@embedpdf/plugin-stamp 2.11.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 (77) 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 +980 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/actions.d.ts +14 -0
  8. package/dist/lib/defaults/name-map.d.ts +2 -0
  9. package/dist/lib/handlers/rubber-stamp.handler.d.ts +4 -0
  10. package/dist/lib/index.d.ts +11 -0
  11. package/dist/lib/manifest.d.ts +4 -0
  12. package/dist/lib/reducer.d.ts +5 -0
  13. package/dist/lib/stamp-plugin.d.ts +54 -0
  14. package/dist/lib/tools.d.ts +58 -0
  15. package/dist/lib/types.d.ts +135 -0
  16. package/dist/preact/adapter.d.ts +5 -0
  17. package/dist/preact/annotation.d.ts +1 -0
  18. package/dist/preact/core.d.ts +1 -0
  19. package/dist/preact/index.cjs +2 -0
  20. package/dist/preact/index.cjs.map +1 -0
  21. package/dist/preact/index.d.ts +1 -0
  22. package/dist/preact/index.js +147 -0
  23. package/dist/preact/index.js.map +1 -0
  24. package/dist/react/adapter.d.ts +2 -0
  25. package/dist/react/annotation.d.ts +1 -0
  26. package/dist/react/core.d.ts +1 -0
  27. package/dist/react/index.cjs +2 -0
  28. package/dist/react/index.cjs.map +1 -0
  29. package/dist/react/index.d.ts +1 -0
  30. package/dist/react/index.js +146 -0
  31. package/dist/react/index.js.map +1 -0
  32. package/dist/shared/components/index.d.ts +3 -0
  33. package/dist/shared/components/stamp-img.d.ts +10 -0
  34. package/dist/shared/components/stamp-preview-renderers.d.ts +2 -0
  35. package/dist/shared/components/stamp-renderer-registration.d.ts +1 -0
  36. package/dist/shared/hooks/index.d.ts +1 -0
  37. package/dist/shared/hooks/use-stamp.d.ts +18 -0
  38. package/dist/shared/index.d.ts +4 -0
  39. package/dist/shared-preact/components/index.d.ts +3 -0
  40. package/dist/shared-preact/components/stamp-img.d.ts +10 -0
  41. package/dist/shared-preact/components/stamp-preview-renderers.d.ts +2 -0
  42. package/dist/shared-preact/components/stamp-renderer-registration.d.ts +1 -0
  43. package/dist/shared-preact/hooks/index.d.ts +1 -0
  44. package/dist/shared-preact/hooks/use-stamp.d.ts +18 -0
  45. package/dist/shared-preact/index.d.ts +4 -0
  46. package/dist/shared-react/components/index.d.ts +3 -0
  47. package/dist/shared-react/components/stamp-img.d.ts +10 -0
  48. package/dist/shared-react/components/stamp-preview-renderers.d.ts +2 -0
  49. package/dist/shared-react/components/stamp-renderer-registration.d.ts +1 -0
  50. package/dist/shared-react/hooks/index.d.ts +1 -0
  51. package/dist/shared-react/hooks/use-stamp.d.ts +18 -0
  52. package/dist/shared-react/index.d.ts +4 -0
  53. package/dist/svelte/components/StampImg.svelte.d.ts +10 -0
  54. package/dist/svelte/components/StampPreview.svelte.d.ts +10 -0
  55. package/dist/svelte/components/StampRendererRegistration.svelte.d.ts +18 -0
  56. package/dist/svelte/components/index.d.ts +2 -0
  57. package/dist/svelte/components/stamp-preview-renderers.d.ts +2 -0
  58. package/dist/svelte/hooks/index.d.ts +1 -0
  59. package/dist/svelte/hooks/use-stamp.svelte.d.ts +23 -0
  60. package/dist/svelte/index.cjs +2 -0
  61. package/dist/svelte/index.cjs.map +1 -0
  62. package/dist/svelte/index.d.ts +4 -0
  63. package/dist/svelte/index.js +223 -0
  64. package/dist/svelte/index.js.map +1 -0
  65. package/dist/vue/components/index.d.ts +2 -0
  66. package/dist/vue/components/stamp-img.vue.d.ts +9 -0
  67. package/dist/vue/components/stamp-preview-renderers.d.ts +2 -0
  68. package/dist/vue/components/stamp-preview.vue.d.ts +10 -0
  69. package/dist/vue/components/stamp-renderer-registration.vue.d.ts +13 -0
  70. package/dist/vue/hooks/index.d.ts +1 -0
  71. package/dist/vue/hooks/use-stamp.d.ts +262 -0
  72. package/dist/vue/index.cjs +2 -0
  73. package/dist/vue/index.cjs.map +1 -0
  74. package/dist/vue/index.d.ts +4 -0
  75. package/dist/vue/index.js +235 -0
  76. package/dist/vue/index.js.map +1 -0
  77. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/handlers/rubber-stamp.handler.ts","../src/lib/tools.ts","../src/lib/defaults/name-map.ts","../src/lib/stamp-plugin.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { StampPluginConfig } from './types';\n\nexport const STAMP_PLUGIN_ID = 'stamp';\n\nexport const manifest: PluginManifest<StampPluginConfig> = {\n id: STAMP_PLUGIN_ID,\n name: 'Stamp Plugin',\n version: '1.0.0',\n provides: ['stamp'],\n requires: ['annotation'],\n optional: ['i18n'],\n defaultConfig: {\n defaultLibrary: {\n id: 'custom',\n name: 'Custom Stamps',\n nameKey: 'stamp.library.custom',\n categories: ['custom', 'sidebar'],\n },\n manifests: [\n {\n url: 'https://cdn.jsdelivr.net/npm/@embedpdf/default-stamps/{locale}/manifest.json',\n fallbackLocale: 'en',\n },\n ],\n },\n};\n","import { Action } from '@embedpdf/core';\n\nexport const ADD_STAMP_LIBRARY = 'STAMP/ADD_LIBRARY';\nexport const REMOVE_STAMP_LIBRARY = 'STAMP/REMOVE_LIBRARY';\n\nexport interface AddStampLibraryAction extends Action {\n type: typeof ADD_STAMP_LIBRARY;\n payload: string;\n}\n\nexport interface RemoveStampLibraryAction extends Action {\n type: typeof REMOVE_STAMP_LIBRARY;\n payload: string;\n}\n\nexport type StampAction = AddStampLibraryAction | RemoveStampLibraryAction;\n\nexport function addStampLibrary(id: string): AddStampLibraryAction {\n return { type: ADD_STAMP_LIBRARY, payload: id };\n}\n\nexport function removeStampLibrary(id: string): RemoveStampLibraryAction {\n return { type: REMOVE_STAMP_LIBRARY, 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 { RUBBER_STAMP_TOOL_ID } from '../tools';\n\nexport const rubberStampHandlerFactory: HandlerFactory<\n PdfStampAnnoObject,\n typeof RUBBER_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?.stampSize) return;\n const { width, height } = ctx.stampSize;\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?.stampSize) return;\n\n const { width, height } = ctx.stampSize;\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: ctx.stamp.name ?? tool.defaults.name ?? PdfAnnotationName.Custom,\n subject: ctx.stamp.subject ?? tool.defaults.subject ?? 'Custom Stamp',\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, { appearance: ctx.appearance });\n onPreview(null);\n },\n\n onPointerLeave: () => {\n onPreview(null);\n },\n };\n },\n};\n","import { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { defineAnnotationTool } from '@embedpdf/plugin-annotation';\nimport { rubberStampHandlerFactory } from './handlers/rubber-stamp.handler';\n\nexport const RUBBER_STAMP_TOOL_ID = 'rubberStamp' as const;\n\nexport const rubberStampTool = defineAnnotationTool({\n id: RUBBER_STAMP_TOOL_ID,\n name: 'Rubber Stamp',\n labelKey: 'stamp.rubberStamp',\n categories: ['annotation', 'stamp', '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: rubberStampHandlerFactory,\n});\n\nexport const stampTools = [rubberStampTool];\n","import { PdfAnnotationName } from '@embedpdf/models';\n\nconst ANNOTATION_NAME_MAP: Record<string, PdfAnnotationName> = {\n Approved: PdfAnnotationName.Approved,\n Experimental: PdfAnnotationName.Experimental,\n NotApproved: PdfAnnotationName.NotApproved,\n AsIs: PdfAnnotationName.AsIs,\n Expired: PdfAnnotationName.Expired,\n NotForPublicRelease: PdfAnnotationName.NotForPublicRelease,\n Confidential: PdfAnnotationName.Confidential,\n Final: PdfAnnotationName.Final,\n Sold: PdfAnnotationName.Sold,\n Departmental: PdfAnnotationName.Departmental,\n ForComment: PdfAnnotationName.ForComment,\n TopSecret: PdfAnnotationName.TopSecret,\n Draft: PdfAnnotationName.Draft,\n ForPublicRelease: PdfAnnotationName.ForPublicRelease,\n Completed: PdfAnnotationName.Completed,\n Void: PdfAnnotationName.Void,\n PreliminaryResults: PdfAnnotationName.PreliminaryResults,\n InformationOnly: PdfAnnotationName.InformationOnly,\n Rejected: PdfAnnotationName.Rejected,\n Witness: PdfAnnotationName.Witness,\n InitialHere: PdfAnnotationName.InitialHere,\n SignHere: PdfAnnotationName.SignHere,\n Accepted: PdfAnnotationName.Accepted,\n Custom: PdfAnnotationName.Custom,\n Image: PdfAnnotationName.Image,\n};\n\nexport function parseAnnotationName(name?: string): PdfAnnotationName {\n if (!name) return PdfAnnotationName.Custom;\n return ANNOTATION_NAME_MAP[name] ?? PdfAnnotationName.Custom;\n}\n","import { BasePlugin, createEmitter, createScopedEmitter, PluginRegistry } from '@embedpdf/core';\nimport { Task, PdfErrorReason, PdfErrorCode, PdfAnnotationObject, uuidV4 } from '@embedpdf/models';\nimport { AnnotationCapability, AnnotationPlugin } from '@embedpdf/plugin-annotation';\nimport { I18nCapability, I18nPlugin } from '@embedpdf/plugin-i18n';\nimport {\n StampCapability,\n StampScope,\n ActiveStampChangeEvent,\n ActiveStampInfo,\n StampDefinition,\n StampDefinitionUpdate,\n StampLibrary,\n StampLibraryConfig,\n StampLibraryUpdate,\n StampManifest,\n StampManifestSource,\n StampPluginConfig,\n StampState,\n ExportedStampLibrary,\n ResolvedStamp,\n} from './types';\nimport { addStampLibrary, removeStampLibrary, StampAction } from './actions';\nimport { STAMP_PLUGIN_ID } from './manifest';\nimport { RUBBER_STAMP_TOOL_ID, stampTools } from './tools';\nimport { parseAnnotationName } from './defaults/name-map';\n\ninterface ManagedManifest {\n source: StampManifestSource;\n localeAware: boolean;\n currentLocale: string;\n libraryId: string | null;\n}\n\nexport class StampPlugin extends BasePlugin<\n StampPluginConfig,\n StampCapability,\n StampState,\n StampAction\n> {\n static readonly id = STAMP_PLUGIN_ID;\n\n private readonly instanceId = uuidV4();\n private readonly libraries = new Map<string, StampLibrary>();\n private readonly libraryChange$ = createEmitter<StampLibrary[]>();\n private readonly activeStamp$ = createScopedEmitter<\n ActiveStampInfo | null,\n ActiveStampChangeEvent,\n string\n >((documentId, activeStamp) => ({ documentId, activeStamp }));\n private readonly managedManifests: ManagedManifest[] = [];\n private annotation: AnnotationCapability | null = null;\n private i18n: I18nCapability | null = null;\n private localeUnsubscribe: (() => void) | 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: StampPluginConfig,\n ) {\n super(id, registry);\n\n this.annotation = registry.getPlugin<AnnotationPlugin>('annotation')?.provides() ?? null;\n if (this.annotation) {\n for (const tool of stampTools) {\n this.annotation.addTool(tool);\n }\n this.toolChangeUnsubscribe = this.annotation.onActiveToolChange(({ documentId, tool }) => {\n if (tool?.id !== RUBBER_STAMP_TOOL_ID) {\n if (this.currentGhostUrl) {\n URL.revokeObjectURL(this.currentGhostUrl);\n this.currentGhostUrl = null;\n }\n this.activeStamp$.emit(documentId, null);\n }\n });\n }\n\n this.i18n = registry.getPlugin<I18nPlugin>('i18n')?.provides() ?? null;\n }\n\n async initialize(): Promise<void> {\n if (this.config.libraries) {\n for (const libConfig of this.config.libraries) {\n await this.loadLibraryInternal(libConfig).toPromise();\n }\n }\n\n if (this.config.manifests && this.config.manifests.length > 0) {\n await this.initializeManifests();\n }\n }\n\n protected buildCapability(): StampCapability {\n return {\n getLibraries: () => this.getLibraries(),\n getStampsByCategory: (category) => this.getStampsByCategory(category),\n renderStamp: (libraryId, pageIndex, width, dpr) =>\n this.renderStamp(libraryId, pageIndex, width, dpr),\n loadLibrary: (config) => this.loadLibrary(config),\n loadLibraryFromManifest: (url) => this.loadLibraryFromManifest(url),\n createNewLibrary: (name, options) => this.createNewLibrary(name, options),\n addStampToLibrary: (libraryId, stamp, pdf) => this.addStampToLibrary(libraryId, stamp, pdf),\n removeStampFromLibrary: (libraryId, stampId) =>\n this.removeStampFromLibrary(libraryId, stampId),\n updateStamp: (libraryId, stampId, updates) => this.updateStamp(libraryId, stampId, updates),\n updateLibrary: (libraryId, updates) => this.updateLibrary(libraryId, updates),\n removeLibrary: (id) => this.removeLibrary(id),\n exportLibrary: (id) => this.exportLibrary(id),\n forDocument: (documentId) => this.createStampScope(documentId),\n onActiveStampChange: this.activeStamp$.onGlobal,\n onLibraryChange: this.libraryChange$.on,\n };\n }\n\n getLibraries(): StampLibrary[] {\n return Array.from(this.libraries.values());\n }\n\n getStampsByCategory(category: string): ResolvedStamp[] {\n const results: ResolvedStamp[] = [];\n\n for (const library of this.libraries.values()) {\n const libraryMatches = library.categories?.includes(category) ?? false;\n\n for (const stamp of library.stamps) {\n const stampMatches = stamp.categories?.includes(category) ?? false;\n if (libraryMatches || stampMatches) {\n results.push({ library, stamp });\n }\n }\n }\n\n return results;\n }\n\n renderStamp(\n libraryId: string,\n pageIndex: number,\n width: number,\n dpr?: number,\n ): Task<Blob, PdfErrorReason> {\n const library = this.libraries.get(libraryId);\n if (!library) {\n const task = new Task<Blob, PdfErrorReason>();\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp library not found: ${libraryId}`,\n });\n return task;\n }\n\n const page = library.document.pages[pageIndex];\n if (!page) {\n const task = new Task<Blob, PdfErrorReason>();\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Page ${pageIndex} not found in stamp library: ${libraryId}`,\n });\n return task;\n }\n\n const scaleFactor = width / page.size.width;\n\n return this.engine.renderPageRect(\n library.document,\n page,\n { origin: { x: 0, y: 0 }, size: page.size },\n {\n scaleFactor,\n dpr: dpr ?? 1,\n withAnnotations: true,\n rotation: page.rotation,\n transparentBackground: true,\n },\n );\n }\n\n loadLibrary(config: StampLibraryConfig): Task<string, PdfErrorReason> {\n return this.loadLibraryInternal(config);\n }\n\n createNewLibrary(\n name: string,\n options?: { categories?: string[]; id?: string; nameKey?: string; readonly?: boolean },\n ): Task<string, PdfErrorReason> {\n const task = new Task<string, PdfErrorReason>();\n const libraryId = options?.id ?? this.generateLibraryId();\n const documentId = this.getLibraryDocumentId(libraryId);\n\n this.engine.createDocument(documentId).wait(\n (doc) => {\n const library: StampLibrary = {\n id: libraryId,\n name,\n nameKey: options?.nameKey,\n document: doc,\n stamps: [],\n categories: options?.categories,\n readonly: options?.readonly ?? false,\n };\n\n this.libraries.set(libraryId, library);\n this.dispatch(addStampLibrary(libraryId));\n this.emitLibraryChange();\n task.resolve(libraryId);\n },\n (error) => {\n this.logger.error(\n 'StampPlugin',\n 'CreateNewLibrary',\n `Failed to create library: ${name}`,\n error,\n );\n task.fail(error);\n },\n );\n\n return task;\n }\n\n addStampToLibrary(\n libraryId: string,\n stamp: Omit<StampDefinition, 'id' | 'pageIndex'>,\n pdf: ArrayBuffer,\n ): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const library = this.libraries.get(libraryId);\n if (!library) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp library not found: ${libraryId}`,\n });\n return task;\n }\n\n if (library.readonly) {\n task.reject({\n code: PdfErrorCode.NotSupport,\n message: `Cannot add stamps to readonly library: ${libraryId}`,\n });\n return task;\n }\n\n const tempDocId = `stamp-temp-${Date.now()}`;\n\n this.engine.openDocumentBuffer({ id: tempDocId, content: pdf }).wait(\n (tempDoc) => {\n this.engine.importPages(library.document, tempDoc, [0]).wait(\n (newPages) => {\n const newPage = newPages[0];\n library.document.pages.push(newPage);\n library.document.pageCount = library.document.pages.length;\n\n const stampDef: StampDefinition = {\n ...stamp,\n id: uuidV4(),\n pageIndex: newPage.index,\n };\n library.stamps.push(stampDef);\n\n this.engine.closeDocument(tempDoc).wait(\n () => {\n this.emitLibraryChange();\n task.resolve();\n },\n () => {\n this.emitLibraryChange();\n task.resolve();\n },\n );\n },\n (error) => {\n this.logger.error('StampPlugin', 'AddStampToLibrary', 'Failed to import page', error);\n this.engine.closeDocument(tempDoc).wait(\n () => task.fail(error),\n () => task.fail(error),\n );\n },\n );\n },\n (error) => {\n this.logger.error(\n 'StampPlugin',\n 'AddStampToLibrary',\n 'Failed to open temp document',\n error,\n );\n task.fail(error);\n },\n );\n\n return task;\n }\n\n private createStampScope(documentId: string): StampScope {\n return {\n createStampFromAnnotation: (annotation, stamp, libraryId) =>\n this.createStampFromAnnotation(documentId, annotation, stamp, libraryId),\n createStampFromAnnotations: (annotations, stamp, libraryId) =>\n this.createStampFromAnnotations(documentId, annotations, stamp, libraryId),\n activateStampPlacement: (libraryId, stamp) =>\n this.activateStampPlacement(documentId, libraryId, stamp),\n activateStampPlacementById: (libraryId, stampId) =>\n this.activateStampPlacementById(documentId, libraryId, stampId),\n getActiveStamp: () => this.getActiveStamp(documentId),\n onActiveStampChange: this.activeStamp$.forScope(documentId),\n };\n }\n\n private activateStampPlacementById(\n documentId: string,\n libraryId: string,\n stampId: string,\n ): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const library = this.libraries.get(libraryId);\n if (!library) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp library not found: ${libraryId}`,\n });\n return task;\n }\n\n const stamp = library.stamps.find((s) => s.id === stampId);\n if (!stamp) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp ${stampId} not found in library: ${libraryId}`,\n });\n return task;\n }\n\n return this.activateStampPlacement(documentId, libraryId, stamp);\n }\n\n private getActiveStamp(documentId: string): ActiveStampInfo | null {\n return this.activeStamp$.getValue(documentId) ?? null;\n }\n\n private activateStampPlacement(\n documentId: string,\n libraryId: string,\n stamp: StampDefinition,\n ): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const library = this.libraries.get(libraryId);\n if (!library) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp library not found: ${libraryId}`,\n });\n return task;\n }\n\n const page = library.document.pages[stamp.pageIndex];\n if (!page) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Page ${stamp.pageIndex} not found in library`,\n });\n return task;\n }\n\n const stampSize = page.size;\n\n this.engine.extractPages(library.document, [stamp.pageIndex]).wait(\n (appearance) => {\n this.renderStamp(libraryId, stamp.pageIndex, stampSize.width, 2).wait(\n (blob) => {\n if (this.currentGhostUrl) {\n URL.revokeObjectURL(this.currentGhostUrl);\n }\n const ghostUrl = URL.createObjectURL(blob);\n this.currentGhostUrl = ghostUrl;\n this.annotation?.setActiveTool(RUBBER_STAMP_TOOL_ID, {\n appearance,\n ghostUrl,\n stampSize,\n libraryId,\n stamp,\n });\n this.activeStamp$.emit(documentId, { libraryId, stamp });\n task.resolve();\n },\n (error) => {\n this.logger.error(\n 'StampPlugin',\n 'ActivateStampPlacement',\n 'Failed to render stamp preview',\n error,\n );\n task.fail(error);\n },\n );\n },\n (error) => {\n this.logger.error(\n 'StampPlugin',\n 'ActivateStampPlacement',\n 'Failed to extract stamp page',\n error,\n );\n task.fail(error);\n },\n );\n\n return task;\n }\n\n private createStampFromAnnotation(\n documentId: string,\n annotation: PdfAnnotationObject,\n stamp: Omit<StampDefinition, 'id' | 'pageIndex'>,\n libraryId?: string,\n ): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const docState = this.getCoreDocument(documentId);\n if (!docState?.document) {\n task.reject({ code: PdfErrorCode.DocNotOpen, message: 'document is not open' });\n return task;\n }\n\n const doc = docState.document;\n const page = doc.pages[annotation.pageIndex];\n if (!page) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `page ${annotation.pageIndex} not found`,\n });\n return task;\n }\n\n this.resolveTargetLibrary(libraryId).wait(\n (targetId) => {\n this.engine.exportAnnotationAppearanceAsPdf(doc, page, annotation).wait(\n (pdf) => {\n this.addStampToLibrary(targetId, stamp, pdf).wait(\n () => task.resolve(),\n (error) => task.fail(error),\n );\n },\n (error) => {\n this.logger.error(\n 'StampPlugin',\n 'CreateStampFromAnnotation',\n 'Failed to export annotation',\n error,\n );\n task.fail(error);\n },\n );\n },\n (error) => task.fail(error),\n );\n\n return task;\n }\n\n private createStampFromAnnotations(\n documentId: string,\n annotations: PdfAnnotationObject[],\n stamp: Omit<StampDefinition, 'id' | 'pageIndex'>,\n libraryId?: string,\n ): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n if (annotations.length === 0) {\n task.reject({ code: PdfErrorCode.NotFound, message: 'no annotations provided' });\n return task;\n }\n\n const docState = this.getCoreDocument(documentId);\n if (!docState?.document) {\n task.reject({ code: PdfErrorCode.DocNotOpen, message: 'document is not open' });\n return task;\n }\n\n const doc = docState.document;\n const page = doc.pages[annotations[0].pageIndex];\n if (!page) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `page ${annotations[0].pageIndex} not found`,\n });\n return task;\n }\n\n this.resolveTargetLibrary(libraryId).wait(\n (targetId) => {\n this.engine.exportAnnotationsAppearanceAsPdf(doc, page, annotations).wait(\n (pdf) => {\n this.addStampToLibrary(targetId, stamp, pdf).wait(\n () => task.resolve(),\n (error) => task.fail(error),\n );\n },\n (error) => {\n this.logger.error(\n 'StampPlugin',\n 'CreateStampFromAnnotations',\n 'Failed to export annotations',\n error,\n );\n task.fail(error);\n },\n );\n },\n (error) => task.fail(error),\n );\n\n return task;\n }\n\n private resolveTargetLibrary(libraryId?: string): Task<string, PdfErrorReason> {\n if (libraryId && this.libraries.has(libraryId)) {\n const task = new Task<string, PdfErrorReason>();\n task.resolve(libraryId);\n return task;\n }\n\n const defaults = this.config.defaultLibrary;\n if (this.config.defaultLibrary === false || !defaults) {\n const task = new Task<string, PdfErrorReason>();\n task.reject({\n code: PdfErrorCode.NotSupport,\n message: 'Default library creation is disabled',\n });\n return task;\n }\n\n const defaultId = defaults.id ?? 'custom';\n\n if (this.libraries.has(defaultId)) {\n const task = new Task<string, PdfErrorReason>();\n task.resolve(defaultId);\n return task;\n }\n\n return this.createNewLibrary(defaults.name ?? 'Custom Stamps', {\n id: defaultId,\n nameKey: defaults.nameKey,\n categories: defaults.categories,\n });\n }\n\n removeLibrary(id: string): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const library = this.libraries.get(id);\n if (!library) {\n task.resolve();\n return task;\n }\n\n this.engine.closeDocument(library.document).wait(\n () => {\n this.libraries.delete(id);\n this.dispatch(removeStampLibrary(id));\n this.emitLibraryChange();\n task.resolve();\n },\n () => {\n this.logger.warn(\n 'StampPlugin',\n 'RemoveLibrary',\n `Failed to close document for library: ${id}`,\n );\n this.libraries.delete(id);\n this.dispatch(removeStampLibrary(id));\n this.emitLibraryChange();\n task.resolve();\n },\n );\n\n return task;\n }\n\n exportLibrary(id: string): Task<ExportedStampLibrary, PdfErrorReason> {\n const task = new Task<ExportedStampLibrary, PdfErrorReason>();\n\n const library = this.libraries.get(id);\n if (!library) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp library not found: ${id}`,\n });\n return task;\n }\n\n this.engine.saveAsCopy(library.document).wait(\n (pdf) => {\n task.resolve({\n name: library.name,\n pdf,\n stamps: library.stamps,\n categories: library.categories,\n });\n },\n (error) => {\n this.logger.error('StampPlugin', 'ExportLibrary', `Failed to export library: ${id}`, error);\n task.fail(error);\n },\n );\n\n return task;\n }\n\n private loadLibraryInternal(config: StampLibraryConfig): Task<string, PdfErrorReason> {\n const task = new Task<string, PdfErrorReason>();\n const libraryId = config.id ?? this.generateLibraryId();\n const documentId = this.getLibraryDocumentId(libraryId);\n\n const engineTask =\n typeof config.pdf === 'string'\n ? this.engine.openDocumentUrl({ id: documentId, url: config.pdf })\n : this.engine.openDocumentBuffer({ id: documentId, content: config.pdf });\n\n engineTask.wait(\n (doc) => {\n const stamps = config.stamps.map((s) => (s.id ? s : { ...s, id: uuidV4() }));\n\n const library: StampLibrary = {\n id: libraryId,\n name: config.name,\n nameKey: config.nameKey,\n document: doc,\n stamps,\n categories: config.categories,\n readonly: config.readonly ?? false,\n };\n\n this.libraries.set(libraryId, library);\n this.dispatch(addStampLibrary(libraryId));\n this.emitLibraryChange();\n\n task.resolve(libraryId);\n },\n (error) => {\n this.logger.error(\n 'StampPlugin',\n 'LoadLibrary',\n `Failed to load stamp library: ${config.name}`,\n error,\n );\n task.fail(error);\n },\n );\n\n return task;\n }\n\n removeStampFromLibrary(libraryId: string, stampId: string): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const library = this.libraries.get(libraryId);\n if (!library) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp library not found: ${libraryId}`,\n });\n return task;\n }\n\n if (library.readonly) {\n task.reject({\n code: PdfErrorCode.NotSupport,\n message: `Cannot remove stamps from readonly library: ${libraryId}`,\n });\n return task;\n }\n\n const stampIdx = library.stamps.findIndex((s) => s.id === stampId);\n if (stampIdx === -1) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp ${stampId} not found in library: ${libraryId}`,\n });\n return task;\n }\n\n const pageIndex = library.stamps[stampIdx].pageIndex;\n\n this.engine.deletePage(library.document, pageIndex).wait(\n () => {\n library.stamps.splice(stampIdx, 1);\n library.document.pages.splice(pageIndex, 1);\n library.document.pageCount = library.document.pages.length;\n\n for (const s of library.stamps) {\n if (s.pageIndex > pageIndex) {\n s.pageIndex--;\n }\n }\n for (let i = 0; i < library.document.pages.length; i++) {\n library.document.pages[i].index = i;\n }\n\n this.emitLibraryChange();\n task.resolve();\n },\n (error) => {\n this.logger.error(\n 'StampPlugin',\n 'RemoveStampFromLibrary',\n `Failed to delete page for stamp ${stampId}`,\n error,\n );\n task.fail(error);\n },\n );\n\n return task;\n }\n\n updateStamp(\n libraryId: string,\n stampId: string,\n updates: StampDefinitionUpdate,\n ): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const library = this.libraries.get(libraryId);\n if (!library) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp library not found: ${libraryId}`,\n });\n return task;\n }\n\n if (library.readonly) {\n task.reject({\n code: PdfErrorCode.NotSupport,\n message: `Cannot update stamps in readonly library: ${libraryId}`,\n });\n return task;\n }\n\n const stamp = library.stamps.find((s) => s.id === stampId);\n if (!stamp) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp ${stampId} not found in library: ${libraryId}`,\n });\n return task;\n }\n\n Object.assign(stamp, updates);\n this.emitLibraryChange();\n task.resolve();\n\n return task;\n }\n\n updateLibrary(libraryId: string, updates: StampLibraryUpdate): Task<void, PdfErrorReason> {\n const task = new Task<void, PdfErrorReason>();\n\n const library = this.libraries.get(libraryId);\n if (!library) {\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Stamp library not found: ${libraryId}`,\n });\n return task;\n }\n\n if (library.readonly) {\n task.reject({\n code: PdfErrorCode.NotSupport,\n message: `Cannot update readonly library: ${libraryId}`,\n });\n return task;\n }\n\n if (updates.name !== undefined) library.name = updates.name;\n if (updates.nameKey !== undefined) library.nameKey = updates.nameKey;\n if (updates.categories !== undefined) library.categories = updates.categories;\n if (updates.readonly !== undefined) library.readonly = updates.readonly;\n\n this.emitLibraryChange();\n task.resolve();\n\n return task;\n }\n\n loadLibraryFromManifest(url: string): Task<string, PdfErrorReason> {\n return this.loadManifestUrl(url, true);\n }\n\n private async initializeManifests(): Promise<void> {\n const currentLocale = this.i18n?.getLocale() ?? 'en';\n\n for (const source of this.config.manifests!) {\n const localeAware = source.url.includes('{locale}');\n const locale = localeAware ? currentLocale : '';\n const resolvedUrl = source.url.replace('{locale}', locale || currentLocale);\n\n const managed: ManagedManifest = {\n source,\n localeAware,\n currentLocale: localeAware ? currentLocale : '',\n libraryId: null,\n };\n this.managedManifests.push(managed);\n\n try {\n const libraryId = await this.loadManifestUrl(resolvedUrl, true).toPromise();\n managed.libraryId = libraryId;\n } catch {\n if (localeAware && source.fallbackLocale && source.fallbackLocale !== currentLocale) {\n const fallbackUrl = source.url.replace('{locale}', source.fallbackLocale);\n try {\n const libraryId = await this.loadManifestUrl(fallbackUrl, true).toPromise();\n managed.libraryId = libraryId;\n managed.currentLocale = source.fallbackLocale;\n } catch {\n this.logger.warn(\n 'StampPlugin',\n 'InitManifests',\n `Failed to load manifest (including fallback): ${source.url}`,\n );\n }\n } else {\n this.logger.warn(\n 'StampPlugin',\n 'InitManifests',\n `Failed to load manifest: ${resolvedUrl}`,\n );\n }\n }\n }\n\n if (this.i18n) {\n this.localeUnsubscribe = this.i18n.onLocaleChange((event) => {\n this.handleLocaleChange(event.currentLocale);\n });\n }\n }\n\n private async handleLocaleChange(newLocale: string): Promise<void> {\n for (const managed of this.managedManifests) {\n if (!managed.localeAware || managed.currentLocale === newLocale) {\n continue;\n }\n\n if (managed.libraryId) {\n try {\n await this.removeLibrary(managed.libraryId).toPromise();\n } catch {\n // Best effort removal\n }\n managed.libraryId = null;\n }\n\n const resolvedUrl = managed.source.url.replace('{locale}', newLocale);\n\n try {\n const libraryId = await this.loadManifestUrl(resolvedUrl, true).toPromise();\n managed.libraryId = libraryId;\n managed.currentLocale = newLocale;\n } catch {\n const fallback = managed.source.fallbackLocale ?? 'en';\n if (fallback !== newLocale) {\n const fallbackUrl = managed.source.url.replace('{locale}', fallback);\n try {\n const libraryId = await this.loadManifestUrl(fallbackUrl, true).toPromise();\n managed.libraryId = libraryId;\n managed.currentLocale = fallback;\n } catch {\n this.logger.warn(\n 'StampPlugin',\n 'LocaleChange',\n `Failed to load manifest for locale ${newLocale} (including fallback): ${managed.source.url}`,\n );\n }\n } else {\n this.logger.warn(\n 'StampPlugin',\n 'LocaleChange',\n `Failed to load manifest for locale ${newLocale}: ${managed.source.url}`,\n );\n }\n }\n }\n }\n\n private loadManifestUrl(url: string, readonly: boolean): Task<string, PdfErrorReason> {\n const task = new Task<string, PdfErrorReason>();\n\n fetch(url)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n return response.json() as Promise<StampManifest>;\n })\n .then((manifest) => {\n const pdfUrl = this.resolveManifestPdfUrl(url, manifest.pdf);\n\n const stamps: StampDefinition[] = manifest.stamps.map((entry) => ({\n id: entry.id ?? uuidV4(),\n pageIndex: entry.pageIndex,\n name: parseAnnotationName(entry.name),\n subject: entry.subject,\n subjectKey: entry.subjectKey,\n label: entry.label,\n categories: entry.categories,\n }));\n\n const config: StampLibraryConfig = {\n id: manifest.id,\n name: manifest.name,\n nameKey: manifest.nameKey,\n pdf: pdfUrl,\n stamps,\n categories: manifest.categories,\n readonly,\n };\n\n this.loadLibraryInternal(config).wait(\n (libraryId) => task.resolve(libraryId),\n (error) => task.fail(error),\n );\n })\n .catch((error) => {\n this.logger.error('StampPlugin', 'LoadManifest', `Failed to fetch manifest: ${url}`, error);\n task.reject({\n code: PdfErrorCode.NotFound,\n message: `Failed to load stamp manifest: ${url}`,\n });\n });\n\n return task;\n }\n\n private resolveManifestPdfUrl(manifestUrl: string, pdfPath: string): string {\n if (\n pdfPath.startsWith('http://') ||\n pdfPath.startsWith('https://') ||\n pdfPath.startsWith('/')\n ) {\n return pdfPath;\n }\n const base = manifestUrl.substring(0, manifestUrl.lastIndexOf('/') + 1);\n return base + pdfPath;\n }\n\n private generateLibraryId(): string {\n return uuidV4();\n }\n\n private getLibraryDocumentId(libraryId: string): string {\n return `stamp-doc-${this.instanceId}-${libraryId}`;\n }\n\n private emitLibraryChange(): void {\n this.libraryChange$.emit(this.getLibraries());\n }\n\n override async destroy(): Promise<void> {\n if (this.currentGhostUrl) {\n URL.revokeObjectURL(this.currentGhostUrl);\n this.currentGhostUrl = null;\n }\n if (this.toolChangeUnsubscribe) {\n this.toolChangeUnsubscribe();\n this.toolChangeUnsubscribe = null;\n }\n if (this.localeUnsubscribe) {\n this.localeUnsubscribe();\n this.localeUnsubscribe = null;\n }\n this.activeStamp$.clear();\n const libs = Array.from(this.libraries.values());\n for (const library of libs) {\n try {\n await this.engine.closeDocument(library.document).toPromise();\n } catch {\n // Best effort cleanup\n }\n }\n this.libraries.clear();\n this.managedManifests.length = 0;\n super.destroy();\n }\n}\n","import { Reducer } from '@embedpdf/core';\nimport { StampAction, ADD_STAMP_LIBRARY, REMOVE_STAMP_LIBRARY } from './actions';\nimport { StampState } from './types';\n\nexport const initialState: StampState = {\n libraryIds: [],\n};\n\nexport const stampReducer: Reducer<StampState, StampAction> = (state = initialState, action) => {\n switch (action.type) {\n case ADD_STAMP_LIBRARY:\n return {\n ...state,\n libraryIds: [...state.libraryIds, action.payload],\n };\n\n case REMOVE_STAMP_LIBRARY:\n return {\n ...state,\n libraryIds: state.libraryIds.filter((id) => id !== action.payload),\n };\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, STAMP_PLUGIN_ID } from './manifest';\nimport { StampPluginConfig, StampState } from './types';\nimport { StampPlugin } from './stamp-plugin';\nimport { stampReducer, initialState } from './reducer';\nimport { StampAction } from './actions';\n\nexport const StampPluginPackage: PluginPackage<\n StampPlugin,\n StampPluginConfig,\n StampState,\n StampAction\n> = {\n manifest,\n create: (registry, config) => new StampPlugin(STAMP_PLUGIN_ID, registry, config),\n reducer: stampReducer,\n initialState,\n};\n\nexport * from './stamp-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\nexport { RUBBER_STAMP_TOOL_ID } from './tools';\n"],"names":["manifest"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Action } from '@embedpdf/core';
2
+ export declare const ADD_STAMP_LIBRARY = "STAMP/ADD_LIBRARY";
3
+ export declare const REMOVE_STAMP_LIBRARY = "STAMP/REMOVE_LIBRARY";
4
+ export interface AddStampLibraryAction extends Action {
5
+ type: typeof ADD_STAMP_LIBRARY;
6
+ payload: string;
7
+ }
8
+ export interface RemoveStampLibraryAction extends Action {
9
+ type: typeof REMOVE_STAMP_LIBRARY;
10
+ payload: string;
11
+ }
12
+ export type StampAction = AddStampLibraryAction | RemoveStampLibraryAction;
13
+ export declare function addStampLibrary(id: string): AddStampLibraryAction;
14
+ export declare function removeStampLibrary(id: string): RemoveStampLibraryAction;
@@ -0,0 +1,2 @@
1
+ import { PdfAnnotationName } from '@embedpdf/models';
2
+ export declare function parseAnnotationName(name?: string): PdfAnnotationName;
@@ -0,0 +1,4 @@
1
+ import { PdfStampAnnoObject } from '@embedpdf/models';
2
+ import { HandlerFactory } from '@embedpdf/plugin-annotation';
3
+ import { RUBBER_STAMP_TOOL_ID } from '../tools';
4
+ export declare const rubberStampHandlerFactory: HandlerFactory<PdfStampAnnoObject, typeof RUBBER_STAMP_TOOL_ID>;
@@ -0,0 +1,11 @@
1
+ import { PluginPackage } from '@embedpdf/core';
2
+ import { StampPluginConfig, StampState } from './types';
3
+ import { StampPlugin } from './stamp-plugin';
4
+ import { StampAction } from './actions';
5
+ export declare const StampPluginPackage: PluginPackage<StampPlugin, StampPluginConfig, StampState, StampAction>;
6
+ export * from './stamp-plugin';
7
+ export * from './types';
8
+ export * from './manifest';
9
+ export * from './actions';
10
+ export * from './reducer';
11
+ export { RUBBER_STAMP_TOOL_ID } from './tools';
@@ -0,0 +1,4 @@
1
+ import { PluginManifest } from '@embedpdf/core';
2
+ import { StampPluginConfig } from './types';
3
+ export declare const STAMP_PLUGIN_ID = "stamp";
4
+ export declare const manifest: PluginManifest<StampPluginConfig>;
@@ -0,0 +1,5 @@
1
+ import { Reducer } from '@embedpdf/core';
2
+ import { StampAction } from './actions';
3
+ import { StampState } from './types';
4
+ export declare const initialState: StampState;
5
+ export declare const stampReducer: Reducer<StampState, StampAction>;
@@ -0,0 +1,54 @@
1
+ import { BasePlugin, PluginRegistry } from '@embedpdf/core';
2
+ import { Task, PdfErrorReason } from '@embedpdf/models';
3
+ import { StampCapability, StampDefinition, StampDefinitionUpdate, StampLibrary, StampLibraryConfig, StampLibraryUpdate, StampPluginConfig, StampState, ExportedStampLibrary, ResolvedStamp } from './types';
4
+ import { StampAction } from './actions';
5
+ export declare class StampPlugin extends BasePlugin<StampPluginConfig, StampCapability, StampState, StampAction> {
6
+ private config;
7
+ static readonly id = "stamp";
8
+ private readonly instanceId;
9
+ private readonly libraries;
10
+ private readonly libraryChange$;
11
+ private readonly activeStamp$;
12
+ private readonly managedManifests;
13
+ private annotation;
14
+ private i18n;
15
+ private localeUnsubscribe;
16
+ private toolChangeUnsubscribe;
17
+ private currentGhostUrl;
18
+ constructor(id: string, registry: PluginRegistry, config: StampPluginConfig);
19
+ initialize(): Promise<void>;
20
+ protected buildCapability(): StampCapability;
21
+ getLibraries(): StampLibrary[];
22
+ getStampsByCategory(category: string): ResolvedStamp[];
23
+ renderStamp(libraryId: string, pageIndex: number, width: number, dpr?: number): Task<Blob, PdfErrorReason>;
24
+ loadLibrary(config: StampLibraryConfig): Task<string, PdfErrorReason>;
25
+ createNewLibrary(name: string, options?: {
26
+ categories?: string[];
27
+ id?: string;
28
+ nameKey?: string;
29
+ readonly?: boolean;
30
+ }): Task<string, PdfErrorReason>;
31
+ addStampToLibrary(libraryId: string, stamp: Omit<StampDefinition, 'id' | 'pageIndex'>, pdf: ArrayBuffer): Task<void, PdfErrorReason>;
32
+ private createStampScope;
33
+ private activateStampPlacementById;
34
+ private getActiveStamp;
35
+ private activateStampPlacement;
36
+ private createStampFromAnnotation;
37
+ private createStampFromAnnotations;
38
+ private resolveTargetLibrary;
39
+ removeLibrary(id: string): Task<void, PdfErrorReason>;
40
+ exportLibrary(id: string): Task<ExportedStampLibrary, PdfErrorReason>;
41
+ private loadLibraryInternal;
42
+ removeStampFromLibrary(libraryId: string, stampId: string): Task<void, PdfErrorReason>;
43
+ updateStamp(libraryId: string, stampId: string, updates: StampDefinitionUpdate): Task<void, PdfErrorReason>;
44
+ updateLibrary(libraryId: string, updates: StampLibraryUpdate): Task<void, PdfErrorReason>;
45
+ loadLibraryFromManifest(url: string): Task<string, PdfErrorReason>;
46
+ private initializeManifests;
47
+ private handleLocaleChange;
48
+ private loadManifestUrl;
49
+ private resolveManifestPdfUrl;
50
+ private generateLibraryId;
51
+ private getLibraryDocumentId;
52
+ private emitLibraryChange;
53
+ destroy(): Promise<void>;
54
+ }
@@ -0,0 +1,58 @@
1
+ import { PdfAnnotationSubtype } from '@embedpdf/models';
2
+ export declare const RUBBER_STAMP_TOOL_ID: "rubberStamp";
3
+ export declare const rubberStampTool: {
4
+ readonly id: "rubberStamp";
5
+ readonly name: "Rubber Stamp";
6
+ readonly labelKey: "stamp.rubberStamp";
7
+ readonly categories: ["annotation", "stamp", "insert"];
8
+ readonly matchScore: () => number;
9
+ readonly interaction: {
10
+ readonly exclusive: true;
11
+ readonly cursor: "copy";
12
+ readonly isDraggable: true;
13
+ readonly isResizable: true;
14
+ readonly isRotatable: false;
15
+ readonly lockAspectRatio: true;
16
+ readonly isGroupDraggable: true;
17
+ readonly isGroupResizable: false;
18
+ readonly isGroupRotatable: false;
19
+ };
20
+ readonly defaults: {
21
+ readonly type: PdfAnnotationSubtype.STAMP;
22
+ };
23
+ readonly behavior: {
24
+ readonly deactivateToolAfterCreate: true;
25
+ readonly selectAfterCreate: true;
26
+ readonly insertUpright: true;
27
+ readonly useAppearanceStream: true;
28
+ };
29
+ readonly pointerHandler: import('@embedpdf/plugin-annotation').HandlerFactory<import('@embedpdf/models').PdfStampAnnoObject, "rubberStamp">;
30
+ };
31
+ export declare const stampTools: {
32
+ readonly id: "rubberStamp";
33
+ readonly name: "Rubber Stamp";
34
+ readonly labelKey: "stamp.rubberStamp";
35
+ readonly categories: ["annotation", "stamp", "insert"];
36
+ readonly matchScore: () => number;
37
+ readonly interaction: {
38
+ readonly exclusive: true;
39
+ readonly cursor: "copy";
40
+ readonly isDraggable: true;
41
+ readonly isResizable: true;
42
+ readonly isRotatable: false;
43
+ readonly lockAspectRatio: true;
44
+ readonly isGroupDraggable: true;
45
+ readonly isGroupResizable: false;
46
+ readonly isGroupRotatable: false;
47
+ };
48
+ readonly defaults: {
49
+ readonly type: PdfAnnotationSubtype.STAMP;
50
+ };
51
+ readonly behavior: {
52
+ readonly deactivateToolAfterCreate: true;
53
+ readonly selectAfterCreate: true;
54
+ readonly insertUpright: true;
55
+ readonly useAppearanceStream: true;
56
+ };
57
+ readonly pointerHandler: import('@embedpdf/plugin-annotation').HandlerFactory<import('@embedpdf/models').PdfStampAnnoObject, "rubberStamp">;
58
+ }[];
@@ -0,0 +1,135 @@
1
+ import { BasePluginConfig, EventHook } from '@embedpdf/core';
2
+ import { PdfAnnotationName, PdfAnnotationObject, PdfDocumentObject, PdfTask, Rect, Rotation } from '@embedpdf/models';
3
+ export interface StampPreviewData {
4
+ rect: Rect;
5
+ ghostUrl: string;
6
+ pageRotation: Rotation;
7
+ }
8
+ export interface RubberStampToolContext {
9
+ appearance: ArrayBuffer;
10
+ ghostUrl: string;
11
+ stampSize: {
12
+ width: number;
13
+ height: number;
14
+ };
15
+ libraryId: string;
16
+ stamp: StampDefinition;
17
+ pageRotation: Rotation;
18
+ }
19
+ declare module '@embedpdf/plugin-annotation' {
20
+ interface ToolContextMap {
21
+ rubberStamp: RubberStampToolContext;
22
+ }
23
+ }
24
+ export interface StampDefinition {
25
+ id: string;
26
+ pageIndex: number;
27
+ name: PdfAnnotationName;
28
+ subject: string;
29
+ subjectKey?: string;
30
+ label?: string;
31
+ categories?: string[];
32
+ }
33
+ export type StampDefinitionUpdate = Partial<Pick<StampDefinition, 'subject' | 'subjectKey' | 'categories'>>;
34
+ export interface StampLibraryConfig {
35
+ id?: string;
36
+ name: string;
37
+ nameKey?: string;
38
+ pdf: string | ArrayBuffer;
39
+ stamps: StampDefinition[];
40
+ categories?: string[];
41
+ readonly?: boolean;
42
+ }
43
+ export type StampLibraryUpdate = Partial<Pick<StampLibrary, 'name' | 'nameKey' | 'categories' | 'readonly'>>;
44
+ export interface StampLibrary {
45
+ id: string;
46
+ name: string;
47
+ nameKey?: string;
48
+ document: PdfDocumentObject;
49
+ stamps: StampDefinition[];
50
+ categories?: string[];
51
+ readonly: boolean;
52
+ }
53
+ export interface ResolvedStamp {
54
+ library: StampLibrary;
55
+ stamp: StampDefinition;
56
+ }
57
+ export interface ExportedStampLibrary {
58
+ name: string;
59
+ pdf: ArrayBuffer;
60
+ stamps: StampDefinition[];
61
+ categories?: string[];
62
+ }
63
+ export interface StampManifestSource {
64
+ url: string;
65
+ fallbackLocale?: string;
66
+ }
67
+ export interface StampManifest {
68
+ id?: string;
69
+ name: string;
70
+ nameKey?: string;
71
+ pdf: string;
72
+ stamps: StampManifestEntry[];
73
+ categories?: string[];
74
+ }
75
+ export interface StampManifestEntry {
76
+ id?: string;
77
+ pageIndex: number;
78
+ name?: string;
79
+ subject: string;
80
+ subjectKey?: string;
81
+ label?: string;
82
+ categories?: string[];
83
+ }
84
+ export interface DefaultLibraryConfig {
85
+ id?: string;
86
+ name?: string;
87
+ nameKey?: string;
88
+ categories?: string[];
89
+ }
90
+ export interface StampPluginConfig extends BasePluginConfig {
91
+ libraries?: StampLibraryConfig[];
92
+ manifests?: StampManifestSource[];
93
+ defaultLibrary?: DefaultLibraryConfig | false;
94
+ }
95
+ export interface StampState {
96
+ libraryIds: string[];
97
+ }
98
+ export interface ActiveStampInfo {
99
+ libraryId: string;
100
+ stamp: StampDefinition;
101
+ }
102
+ export interface ActiveStampChangeEvent {
103
+ documentId: string;
104
+ activeStamp: ActiveStampInfo | null;
105
+ }
106
+ export interface StampScope {
107
+ createStampFromAnnotation(annotation: PdfAnnotationObject, stamp: Omit<StampDefinition, 'id' | 'pageIndex'>, libraryId?: string): PdfTask<void>;
108
+ createStampFromAnnotations(annotations: PdfAnnotationObject[], stamp: Omit<StampDefinition, 'id' | 'pageIndex'>, libraryId?: string): PdfTask<void>;
109
+ activateStampPlacement(libraryId: string, stamp: StampDefinition): PdfTask<void>;
110
+ activateStampPlacementById(libraryId: string, stampId: string): PdfTask<void>;
111
+ getActiveStamp(): ActiveStampInfo | null;
112
+ onActiveStampChange: EventHook<ActiveStampInfo | null>;
113
+ }
114
+ export interface StampCapability {
115
+ getLibraries(): StampLibrary[];
116
+ getStampsByCategory(category: string): ResolvedStamp[];
117
+ renderStamp(libraryId: string, pageIndex: number, width: number, dpr?: number): PdfTask<Blob>;
118
+ loadLibrary(config: StampLibraryConfig): PdfTask<string>;
119
+ loadLibraryFromManifest(url: string): PdfTask<string>;
120
+ createNewLibrary(name: string, options?: {
121
+ categories?: string[];
122
+ id?: string;
123
+ nameKey?: string;
124
+ readonly?: boolean;
125
+ }): PdfTask<string>;
126
+ addStampToLibrary(libraryId: string, stamp: Omit<StampDefinition, 'id' | 'pageIndex'>, pdf: ArrayBuffer): PdfTask<void>;
127
+ removeStampFromLibrary(libraryId: string, stampId: string): PdfTask<void>;
128
+ updateStamp(libraryId: string, stampId: string, updates: StampDefinitionUpdate): PdfTask<void>;
129
+ updateLibrary(libraryId: string, updates: StampLibraryUpdate): PdfTask<void>;
130
+ removeLibrary(id: string): PdfTask<void>;
131
+ exportLibrary(id: string): PdfTask<ExportedStampLibrary>;
132
+ forDocument(documentId: string): StampScope;
133
+ onActiveStampChange: EventHook<ActiveStampChangeEvent>;
134
+ onLibraryChange: EventHook<StampLibrary[]>;
135
+ }
@@ -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-stamp"),r=require("@embedpdf/plugin-annotation/preact"),n=require("preact/jsx-runtime"),s=require("@embedpdf/models"),i=require("@embedpdf/core/preact");require("preact");const a=require("preact/hooks"),o=[r.createRenderer({id:"stampPreview",matchesPreview:e=>e.type===s.PdfAnnotationSubtype.STAMP,renderPreview:({data:e})=>{const t=(4-e.pageRotation)%4*90;return n.jsx("img",{src:e.ghostUrl,style:{width:"100%",height:"100%",opacity:.6,objectFit:"contain",pointerEvents:"none",transform:t?`rotate(${t}deg)`:void 0},alt:""})}})];function u(){return r.useRegisterRenderers(o),null}const c=()=>i.useCapability(t.StampPlugin.id);const p=e.createPluginPackage(t.StampPluginPackage).addUtility(u).build();exports.StampImg=function({libraryId:e,pageIndex:t,width:r,dpr:i,style:o,...u}){const{provides:p}=c(),[d,l]=a.useState(),g=a.useRef(null);return a.useEffect(()=>{if(!p)return;const n=p.renderStamp(e,t,r,i??window.devicePixelRatio);return n.wait(e=>{const t=URL.createObjectURL(e);g.current=t,l(t)},s.ignore),()=>{g.current?(URL.revokeObjectURL(g.current),g.current=null):n.abort({code:s.PdfErrorCode.Cancelled,message:"canceled stamp render task"})}},[p,e,t,r,i]),d?n.jsx("img",{src:d,onLoad:()=>{g.current&&(URL.revokeObjectURL(g.current),g.current=null)},style:o,...u}):null},exports.StampPluginPackage=p,exports.StampRendererRegistration=u,exports.stampPreviewRenderers=o,exports.useActiveStamp=e=>{const{provides:t}=c(),[r,n]=a.useState(null);return a.useEffect(()=>{if(!t)return;const r=t.forDocument(e);return n(r.getActiveStamp()),r.onActiveStampChange(n)},[t,e]),r},exports.useStampCapability=c,exports.useStampLibraries=()=>{const{provides:e}=c(),[t,r]=a.useState((null==e?void 0:e.getLibraries())??[]);return a.useEffect(()=>{if(e)return r(e.getLibraries()),e.onLibraryChange(e=>{r(e)})},[e]),{libraries:t,provides:e}},exports.useStampPlugin=()=>i.usePlugin(t.StampPlugin.id),exports.useStampsByCategory=e=>{const{provides:t}=c(),[r,n]=a.useState([]);return a.useEffect(()=>{if(t)return n(t.getStampsByCategory(e)),t.onLibraryChange(()=>{n(t.getStampsByCategory(e))})},[t,e]),r},exports.useStampsByLibrary=(e,t)=>{const{provides:r}=c(),[n,s]=a.useState([]);return a.useEffect(()=>{if(!r)return;const n=()=>{var n,i;const a=r.getLibraries(),o=[];for(const r of a)if(!e||"all"===e||r.id===e)for(const e of r.stamps){if(t){const s=(null==(n=r.categories)?void 0:n.includes(t))??!1,a=(null==(i=e.categories)?void 0:i.includes(t))??!1;if(!s&&!a)continue}o.push({library:r,stamp:e})}s(o)};return n(),r.onLibraryChange(n)},[r,e,t]),n},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/components/stamp-preview-renderers.tsx","../../src/shared/components/stamp-renderer-registration.tsx","../../src/shared/hooks/use-stamp.ts","../../src/shared/index.ts","../../src/shared/components/stamp-img.tsx"],"sourcesContent":["import { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { createRenderer, BoxedAnnotationRenderer } from '@embedpdf/plugin-annotation/@framework';\nimport { StampPreviewData } from '@embedpdf/plugin-stamp';\n\nexport const stampPreviewRenderers: BoxedAnnotationRenderer[] = [\n createRenderer<never, StampPreviewData>({\n id: 'stampPreview',\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.STAMP,\n renderPreview: ({ data }) => {\n const rotationDeg = ((4 - data.pageRotation) % 4) * 90;\n return (\n <img\n src={data.ghostUrl}\n style={{\n width: '100%',\n height: '100%',\n opacity: 0.6,\n objectFit: 'contain' as const,\n pointerEvents: 'none' as const,\n transform: rotationDeg ? `rotate(${rotationDeg}deg)` : undefined,\n }}\n alt=\"\"\n />\n );\n },\n }),\n];\n","import { useRegisterRenderers } from '@embedpdf/plugin-annotation/@framework';\nimport { stampPreviewRenderers } from './stamp-preview-renderers';\n\nexport function StampRendererRegistration() {\n useRegisterRenderers(stampPreviewRenderers);\n return null;\n}\n","import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { StampPlugin, StampLibrary, ResolvedStamp, ActiveStampInfo } from '@embedpdf/plugin-stamp';\nimport { useState, useEffect } from '@framework';\n\nexport const useStampPlugin = () => usePlugin<StampPlugin>(StampPlugin.id);\nexport const useStampCapability = () => useCapability<StampPlugin>(StampPlugin.id);\n\nexport const useStampLibraries = () => {\n const { provides } = useStampCapability();\n const [libraries, setLibraries] = useState<StampLibrary[]>(provides?.getLibraries() ?? []);\n\n useEffect(() => {\n if (!provides) return;\n setLibraries(provides.getLibraries());\n return provides.onLibraryChange((libs) => {\n setLibraries(libs);\n });\n }, [provides]);\n\n return { libraries, provides };\n};\n\nexport const useStampsByCategory = (category: string) => {\n const { provides } = useStampCapability();\n const [stamps, setStamps] = useState<ResolvedStamp[]>([]);\n\n useEffect(() => {\n if (!provides) return;\n setStamps(provides.getStampsByCategory(category));\n return provides.onLibraryChange(() => {\n setStamps(provides.getStampsByCategory(category));\n });\n }, [provides, category]);\n\n return stamps;\n};\n\nexport const useStampsByLibrary = (libraryId?: string, category?: string) => {\n const { provides } = useStampCapability();\n const [stamps, setStamps] = useState<ResolvedStamp[]>([]);\n\n useEffect(() => {\n if (!provides) return;\n\n const derive = () => {\n const libraries = provides.getLibraries();\n const results: ResolvedStamp[] = [];\n\n for (const library of libraries) {\n if (libraryId && libraryId !== 'all' && library.id !== libraryId) continue;\n\n for (const stamp of library.stamps) {\n if (category) {\n const libraryMatches = library.categories?.includes(category) ?? false;\n const stampMatches = stamp.categories?.includes(category) ?? false;\n if (!libraryMatches && !stampMatches) continue;\n }\n results.push({ library, stamp });\n }\n }\n\n setStamps(results);\n };\n\n derive();\n return provides.onLibraryChange(derive);\n }, [provides, libraryId, category]);\n\n return stamps;\n};\n\nexport const useActiveStamp = (documentId: string) => {\n const { provides: stamp } = useStampCapability();\n const [activeStamp, setActiveStamp] = useState<ActiveStampInfo | null>(null);\n\n useEffect(() => {\n if (!stamp) return;\n const scope = stamp.forDocument(documentId);\n setActiveStamp(scope.getActiveStamp());\n return scope.onActiveStampChange(setActiveStamp);\n }, [stamp, documentId]);\n\n return activeStamp;\n};\n","import { createPluginPackage } from '@embedpdf/core';\nimport { StampPluginPackage as BaseStampPackage } from '@embedpdf/plugin-stamp';\nimport { StampRendererRegistration } from './components/stamp-renderer-registration';\n\nexport * from './hooks';\nexport * from './components';\nexport * from '@embedpdf/plugin-stamp';\n\nexport const StampPluginPackage = createPluginPackage(BaseStampPackage)\n .addUtility(StampRendererRegistration)\n .build();\n","import { useEffect, useState, useRef, HTMLAttributes, CSSProperties } from '@framework';\nimport { ignore, PdfErrorCode } from '@embedpdf/models';\nimport { useStampCapability } from '../hooks';\n\ntype StampImgProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {\n libraryId: string;\n pageIndex: number;\n width: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function StampImg({ libraryId, pageIndex, width, dpr, style, ...props }: StampImgProps) {\n const { provides } = useStampCapability();\n const [url, setUrl] = useState<string>();\n const urlRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n const task = provides.renderStamp(libraryId, pageIndex, width, dpr ?? window.devicePixelRatio);\n\n task.wait((blob) => {\n const objectUrl = URL.createObjectURL(blob);\n urlRef.current = objectUrl;\n setUrl(objectUrl);\n }, ignore);\n\n return () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled stamp render task',\n });\n }\n };\n }, [provides, libraryId, pageIndex, width, dpr]);\n\n const handleImageLoad = () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n }\n };\n\n return url ? <img src={url} onLoad={handleImageLoad} style={style} {...props} /> : null;\n}\n"],"names":["stampPreviewRenderers","createRenderer","id","matchesPreview","p","type","PdfAnnotationSubtype","STAMP","renderPreview","data","rotationDeg","pageRotation","jsx","src","ghostUrl","style","width","height","opacity","objectFit","pointerEvents","transform","alt","StampRendererRegistration","useRegisterRenderers","useStampCapability","useCapability","StampPlugin","StampPluginPackage","createPluginPackage","BaseStampPackage","addUtility","build","libraryId","pageIndex","dpr","props","provides","url","setUrl","useState","urlRef","useRef","useEffect","task","renderStamp","window","devicePixelRatio","wait","blob","objectUrl","URL","createObjectURL","current","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","onLoad","documentId","stamp","activeStamp","setActiveStamp","scope","forDocument","getActiveStamp","onActiveStampChange","libraries","setLibraries","getLibraries","onLibraryChange","libs","usePlugin","category","stamps","setStamps","getStampsByCategory","derive","results","library","libraryMatches","_a","categories","includes","stampMatches","_b","push"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from '../shared-preact';
@@ -0,0 +1,147 @@
1
+ import { createPluginPackage } from "@embedpdf/core";
2
+ import { StampPlugin, StampPluginPackage as StampPluginPackage$1 } from "@embedpdf/plugin-stamp";
3
+ export * from "@embedpdf/plugin-stamp";
4
+ import { createRenderer, useRegisterRenderers } from "@embedpdf/plugin-annotation/preact";
5
+ import { jsx } from "preact/jsx-runtime";
6
+ import { PdfAnnotationSubtype, ignore, PdfErrorCode } from "@embedpdf/models";
7
+ import { useCapability, usePlugin } from "@embedpdf/core/preact";
8
+ import "preact";
9
+ import { useState, useEffect, useRef } from "preact/hooks";
10
+ const stampPreviewRenderers = [
11
+ createRenderer({
12
+ id: "stampPreview",
13
+ matchesPreview: (p) => p.type === PdfAnnotationSubtype.STAMP,
14
+ renderPreview: ({ data }) => {
15
+ const rotationDeg = (4 - data.pageRotation) % 4 * 90;
16
+ return /* @__PURE__ */ jsx(
17
+ "img",
18
+ {
19
+ src: data.ghostUrl,
20
+ style: {
21
+ width: "100%",
22
+ height: "100%",
23
+ opacity: 0.6,
24
+ objectFit: "contain",
25
+ pointerEvents: "none",
26
+ transform: rotationDeg ? `rotate(${rotationDeg}deg)` : void 0
27
+ },
28
+ alt: ""
29
+ }
30
+ );
31
+ }
32
+ })
33
+ ];
34
+ function StampRendererRegistration() {
35
+ useRegisterRenderers(stampPreviewRenderers);
36
+ return null;
37
+ }
38
+ const useStampPlugin = () => usePlugin(StampPlugin.id);
39
+ const useStampCapability = () => useCapability(StampPlugin.id);
40
+ const useStampLibraries = () => {
41
+ const { provides } = useStampCapability();
42
+ const [libraries, setLibraries] = useState((provides == null ? void 0 : provides.getLibraries()) ?? []);
43
+ useEffect(() => {
44
+ if (!provides) return;
45
+ setLibraries(provides.getLibraries());
46
+ return provides.onLibraryChange((libs) => {
47
+ setLibraries(libs);
48
+ });
49
+ }, [provides]);
50
+ return { libraries, provides };
51
+ };
52
+ const useStampsByCategory = (category) => {
53
+ const { provides } = useStampCapability();
54
+ const [stamps, setStamps] = useState([]);
55
+ useEffect(() => {
56
+ if (!provides) return;
57
+ setStamps(provides.getStampsByCategory(category));
58
+ return provides.onLibraryChange(() => {
59
+ setStamps(provides.getStampsByCategory(category));
60
+ });
61
+ }, [provides, category]);
62
+ return stamps;
63
+ };
64
+ const useStampsByLibrary = (libraryId, category) => {
65
+ const { provides } = useStampCapability();
66
+ const [stamps, setStamps] = useState([]);
67
+ useEffect(() => {
68
+ if (!provides) return;
69
+ const derive = () => {
70
+ var _a, _b;
71
+ const libraries = provides.getLibraries();
72
+ const results = [];
73
+ for (const library of libraries) {
74
+ if (libraryId && libraryId !== "all" && library.id !== libraryId) continue;
75
+ for (const stamp of library.stamps) {
76
+ if (category) {
77
+ const libraryMatches = ((_a = library.categories) == null ? void 0 : _a.includes(category)) ?? false;
78
+ const stampMatches = ((_b = stamp.categories) == null ? void 0 : _b.includes(category)) ?? false;
79
+ if (!libraryMatches && !stampMatches) continue;
80
+ }
81
+ results.push({ library, stamp });
82
+ }
83
+ }
84
+ setStamps(results);
85
+ };
86
+ derive();
87
+ return provides.onLibraryChange(derive);
88
+ }, [provides, libraryId, category]);
89
+ return stamps;
90
+ };
91
+ const useActiveStamp = (documentId) => {
92
+ const { provides: stamp } = useStampCapability();
93
+ const [activeStamp, setActiveStamp] = useState(null);
94
+ useEffect(() => {
95
+ if (!stamp) return;
96
+ const scope = stamp.forDocument(documentId);
97
+ setActiveStamp(scope.getActiveStamp());
98
+ return scope.onActiveStampChange(setActiveStamp);
99
+ }, [stamp, documentId]);
100
+ return activeStamp;
101
+ };
102
+ function StampImg({ libraryId, pageIndex, width, dpr, style, ...props }) {
103
+ const { provides } = useStampCapability();
104
+ const [url, setUrl] = useState();
105
+ const urlRef = useRef(null);
106
+ useEffect(() => {
107
+ if (!provides) return;
108
+ const task = provides.renderStamp(libraryId, pageIndex, width, dpr ?? window.devicePixelRatio);
109
+ task.wait((blob) => {
110
+ const objectUrl = URL.createObjectURL(blob);
111
+ urlRef.current = objectUrl;
112
+ setUrl(objectUrl);
113
+ }, ignore);
114
+ return () => {
115
+ if (urlRef.current) {
116
+ URL.revokeObjectURL(urlRef.current);
117
+ urlRef.current = null;
118
+ } else {
119
+ task.abort({
120
+ code: PdfErrorCode.Cancelled,
121
+ message: "canceled stamp render task"
122
+ });
123
+ }
124
+ };
125
+ }, [provides, libraryId, pageIndex, width, dpr]);
126
+ const handleImageLoad = () => {
127
+ if (urlRef.current) {
128
+ URL.revokeObjectURL(urlRef.current);
129
+ urlRef.current = null;
130
+ }
131
+ };
132
+ return url ? /* @__PURE__ */ jsx("img", { src: url, onLoad: handleImageLoad, style, ...props }) : null;
133
+ }
134
+ const StampPluginPackage = createPluginPackage(StampPluginPackage$1).addUtility(StampRendererRegistration).build();
135
+ export {
136
+ StampImg,
137
+ StampPluginPackage,
138
+ StampRendererRegistration,
139
+ stampPreviewRenderers,
140
+ useActiveStamp,
141
+ useStampCapability,
142
+ useStampLibraries,
143
+ useStampPlugin,
144
+ useStampsByCategory,
145
+ useStampsByLibrary
146
+ };
147
+ //# sourceMappingURL=index.js.map