@embedpdf/plugin-capture 1.5.0 → 2.0.0-next.1

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 (36) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +215 -35
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/actions.d.ts +33 -0
  6. package/dist/lib/capture-plugin.d.ts +12 -3
  7. package/dist/lib/index.d.ts +5 -2
  8. package/dist/lib/reducer.d.ts +6 -0
  9. package/dist/lib/types.d.ts +27 -2
  10. package/dist/preact/index.cjs +1 -1
  11. package/dist/preact/index.cjs.map +1 -1
  12. package/dist/preact/index.js +25 -16
  13. package/dist/preact/index.js.map +1 -1
  14. package/dist/react/index.cjs +1 -1
  15. package/dist/react/index.cjs.map +1 -1
  16. package/dist/react/index.js +25 -16
  17. package/dist/react/index.js.map +1 -1
  18. package/dist/shared/components/marquee-capture.d.ts +4 -2
  19. package/dist/shared/hooks/use-capture.d.ts +8 -4
  20. package/dist/shared-preact/components/marquee-capture.d.ts +4 -2
  21. package/dist/shared-preact/hooks/use-capture.d.ts +8 -4
  22. package/dist/shared-react/components/marquee-capture.d.ts +4 -2
  23. package/dist/shared-react/hooks/use-capture.d.ts +8 -4
  24. package/dist/svelte/components/MarqueeCapture.svelte.d.ts +3 -1
  25. package/dist/svelte/hooks/use-capture.svelte.d.ts +11 -5
  26. package/dist/svelte/index.cjs +1 -1
  27. package/dist/svelte/index.cjs.map +1 -1
  28. package/dist/svelte/index.js +54 -35
  29. package/dist/svelte/index.js.map +1 -1
  30. package/dist/vue/components/marquee-capture.vue.d.ts +5 -2
  31. package/dist/vue/hooks/use-capture.d.ts +13 -4
  32. package/dist/vue/index.cjs +1 -1
  33. package/dist/vue/index.cjs.map +1 -1
  34. package/dist/vue/index.js +53 -34
  35. package/dist/vue/index.js.map +1 -1
  36. package/package.json +8 -8
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),a=require("@embedpdf/models"),t="capture",i={id:t,name:"Capture Plugin",version:"1.0.0",provides:["capture"],requires:["render"],optional:["interaction-manager"],defaultConfig:{enabled:!0,scale:1,imageType:"image/png",withAnnotations:!1}};const r=class extends e.BasePlugin{constructor(a,t,i){var r;super(a,t),this.captureArea$=e.createEmitter(),this.marqueeCaptureActive$=e.createBehaviorEmitter(),this.config=i,this.renderCapability=this.registry.getPlugin("render").provides(),this.interactionManagerCapability=null==(r=this.registry.getPlugin("interaction-manager"))?void 0:r.provides(),this.interactionManagerCapability&&(this.interactionManagerCapability.registerMode({id:"marqueeCapture",scope:"page",exclusive:!0,cursor:"crosshair"}),this.interactionManagerCapability.onModeChange((e=>{"marqueeCapture"===e.activeMode?this.marqueeCaptureActive$.emit(!0):this.marqueeCaptureActive$.emit(!1)})))}async initialize(e){}buildCapability(){return{onCaptureArea:this.captureArea$.on,onMarqueeCaptureActiveChange:this.marqueeCaptureActive$.on,captureArea:this.captureArea.bind(this),enableMarqueeCapture:this.enableMarqueeCapture.bind(this),disableMarqueeCapture:this.disableMarqueeCapture.bind(this),toggleMarqueeCapture:this.toggleMarqueeCapture.bind(this),isMarqueeCaptureActive:()=>{var e;return"marqueeCapture"===(null==(e=this.interactionManagerCapability)?void 0:e.getActiveMode())},registerMarqueeOnPage:e=>this.registerMarqueeOnPage(e)}}registerMarqueeOnPage(a){if(!this.interactionManagerCapability)return this.logger.warn("CapturePlugin","MissingDependency","Interaction manager plugin not loaded, marquee capture disabled"),()=>{};const t=this.coreState.core.document;if(!t)return this.logger.warn("CapturePlugin","DocumentNotFound","Document not found"),()=>{};const i=t.pages[a.pageIndex];if(!i)return this.logger.warn("CapturePlugin","PageNotFound",`Page ${a.pageIndex} not found`),()=>{};const r=function(a){const{pageSize:t,scale:i,minDragPx:r=5,onPreview:n,onCommit:u}=a;let l=null,o=null;return{onPointerDown:(e,a)=>{var t;l=e,o={origin:{x:e.x,y:e.y},size:{width:0,height:0}},null==n||n(o),null==(t=a.setPointerCapture)||t.call(a)},onPointerMove:a=>{if(!l)return;const i=e.clamp(a.x,0,t.width),r=e.clamp(a.y,0,t.height);o={origin:{x:Math.min(l.x,i),y:Math.min(l.y,r)},size:{width:Math.abs(i-l.x),height:Math.abs(r-l.y)}},null==n||n(o)},onPointerUp:(e,a)=>{var t;o&&Math.max(o.size.width,o.size.height)*i>r&&(null==u||u(o)),l=null,o=null,null==n||n(null),null==(t=a.releasePointerCapture)||t.call(a)},onPointerCancel:(e,a)=>{var t;l=null,o=null,null==n||n(null),null==(t=a.releasePointerCapture)||t.call(a)}}}({pageSize:i.size,scale:a.scale,onPreview:a.callback.onPreview,onCommit:e=>{var t,i;this.captureArea(a.pageIndex,e),null==(i=(t=a.callback).onCommit)||i.call(t,e)}});return this.interactionManagerCapability.registerHandlers({modeId:"marqueeCapture",handlers:r,pageIndex:a.pageIndex})}captureArea(e,t){this.disableMarqueeCapture();this.renderCapability.renderPageRect({pageIndex:e,rect:t,options:{imageType:this.config.imageType,scaleFactor:this.config.scale,withAnnotations:this.config.withAnnotations||!1}}).wait((a=>{this.captureArea$.emit({pageIndex:e,rect:t,blob:a,imageType:this.config.imageType||"image/png",scale:this.config.scale||1,withAnnotations:this.config.withAnnotations||!1})}),a.ignore)}enableMarqueeCapture(){var e;null==(e=this.interactionManagerCapability)||e.activate("marqueeCapture")}disableMarqueeCapture(){var e;null==(e=this.interactionManagerCapability)||e.activateDefaultMode()}toggleMarqueeCapture(){var e,a,t;"marqueeCapture"===(null==(e=this.interactionManagerCapability)?void 0:e.getActiveMode())?null==(a=this.interactionManagerCapability)||a.activateDefaultMode():null==(t=this.interactionManagerCapability)||t.activate("marqueeCapture")}};r.id="capture";let n=r;const u={manifest:i,create:(e,a)=>new n(t,e,a),reducer:()=>{},initialState:{}};exports.CAPTURE_PLUGIN_ID=t,exports.CapturePlugin=n,exports.CapturePluginPackage=u,exports.manifest=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),t=require("@embedpdf/models"),a="capture",r={id:a,name:"Capture Plugin",version:"1.0.0",provides:["capture"],requires:["render"],optional:["interaction-manager"],defaultConfig:{enabled:!0,scale:1,imageType:"image/png",withAnnotations:!1}};const n="CAPTURE/INIT_STATE",i="CAPTURE/CLEANUP_STATE",o="CAPTURE/SET_ACTIVE_DOCUMENT",u="CAPTURE/SET_MARQUEE_CAPTURE_ACTIVE";function c(e,t){return{type:n,payload:{documentId:e,state:t}}}function s(e){return{type:i,payload:e}}function l(e,t){return{type:u,payload:{documentId:e,isActive:t}}}const p={isMarqueeCaptureActive:!1},d={documents:{},activeDocumentId:null},g=(e=d,t)=>{switch(t.type){case n:{const{documentId:a,state:r}=t.payload;return{...e,documents:{...e.documents,[a]:r},activeDocumentId:e.activeDocumentId??a}}case i:{const a=t.payload,{[a]:r,...n}=e.documents;return{...e,documents:n,activeDocumentId:e.activeDocumentId===a?null:e.activeDocumentId}}case o:return{...e,activeDocumentId:t.payload};case u:{const{documentId:a,isActive:r}=t.payload,n=e.documents[a];return n?{...e,documents:{...e.documents,[a]:{...n,isMarqueeCaptureActive:r}}}:e}default:return e}},m=class extends e.BasePlugin{constructor(t,a,r){var n;super(t,a),this.captureArea$=e.createEmitter(),this.state$=e.createBehaviorEmitter(),this.config=r,this.renderCapability=this.registry.getPlugin("render").provides(),this.interactionManagerCapability=null==(n=this.registry.getPlugin("interaction-manager"))?void 0:n.provides(),this.interactionManagerCapability&&(this.interactionManagerCapability.registerMode({id:"marqueeCapture",scope:"page",exclusive:!0,cursor:"crosshair"}),this.interactionManagerCapability.onModeChange(e=>{const t="marqueeCapture"===e.activeMode,a=this.getDocumentState(e.documentId);a&&a.isMarqueeCaptureActive!==t&&this.dispatch(l(e.documentId,t))}))}onDocumentLoadingStarted(e){const t={...p};this.dispatch(c(e,t)),this.logger.debug("CapturePlugin","DocumentOpened",`Initialized capture state for document: ${e}`)}onDocumentClosed(e){this.dispatch(s(e)),this.logger.debug("CapturePlugin","DocumentClosed",`Cleaned up capture state for document: ${e}`)}async initialize(e){}buildCapability(){return{captureArea:(e,t)=>this.captureArea(e,t),enableMarqueeCapture:()=>this.enableMarqueeCapture(),disableMarqueeCapture:()=>this.disableMarqueeCapture(),toggleMarqueeCapture:()=>this.toggleMarqueeCapture(),isMarqueeCaptureActive:()=>this.isMarqueeCaptureActive(),getState:()=>this.getDocumentStateOrThrow(),forDocument:e=>this.createCaptureScope(e),registerMarqueeOnPage:e=>this.registerMarqueeOnPage(e),onCaptureArea:this.captureArea$.on,onStateChange:this.state$.on}}createCaptureScope(e){return{captureArea:(t,a)=>this.captureArea(t,a,e),enableMarqueeCapture:()=>this.enableMarqueeCapture(e),disableMarqueeCapture:()=>this.disableMarqueeCapture(e),toggleMarqueeCapture:()=>this.toggleMarqueeCapture(e),isMarqueeCaptureActive:()=>this.isMarqueeCaptureActive(e),getState:()=>this.getDocumentStateOrThrow(e),onCaptureArea:t=>this.captureArea$.on(a=>{a.documentId===e&&t(a)}),onStateChange:t=>this.state$.on(a=>{a.documentId===e&&t(a.state)})}}getDocumentState(e){const t=e??this.getActiveDocumentId();return this.state.documents[t]??null}getDocumentStateOrThrow(e){const t=this.getDocumentState(e);if(!t)throw new Error(`Capture state not found for document: ${e??"active"}`);return t}registerMarqueeOnPage(t){if(!this.interactionManagerCapability)return this.logger.warn("CapturePlugin","MissingDependency","Interaction manager plugin not loaded, marquee capture disabled"),()=>{};const a=this.coreState.core.documents[t.documentId];if(!a||!a.document)return this.logger.warn("CapturePlugin","DocumentNotFound","Document not found"),()=>{};const r=a.document.pages[t.pageIndex];if(!r)return this.logger.warn("CapturePlugin","PageNotFound",`Page ${t.pageIndex} not found`),()=>{};const n=function(t){const{pageSize:a,scale:r,minDragPx:n=5,onPreview:i,onCommit:o}=t;let u=null,c=null;return{onPointerDown:(e,t)=>{var a;u=e,c={origin:{x:e.x,y:e.y},size:{width:0,height:0}},null==i||i(c),null==(a=t.setPointerCapture)||a.call(t)},onPointerMove:t=>{if(!u)return;const r=e.clamp(t.x,0,a.width),n=e.clamp(t.y,0,a.height);c={origin:{x:Math.min(u.x,r),y:Math.min(u.y,n)},size:{width:Math.abs(r-u.x),height:Math.abs(n-u.y)}},null==i||i(c)},onPointerUp:(e,t)=>{var a;c&&Math.max(c.size.width,c.size.height)*r>n&&(null==o||o(c)),u=null,c=null,null==i||i(null),null==(a=t.releasePointerCapture)||a.call(t)},onPointerCancel:(e,t)=>{var a;u=null,c=null,null==i||i(null),null==(a=t.releasePointerCapture)||a.call(t)}}}({pageSize:r.size,scale:t.scale,onPreview:t.callback.onPreview,onCommit:e=>{var a,r;this.captureArea(t.pageIndex,e,t.documentId),null==(r=(a=t.callback).onCommit)||r.call(a,e)}});return this.interactionManagerCapability.registerHandlers({documentId:t.documentId,modeId:"marqueeCapture",handlers:n,pageIndex:t.pageIndex})}captureArea(e,a,r){const n=r??this.getActiveDocumentId();this.disableMarqueeCapture(n);this.renderCapability.forDocument(n).renderPageRect({pageIndex:e,rect:a,options:{imageType:this.config.imageType,scaleFactor:this.config.scale,withAnnotations:this.config.withAnnotations||!1}}).wait(t=>{this.captureArea$.emit({documentId:n,pageIndex:e,rect:a,blob:t,imageType:this.config.imageType||"image/png",scale:this.config.scale||1,withAnnotations:this.config.withAnnotations||!1})},t.ignore)}enableMarqueeCapture(e){var t;const a=e??this.getActiveDocumentId();null==(t=this.interactionManagerCapability)||t.forDocument(a).activate("marqueeCapture")}disableMarqueeCapture(e){var t;const a=e??this.getActiveDocumentId();null==(t=this.interactionManagerCapability)||t.forDocument(a).activateDefaultMode()}toggleMarqueeCapture(e){var t;const a=e??this.getActiveDocumentId(),r=null==(t=this.interactionManagerCapability)?void 0:t.forDocument(a);"marqueeCapture"===(null==r?void 0:r.getActiveMode())?r.activateDefaultMode():null==r||r.activate("marqueeCapture")}isMarqueeCaptureActive(e){var t;const a=e??this.getActiveDocumentId();return"marqueeCapture"===(null==(t=this.interactionManagerCapability)?void 0:t.forDocument(a).getActiveMode())}onStoreUpdated(e,t){for(const a in t.documents){const r=e.documents[a],n=t.documents[a];r&&n&&r.isMarqueeCaptureActive!==n.isMarqueeCaptureActive&&this.state$.emit({documentId:a,state:n})}}async destroy(){this.captureArea$.clear(),this.state$.clear(),super.destroy()}};m.id="capture";let h=m;const C={manifest:r,create:(e,t)=>new h(a,e,t),reducer:g,initialState:d};exports.CAPTURE_PLUGIN_ID=a,exports.CLEANUP_CAPTURE_STATE=i,exports.CapturePlugin=h,exports.CapturePluginPackage=C,exports.INIT_CAPTURE_STATE=n,exports.SET_ACTIVE_DOCUMENT=o,exports.SET_MARQUEE_CAPTURE_ACTIVE=u,exports.captureReducer=g,exports.cleanupCaptureState=s,exports.initCaptureState=c,exports.initialDocumentState=p,exports.initialState=d,exports.manifest=r,exports.setActiveDocument=function(e){return{type:o,payload:e}},exports.setMarqueeCaptureActive=l;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/lib/manifest.ts","../src/lib/capture-plugin.ts","../src/lib/handlers/marquee-capture.handler.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { CapturePluginConfig } from './types';\n\nexport const CAPTURE_PLUGIN_ID = 'capture';\n\nexport const manifest: PluginManifest<CapturePluginConfig> = {\n id: CAPTURE_PLUGIN_ID,\n name: 'Capture Plugin',\n version: '1.0.0',\n provides: ['capture'],\n requires: ['render'],\n optional: ['interaction-manager'],\n defaultConfig: {\n enabled: true,\n scale: 1,\n imageType: 'image/png',\n withAnnotations: false,\n },\n};\n","import { BasePlugin, createBehaviorEmitter, createEmitter, PluginRegistry } from '@embedpdf/core';\nimport { ignore, Rect } from '@embedpdf/models';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { RenderCapability, RenderPlugin } from '@embedpdf/plugin-render';\n\nimport {\n CaptureAreaEvent,\n CaptureCapability,\n CapturePluginConfig,\n RegisterMarqueeOnPageOptions,\n} from './types';\nimport { createMarqueeHandler } from './handlers';\n\nexport class CapturePlugin extends BasePlugin<CapturePluginConfig, CaptureCapability> {\n static readonly id = 'capture' as const;\n\n private captureArea$ = createEmitter<CaptureAreaEvent>();\n private marqueeCaptureActive$ = createBehaviorEmitter<boolean>();\n\n private renderCapability: RenderCapability;\n private interactionManagerCapability: InteractionManagerCapability | undefined;\n private config: CapturePluginConfig;\n\n constructor(id: string, registry: PluginRegistry, config: CapturePluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n this.renderCapability = this.registry.getPlugin<RenderPlugin>('render')!.provides();\n this.interactionManagerCapability = this.registry\n .getPlugin<InteractionManagerPlugin>('interaction-manager')\n ?.provides();\n\n if (this.interactionManagerCapability) {\n this.interactionManagerCapability.registerMode({\n id: 'marqueeCapture',\n scope: 'page',\n exclusive: true,\n cursor: 'crosshair',\n });\n\n this.interactionManagerCapability.onModeChange((state) => {\n if (state.activeMode === 'marqueeCapture') {\n this.marqueeCaptureActive$.emit(true);\n } else {\n this.marqueeCaptureActive$.emit(false);\n }\n });\n }\n }\n\n async initialize(_: CapturePluginConfig): Promise<void> {}\n\n protected buildCapability(): CaptureCapability {\n return {\n onCaptureArea: this.captureArea$.on,\n onMarqueeCaptureActiveChange: this.marqueeCaptureActive$.on,\n captureArea: this.captureArea.bind(this),\n enableMarqueeCapture: this.enableMarqueeCapture.bind(this),\n disableMarqueeCapture: this.disableMarqueeCapture.bind(this),\n toggleMarqueeCapture: this.toggleMarqueeCapture.bind(this),\n isMarqueeCaptureActive: () =>\n this.interactionManagerCapability?.getActiveMode() === 'marqueeCapture',\n registerMarqueeOnPage: (opts) => this.registerMarqueeOnPage(opts),\n };\n }\n\n public registerMarqueeOnPage(opts: RegisterMarqueeOnPageOptions) {\n if (!this.interactionManagerCapability) {\n this.logger.warn(\n 'CapturePlugin',\n 'MissingDependency',\n 'Interaction manager plugin not loaded, marquee capture disabled',\n );\n return () => {};\n }\n\n const document = this.coreState.core.document;\n if (!document) {\n this.logger.warn('CapturePlugin', 'DocumentNotFound', 'Document not found');\n return () => {};\n }\n\n const page = document.pages[opts.pageIndex];\n if (!page) {\n this.logger.warn('CapturePlugin', 'PageNotFound', `Page ${opts.pageIndex} not found`);\n return () => {};\n }\n\n const handlers = createMarqueeHandler({\n pageSize: page.size,\n scale: opts.scale,\n onPreview: opts.callback.onPreview,\n onCommit: (rect) => {\n // Capture the selected area\n this.captureArea(opts.pageIndex, rect);\n opts.callback.onCommit?.(rect);\n },\n });\n\n const off = this.interactionManagerCapability.registerHandlers({\n modeId: 'marqueeCapture',\n handlers,\n pageIndex: opts.pageIndex,\n });\n\n return off;\n }\n\n private captureArea(pageIndex: number, rect: Rect) {\n this.disableMarqueeCapture();\n\n const task = this.renderCapability.renderPageRect({\n pageIndex,\n rect,\n options: {\n imageType: this.config.imageType,\n scaleFactor: this.config.scale,\n withAnnotations: this.config.withAnnotations || false,\n },\n });\n\n task.wait((blob) => {\n this.captureArea$.emit({\n pageIndex,\n rect,\n blob,\n imageType: this.config.imageType || 'image/png',\n scale: this.config.scale || 1,\n withAnnotations: this.config.withAnnotations || false,\n });\n }, ignore);\n }\n\n private enableMarqueeCapture() {\n this.interactionManagerCapability?.activate('marqueeCapture');\n }\n\n private disableMarqueeCapture() {\n this.interactionManagerCapability?.activateDefaultMode();\n }\n\n private toggleMarqueeCapture() {\n if (this.interactionManagerCapability?.getActiveMode() === 'marqueeCapture') {\n this.interactionManagerCapability?.activateDefaultMode();\n } else {\n this.interactionManagerCapability?.activate('marqueeCapture');\n }\n }\n}\n","import { Position, Rect, Size } from '@embedpdf/models';\nimport { clamp } from '@embedpdf/core';\nimport {\n EmbedPdfPointerEvent,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport function createMarqueeHandler(opts: {\n pageSize: Size;\n scale: number;\n minDragPx?: number;\n onPreview?: (rect: Rect | null) => void;\n onCommit?: (rect: Rect) => void;\n}): PointerEventHandlersWithLifecycle<EmbedPdfPointerEvent> {\n const { pageSize, scale, minDragPx = 5, onPreview, onCommit } = opts;\n\n let start: Position | null = null;\n let last: Rect | null = null;\n\n return {\n onPointerDown: (pos, evt) => {\n start = pos;\n last = { origin: { x: pos.x, y: pos.y }, size: { width: 0, height: 0 } };\n onPreview?.(last);\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageSize.width);\n const y = clamp(pos.y, 0, pageSize.height);\n last = {\n origin: { x: Math.min(start.x, x), y: Math.min(start.y, y) },\n size: { width: Math.abs(x - start.x), height: Math.abs(y - start.y) },\n };\n onPreview?.(last);\n },\n onPointerUp: (_pos, evt) => {\n if (last) {\n const dragPx = Math.max(last.size.width, last.size.height) * scale;\n if (dragPx > minDragPx) {\n onCommit?.(last);\n }\n }\n start = null;\n last = null;\n onPreview?.(null);\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_pos, evt) => {\n start = null;\n last = null;\n onPreview?.(null);\n evt.releasePointerCapture?.();\n },\n };\n}\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, CAPTURE_PLUGIN_ID } from './manifest';\nimport { CapturePluginConfig } from './types';\nimport { CapturePlugin } from './capture-plugin';\n\nexport const CapturePluginPackage: PluginPackage<CapturePlugin, CapturePluginConfig> = {\n manifest,\n create: (registry, config) => new CapturePlugin(CAPTURE_PLUGIN_ID, registry, config),\n reducer: () => {},\n initialState: {},\n};\n\nexport * from './capture-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"names":["CAPTURE_PLUGIN_ID","manifest","id","name","version","provides","requires","optional","defaultConfig","enabled","scale","imageType","withAnnotations","_CapturePlugin","BasePlugin","constructor","registry","config","super","this","captureArea$","createEmitter","marqueeCaptureActive$","createBehaviorEmitter","renderCapability","getPlugin","interactionManagerCapability","_a","registerMode","scope","exclusive","cursor","onModeChange","state","activeMode","emit","initialize","_","buildCapability","onCaptureArea","on","onMarqueeCaptureActiveChange","captureArea","bind","enableMarqueeCapture","disableMarqueeCapture","toggleMarqueeCapture","isMarqueeCaptureActive","getActiveMode","registerMarqueeOnPage","opts","logger","warn","document","coreState","core","page","pages","pageIndex","handlers","pageSize","minDragPx","onPreview","onCommit","start","last","onPointerDown","pos","evt","origin","x","y","size","width","height","setPointerCapture","call","onPointerMove","clamp","Math","min","abs","onPointerUp","_pos","max","releasePointerCapture","onPointerCancel","createMarqueeHandler","callback","rect","_b","registerHandlers","modeId","renderPageRect","options","scaleFactor","wait","blob","ignore","activate","activateDefaultMode","_c","CapturePlugin","CapturePluginPackage","create","reducer","initialState"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/capture-plugin.ts","../src/lib/handlers/marquee-capture.handler.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { CapturePluginConfig } from './types';\n\nexport const CAPTURE_PLUGIN_ID = 'capture';\n\nexport const manifest: PluginManifest<CapturePluginConfig> = {\n id: CAPTURE_PLUGIN_ID,\n name: 'Capture Plugin',\n version: '1.0.0',\n provides: ['capture'],\n requires: ['render'],\n optional: ['interaction-manager'],\n defaultConfig: {\n enabled: true,\n scale: 1,\n imageType: 'image/png',\n withAnnotations: false,\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { CaptureDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_CAPTURE_STATE = 'CAPTURE/INIT_STATE';\nexport const CLEANUP_CAPTURE_STATE = 'CAPTURE/CLEANUP_STATE';\nexport const SET_ACTIVE_DOCUMENT = 'CAPTURE/SET_ACTIVE_DOCUMENT';\n\n// Per-document actions\nexport const SET_MARQUEE_CAPTURE_ACTIVE = 'CAPTURE/SET_MARQUEE_CAPTURE_ACTIVE';\n\n// Document lifecycle actions\nexport interface InitCaptureStateAction extends Action {\n type: typeof INIT_CAPTURE_STATE;\n payload: {\n documentId: string;\n state: CaptureDocumentState;\n };\n}\n\nexport interface CleanupCaptureStateAction extends Action {\n type: typeof CLEANUP_CAPTURE_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveDocumentAction extends Action {\n type: typeof SET_ACTIVE_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetMarqueeCaptureActiveAction extends Action {\n type: typeof SET_MARQUEE_CAPTURE_ACTIVE;\n payload: {\n documentId: string;\n isActive: boolean;\n };\n}\n\nexport type CaptureAction =\n | InitCaptureStateAction\n | CleanupCaptureStateAction\n | SetActiveDocumentAction\n | SetMarqueeCaptureActiveAction;\n\n// Action Creators\nexport function initCaptureState(\n documentId: string,\n state: CaptureDocumentState,\n): InitCaptureStateAction {\n return { type: INIT_CAPTURE_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupCaptureState(documentId: string): CleanupCaptureStateAction {\n return { type: CLEANUP_CAPTURE_STATE, payload: documentId };\n}\n\nexport function setActiveDocument(documentId: string | null): SetActiveDocumentAction {\n return { type: SET_ACTIVE_DOCUMENT, payload: documentId };\n}\n\nexport function setMarqueeCaptureActive(\n documentId: string,\n isActive: boolean,\n): SetMarqueeCaptureActiveAction {\n return { type: SET_MARQUEE_CAPTURE_ACTIVE, payload: { documentId, isActive } };\n}\n","import { Reducer } from '@embedpdf/core';\nimport {\n CaptureAction,\n INIT_CAPTURE_STATE,\n CLEANUP_CAPTURE_STATE,\n SET_ACTIVE_DOCUMENT,\n SET_MARQUEE_CAPTURE_ACTIVE,\n} from './actions';\nimport { CaptureState, CaptureDocumentState } from './types';\n\nexport const initialDocumentState: CaptureDocumentState = {\n isMarqueeCaptureActive: false,\n};\n\nexport const initialState: CaptureState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const captureReducer: Reducer<CaptureState, CaptureAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n case INIT_CAPTURE_STATE: {\n const { documentId, state: docState } = action.payload;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: docState,\n },\n // Set as active if no active document\n activeDocumentId: state.activeDocumentId ?? documentId,\n };\n }\n\n case CLEANUP_CAPTURE_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remainingDocs } = state.documents;\n return {\n ...state,\n documents: remainingDocs,\n activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId,\n };\n }\n\n case SET_ACTIVE_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_MARQUEE_CAPTURE_ACTIVE: {\n const { documentId, isActive } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n isMarqueeCaptureActive: isActive,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import {\n BasePlugin,\n createBehaviorEmitter,\n createEmitter,\n PluginRegistry,\n Listener,\n} from '@embedpdf/core';\nimport { ignore, Rect } from '@embedpdf/models';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { RenderCapability, RenderPlugin } from '@embedpdf/plugin-render';\n\nimport {\n CaptureAreaEvent,\n CaptureCapability,\n CapturePluginConfig,\n RegisterMarqueeOnPageOptions,\n CaptureState,\n CaptureScope,\n StateChangeEvent,\n CaptureDocumentState,\n} from './types';\nimport { createMarqueeHandler } from './handlers';\nimport {\n CaptureAction,\n initCaptureState,\n cleanupCaptureState,\n setMarqueeCaptureActive,\n} from './actions';\nimport { initialDocumentState } from './reducer';\n\nexport class CapturePlugin extends BasePlugin<\n CapturePluginConfig,\n CaptureCapability,\n CaptureState,\n CaptureAction\n> {\n static readonly id = 'capture' as const;\n\n private captureArea$ = createEmitter<CaptureAreaEvent>();\n private state$ = createBehaviorEmitter<StateChangeEvent>();\n\n private renderCapability: RenderCapability;\n private interactionManagerCapability: InteractionManagerCapability | undefined;\n private config: CapturePluginConfig;\n\n constructor(id: string, registry: PluginRegistry, config: CapturePluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n this.renderCapability = this.registry.getPlugin<RenderPlugin>('render')!.provides();\n this.interactionManagerCapability = this.registry\n .getPlugin<InteractionManagerPlugin>('interaction-manager')\n ?.provides();\n\n if (this.interactionManagerCapability) {\n this.interactionManagerCapability.registerMode({\n id: 'marqueeCapture',\n scope: 'page',\n exclusive: true,\n cursor: 'crosshair',\n });\n\n this.interactionManagerCapability.onModeChange((state) => {\n // Track marquee capture state changes for this document\n const isMarqueeActive = state.activeMode === 'marqueeCapture';\n const docState = this.getDocumentState(state.documentId);\n\n // Only dispatch if state actually changed\n if (docState && docState.isMarqueeCaptureActive !== isMarqueeActive) {\n this.dispatch(setMarqueeCaptureActive(state.documentId, isMarqueeActive));\n }\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize capture state for this document\n const docState: CaptureDocumentState = {\n ...initialDocumentState,\n };\n\n this.dispatch(initCaptureState(documentId, docState));\n\n this.logger.debug(\n 'CapturePlugin',\n 'DocumentOpened',\n `Initialized capture state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.dispatch(cleanupCaptureState(documentId));\n\n this.logger.debug(\n 'CapturePlugin',\n 'DocumentClosed',\n `Cleaned up capture state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: CapturePluginConfig): Promise<void> {}\n\n protected buildCapability(): CaptureCapability {\n return {\n // Active document operations\n captureArea: (pageIndex, rect) => this.captureArea(pageIndex, rect),\n enableMarqueeCapture: () => this.enableMarqueeCapture(),\n disableMarqueeCapture: () => this.disableMarqueeCapture(),\n toggleMarqueeCapture: () => this.toggleMarqueeCapture(),\n isMarqueeCaptureActive: () => this.isMarqueeCaptureActive(),\n getState: () => this.getDocumentStateOrThrow(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createCaptureScope(documentId),\n\n // Global\n registerMarqueeOnPage: (opts) => this.registerMarqueeOnPage(opts),\n\n // Events\n onCaptureArea: this.captureArea$.on,\n onStateChange: this.state$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createCaptureScope(documentId: string): CaptureScope {\n return {\n captureArea: (pageIndex, rect) => this.captureArea(pageIndex, rect, documentId),\n enableMarqueeCapture: () => this.enableMarqueeCapture(documentId),\n disableMarqueeCapture: () => this.disableMarqueeCapture(documentId),\n toggleMarqueeCapture: () => this.toggleMarqueeCapture(documentId),\n isMarqueeCaptureActive: () => this.isMarqueeCaptureActive(documentId),\n getState: () => this.getDocumentStateOrThrow(documentId),\n onCaptureArea: (listener: Listener<CaptureAreaEvent>) =>\n this.captureArea$.on((event) => {\n if (event.documentId === documentId) listener(event);\n }),\n onStateChange: (listener: Listener<CaptureDocumentState>) =>\n this.state$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n\n private getDocumentState(documentId?: string): CaptureDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): CaptureDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Capture state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Per-Document Operations\n // ─────────────────────────────────────────────────────────\n\n public registerMarqueeOnPage(opts: RegisterMarqueeOnPageOptions) {\n if (!this.interactionManagerCapability) {\n this.logger.warn(\n 'CapturePlugin',\n 'MissingDependency',\n 'Interaction manager plugin not loaded, marquee capture disabled',\n );\n return () => {};\n }\n\n const coreDoc = this.coreState.core.documents[opts.documentId];\n if (!coreDoc || !coreDoc.document) {\n this.logger.warn('CapturePlugin', 'DocumentNotFound', 'Document not found');\n return () => {};\n }\n\n const page = coreDoc.document.pages[opts.pageIndex];\n if (!page) {\n this.logger.warn('CapturePlugin', 'PageNotFound', `Page ${opts.pageIndex} not found`);\n return () => {};\n }\n\n const handlers = createMarqueeHandler({\n pageSize: page.size,\n scale: opts.scale,\n onPreview: opts.callback.onPreview,\n onCommit: (rect) => {\n // Capture the selected area\n this.captureArea(opts.pageIndex, rect, opts.documentId);\n opts.callback.onCommit?.(rect);\n },\n });\n\n const off = this.interactionManagerCapability.registerHandlers({\n documentId: opts.documentId,\n modeId: 'marqueeCapture',\n handlers,\n pageIndex: opts.pageIndex,\n });\n\n return off;\n }\n\n private captureArea(pageIndex: number, rect: Rect, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.disableMarqueeCapture(id);\n\n const task = this.renderCapability.forDocument(id).renderPageRect({\n pageIndex,\n rect,\n options: {\n imageType: this.config.imageType,\n scaleFactor: this.config.scale,\n withAnnotations: this.config.withAnnotations || false,\n },\n });\n\n task.wait((blob) => {\n this.captureArea$.emit({\n documentId: id,\n pageIndex,\n rect,\n blob,\n imageType: this.config.imageType || 'image/png',\n scale: this.config.scale || 1,\n withAnnotations: this.config.withAnnotations || false,\n });\n }, ignore);\n }\n\n private enableMarqueeCapture(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManagerCapability?.forDocument(id).activate('marqueeCapture');\n }\n\n private disableMarqueeCapture(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManagerCapability?.forDocument(id).activateDefaultMode();\n }\n\n private toggleMarqueeCapture(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const scope = this.interactionManagerCapability?.forDocument(id);\n if (scope?.getActiveMode() === 'marqueeCapture') {\n scope.activateDefaultMode();\n } else {\n scope?.activate('marqueeCapture');\n }\n }\n\n private isMarqueeCaptureActive(documentId?: string): boolean {\n const id = documentId ?? this.getActiveDocumentId();\n return this.interactionManagerCapability?.forDocument(id).getActiveMode() === 'marqueeCapture';\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: CaptureState, newState: CaptureState): void {\n // Emit state changes for each changed document\n for (const documentId in newState.documents) {\n const prevDoc = prevState.documents[documentId];\n const newDoc = newState.documents[documentId];\n\n if (prevDoc && newDoc && prevDoc.isMarqueeCaptureActive !== newDoc.isMarqueeCaptureActive) {\n this.state$.emit({\n documentId,\n state: newDoc,\n });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async destroy() {\n this.captureArea$.clear();\n this.state$.clear();\n super.destroy();\n }\n}\n","import { Position, Rect, Size } from '@embedpdf/models';\nimport { clamp } from '@embedpdf/core';\nimport {\n EmbedPdfPointerEvent,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport function createMarqueeHandler(opts: {\n pageSize: Size;\n scale: number;\n minDragPx?: number;\n onPreview?: (rect: Rect | null) => void;\n onCommit?: (rect: Rect) => void;\n}): PointerEventHandlersWithLifecycle<EmbedPdfPointerEvent> {\n const { pageSize, scale, minDragPx = 5, onPreview, onCommit } = opts;\n\n let start: Position | null = null;\n let last: Rect | null = null;\n\n return {\n onPointerDown: (pos, evt) => {\n start = pos;\n last = { origin: { x: pos.x, y: pos.y }, size: { width: 0, height: 0 } };\n onPreview?.(last);\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageSize.width);\n const y = clamp(pos.y, 0, pageSize.height);\n last = {\n origin: { x: Math.min(start.x, x), y: Math.min(start.y, y) },\n size: { width: Math.abs(x - start.x), height: Math.abs(y - start.y) },\n };\n onPreview?.(last);\n },\n onPointerUp: (_pos, evt) => {\n if (last) {\n const dragPx = Math.max(last.size.width, last.size.height) * scale;\n if (dragPx > minDragPx) {\n onCommit?.(last);\n }\n }\n start = null;\n last = null;\n onPreview?.(null);\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_pos, evt) => {\n start = null;\n last = null;\n onPreview?.(null);\n evt.releasePointerCapture?.();\n },\n };\n}\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, CAPTURE_PLUGIN_ID } from './manifest';\nimport { CapturePluginConfig, CaptureState } from './types';\nimport { CapturePlugin } from './capture-plugin';\nimport { captureReducer, initialState } from './reducer';\nimport { CaptureAction } from './actions';\n\nexport const CapturePluginPackage: PluginPackage<\n CapturePlugin,\n CapturePluginConfig,\n CaptureState,\n CaptureAction\n> = {\n manifest,\n create: (registry, config) => new CapturePlugin(CAPTURE_PLUGIN_ID, registry, config),\n reducer: captureReducer,\n initialState,\n};\n\nexport * from './capture-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":["CAPTURE_PLUGIN_ID","manifest","id","name","version","provides","requires","optional","defaultConfig","enabled","scale","imageType","withAnnotations","INIT_CAPTURE_STATE","CLEANUP_CAPTURE_STATE","SET_ACTIVE_DOCUMENT","SET_MARQUEE_CAPTURE_ACTIVE","initCaptureState","documentId","state","type","payload","cleanupCaptureState","setMarqueeCaptureActive","isActive","initialDocumentState","isMarqueeCaptureActive","initialState","documents","activeDocumentId","captureReducer","action","docState","removed","remainingDocs","_CapturePlugin","BasePlugin","constructor","registry","config","super","this","captureArea$","createEmitter","state$","createBehaviorEmitter","renderCapability","getPlugin","interactionManagerCapability","_a","registerMode","scope","exclusive","cursor","onModeChange","isMarqueeActive","activeMode","getDocumentState","dispatch","onDocumentLoadingStarted","logger","debug","onDocumentClosed","initialize","_","buildCapability","captureArea","pageIndex","rect","enableMarqueeCapture","disableMarqueeCapture","toggleMarqueeCapture","getState","getDocumentStateOrThrow","forDocument","createCaptureScope","registerMarqueeOnPage","opts","onCaptureArea","on","onStateChange","listener","event","getActiveDocumentId","Error","warn","coreDoc","coreState","core","document","page","pages","handlers","pageSize","minDragPx","onPreview","onCommit","start","last","onPointerDown","pos","evt","origin","x","y","size","width","height","setPointerCapture","call","onPointerMove","clamp","Math","min","abs","onPointerUp","_pos","max","releasePointerCapture","onPointerCancel","createMarqueeHandler","callback","_b","registerHandlers","modeId","renderPageRect","options","scaleFactor","wait","blob","emit","ignore","activate","activateDefaultMode","getActiveMode","onStoreUpdated","prevState","newState","prevDoc","newDoc","destroy","clear","CapturePlugin","CapturePluginPackage","create","reducer"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -59,12 +59,83 @@ function createMarqueeHandler(opts) {
59
59
  }
60
60
  };
61
61
  }
62
+ const INIT_CAPTURE_STATE = "CAPTURE/INIT_STATE";
63
+ const CLEANUP_CAPTURE_STATE = "CAPTURE/CLEANUP_STATE";
64
+ const SET_ACTIVE_DOCUMENT = "CAPTURE/SET_ACTIVE_DOCUMENT";
65
+ const SET_MARQUEE_CAPTURE_ACTIVE = "CAPTURE/SET_MARQUEE_CAPTURE_ACTIVE";
66
+ function initCaptureState(documentId, state) {
67
+ return { type: INIT_CAPTURE_STATE, payload: { documentId, state } };
68
+ }
69
+ function cleanupCaptureState(documentId) {
70
+ return { type: CLEANUP_CAPTURE_STATE, payload: documentId };
71
+ }
72
+ function setActiveDocument(documentId) {
73
+ return { type: SET_ACTIVE_DOCUMENT, payload: documentId };
74
+ }
75
+ function setMarqueeCaptureActive(documentId, isActive) {
76
+ return { type: SET_MARQUEE_CAPTURE_ACTIVE, payload: { documentId, isActive } };
77
+ }
78
+ const initialDocumentState = {
79
+ isMarqueeCaptureActive: false
80
+ };
81
+ const initialState = {
82
+ documents: {},
83
+ activeDocumentId: null
84
+ };
85
+ const captureReducer = (state = initialState, action) => {
86
+ switch (action.type) {
87
+ case INIT_CAPTURE_STATE: {
88
+ const { documentId, state: docState } = action.payload;
89
+ return {
90
+ ...state,
91
+ documents: {
92
+ ...state.documents,
93
+ [documentId]: docState
94
+ },
95
+ // Set as active if no active document
96
+ activeDocumentId: state.activeDocumentId ?? documentId
97
+ };
98
+ }
99
+ case CLEANUP_CAPTURE_STATE: {
100
+ const documentId = action.payload;
101
+ const { [documentId]: removed, ...remainingDocs } = state.documents;
102
+ return {
103
+ ...state,
104
+ documents: remainingDocs,
105
+ activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId
106
+ };
107
+ }
108
+ case SET_ACTIVE_DOCUMENT: {
109
+ return {
110
+ ...state,
111
+ activeDocumentId: action.payload
112
+ };
113
+ }
114
+ case SET_MARQUEE_CAPTURE_ACTIVE: {
115
+ const { documentId, isActive } = action.payload;
116
+ const docState = state.documents[documentId];
117
+ if (!docState) return state;
118
+ return {
119
+ ...state,
120
+ documents: {
121
+ ...state.documents,
122
+ [documentId]: {
123
+ ...docState,
124
+ isMarqueeCaptureActive: isActive
125
+ }
126
+ }
127
+ };
128
+ }
129
+ default:
130
+ return state;
131
+ }
132
+ };
62
133
  const _CapturePlugin = class _CapturePlugin extends BasePlugin {
63
134
  constructor(id, registry, config) {
64
135
  var _a;
65
136
  super(id, registry);
66
137
  this.captureArea$ = createEmitter();
67
- this.marqueeCaptureActive$ = createBehaviorEmitter();
138
+ this.state$ = createBehaviorEmitter();
68
139
  this.config = config;
69
140
  this.renderCapability = this.registry.getPlugin("render").provides();
70
141
  this.interactionManagerCapability = (_a = this.registry.getPlugin("interaction-manager")) == null ? void 0 : _a.provides();
@@ -76,31 +147,95 @@ const _CapturePlugin = class _CapturePlugin extends BasePlugin {
76
147
  cursor: "crosshair"
77
148
  });
78
149
  this.interactionManagerCapability.onModeChange((state) => {
79
- if (state.activeMode === "marqueeCapture") {
80
- this.marqueeCaptureActive$.emit(true);
81
- } else {
82
- this.marqueeCaptureActive$.emit(false);
150
+ const isMarqueeActive = state.activeMode === "marqueeCapture";
151
+ const docState = this.getDocumentState(state.documentId);
152
+ if (docState && docState.isMarqueeCaptureActive !== isMarqueeActive) {
153
+ this.dispatch(setMarqueeCaptureActive(state.documentId, isMarqueeActive));
83
154
  }
84
155
  });
85
156
  }
86
157
  }
158
+ // ─────────────────────────────────────────────────────────
159
+ // Document Lifecycle (from BasePlugin)
160
+ // ─────────────────────────────────────────────────────────
161
+ onDocumentLoadingStarted(documentId) {
162
+ const docState = {
163
+ ...initialDocumentState
164
+ };
165
+ this.dispatch(initCaptureState(documentId, docState));
166
+ this.logger.debug(
167
+ "CapturePlugin",
168
+ "DocumentOpened",
169
+ `Initialized capture state for document: ${documentId}`
170
+ );
171
+ }
172
+ onDocumentClosed(documentId) {
173
+ this.dispatch(cleanupCaptureState(documentId));
174
+ this.logger.debug(
175
+ "CapturePlugin",
176
+ "DocumentClosed",
177
+ `Cleaned up capture state for document: ${documentId}`
178
+ );
179
+ }
180
+ // ─────────────────────────────────────────────────────────
181
+ // Capability
182
+ // ─────────────────────────────────────────────────────────
87
183
  async initialize(_) {
88
184
  }
89
185
  buildCapability() {
90
186
  return {
187
+ // Active document operations
188
+ captureArea: (pageIndex, rect) => this.captureArea(pageIndex, rect),
189
+ enableMarqueeCapture: () => this.enableMarqueeCapture(),
190
+ disableMarqueeCapture: () => this.disableMarqueeCapture(),
191
+ toggleMarqueeCapture: () => this.toggleMarqueeCapture(),
192
+ isMarqueeCaptureActive: () => this.isMarqueeCaptureActive(),
193
+ getState: () => this.getDocumentStateOrThrow(),
194
+ // Document-scoped operations
195
+ forDocument: (documentId) => this.createCaptureScope(documentId),
196
+ // Global
197
+ registerMarqueeOnPage: (opts) => this.registerMarqueeOnPage(opts),
198
+ // Events
91
199
  onCaptureArea: this.captureArea$.on,
92
- onMarqueeCaptureActiveChange: this.marqueeCaptureActive$.on,
93
- captureArea: this.captureArea.bind(this),
94
- enableMarqueeCapture: this.enableMarqueeCapture.bind(this),
95
- disableMarqueeCapture: this.disableMarqueeCapture.bind(this),
96
- toggleMarqueeCapture: this.toggleMarqueeCapture.bind(this),
97
- isMarqueeCaptureActive: () => {
98
- var _a;
99
- return ((_a = this.interactionManagerCapability) == null ? void 0 : _a.getActiveMode()) === "marqueeCapture";
100
- },
101
- registerMarqueeOnPage: (opts) => this.registerMarqueeOnPage(opts)
200
+ onStateChange: this.state$.on
102
201
  };
103
202
  }
203
+ // ─────────────────────────────────────────────────────────
204
+ // Document Scoping
205
+ // ─────────────────────────────────────────────────────────
206
+ createCaptureScope(documentId) {
207
+ return {
208
+ captureArea: (pageIndex, rect) => this.captureArea(pageIndex, rect, documentId),
209
+ enableMarqueeCapture: () => this.enableMarqueeCapture(documentId),
210
+ disableMarqueeCapture: () => this.disableMarqueeCapture(documentId),
211
+ toggleMarqueeCapture: () => this.toggleMarqueeCapture(documentId),
212
+ isMarqueeCaptureActive: () => this.isMarqueeCaptureActive(documentId),
213
+ getState: () => this.getDocumentStateOrThrow(documentId),
214
+ onCaptureArea: (listener) => this.captureArea$.on((event) => {
215
+ if (event.documentId === documentId) listener(event);
216
+ }),
217
+ onStateChange: (listener) => this.state$.on((event) => {
218
+ if (event.documentId === documentId) listener(event.state);
219
+ })
220
+ };
221
+ }
222
+ // ─────────────────────────────────────────────────────────
223
+ // State Helpers
224
+ // ─────────────────────────────────────────────────────────
225
+ getDocumentState(documentId) {
226
+ const id = documentId ?? this.getActiveDocumentId();
227
+ return this.state.documents[id] ?? null;
228
+ }
229
+ getDocumentStateOrThrow(documentId) {
230
+ const state = this.getDocumentState(documentId);
231
+ if (!state) {
232
+ throw new Error(`Capture state not found for document: ${documentId ?? "active"}`);
233
+ }
234
+ return state;
235
+ }
236
+ // ─────────────────────────────────────────────────────────
237
+ // Per-Document Operations
238
+ // ─────────────────────────────────────────────────────────
104
239
  registerMarqueeOnPage(opts) {
105
240
  if (!this.interactionManagerCapability) {
106
241
  this.logger.warn(
@@ -111,13 +246,13 @@ const _CapturePlugin = class _CapturePlugin extends BasePlugin {
111
246
  return () => {
112
247
  };
113
248
  }
114
- const document = this.coreState.core.document;
115
- if (!document) {
249
+ const coreDoc = this.coreState.core.documents[opts.documentId];
250
+ if (!coreDoc || !coreDoc.document) {
116
251
  this.logger.warn("CapturePlugin", "DocumentNotFound", "Document not found");
117
252
  return () => {
118
253
  };
119
254
  }
120
- const page = document.pages[opts.pageIndex];
255
+ const page = coreDoc.document.pages[opts.pageIndex];
121
256
  if (!page) {
122
257
  this.logger.warn("CapturePlugin", "PageNotFound", `Page ${opts.pageIndex} not found`);
123
258
  return () => {
@@ -129,20 +264,22 @@ const _CapturePlugin = class _CapturePlugin extends BasePlugin {
129
264
  onPreview: opts.callback.onPreview,
130
265
  onCommit: (rect) => {
131
266
  var _a, _b;
132
- this.captureArea(opts.pageIndex, rect);
267
+ this.captureArea(opts.pageIndex, rect, opts.documentId);
133
268
  (_b = (_a = opts.callback).onCommit) == null ? void 0 : _b.call(_a, rect);
134
269
  }
135
270
  });
136
271
  const off = this.interactionManagerCapability.registerHandlers({
272
+ documentId: opts.documentId,
137
273
  modeId: "marqueeCapture",
138
274
  handlers,
139
275
  pageIndex: opts.pageIndex
140
276
  });
141
277
  return off;
142
278
  }
143
- captureArea(pageIndex, rect) {
144
- this.disableMarqueeCapture();
145
- const task = this.renderCapability.renderPageRect({
279
+ captureArea(pageIndex, rect, documentId) {
280
+ const id = documentId ?? this.getActiveDocumentId();
281
+ this.disableMarqueeCapture(id);
282
+ const task = this.renderCapability.forDocument(id).renderPageRect({
146
283
  pageIndex,
147
284
  rect,
148
285
  options: {
@@ -153,6 +290,7 @@ const _CapturePlugin = class _CapturePlugin extends BasePlugin {
153
290
  });
154
291
  task.wait((blob) => {
155
292
  this.captureArea$.emit({
293
+ documentId: id,
156
294
  pageIndex,
157
295
  rect,
158
296
  blob,
@@ -162,36 +300,78 @@ const _CapturePlugin = class _CapturePlugin extends BasePlugin {
162
300
  });
163
301
  }, ignore);
164
302
  }
165
- enableMarqueeCapture() {
303
+ enableMarqueeCapture(documentId) {
166
304
  var _a;
167
- (_a = this.interactionManagerCapability) == null ? void 0 : _a.activate("marqueeCapture");
305
+ const id = documentId ?? this.getActiveDocumentId();
306
+ (_a = this.interactionManagerCapability) == null ? void 0 : _a.forDocument(id).activate("marqueeCapture");
168
307
  }
169
- disableMarqueeCapture() {
308
+ disableMarqueeCapture(documentId) {
170
309
  var _a;
171
- (_a = this.interactionManagerCapability) == null ? void 0 : _a.activateDefaultMode();
310
+ const id = documentId ?? this.getActiveDocumentId();
311
+ (_a = this.interactionManagerCapability) == null ? void 0 : _a.forDocument(id).activateDefaultMode();
172
312
  }
173
- toggleMarqueeCapture() {
174
- var _a, _b, _c;
175
- if (((_a = this.interactionManagerCapability) == null ? void 0 : _a.getActiveMode()) === "marqueeCapture") {
176
- (_b = this.interactionManagerCapability) == null ? void 0 : _b.activateDefaultMode();
313
+ toggleMarqueeCapture(documentId) {
314
+ var _a;
315
+ const id = documentId ?? this.getActiveDocumentId();
316
+ const scope = (_a = this.interactionManagerCapability) == null ? void 0 : _a.forDocument(id);
317
+ if ((scope == null ? void 0 : scope.getActiveMode()) === "marqueeCapture") {
318
+ scope.activateDefaultMode();
177
319
  } else {
178
- (_c = this.interactionManagerCapability) == null ? void 0 : _c.activate("marqueeCapture");
320
+ scope == null ? void 0 : scope.activate("marqueeCapture");
321
+ }
322
+ }
323
+ isMarqueeCaptureActive(documentId) {
324
+ var _a;
325
+ const id = documentId ?? this.getActiveDocumentId();
326
+ return ((_a = this.interactionManagerCapability) == null ? void 0 : _a.forDocument(id).getActiveMode()) === "marqueeCapture";
327
+ }
328
+ // ─────────────────────────────────────────────────────────
329
+ // Store Update Handlers
330
+ // ─────────────────────────────────────────────────────────
331
+ onStoreUpdated(prevState, newState) {
332
+ for (const documentId in newState.documents) {
333
+ const prevDoc = prevState.documents[documentId];
334
+ const newDoc = newState.documents[documentId];
335
+ if (prevDoc && newDoc && prevDoc.isMarqueeCaptureActive !== newDoc.isMarqueeCaptureActive) {
336
+ this.state$.emit({
337
+ documentId,
338
+ state: newDoc
339
+ });
340
+ }
179
341
  }
180
342
  }
343
+ // ─────────────────────────────────────────────────────────
344
+ // Lifecycle
345
+ // ─────────────────────────────────────────────────────────
346
+ async destroy() {
347
+ this.captureArea$.clear();
348
+ this.state$.clear();
349
+ super.destroy();
350
+ }
181
351
  };
182
352
  _CapturePlugin.id = "capture";
183
353
  let CapturePlugin = _CapturePlugin;
184
354
  const CapturePluginPackage = {
185
355
  manifest,
186
356
  create: (registry, config) => new CapturePlugin(CAPTURE_PLUGIN_ID, registry, config),
187
- reducer: () => {
188
- },
189
- initialState: {}
357
+ reducer: captureReducer,
358
+ initialState
190
359
  };
191
360
  export {
192
361
  CAPTURE_PLUGIN_ID,
362
+ CLEANUP_CAPTURE_STATE,
193
363
  CapturePlugin,
194
364
  CapturePluginPackage,
195
- manifest
365
+ INIT_CAPTURE_STATE,
366
+ SET_ACTIVE_DOCUMENT,
367
+ SET_MARQUEE_CAPTURE_ACTIVE,
368
+ captureReducer,
369
+ cleanupCaptureState,
370
+ initCaptureState,
371
+ initialDocumentState,
372
+ initialState,
373
+ manifest,
374
+ setActiveDocument,
375
+ setMarqueeCaptureActive
196
376
  };
197
377
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/lib/manifest.ts","../src/lib/handlers/marquee-capture.handler.ts","../src/lib/capture-plugin.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { CapturePluginConfig } from './types';\n\nexport const CAPTURE_PLUGIN_ID = 'capture';\n\nexport const manifest: PluginManifest<CapturePluginConfig> = {\n id: CAPTURE_PLUGIN_ID,\n name: 'Capture Plugin',\n version: '1.0.0',\n provides: ['capture'],\n requires: ['render'],\n optional: ['interaction-manager'],\n defaultConfig: {\n enabled: true,\n scale: 1,\n imageType: 'image/png',\n withAnnotations: false,\n },\n};\n","import { Position, Rect, Size } from '@embedpdf/models';\nimport { clamp } from '@embedpdf/core';\nimport {\n EmbedPdfPointerEvent,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport function createMarqueeHandler(opts: {\n pageSize: Size;\n scale: number;\n minDragPx?: number;\n onPreview?: (rect: Rect | null) => void;\n onCommit?: (rect: Rect) => void;\n}): PointerEventHandlersWithLifecycle<EmbedPdfPointerEvent> {\n const { pageSize, scale, minDragPx = 5, onPreview, onCommit } = opts;\n\n let start: Position | null = null;\n let last: Rect | null = null;\n\n return {\n onPointerDown: (pos, evt) => {\n start = pos;\n last = { origin: { x: pos.x, y: pos.y }, size: { width: 0, height: 0 } };\n onPreview?.(last);\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageSize.width);\n const y = clamp(pos.y, 0, pageSize.height);\n last = {\n origin: { x: Math.min(start.x, x), y: Math.min(start.y, y) },\n size: { width: Math.abs(x - start.x), height: Math.abs(y - start.y) },\n };\n onPreview?.(last);\n },\n onPointerUp: (_pos, evt) => {\n if (last) {\n const dragPx = Math.max(last.size.width, last.size.height) * scale;\n if (dragPx > minDragPx) {\n onCommit?.(last);\n }\n }\n start = null;\n last = null;\n onPreview?.(null);\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_pos, evt) => {\n start = null;\n last = null;\n onPreview?.(null);\n evt.releasePointerCapture?.();\n },\n };\n}\n","import { BasePlugin, createBehaviorEmitter, createEmitter, PluginRegistry } from '@embedpdf/core';\nimport { ignore, Rect } from '@embedpdf/models';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { RenderCapability, RenderPlugin } from '@embedpdf/plugin-render';\n\nimport {\n CaptureAreaEvent,\n CaptureCapability,\n CapturePluginConfig,\n RegisterMarqueeOnPageOptions,\n} from './types';\nimport { createMarqueeHandler } from './handlers';\n\nexport class CapturePlugin extends BasePlugin<CapturePluginConfig, CaptureCapability> {\n static readonly id = 'capture' as const;\n\n private captureArea$ = createEmitter<CaptureAreaEvent>();\n private marqueeCaptureActive$ = createBehaviorEmitter<boolean>();\n\n private renderCapability: RenderCapability;\n private interactionManagerCapability: InteractionManagerCapability | undefined;\n private config: CapturePluginConfig;\n\n constructor(id: string, registry: PluginRegistry, config: CapturePluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n this.renderCapability = this.registry.getPlugin<RenderPlugin>('render')!.provides();\n this.interactionManagerCapability = this.registry\n .getPlugin<InteractionManagerPlugin>('interaction-manager')\n ?.provides();\n\n if (this.interactionManagerCapability) {\n this.interactionManagerCapability.registerMode({\n id: 'marqueeCapture',\n scope: 'page',\n exclusive: true,\n cursor: 'crosshair',\n });\n\n this.interactionManagerCapability.onModeChange((state) => {\n if (state.activeMode === 'marqueeCapture') {\n this.marqueeCaptureActive$.emit(true);\n } else {\n this.marqueeCaptureActive$.emit(false);\n }\n });\n }\n }\n\n async initialize(_: CapturePluginConfig): Promise<void> {}\n\n protected buildCapability(): CaptureCapability {\n return {\n onCaptureArea: this.captureArea$.on,\n onMarqueeCaptureActiveChange: this.marqueeCaptureActive$.on,\n captureArea: this.captureArea.bind(this),\n enableMarqueeCapture: this.enableMarqueeCapture.bind(this),\n disableMarqueeCapture: this.disableMarqueeCapture.bind(this),\n toggleMarqueeCapture: this.toggleMarqueeCapture.bind(this),\n isMarqueeCaptureActive: () =>\n this.interactionManagerCapability?.getActiveMode() === 'marqueeCapture',\n registerMarqueeOnPage: (opts) => this.registerMarqueeOnPage(opts),\n };\n }\n\n public registerMarqueeOnPage(opts: RegisterMarqueeOnPageOptions) {\n if (!this.interactionManagerCapability) {\n this.logger.warn(\n 'CapturePlugin',\n 'MissingDependency',\n 'Interaction manager plugin not loaded, marquee capture disabled',\n );\n return () => {};\n }\n\n const document = this.coreState.core.document;\n if (!document) {\n this.logger.warn('CapturePlugin', 'DocumentNotFound', 'Document not found');\n return () => {};\n }\n\n const page = document.pages[opts.pageIndex];\n if (!page) {\n this.logger.warn('CapturePlugin', 'PageNotFound', `Page ${opts.pageIndex} not found`);\n return () => {};\n }\n\n const handlers = createMarqueeHandler({\n pageSize: page.size,\n scale: opts.scale,\n onPreview: opts.callback.onPreview,\n onCommit: (rect) => {\n // Capture the selected area\n this.captureArea(opts.pageIndex, rect);\n opts.callback.onCommit?.(rect);\n },\n });\n\n const off = this.interactionManagerCapability.registerHandlers({\n modeId: 'marqueeCapture',\n handlers,\n pageIndex: opts.pageIndex,\n });\n\n return off;\n }\n\n private captureArea(pageIndex: number, rect: Rect) {\n this.disableMarqueeCapture();\n\n const task = this.renderCapability.renderPageRect({\n pageIndex,\n rect,\n options: {\n imageType: this.config.imageType,\n scaleFactor: this.config.scale,\n withAnnotations: this.config.withAnnotations || false,\n },\n });\n\n task.wait((blob) => {\n this.captureArea$.emit({\n pageIndex,\n rect,\n blob,\n imageType: this.config.imageType || 'image/png',\n scale: this.config.scale || 1,\n withAnnotations: this.config.withAnnotations || false,\n });\n }, ignore);\n }\n\n private enableMarqueeCapture() {\n this.interactionManagerCapability?.activate('marqueeCapture');\n }\n\n private disableMarqueeCapture() {\n this.interactionManagerCapability?.activateDefaultMode();\n }\n\n private toggleMarqueeCapture() {\n if (this.interactionManagerCapability?.getActiveMode() === 'marqueeCapture') {\n this.interactionManagerCapability?.activateDefaultMode();\n } else {\n this.interactionManagerCapability?.activate('marqueeCapture');\n }\n }\n}\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, CAPTURE_PLUGIN_ID } from './manifest';\nimport { CapturePluginConfig } from './types';\nimport { CapturePlugin } from './capture-plugin';\n\nexport const CapturePluginPackage: PluginPackage<CapturePlugin, CapturePluginConfig> = {\n manifest,\n create: (registry, config) => new CapturePlugin(CAPTURE_PLUGIN_ID, registry, config),\n reducer: () => {},\n initialState: {},\n};\n\nexport * from './capture-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/manifest.ts","../src/lib/handlers/marquee-capture.handler.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/capture-plugin.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { CapturePluginConfig } from './types';\n\nexport const CAPTURE_PLUGIN_ID = 'capture';\n\nexport const manifest: PluginManifest<CapturePluginConfig> = {\n id: CAPTURE_PLUGIN_ID,\n name: 'Capture Plugin',\n version: '1.0.0',\n provides: ['capture'],\n requires: ['render'],\n optional: ['interaction-manager'],\n defaultConfig: {\n enabled: true,\n scale: 1,\n imageType: 'image/png',\n withAnnotations: false,\n },\n};\n","import { Position, Rect, Size } from '@embedpdf/models';\nimport { clamp } from '@embedpdf/core';\nimport {\n EmbedPdfPointerEvent,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport function createMarqueeHandler(opts: {\n pageSize: Size;\n scale: number;\n minDragPx?: number;\n onPreview?: (rect: Rect | null) => void;\n onCommit?: (rect: Rect) => void;\n}): PointerEventHandlersWithLifecycle<EmbedPdfPointerEvent> {\n const { pageSize, scale, minDragPx = 5, onPreview, onCommit } = opts;\n\n let start: Position | null = null;\n let last: Rect | null = null;\n\n return {\n onPointerDown: (pos, evt) => {\n start = pos;\n last = { origin: { x: pos.x, y: pos.y }, size: { width: 0, height: 0 } };\n onPreview?.(last);\n evt.setPointerCapture?.();\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageSize.width);\n const y = clamp(pos.y, 0, pageSize.height);\n last = {\n origin: { x: Math.min(start.x, x), y: Math.min(start.y, y) },\n size: { width: Math.abs(x - start.x), height: Math.abs(y - start.y) },\n };\n onPreview?.(last);\n },\n onPointerUp: (_pos, evt) => {\n if (last) {\n const dragPx = Math.max(last.size.width, last.size.height) * scale;\n if (dragPx > minDragPx) {\n onCommit?.(last);\n }\n }\n start = null;\n last = null;\n onPreview?.(null);\n evt.releasePointerCapture?.();\n },\n onPointerCancel: (_pos, evt) => {\n start = null;\n last = null;\n onPreview?.(null);\n evt.releasePointerCapture?.();\n },\n };\n}\n","import { Action } from '@embedpdf/core';\nimport { CaptureDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_CAPTURE_STATE = 'CAPTURE/INIT_STATE';\nexport const CLEANUP_CAPTURE_STATE = 'CAPTURE/CLEANUP_STATE';\nexport const SET_ACTIVE_DOCUMENT = 'CAPTURE/SET_ACTIVE_DOCUMENT';\n\n// Per-document actions\nexport const SET_MARQUEE_CAPTURE_ACTIVE = 'CAPTURE/SET_MARQUEE_CAPTURE_ACTIVE';\n\n// Document lifecycle actions\nexport interface InitCaptureStateAction extends Action {\n type: typeof INIT_CAPTURE_STATE;\n payload: {\n documentId: string;\n state: CaptureDocumentState;\n };\n}\n\nexport interface CleanupCaptureStateAction extends Action {\n type: typeof CLEANUP_CAPTURE_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveDocumentAction extends Action {\n type: typeof SET_ACTIVE_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetMarqueeCaptureActiveAction extends Action {\n type: typeof SET_MARQUEE_CAPTURE_ACTIVE;\n payload: {\n documentId: string;\n isActive: boolean;\n };\n}\n\nexport type CaptureAction =\n | InitCaptureStateAction\n | CleanupCaptureStateAction\n | SetActiveDocumentAction\n | SetMarqueeCaptureActiveAction;\n\n// Action Creators\nexport function initCaptureState(\n documentId: string,\n state: CaptureDocumentState,\n): InitCaptureStateAction {\n return { type: INIT_CAPTURE_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupCaptureState(documentId: string): CleanupCaptureStateAction {\n return { type: CLEANUP_CAPTURE_STATE, payload: documentId };\n}\n\nexport function setActiveDocument(documentId: string | null): SetActiveDocumentAction {\n return { type: SET_ACTIVE_DOCUMENT, payload: documentId };\n}\n\nexport function setMarqueeCaptureActive(\n documentId: string,\n isActive: boolean,\n): SetMarqueeCaptureActiveAction {\n return { type: SET_MARQUEE_CAPTURE_ACTIVE, payload: { documentId, isActive } };\n}\n","import { Reducer } from '@embedpdf/core';\nimport {\n CaptureAction,\n INIT_CAPTURE_STATE,\n CLEANUP_CAPTURE_STATE,\n SET_ACTIVE_DOCUMENT,\n SET_MARQUEE_CAPTURE_ACTIVE,\n} from './actions';\nimport { CaptureState, CaptureDocumentState } from './types';\n\nexport const initialDocumentState: CaptureDocumentState = {\n isMarqueeCaptureActive: false,\n};\n\nexport const initialState: CaptureState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const captureReducer: Reducer<CaptureState, CaptureAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n case INIT_CAPTURE_STATE: {\n const { documentId, state: docState } = action.payload;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: docState,\n },\n // Set as active if no active document\n activeDocumentId: state.activeDocumentId ?? documentId,\n };\n }\n\n case CLEANUP_CAPTURE_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remainingDocs } = state.documents;\n return {\n ...state,\n documents: remainingDocs,\n activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId,\n };\n }\n\n case SET_ACTIVE_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_MARQUEE_CAPTURE_ACTIVE: {\n const { documentId, isActive } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n isMarqueeCaptureActive: isActive,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import {\n BasePlugin,\n createBehaviorEmitter,\n createEmitter,\n PluginRegistry,\n Listener,\n} from '@embedpdf/core';\nimport { ignore, Rect } from '@embedpdf/models';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { RenderCapability, RenderPlugin } from '@embedpdf/plugin-render';\n\nimport {\n CaptureAreaEvent,\n CaptureCapability,\n CapturePluginConfig,\n RegisterMarqueeOnPageOptions,\n CaptureState,\n CaptureScope,\n StateChangeEvent,\n CaptureDocumentState,\n} from './types';\nimport { createMarqueeHandler } from './handlers';\nimport {\n CaptureAction,\n initCaptureState,\n cleanupCaptureState,\n setMarqueeCaptureActive,\n} from './actions';\nimport { initialDocumentState } from './reducer';\n\nexport class CapturePlugin extends BasePlugin<\n CapturePluginConfig,\n CaptureCapability,\n CaptureState,\n CaptureAction\n> {\n static readonly id = 'capture' as const;\n\n private captureArea$ = createEmitter<CaptureAreaEvent>();\n private state$ = createBehaviorEmitter<StateChangeEvent>();\n\n private renderCapability: RenderCapability;\n private interactionManagerCapability: InteractionManagerCapability | undefined;\n private config: CapturePluginConfig;\n\n constructor(id: string, registry: PluginRegistry, config: CapturePluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n this.renderCapability = this.registry.getPlugin<RenderPlugin>('render')!.provides();\n this.interactionManagerCapability = this.registry\n .getPlugin<InteractionManagerPlugin>('interaction-manager')\n ?.provides();\n\n if (this.interactionManagerCapability) {\n this.interactionManagerCapability.registerMode({\n id: 'marqueeCapture',\n scope: 'page',\n exclusive: true,\n cursor: 'crosshair',\n });\n\n this.interactionManagerCapability.onModeChange((state) => {\n // Track marquee capture state changes for this document\n const isMarqueeActive = state.activeMode === 'marqueeCapture';\n const docState = this.getDocumentState(state.documentId);\n\n // Only dispatch if state actually changed\n if (docState && docState.isMarqueeCaptureActive !== isMarqueeActive) {\n this.dispatch(setMarqueeCaptureActive(state.documentId, isMarqueeActive));\n }\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize capture state for this document\n const docState: CaptureDocumentState = {\n ...initialDocumentState,\n };\n\n this.dispatch(initCaptureState(documentId, docState));\n\n this.logger.debug(\n 'CapturePlugin',\n 'DocumentOpened',\n `Initialized capture state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.dispatch(cleanupCaptureState(documentId));\n\n this.logger.debug(\n 'CapturePlugin',\n 'DocumentClosed',\n `Cleaned up capture state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: CapturePluginConfig): Promise<void> {}\n\n protected buildCapability(): CaptureCapability {\n return {\n // Active document operations\n captureArea: (pageIndex, rect) => this.captureArea(pageIndex, rect),\n enableMarqueeCapture: () => this.enableMarqueeCapture(),\n disableMarqueeCapture: () => this.disableMarqueeCapture(),\n toggleMarqueeCapture: () => this.toggleMarqueeCapture(),\n isMarqueeCaptureActive: () => this.isMarqueeCaptureActive(),\n getState: () => this.getDocumentStateOrThrow(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createCaptureScope(documentId),\n\n // Global\n registerMarqueeOnPage: (opts) => this.registerMarqueeOnPage(opts),\n\n // Events\n onCaptureArea: this.captureArea$.on,\n onStateChange: this.state$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createCaptureScope(documentId: string): CaptureScope {\n return {\n captureArea: (pageIndex, rect) => this.captureArea(pageIndex, rect, documentId),\n enableMarqueeCapture: () => this.enableMarqueeCapture(documentId),\n disableMarqueeCapture: () => this.disableMarqueeCapture(documentId),\n toggleMarqueeCapture: () => this.toggleMarqueeCapture(documentId),\n isMarqueeCaptureActive: () => this.isMarqueeCaptureActive(documentId),\n getState: () => this.getDocumentStateOrThrow(documentId),\n onCaptureArea: (listener: Listener<CaptureAreaEvent>) =>\n this.captureArea$.on((event) => {\n if (event.documentId === documentId) listener(event);\n }),\n onStateChange: (listener: Listener<CaptureDocumentState>) =>\n this.state$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n\n private getDocumentState(documentId?: string): CaptureDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): CaptureDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Capture state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Per-Document Operations\n // ─────────────────────────────────────────────────────────\n\n public registerMarqueeOnPage(opts: RegisterMarqueeOnPageOptions) {\n if (!this.interactionManagerCapability) {\n this.logger.warn(\n 'CapturePlugin',\n 'MissingDependency',\n 'Interaction manager plugin not loaded, marquee capture disabled',\n );\n return () => {};\n }\n\n const coreDoc = this.coreState.core.documents[opts.documentId];\n if (!coreDoc || !coreDoc.document) {\n this.logger.warn('CapturePlugin', 'DocumentNotFound', 'Document not found');\n return () => {};\n }\n\n const page = coreDoc.document.pages[opts.pageIndex];\n if (!page) {\n this.logger.warn('CapturePlugin', 'PageNotFound', `Page ${opts.pageIndex} not found`);\n return () => {};\n }\n\n const handlers = createMarqueeHandler({\n pageSize: page.size,\n scale: opts.scale,\n onPreview: opts.callback.onPreview,\n onCommit: (rect) => {\n // Capture the selected area\n this.captureArea(opts.pageIndex, rect, opts.documentId);\n opts.callback.onCommit?.(rect);\n },\n });\n\n const off = this.interactionManagerCapability.registerHandlers({\n documentId: opts.documentId,\n modeId: 'marqueeCapture',\n handlers,\n pageIndex: opts.pageIndex,\n });\n\n return off;\n }\n\n private captureArea(pageIndex: number, rect: Rect, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.disableMarqueeCapture(id);\n\n const task = this.renderCapability.forDocument(id).renderPageRect({\n pageIndex,\n rect,\n options: {\n imageType: this.config.imageType,\n scaleFactor: this.config.scale,\n withAnnotations: this.config.withAnnotations || false,\n },\n });\n\n task.wait((blob) => {\n this.captureArea$.emit({\n documentId: id,\n pageIndex,\n rect,\n blob,\n imageType: this.config.imageType || 'image/png',\n scale: this.config.scale || 1,\n withAnnotations: this.config.withAnnotations || false,\n });\n }, ignore);\n }\n\n private enableMarqueeCapture(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManagerCapability?.forDocument(id).activate('marqueeCapture');\n }\n\n private disableMarqueeCapture(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManagerCapability?.forDocument(id).activateDefaultMode();\n }\n\n private toggleMarqueeCapture(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const scope = this.interactionManagerCapability?.forDocument(id);\n if (scope?.getActiveMode() === 'marqueeCapture') {\n scope.activateDefaultMode();\n } else {\n scope?.activate('marqueeCapture');\n }\n }\n\n private isMarqueeCaptureActive(documentId?: string): boolean {\n const id = documentId ?? this.getActiveDocumentId();\n return this.interactionManagerCapability?.forDocument(id).getActiveMode() === 'marqueeCapture';\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: CaptureState, newState: CaptureState): void {\n // Emit state changes for each changed document\n for (const documentId in newState.documents) {\n const prevDoc = prevState.documents[documentId];\n const newDoc = newState.documents[documentId];\n\n if (prevDoc && newDoc && prevDoc.isMarqueeCaptureActive !== newDoc.isMarqueeCaptureActive) {\n this.state$.emit({\n documentId,\n state: newDoc,\n });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async destroy() {\n this.captureArea$.clear();\n this.state$.clear();\n super.destroy();\n }\n}\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, CAPTURE_PLUGIN_ID } from './manifest';\nimport { CapturePluginConfig, CaptureState } from './types';\nimport { CapturePlugin } from './capture-plugin';\nimport { captureReducer, initialState } from './reducer';\nimport { CaptureAction } from './actions';\n\nexport const CapturePluginPackage: PluginPackage<\n CapturePlugin,\n CapturePluginConfig,\n CaptureState,\n CaptureAction\n> = {\n manifest,\n create: (registry, config) => new CapturePlugin(CAPTURE_PLUGIN_ID, registry, config),\n reducer: captureReducer,\n initialState,\n};\n\nexport * from './capture-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Action } from '@embedpdf/core';
2
+ import { CaptureDocumentState } from './types';
3
+ export declare const INIT_CAPTURE_STATE = "CAPTURE/INIT_STATE";
4
+ export declare const CLEANUP_CAPTURE_STATE = "CAPTURE/CLEANUP_STATE";
5
+ export declare const SET_ACTIVE_DOCUMENT = "CAPTURE/SET_ACTIVE_DOCUMENT";
6
+ export declare const SET_MARQUEE_CAPTURE_ACTIVE = "CAPTURE/SET_MARQUEE_CAPTURE_ACTIVE";
7
+ export interface InitCaptureStateAction extends Action {
8
+ type: typeof INIT_CAPTURE_STATE;
9
+ payload: {
10
+ documentId: string;
11
+ state: CaptureDocumentState;
12
+ };
13
+ }
14
+ export interface CleanupCaptureStateAction extends Action {
15
+ type: typeof CLEANUP_CAPTURE_STATE;
16
+ payload: string;
17
+ }
18
+ export interface SetActiveDocumentAction extends Action {
19
+ type: typeof SET_ACTIVE_DOCUMENT;
20
+ payload: string | null;
21
+ }
22
+ export interface SetMarqueeCaptureActiveAction extends Action {
23
+ type: typeof SET_MARQUEE_CAPTURE_ACTIVE;
24
+ payload: {
25
+ documentId: string;
26
+ isActive: boolean;
27
+ };
28
+ }
29
+ export type CaptureAction = InitCaptureStateAction | CleanupCaptureStateAction | SetActiveDocumentAction | SetMarqueeCaptureActiveAction;
30
+ export declare function initCaptureState(documentId: string, state: CaptureDocumentState): InitCaptureStateAction;
31
+ export declare function cleanupCaptureState(documentId: string): CleanupCaptureStateAction;
32
+ export declare function setActiveDocument(documentId: string | null): SetActiveDocumentAction;
33
+ export declare function setMarqueeCaptureActive(documentId: string, isActive: boolean): SetMarqueeCaptureActiveAction;