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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
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;
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:{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/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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"}
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 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","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
@@ -9,7 +9,6 @@ const manifest = {
9
9
  requires: ["render"],
10
10
  optional: ["interaction-manager"],
11
11
  defaultConfig: {
12
- enabled: true,
13
12
  scale: 1,
14
13
  imageType: "image/png",
15
14
  withAnnotations: false
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/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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"}
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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/plugin-capture",
3
- "version": "2.0.0-next.1",
3
+ "version": "2.0.0-next.2",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.cjs",
@@ -34,15 +34,15 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "@embedpdf/models": "2.0.0-next.1"
37
+ "@embedpdf/models": "2.0.0-next.2"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/react": "^18.2.0",
41
41
  "typescript": "^5.0.0",
42
42
  "@embedpdf/build": "1.1.0",
43
- "@embedpdf/core": "2.0.0-next.1",
44
- "@embedpdf/plugin-interaction-manager": "2.0.0-next.1",
45
- "@embedpdf/plugin-render": "2.0.0-next.1"
43
+ "@embedpdf/plugin-render": "2.0.0-next.2",
44
+ "@embedpdf/plugin-interaction-manager": "2.0.0-next.2",
45
+ "@embedpdf/core": "2.0.0-next.2"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "react": ">=16.8.0",
@@ -50,9 +50,9 @@
50
50
  "preact": "^10.26.4",
51
51
  "vue": ">=3.2.0",
52
52
  "svelte": ">=5 <6",
53
- "@embedpdf/plugin-interaction-manager": "2.0.0-next.1",
54
- "@embedpdf/core": "2.0.0-next.1",
55
- "@embedpdf/plugin-render": "2.0.0-next.1"
53
+ "@embedpdf/core": "2.0.0-next.2",
54
+ "@embedpdf/plugin-render": "2.0.0-next.2",
55
+ "@embedpdf/plugin-interaction-manager": "2.0.0-next.2"
56
56
  },
57
57
  "files": [
58
58
  "dist",