@embedpdf/plugin-capture 1.5.0 → 2.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +215 -35
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +33 -0
- package/dist/lib/capture-plugin.d.ts +12 -3
- package/dist/lib/index.d.ts +5 -2
- package/dist/lib/reducer.d.ts +6 -0
- package/dist/lib/types.d.ts +27 -2
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +25 -16
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +25 -16
- package/dist/react/index.js.map +1 -1
- package/dist/shared/components/marquee-capture.d.ts +4 -2
- package/dist/shared/hooks/use-capture.d.ts +8 -4
- package/dist/shared-preact/components/marquee-capture.d.ts +4 -2
- package/dist/shared-preact/hooks/use-capture.d.ts +8 -4
- package/dist/shared-react/components/marquee-capture.d.ts +4 -2
- package/dist/shared-react/hooks/use-capture.d.ts +8 -4
- package/dist/svelte/components/MarqueeCapture.svelte.d.ts +3 -1
- package/dist/svelte/hooks/use-capture.svelte.d.ts +11 -5
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.js +54 -35
- package/dist/svelte/index.js.map +1 -1
- package/dist/vue/components/marquee-capture.vue.d.ts +5 -2
- package/dist/vue/hooks/use-capture.d.ts +13 -4
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +53 -34
- package/dist/vue/index.js.map +1 -1
- package/package.json +9 -9
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
this.
|
|
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
|
-
|
|
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
|
|
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.
|
|
145
|
-
|
|
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
|
-
|
|
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
|
-
|
|
310
|
+
const id = documentId ?? this.getActiveDocumentId();
|
|
311
|
+
(_a = this.interactionManagerCapability) == null ? void 0 : _a.forDocument(id).activateDefaultMode();
|
|
172
312
|
}
|
|
173
|
-
toggleMarqueeCapture() {
|
|
174
|
-
var _a
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|