@embedpdf/plugin-spread 2.0.0-next.1 → 2.0.0-next.3
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 +1 -3
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core");var t=(e=>(e.None="none",e.Odd="odd",e.Even="even",e))(t||{});const o="SPREAD/INIT_STATE",r="SPREAD/CLEANUP_STATE",d="SPREAD/SET_ACTIVE_DOCUMENT",n="SPREAD/SET_SPREAD_MODE",a="SPREAD/SET_PAGE_GROUPING";function s(e,t){return{type:o,payload:{documentId:e,state:t}}}function c(e){return{type:r,payload:e}}function u(e,t){return{type:n,payload:{documentId:e,spreadMode:t}}}function i(e,t){return{type:a,payload:{documentId:e,grouping:t}}}const p=class extends e.BasePlugin{constructor(o,r,d){var n;super(o,r),this.spreadEmitter$=e.createBehaviorEmitter(),this.defaultSpreadMode=d.defaultSpreadMode??t.None,this.viewport=(null==(n=r.getPlugin("viewport"))?void 0:n.provides())??null}onDocumentLoadingStarted(e){var t;const o={spreadMode:this.defaultSpreadMode};this.dispatch(s(e,o)),null==(t=this.viewport)||t.gate("spread",e),this.logger.debug("SpreadPlugin","DocumentOpened",`Initialized spread state for document: ${e}`)}onDocumentLoaded(e){var t;const o=this.coreState.core.documents[e];if(null==o?void 0:o.document){const t=this.calculatePageGrouping(e,o.document.pages.length);this.dispatch(i(e,t))}null==(t=this.viewport)||t.releaseGate("spread",e)}onDocumentClosed(e){this.dispatch(c(e)),this.logger.debug("SpreadPlugin","DocumentClosed",`Cleaned up spread state for document: ${e}`)}buildCapability(){return{setSpreadMode:e=>this.setSpreadModeForDocument(e),getSpreadMode:()=>this.getSpreadModeForDocument(),getSpreadPages:()=>this.getSpreadPages(),forDocument:e=>this.createSpreadScope(e),onSpreadChange:this.spreadEmitter$.on}}createSpreadScope(e){return{setSpreadMode:t=>this.setSpreadModeForDocument(t,e),getSpreadMode:()=>this.getSpreadModeForDocument(e),getSpreadPages:()=>this.getSpreadPages(e),onSpreadChange:t=>this.spreadEmitter$.on(o=>{o.documentId===e&&t(o.spreadMode)})}}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(`Spread state not found for document: ${e??"active"}`);return t}setSpreadModeForDocument(e,t){const o=t??this.getActiveDocumentId(),r=this.getDocumentStateOrThrow(o),d=this.coreState.core.documents[o];if(!(null==d?void 0:d.document))throw new Error(`Document ${o} not loaded`);if(r.spreadMode!==e){this.dispatch(u(o,e));const t=this.calculatePageGrouping(o,d.document.pages.length);this.dispatch(i(o,t)),this.spreadEmitter$.emit({documentId:o,spreadMode:e})}}getSpreadModeForDocument(e){return this.getDocumentStateOrThrow(e).spreadMode}calculatePageGrouping(e,o){switch(this.getDocumentStateOrThrow(e).spreadMode){case t.None:return Array.from({length:o},(e,t)=>[t]);case t.Odd:return Array.from({length:Math.ceil(o/2)},(e,t)=>{const r=[2*t];return 2*t+1<o&&r.push(2*t+1),r});case t.Even:return[[0],...Array.from({length:Math.ceil((o-1)/2)},(e,t)=>{const r=[1+2*t];return 1+2*t+1<o&&r.push(1+2*t+1),r})];default:return Array.from({length:o},(e,t)=>[t])}}getSpreadPages(e){const t=e??this.getActiveDocumentId(),o=this.coreState.core.documents[t],r=this.getDocumentStateOrThrow(t);if(!(null==o?void 0:o.document))throw new Error(`Document ${t} not loaded`);const d=r.pageGrouping??[],n=o.document.pages;return d.map(e=>e.map(e=>n[e]).filter(Boolean))}onStoreUpdated(e,o){for(const r in o.documents){const d=e.documents[r],n=o.documents[r];(null==d?void 0:d.spreadMode)!==n.spreadMode&&this.logger.debug("SpreadPlugin","SpreadModeChanged",`Spread mode changed for document ${r}: ${(null==d?void 0:d.spreadMode)??t.None} -> ${n.spreadMode}`)}}async initialize(e){this.logger.info("SpreadPlugin","Initialize","Spread plugin initialized")}async destroy(){this.spreadEmitter$.clear(),super.destroy()}};p.id="spread";let l=p;const m="spread",g={id:m,name:"Spread Plugin",version:"1.0.0",provides:["spread"],requires:[],optional:["viewport"],defaultConfig:{
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core");var t=(e=>(e.None="none",e.Odd="odd",e.Even="even",e))(t||{});const o="SPREAD/INIT_STATE",r="SPREAD/CLEANUP_STATE",d="SPREAD/SET_ACTIVE_DOCUMENT",n="SPREAD/SET_SPREAD_MODE",a="SPREAD/SET_PAGE_GROUPING";function s(e,t){return{type:o,payload:{documentId:e,state:t}}}function c(e){return{type:r,payload:e}}function u(e,t){return{type:n,payload:{documentId:e,spreadMode:t}}}function i(e,t){return{type:a,payload:{documentId:e,grouping:t}}}const p=class extends e.BasePlugin{constructor(o,r,d){var n;super(o,r),this.spreadEmitter$=e.createBehaviorEmitter(),this.defaultSpreadMode=d.defaultSpreadMode??t.None,this.viewport=(null==(n=r.getPlugin("viewport"))?void 0:n.provides())??null}onDocumentLoadingStarted(e){var t;const o={spreadMode:this.defaultSpreadMode};this.dispatch(s(e,o)),null==(t=this.viewport)||t.gate("spread",e),this.logger.debug("SpreadPlugin","DocumentOpened",`Initialized spread state for document: ${e}`)}onDocumentLoaded(e){var t;const o=this.coreState.core.documents[e];if(null==o?void 0:o.document){const t=this.calculatePageGrouping(e,o.document.pages.length);this.dispatch(i(e,t))}null==(t=this.viewport)||t.releaseGate("spread",e)}onDocumentClosed(e){this.dispatch(c(e)),this.logger.debug("SpreadPlugin","DocumentClosed",`Cleaned up spread state for document: ${e}`)}buildCapability(){return{setSpreadMode:e=>this.setSpreadModeForDocument(e),getSpreadMode:()=>this.getSpreadModeForDocument(),getSpreadPages:()=>this.getSpreadPages(),forDocument:e=>this.createSpreadScope(e),onSpreadChange:this.spreadEmitter$.on}}createSpreadScope(e){return{setSpreadMode:t=>this.setSpreadModeForDocument(t,e),getSpreadMode:()=>this.getSpreadModeForDocument(e),getSpreadPages:()=>this.getSpreadPages(e),onSpreadChange:t=>this.spreadEmitter$.on(o=>{o.documentId===e&&t(o.spreadMode)})}}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(`Spread state not found for document: ${e??"active"}`);return t}setSpreadModeForDocument(e,t){const o=t??this.getActiveDocumentId(),r=this.getDocumentStateOrThrow(o),d=this.coreState.core.documents[o];if(!(null==d?void 0:d.document))throw new Error(`Document ${o} not loaded`);if(r.spreadMode!==e){this.dispatch(u(o,e));const t=this.calculatePageGrouping(o,d.document.pages.length);this.dispatch(i(o,t)),this.spreadEmitter$.emit({documentId:o,spreadMode:e})}}getSpreadModeForDocument(e){return this.getDocumentStateOrThrow(e).spreadMode}calculatePageGrouping(e,o){switch(this.getDocumentStateOrThrow(e).spreadMode){case t.None:return Array.from({length:o},(e,t)=>[t]);case t.Odd:return Array.from({length:Math.ceil(o/2)},(e,t)=>{const r=[2*t];return 2*t+1<o&&r.push(2*t+1),r});case t.Even:return[[0],...Array.from({length:Math.ceil((o-1)/2)},(e,t)=>{const r=[1+2*t];return 1+2*t+1<o&&r.push(1+2*t+1),r})];default:return Array.from({length:o},(e,t)=>[t])}}getSpreadPages(e){const t=e??this.getActiveDocumentId(),o=this.coreState.core.documents[t],r=this.getDocumentStateOrThrow(t);if(!(null==o?void 0:o.document))throw new Error(`Document ${t} not loaded`);const d=r.pageGrouping??[],n=o.document.pages;return d.map(e=>e.map(e=>n[e]).filter(Boolean))}onStoreUpdated(e,o){for(const r in o.documents){const d=e.documents[r],n=o.documents[r];(null==d?void 0:d.spreadMode)!==n.spreadMode&&this.logger.debug("SpreadPlugin","SpreadModeChanged",`Spread mode changed for document ${r}: ${(null==d?void 0:d.spreadMode)??t.None} -> ${n.spreadMode}`)}}async initialize(e){this.logger.info("SpreadPlugin","Initialize","Spread plugin initialized")}async destroy(){this.spreadEmitter$.clear(),super.destroy()}};p.id="spread";let l=p;const m="spread",g={id:m,name:"Spread Plugin",version:"1.0.0",provides:["spread"],requires:[],optional:["viewport"],defaultConfig:{}},S={spreadMode:t.None},h={documents:{},activeDocumentId:null},D=(e=h,t)=>{switch(t.type){case o:{const{documentId:o,state:r}=t.payload;return{...e,documents:{...e.documents,[o]:r},activeDocumentId:e.activeDocumentId??o}}case r:{const o=t.payload,{[o]:r,...d}=e.documents;return{...e,documents:d,activeDocumentId:e.activeDocumentId===o?null:e.activeDocumentId}}case d:return{...e,activeDocumentId:t.payload};case n:{const{documentId:o,spreadMode:r}=t.payload,d=e.documents[o];return d?{...e,documents:{...e.documents,[o]:{...d,spreadMode:r}}}:e}case a:{const{documentId:o,grouping:r}=t.payload,d=e.documents[o];return d?{...e,documents:{...e.documents,[o]:{...d,pageGrouping:r}}}:e}default:return e}},E={manifest:g,create:(e,t)=>new l(m,e,t),reducer:D,initialState:h};exports.CLEANUP_SPREAD_STATE=r,exports.INIT_SPREAD_STATE=o,exports.SET_ACTIVE_SPREAD_DOCUMENT=d,exports.SET_PAGE_GROUPING=a,exports.SET_SPREAD_MODE=n,exports.SPREAD_PLUGIN_ID=m,exports.SpreadMode=t,exports.SpreadPlugin=l,exports.SpreadPluginPackage=E,exports.cleanupSpreadState=c,exports.initSpreadState=s,exports.initialDocumentState=S,exports.initialState=h,exports.manifest=g,exports.setActiveSpreadDocument=function(e){return{type:d,payload:e}},exports.setPageGrouping=i,exports.setSpreadMode=u,exports.spreadReducer=D;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/lib/types.ts","../src/lib/actions.ts","../src/lib/spread-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { BasePluginConfig, EventHook } from '@embedpdf/core';\nimport { PdfPageObject } from '@embedpdf/models';\n\nexport interface SpreadPluginConfig extends BasePluginConfig {\n defaultSpreadMode?: SpreadMode;\n}\n\nexport enum SpreadMode {\n None = 'none',\n Odd = 'odd',\n Even = 'even',\n}\n\n// Per-document spread state\nexport interface SpreadDocumentState {\n spreadMode: SpreadMode;\n pageGrouping?: number[][]; // [[0], [1,2], [3,4], ...]\n}\n\nexport interface SpreadState {\n documents: Record<string, SpreadDocumentState>;\n activeDocumentId: string | null;\n}\n\n// Events include documentId\nexport interface SpreadChangeEvent {\n documentId: string;\n spreadMode: SpreadMode;\n}\n\n// Scoped spread capability\nexport interface SpreadScope {\n setSpreadMode(mode: SpreadMode): void;\n getSpreadMode(): SpreadMode;\n getSpreadPages(): PdfPageObject[][];\n onSpreadChange: EventHook<SpreadMode>;\n}\n\nexport interface SpreadCapability {\n // Active document operations\n setSpreadMode(mode: SpreadMode): void;\n getSpreadMode(): SpreadMode;\n getSpreadPages(documentId?: string): PdfPageObject[][];\n\n // Document-scoped operations\n forDocument(documentId: string): SpreadScope;\n\n // Events\n onSpreadChange: EventHook<SpreadChangeEvent>;\n}\n","import { Action } from '@embedpdf/core';\nimport { SpreadMode, SpreadDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_SPREAD_STATE = 'SPREAD/INIT_STATE';\nexport const CLEANUP_SPREAD_STATE = 'SPREAD/CLEANUP_STATE';\nexport const SET_ACTIVE_SPREAD_DOCUMENT = 'SPREAD/SET_ACTIVE_DOCUMENT';\n\n// Spread operations\nexport const SET_SPREAD_MODE = 'SPREAD/SET_SPREAD_MODE';\nexport const SET_PAGE_GROUPING = 'SPREAD/SET_PAGE_GROUPING';\n\n// Document lifecycle actions\nexport interface InitSpreadStateAction extends Action {\n type: typeof INIT_SPREAD_STATE;\n payload: {\n documentId: string;\n state: SpreadDocumentState;\n };\n}\n\nexport interface CleanupSpreadStateAction extends Action {\n type: typeof CLEANUP_SPREAD_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveSpreadDocumentAction extends Action {\n type: typeof SET_ACTIVE_SPREAD_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetSpreadModeAction extends Action {\n type: typeof SET_SPREAD_MODE;\n payload: {\n documentId: string;\n spreadMode: SpreadMode;\n };\n}\n\nexport interface SetPageGroupingAction extends Action {\n type: typeof SET_PAGE_GROUPING;\n payload: {\n documentId: string;\n grouping: number[][];\n };\n}\n\nexport type SpreadAction =\n | InitSpreadStateAction\n | CleanupSpreadStateAction\n | SetActiveSpreadDocumentAction\n | SetSpreadModeAction\n | SetPageGroupingAction;\n\n// Action Creators\nexport function initSpreadState(\n documentId: string,\n state: SpreadDocumentState,\n): InitSpreadStateAction {\n return { type: INIT_SPREAD_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupSpreadState(documentId: string): CleanupSpreadStateAction {\n return { type: CLEANUP_SPREAD_STATE, payload: documentId };\n}\n\nexport function setActiveSpreadDocument(documentId: string | null): SetActiveSpreadDocumentAction {\n return { type: SET_ACTIVE_SPREAD_DOCUMENT, payload: documentId };\n}\n\nexport function setSpreadMode(documentId: string, spreadMode: SpreadMode): SetSpreadModeAction {\n return { type: SET_SPREAD_MODE, payload: { documentId, spreadMode } };\n}\n\nexport function setPageGrouping(documentId: string, grouping: number[][]): SetPageGroupingAction {\n return { type: SET_PAGE_GROUPING, payload: { documentId, grouping } };\n}\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport { PdfPageObject } from '@embedpdf/models';\nimport {\n SpreadCapability,\n SpreadMode,\n SpreadPluginConfig,\n SpreadState,\n SpreadScope,\n SpreadChangeEvent,\n SpreadDocumentState,\n} from './types';\nimport {\n setSpreadMode,\n initSpreadState,\n cleanupSpreadState,\n SpreadAction,\n setPageGrouping,\n} from './actions';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport class SpreadPlugin extends BasePlugin<\n SpreadPluginConfig,\n SpreadCapability,\n SpreadState,\n SpreadAction\n> {\n static readonly id = 'spread' as const;\n\n private readonly spreadEmitter$ = createBehaviorEmitter<SpreadChangeEvent>();\n private readonly defaultSpreadMode: SpreadMode;\n private readonly viewport: ViewportCapability | null;\n\n constructor(id: string, registry: PluginRegistry, cfg: SpreadPluginConfig) {\n super(id, registry);\n this.defaultSpreadMode = cfg.defaultSpreadMode ?? SpreadMode.None;\n\n this.viewport = registry.getPlugin<ViewportPlugin>('viewport')?.provides() ?? null;\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize spread state for this document\n const docState: SpreadDocumentState = {\n spreadMode: this.defaultSpreadMode,\n };\n\n this.dispatch(initSpreadState(documentId, docState));\n this.viewport?.gate('spread', documentId);\n this.logger.debug(\n 'SpreadPlugin',\n 'DocumentOpened',\n `Initialized spread state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentLoaded(documentId: string): void {\n // Calculate grouping indices and store in plugin state\n const coreDoc = this.coreState.core.documents[documentId];\n if (coreDoc?.document) {\n const grouping = this.calculatePageGrouping(documentId, coreDoc.document.pages.length);\n\n // Store grouping in plugin state\n this.dispatch(setPageGrouping(documentId, grouping));\n }\n this.viewport?.releaseGate('spread', documentId);\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.dispatch(cleanupSpreadState(documentId));\n\n this.logger.debug(\n 'SpreadPlugin',\n 'DocumentClosed',\n `Cleaned up spread state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): SpreadCapability {\n return {\n // Active document operations\n setSpreadMode: (mode: SpreadMode) => this.setSpreadModeForDocument(mode),\n getSpreadMode: () => this.getSpreadModeForDocument(),\n getSpreadPages: () => this.getSpreadPages(),\n // Document-scoped operations\n forDocument: (documentId: string) => this.createSpreadScope(documentId),\n\n // Events\n onSpreadChange: this.spreadEmitter$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createSpreadScope(documentId: string): SpreadScope {\n return {\n setSpreadMode: (mode: SpreadMode) => this.setSpreadModeForDocument(mode, documentId),\n getSpreadMode: () => this.getSpreadModeForDocument(documentId),\n getSpreadPages: () => this.getSpreadPages(documentId),\n onSpreadChange: (listener: Listener<SpreadMode>) =>\n this.spreadEmitter$.on((event) => {\n if (event.documentId === documentId) listener(event.spreadMode);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n private getDocumentState(documentId?: string): SpreadDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): SpreadDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Spread state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private setSpreadModeForDocument(mode: SpreadMode, documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n const currentState = this.getDocumentStateOrThrow(id);\n const coreDoc = this.coreState.core.documents[id];\n\n if (!coreDoc?.document) {\n throw new Error(`Document ${id} not loaded`);\n }\n\n if (currentState.spreadMode !== mode) {\n // Update plugin state\n this.dispatch(setSpreadMode(id, mode));\n\n // Calculate new grouping\n const grouping = this.calculatePageGrouping(id, coreDoc.document.pages.length);\n this.dispatch(setPageGrouping(id, grouping));\n\n // Emit event\n this.spreadEmitter$.emit({\n documentId: id,\n spreadMode: mode,\n });\n }\n }\n\n private getSpreadModeForDocument(documentId?: string): SpreadMode {\n return this.getDocumentStateOrThrow(documentId).spreadMode;\n }\n\n /**\n * Calculate page grouping indices based on spread mode\n * Returns indices, not actual page objects\n */\n private calculatePageGrouping(documentId: string, pageCount: number): number[][] {\n const docState = this.getDocumentStateOrThrow(documentId);\n const spreadMode = docState.spreadMode;\n\n switch (spreadMode) {\n case SpreadMode.None:\n // [[0], [1], [2], [3], ...]\n return Array.from({ length: pageCount }, (_, i) => [i]);\n\n case SpreadMode.Odd:\n // [[0, 1], [2, 3], [4, 5], ...]\n return Array.from({ length: Math.ceil(pageCount / 2) }, (_, i) => {\n const indices = [i * 2];\n if (i * 2 + 1 < pageCount) indices.push(i * 2 + 1);\n return indices;\n });\n\n case SpreadMode.Even:\n // [[0], [1, 2], [3, 4], [5, 6], ...]\n return [\n [0],\n ...Array.from({ length: Math.ceil((pageCount - 1) / 2) }, (_, i) => {\n const indices = [1 + i * 2];\n if (1 + i * 2 + 1 < pageCount) indices.push(1 + i * 2 + 1);\n return indices;\n }),\n ];\n\n default:\n return Array.from({ length: pageCount }, (_, i) => [i]);\n }\n }\n\n /**\n * Get the actual page objects grouped according to spread mode\n * This is computed on-demand, not stored\n */\n private getSpreadPages(documentId?: string): PdfPageObject[][] {\n const id = documentId ?? this.getActiveDocumentId();\n const coreDoc = this.coreState.core.documents[id];\n const spreadState = this.getDocumentStateOrThrow(id);\n\n if (!coreDoc?.document) {\n throw new Error(`Document ${id} not loaded`);\n }\n\n const grouping = spreadState.pageGrouping ?? [];\n const pages = coreDoc.document.pages;\n\n // Map indices to actual page objects\n return grouping.map((indices) => indices.map((idx) => pages[idx]).filter(Boolean));\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: SpreadState, newState: SpreadState): void {\n // Emit spread change events 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?.spreadMode !== newDoc.spreadMode) {\n this.logger.debug(\n 'SpreadPlugin',\n 'SpreadModeChanged',\n `Spread mode changed for document ${documentId}: ${prevDoc?.spreadMode ?? SpreadMode.None} -> ${newDoc.spreadMode}`,\n );\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_config: SpreadPluginConfig): Promise<void> {\n this.logger.info('SpreadPlugin', 'Initialize', 'Spread plugin initialized');\n }\n\n async destroy(): Promise<void> {\n this.spreadEmitter$.clear();\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SpreadPluginConfig } from './types';\n\nexport const SPREAD_PLUGIN_ID = 'spread';\n\nexport const manifest: PluginManifest<SpreadPluginConfig> = {\n id: SPREAD_PLUGIN_ID,\n name: 'Spread Plugin',\n version: '1.0.0',\n provides: ['spread'],\n requires: [],\n optional: ['viewport'],\n defaultConfig: {\n enabled: true,\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n SpreadAction,\n INIT_SPREAD_STATE,\n CLEANUP_SPREAD_STATE,\n SET_ACTIVE_SPREAD_DOCUMENT,\n SET_SPREAD_MODE,\n SET_PAGE_GROUPING,\n} from './actions';\nimport { SpreadState, SpreadDocumentState, SpreadMode } from './types';\n\nexport const initialDocumentState: SpreadDocumentState = {\n spreadMode: SpreadMode.None,\n};\n\nexport const initialState: SpreadState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const spreadReducer: Reducer<SpreadState, SpreadAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_SPREAD_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_SPREAD_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_SPREAD_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_SPREAD_MODE: {\n const { documentId, spreadMode } = 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 spreadMode,\n },\n },\n };\n }\n\n case SET_PAGE_GROUPING: {\n const { documentId, grouping } = 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 pageGrouping: grouping,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SpreadPlugin } from './spread-plugin';\nimport { manifest, SPREAD_PLUGIN_ID } from './manifest';\nimport { SpreadPluginConfig, SpreadState } from './types';\nimport { spreadReducer, initialState } from './reducer';\nimport { SpreadAction } from './actions';\n\nexport const SpreadPluginPackage: PluginPackage<\n SpreadPlugin,\n SpreadPluginConfig,\n SpreadState,\n SpreadAction\n> = {\n manifest,\n create: (registry, config) => new SpreadPlugin(SPREAD_PLUGIN_ID, registry, config),\n reducer: spreadReducer,\n initialState,\n};\n\nexport * from './spread-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":["SpreadMode","INIT_SPREAD_STATE","CLEANUP_SPREAD_STATE","SET_ACTIVE_SPREAD_DOCUMENT","SET_SPREAD_MODE","SET_PAGE_GROUPING","initSpreadState","documentId","state","type","payload","cleanupSpreadState","setSpreadMode","spreadMode","setPageGrouping","grouping","_SpreadPlugin","BasePlugin","constructor","id","registry","cfg","super","this","spreadEmitter$","createBehaviorEmitter","defaultSpreadMode","None","viewport","_a","getPlugin","provides","onDocumentLoadingStarted","docState","dispatch","gate","logger","debug","onDocumentLoaded","coreDoc","coreState","core","documents","document","calculatePageGrouping","pages","length","releaseGate","onDocumentClosed","buildCapability","mode","setSpreadModeForDocument","getSpreadMode","getSpreadModeForDocument","getSpreadPages","forDocument","createSpreadScope","onSpreadChange","on","listener","event","getDocumentState","getActiveDocumentId","getDocumentStateOrThrow","Error","currentState","emit","pageCount","Array","from","_","i","Odd","Math","ceil","indices","push","Even","spreadState","pageGrouping","map","idx","filter","Boolean","onStoreUpdated","prevState","newState","prevDoc","newDoc","initialize","_config","info","destroy","clear","SpreadPlugin","SPREAD_PLUGIN_ID","manifest","name","version","requires","optional","defaultConfig","enabled","initialDocumentState","initialState","activeDocumentId","spreadReducer","action","removed","remainingDocs","SpreadPluginPackage","create","config","reducer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/lib/types.ts","../src/lib/actions.ts","../src/lib/spread-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { BasePluginConfig, EventHook } from '@embedpdf/core';\nimport { PdfPageObject } from '@embedpdf/models';\n\nexport interface SpreadPluginConfig extends BasePluginConfig {\n defaultSpreadMode?: SpreadMode;\n}\n\nexport enum SpreadMode {\n None = 'none',\n Odd = 'odd',\n Even = 'even',\n}\n\n// Per-document spread state\nexport interface SpreadDocumentState {\n spreadMode: SpreadMode;\n pageGrouping?: number[][]; // [[0], [1,2], [3,4], ...]\n}\n\nexport interface SpreadState {\n documents: Record<string, SpreadDocumentState>;\n activeDocumentId: string | null;\n}\n\n// Events include documentId\nexport interface SpreadChangeEvent {\n documentId: string;\n spreadMode: SpreadMode;\n}\n\n// Scoped spread capability\nexport interface SpreadScope {\n setSpreadMode(mode: SpreadMode): void;\n getSpreadMode(): SpreadMode;\n getSpreadPages(): PdfPageObject[][];\n onSpreadChange: EventHook<SpreadMode>;\n}\n\nexport interface SpreadCapability {\n // Active document operations\n setSpreadMode(mode: SpreadMode): void;\n getSpreadMode(): SpreadMode;\n getSpreadPages(documentId?: string): PdfPageObject[][];\n\n // Document-scoped operations\n forDocument(documentId: string): SpreadScope;\n\n // Events\n onSpreadChange: EventHook<SpreadChangeEvent>;\n}\n","import { Action } from '@embedpdf/core';\nimport { SpreadMode, SpreadDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_SPREAD_STATE = 'SPREAD/INIT_STATE';\nexport const CLEANUP_SPREAD_STATE = 'SPREAD/CLEANUP_STATE';\nexport const SET_ACTIVE_SPREAD_DOCUMENT = 'SPREAD/SET_ACTIVE_DOCUMENT';\n\n// Spread operations\nexport const SET_SPREAD_MODE = 'SPREAD/SET_SPREAD_MODE';\nexport const SET_PAGE_GROUPING = 'SPREAD/SET_PAGE_GROUPING';\n\n// Document lifecycle actions\nexport interface InitSpreadStateAction extends Action {\n type: typeof INIT_SPREAD_STATE;\n payload: {\n documentId: string;\n state: SpreadDocumentState;\n };\n}\n\nexport interface CleanupSpreadStateAction extends Action {\n type: typeof CLEANUP_SPREAD_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveSpreadDocumentAction extends Action {\n type: typeof SET_ACTIVE_SPREAD_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetSpreadModeAction extends Action {\n type: typeof SET_SPREAD_MODE;\n payload: {\n documentId: string;\n spreadMode: SpreadMode;\n };\n}\n\nexport interface SetPageGroupingAction extends Action {\n type: typeof SET_PAGE_GROUPING;\n payload: {\n documentId: string;\n grouping: number[][];\n };\n}\n\nexport type SpreadAction =\n | InitSpreadStateAction\n | CleanupSpreadStateAction\n | SetActiveSpreadDocumentAction\n | SetSpreadModeAction\n | SetPageGroupingAction;\n\n// Action Creators\nexport function initSpreadState(\n documentId: string,\n state: SpreadDocumentState,\n): InitSpreadStateAction {\n return { type: INIT_SPREAD_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupSpreadState(documentId: string): CleanupSpreadStateAction {\n return { type: CLEANUP_SPREAD_STATE, payload: documentId };\n}\n\nexport function setActiveSpreadDocument(documentId: string | null): SetActiveSpreadDocumentAction {\n return { type: SET_ACTIVE_SPREAD_DOCUMENT, payload: documentId };\n}\n\nexport function setSpreadMode(documentId: string, spreadMode: SpreadMode): SetSpreadModeAction {\n return { type: SET_SPREAD_MODE, payload: { documentId, spreadMode } };\n}\n\nexport function setPageGrouping(documentId: string, grouping: number[][]): SetPageGroupingAction {\n return { type: SET_PAGE_GROUPING, payload: { documentId, grouping } };\n}\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport { PdfPageObject } from '@embedpdf/models';\nimport {\n SpreadCapability,\n SpreadMode,\n SpreadPluginConfig,\n SpreadState,\n SpreadScope,\n SpreadChangeEvent,\n SpreadDocumentState,\n} from './types';\nimport {\n setSpreadMode,\n initSpreadState,\n cleanupSpreadState,\n SpreadAction,\n setPageGrouping,\n} from './actions';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport class SpreadPlugin extends BasePlugin<\n SpreadPluginConfig,\n SpreadCapability,\n SpreadState,\n SpreadAction\n> {\n static readonly id = 'spread' as const;\n\n private readonly spreadEmitter$ = createBehaviorEmitter<SpreadChangeEvent>();\n private readonly defaultSpreadMode: SpreadMode;\n private readonly viewport: ViewportCapability | null;\n\n constructor(id: string, registry: PluginRegistry, cfg: SpreadPluginConfig) {\n super(id, registry);\n this.defaultSpreadMode = cfg.defaultSpreadMode ?? SpreadMode.None;\n\n this.viewport = registry.getPlugin<ViewportPlugin>('viewport')?.provides() ?? null;\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize spread state for this document\n const docState: SpreadDocumentState = {\n spreadMode: this.defaultSpreadMode,\n };\n\n this.dispatch(initSpreadState(documentId, docState));\n this.viewport?.gate('spread', documentId);\n this.logger.debug(\n 'SpreadPlugin',\n 'DocumentOpened',\n `Initialized spread state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentLoaded(documentId: string): void {\n // Calculate grouping indices and store in plugin state\n const coreDoc = this.coreState.core.documents[documentId];\n if (coreDoc?.document) {\n const grouping = this.calculatePageGrouping(documentId, coreDoc.document.pages.length);\n\n // Store grouping in plugin state\n this.dispatch(setPageGrouping(documentId, grouping));\n }\n this.viewport?.releaseGate('spread', documentId);\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.dispatch(cleanupSpreadState(documentId));\n\n this.logger.debug(\n 'SpreadPlugin',\n 'DocumentClosed',\n `Cleaned up spread state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): SpreadCapability {\n return {\n // Active document operations\n setSpreadMode: (mode: SpreadMode) => this.setSpreadModeForDocument(mode),\n getSpreadMode: () => this.getSpreadModeForDocument(),\n getSpreadPages: () => this.getSpreadPages(),\n // Document-scoped operations\n forDocument: (documentId: string) => this.createSpreadScope(documentId),\n\n // Events\n onSpreadChange: this.spreadEmitter$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createSpreadScope(documentId: string): SpreadScope {\n return {\n setSpreadMode: (mode: SpreadMode) => this.setSpreadModeForDocument(mode, documentId),\n getSpreadMode: () => this.getSpreadModeForDocument(documentId),\n getSpreadPages: () => this.getSpreadPages(documentId),\n onSpreadChange: (listener: Listener<SpreadMode>) =>\n this.spreadEmitter$.on((event) => {\n if (event.documentId === documentId) listener(event.spreadMode);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n private getDocumentState(documentId?: string): SpreadDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): SpreadDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Spread state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private setSpreadModeForDocument(mode: SpreadMode, documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n const currentState = this.getDocumentStateOrThrow(id);\n const coreDoc = this.coreState.core.documents[id];\n\n if (!coreDoc?.document) {\n throw new Error(`Document ${id} not loaded`);\n }\n\n if (currentState.spreadMode !== mode) {\n // Update plugin state\n this.dispatch(setSpreadMode(id, mode));\n\n // Calculate new grouping\n const grouping = this.calculatePageGrouping(id, coreDoc.document.pages.length);\n this.dispatch(setPageGrouping(id, grouping));\n\n // Emit event\n this.spreadEmitter$.emit({\n documentId: id,\n spreadMode: mode,\n });\n }\n }\n\n private getSpreadModeForDocument(documentId?: string): SpreadMode {\n return this.getDocumentStateOrThrow(documentId).spreadMode;\n }\n\n /**\n * Calculate page grouping indices based on spread mode\n * Returns indices, not actual page objects\n */\n private calculatePageGrouping(documentId: string, pageCount: number): number[][] {\n const docState = this.getDocumentStateOrThrow(documentId);\n const spreadMode = docState.spreadMode;\n\n switch (spreadMode) {\n case SpreadMode.None:\n // [[0], [1], [2], [3], ...]\n return Array.from({ length: pageCount }, (_, i) => [i]);\n\n case SpreadMode.Odd:\n // [[0, 1], [2, 3], [4, 5], ...]\n return Array.from({ length: Math.ceil(pageCount / 2) }, (_, i) => {\n const indices = [i * 2];\n if (i * 2 + 1 < pageCount) indices.push(i * 2 + 1);\n return indices;\n });\n\n case SpreadMode.Even:\n // [[0], [1, 2], [3, 4], [5, 6], ...]\n return [\n [0],\n ...Array.from({ length: Math.ceil((pageCount - 1) / 2) }, (_, i) => {\n const indices = [1 + i * 2];\n if (1 + i * 2 + 1 < pageCount) indices.push(1 + i * 2 + 1);\n return indices;\n }),\n ];\n\n default:\n return Array.from({ length: pageCount }, (_, i) => [i]);\n }\n }\n\n /**\n * Get the actual page objects grouped according to spread mode\n * This is computed on-demand, not stored\n */\n private getSpreadPages(documentId?: string): PdfPageObject[][] {\n const id = documentId ?? this.getActiveDocumentId();\n const coreDoc = this.coreState.core.documents[id];\n const spreadState = this.getDocumentStateOrThrow(id);\n\n if (!coreDoc?.document) {\n throw new Error(`Document ${id} not loaded`);\n }\n\n const grouping = spreadState.pageGrouping ?? [];\n const pages = coreDoc.document.pages;\n\n // Map indices to actual page objects\n return grouping.map((indices) => indices.map((idx) => pages[idx]).filter(Boolean));\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: SpreadState, newState: SpreadState): void {\n // Emit spread change events 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?.spreadMode !== newDoc.spreadMode) {\n this.logger.debug(\n 'SpreadPlugin',\n 'SpreadModeChanged',\n `Spread mode changed for document ${documentId}: ${prevDoc?.spreadMode ?? SpreadMode.None} -> ${newDoc.spreadMode}`,\n );\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_config: SpreadPluginConfig): Promise<void> {\n this.logger.info('SpreadPlugin', 'Initialize', 'Spread plugin initialized');\n }\n\n async destroy(): Promise<void> {\n this.spreadEmitter$.clear();\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SpreadPluginConfig } from './types';\n\nexport const SPREAD_PLUGIN_ID = 'spread';\n\nexport const manifest: PluginManifest<SpreadPluginConfig> = {\n id: SPREAD_PLUGIN_ID,\n name: 'Spread Plugin',\n version: '1.0.0',\n provides: ['spread'],\n requires: [],\n optional: ['viewport'],\n defaultConfig: {},\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n SpreadAction,\n INIT_SPREAD_STATE,\n CLEANUP_SPREAD_STATE,\n SET_ACTIVE_SPREAD_DOCUMENT,\n SET_SPREAD_MODE,\n SET_PAGE_GROUPING,\n} from './actions';\nimport { SpreadState, SpreadDocumentState, SpreadMode } from './types';\n\nexport const initialDocumentState: SpreadDocumentState = {\n spreadMode: SpreadMode.None,\n};\n\nexport const initialState: SpreadState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const spreadReducer: Reducer<SpreadState, SpreadAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_SPREAD_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_SPREAD_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_SPREAD_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_SPREAD_MODE: {\n const { documentId, spreadMode } = 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 spreadMode,\n },\n },\n };\n }\n\n case SET_PAGE_GROUPING: {\n const { documentId, grouping } = 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 pageGrouping: grouping,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SpreadPlugin } from './spread-plugin';\nimport { manifest, SPREAD_PLUGIN_ID } from './manifest';\nimport { SpreadPluginConfig, SpreadState } from './types';\nimport { spreadReducer, initialState } from './reducer';\nimport { SpreadAction } from './actions';\n\nexport const SpreadPluginPackage: PluginPackage<\n SpreadPlugin,\n SpreadPluginConfig,\n SpreadState,\n SpreadAction\n> = {\n manifest,\n create: (registry, config) => new SpreadPlugin(SPREAD_PLUGIN_ID, registry, config),\n reducer: spreadReducer,\n initialState,\n};\n\nexport * from './spread-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":["SpreadMode","INIT_SPREAD_STATE","CLEANUP_SPREAD_STATE","SET_ACTIVE_SPREAD_DOCUMENT","SET_SPREAD_MODE","SET_PAGE_GROUPING","initSpreadState","documentId","state","type","payload","cleanupSpreadState","setSpreadMode","spreadMode","setPageGrouping","grouping","_SpreadPlugin","BasePlugin","constructor","id","registry","cfg","super","this","spreadEmitter$","createBehaviorEmitter","defaultSpreadMode","None","viewport","_a","getPlugin","provides","onDocumentLoadingStarted","docState","dispatch","gate","logger","debug","onDocumentLoaded","coreDoc","coreState","core","documents","document","calculatePageGrouping","pages","length","releaseGate","onDocumentClosed","buildCapability","mode","setSpreadModeForDocument","getSpreadMode","getSpreadModeForDocument","getSpreadPages","forDocument","createSpreadScope","onSpreadChange","on","listener","event","getDocumentState","getActiveDocumentId","getDocumentStateOrThrow","Error","currentState","emit","pageCount","Array","from","_","i","Odd","Math","ceil","indices","push","Even","spreadState","pageGrouping","map","idx","filter","Boolean","onStoreUpdated","prevState","newState","prevDoc","newDoc","initialize","_config","info","destroy","clear","SpreadPlugin","SPREAD_PLUGIN_ID","manifest","name","version","requires","optional","defaultConfig","initialDocumentState","initialState","activeDocumentId","spreadReducer","action","removed","remainingDocs","SpreadPluginPackage","create","config","reducer"],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/lib/types.ts","../src/lib/actions.ts","../src/lib/spread-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { BasePluginConfig, EventHook } from '@embedpdf/core';\nimport { PdfPageObject } from '@embedpdf/models';\n\nexport interface SpreadPluginConfig extends BasePluginConfig {\n defaultSpreadMode?: SpreadMode;\n}\n\nexport enum SpreadMode {\n None = 'none',\n Odd = 'odd',\n Even = 'even',\n}\n\n// Per-document spread state\nexport interface SpreadDocumentState {\n spreadMode: SpreadMode;\n pageGrouping?: number[][]; // [[0], [1,2], [3,4], ...]\n}\n\nexport interface SpreadState {\n documents: Record<string, SpreadDocumentState>;\n activeDocumentId: string | null;\n}\n\n// Events include documentId\nexport interface SpreadChangeEvent {\n documentId: string;\n spreadMode: SpreadMode;\n}\n\n// Scoped spread capability\nexport interface SpreadScope {\n setSpreadMode(mode: SpreadMode): void;\n getSpreadMode(): SpreadMode;\n getSpreadPages(): PdfPageObject[][];\n onSpreadChange: EventHook<SpreadMode>;\n}\n\nexport interface SpreadCapability {\n // Active document operations\n setSpreadMode(mode: SpreadMode): void;\n getSpreadMode(): SpreadMode;\n getSpreadPages(documentId?: string): PdfPageObject[][];\n\n // Document-scoped operations\n forDocument(documentId: string): SpreadScope;\n\n // Events\n onSpreadChange: EventHook<SpreadChangeEvent>;\n}\n","import { Action } from '@embedpdf/core';\nimport { SpreadMode, SpreadDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_SPREAD_STATE = 'SPREAD/INIT_STATE';\nexport const CLEANUP_SPREAD_STATE = 'SPREAD/CLEANUP_STATE';\nexport const SET_ACTIVE_SPREAD_DOCUMENT = 'SPREAD/SET_ACTIVE_DOCUMENT';\n\n// Spread operations\nexport const SET_SPREAD_MODE = 'SPREAD/SET_SPREAD_MODE';\nexport const SET_PAGE_GROUPING = 'SPREAD/SET_PAGE_GROUPING';\n\n// Document lifecycle actions\nexport interface InitSpreadStateAction extends Action {\n type: typeof INIT_SPREAD_STATE;\n payload: {\n documentId: string;\n state: SpreadDocumentState;\n };\n}\n\nexport interface CleanupSpreadStateAction extends Action {\n type: typeof CLEANUP_SPREAD_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveSpreadDocumentAction extends Action {\n type: typeof SET_ACTIVE_SPREAD_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetSpreadModeAction extends Action {\n type: typeof SET_SPREAD_MODE;\n payload: {\n documentId: string;\n spreadMode: SpreadMode;\n };\n}\n\nexport interface SetPageGroupingAction extends Action {\n type: typeof SET_PAGE_GROUPING;\n payload: {\n documentId: string;\n grouping: number[][];\n };\n}\n\nexport type SpreadAction =\n | InitSpreadStateAction\n | CleanupSpreadStateAction\n | SetActiveSpreadDocumentAction\n | SetSpreadModeAction\n | SetPageGroupingAction;\n\n// Action Creators\nexport function initSpreadState(\n documentId: string,\n state: SpreadDocumentState,\n): InitSpreadStateAction {\n return { type: INIT_SPREAD_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupSpreadState(documentId: string): CleanupSpreadStateAction {\n return { type: CLEANUP_SPREAD_STATE, payload: documentId };\n}\n\nexport function setActiveSpreadDocument(documentId: string | null): SetActiveSpreadDocumentAction {\n return { type: SET_ACTIVE_SPREAD_DOCUMENT, payload: documentId };\n}\n\nexport function setSpreadMode(documentId: string, spreadMode: SpreadMode): SetSpreadModeAction {\n return { type: SET_SPREAD_MODE, payload: { documentId, spreadMode } };\n}\n\nexport function setPageGrouping(documentId: string, grouping: number[][]): SetPageGroupingAction {\n return { type: SET_PAGE_GROUPING, payload: { documentId, grouping } };\n}\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport { PdfPageObject } from '@embedpdf/models';\nimport {\n SpreadCapability,\n SpreadMode,\n SpreadPluginConfig,\n SpreadState,\n SpreadScope,\n SpreadChangeEvent,\n SpreadDocumentState,\n} from './types';\nimport {\n setSpreadMode,\n initSpreadState,\n cleanupSpreadState,\n SpreadAction,\n setPageGrouping,\n} from './actions';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport class SpreadPlugin extends BasePlugin<\n SpreadPluginConfig,\n SpreadCapability,\n SpreadState,\n SpreadAction\n> {\n static readonly id = 'spread' as const;\n\n private readonly spreadEmitter$ = createBehaviorEmitter<SpreadChangeEvent>();\n private readonly defaultSpreadMode: SpreadMode;\n private readonly viewport: ViewportCapability | null;\n\n constructor(id: string, registry: PluginRegistry, cfg: SpreadPluginConfig) {\n super(id, registry);\n this.defaultSpreadMode = cfg.defaultSpreadMode ?? SpreadMode.None;\n\n this.viewport = registry.getPlugin<ViewportPlugin>('viewport')?.provides() ?? null;\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize spread state for this document\n const docState: SpreadDocumentState = {\n spreadMode: this.defaultSpreadMode,\n };\n\n this.dispatch(initSpreadState(documentId, docState));\n this.viewport?.gate('spread', documentId);\n this.logger.debug(\n 'SpreadPlugin',\n 'DocumentOpened',\n `Initialized spread state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentLoaded(documentId: string): void {\n // Calculate grouping indices and store in plugin state\n const coreDoc = this.coreState.core.documents[documentId];\n if (coreDoc?.document) {\n const grouping = this.calculatePageGrouping(documentId, coreDoc.document.pages.length);\n\n // Store grouping in plugin state\n this.dispatch(setPageGrouping(documentId, grouping));\n }\n this.viewport?.releaseGate('spread', documentId);\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.dispatch(cleanupSpreadState(documentId));\n\n this.logger.debug(\n 'SpreadPlugin',\n 'DocumentClosed',\n `Cleaned up spread state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): SpreadCapability {\n return {\n // Active document operations\n setSpreadMode: (mode: SpreadMode) => this.setSpreadModeForDocument(mode),\n getSpreadMode: () => this.getSpreadModeForDocument(),\n getSpreadPages: () => this.getSpreadPages(),\n // Document-scoped operations\n forDocument: (documentId: string) => this.createSpreadScope(documentId),\n\n // Events\n onSpreadChange: this.spreadEmitter$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createSpreadScope(documentId: string): SpreadScope {\n return {\n setSpreadMode: (mode: SpreadMode) => this.setSpreadModeForDocument(mode, documentId),\n getSpreadMode: () => this.getSpreadModeForDocument(documentId),\n getSpreadPages: () => this.getSpreadPages(documentId),\n onSpreadChange: (listener: Listener<SpreadMode>) =>\n this.spreadEmitter$.on((event) => {\n if (event.documentId === documentId) listener(event.spreadMode);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n private getDocumentState(documentId?: string): SpreadDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): SpreadDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Spread state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private setSpreadModeForDocument(mode: SpreadMode, documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n const currentState = this.getDocumentStateOrThrow(id);\n const coreDoc = this.coreState.core.documents[id];\n\n if (!coreDoc?.document) {\n throw new Error(`Document ${id} not loaded`);\n }\n\n if (currentState.spreadMode !== mode) {\n // Update plugin state\n this.dispatch(setSpreadMode(id, mode));\n\n // Calculate new grouping\n const grouping = this.calculatePageGrouping(id, coreDoc.document.pages.length);\n this.dispatch(setPageGrouping(id, grouping));\n\n // Emit event\n this.spreadEmitter$.emit({\n documentId: id,\n spreadMode: mode,\n });\n }\n }\n\n private getSpreadModeForDocument(documentId?: string): SpreadMode {\n return this.getDocumentStateOrThrow(documentId).spreadMode;\n }\n\n /**\n * Calculate page grouping indices based on spread mode\n * Returns indices, not actual page objects\n */\n private calculatePageGrouping(documentId: string, pageCount: number): number[][] {\n const docState = this.getDocumentStateOrThrow(documentId);\n const spreadMode = docState.spreadMode;\n\n switch (spreadMode) {\n case SpreadMode.None:\n // [[0], [1], [2], [3], ...]\n return Array.from({ length: pageCount }, (_, i) => [i]);\n\n case SpreadMode.Odd:\n // [[0, 1], [2, 3], [4, 5], ...]\n return Array.from({ length: Math.ceil(pageCount / 2) }, (_, i) => {\n const indices = [i * 2];\n if (i * 2 + 1 < pageCount) indices.push(i * 2 + 1);\n return indices;\n });\n\n case SpreadMode.Even:\n // [[0], [1, 2], [3, 4], [5, 6], ...]\n return [\n [0],\n ...Array.from({ length: Math.ceil((pageCount - 1) / 2) }, (_, i) => {\n const indices = [1 + i * 2];\n if (1 + i * 2 + 1 < pageCount) indices.push(1 + i * 2 + 1);\n return indices;\n }),\n ];\n\n default:\n return Array.from({ length: pageCount }, (_, i) => [i]);\n }\n }\n\n /**\n * Get the actual page objects grouped according to spread mode\n * This is computed on-demand, not stored\n */\n private getSpreadPages(documentId?: string): PdfPageObject[][] {\n const id = documentId ?? this.getActiveDocumentId();\n const coreDoc = this.coreState.core.documents[id];\n const spreadState = this.getDocumentStateOrThrow(id);\n\n if (!coreDoc?.document) {\n throw new Error(`Document ${id} not loaded`);\n }\n\n const grouping = spreadState.pageGrouping ?? [];\n const pages = coreDoc.document.pages;\n\n // Map indices to actual page objects\n return grouping.map((indices) => indices.map((idx) => pages[idx]).filter(Boolean));\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: SpreadState, newState: SpreadState): void {\n // Emit spread change events 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?.spreadMode !== newDoc.spreadMode) {\n this.logger.debug(\n 'SpreadPlugin',\n 'SpreadModeChanged',\n `Spread mode changed for document ${documentId}: ${prevDoc?.spreadMode ?? SpreadMode.None} -> ${newDoc.spreadMode}`,\n );\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_config: SpreadPluginConfig): Promise<void> {\n this.logger.info('SpreadPlugin', 'Initialize', 'Spread plugin initialized');\n }\n\n async destroy(): Promise<void> {\n this.spreadEmitter$.clear();\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SpreadPluginConfig } from './types';\n\nexport const SPREAD_PLUGIN_ID = 'spread';\n\nexport const manifest: PluginManifest<SpreadPluginConfig> = {\n id: SPREAD_PLUGIN_ID,\n name: 'Spread Plugin',\n version: '1.0.0',\n provides: ['spread'],\n requires: [],\n optional: ['viewport'],\n defaultConfig: {\n enabled: true,\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n SpreadAction,\n INIT_SPREAD_STATE,\n CLEANUP_SPREAD_STATE,\n SET_ACTIVE_SPREAD_DOCUMENT,\n SET_SPREAD_MODE,\n SET_PAGE_GROUPING,\n} from './actions';\nimport { SpreadState, SpreadDocumentState, SpreadMode } from './types';\n\nexport const initialDocumentState: SpreadDocumentState = {\n spreadMode: SpreadMode.None,\n};\n\nexport const initialState: SpreadState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const spreadReducer: Reducer<SpreadState, SpreadAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_SPREAD_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_SPREAD_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_SPREAD_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_SPREAD_MODE: {\n const { documentId, spreadMode } = 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 spreadMode,\n },\n },\n };\n }\n\n case SET_PAGE_GROUPING: {\n const { documentId, grouping } = 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 pageGrouping: grouping,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SpreadPlugin } from './spread-plugin';\nimport { manifest, SPREAD_PLUGIN_ID } from './manifest';\nimport { SpreadPluginConfig, SpreadState } from './types';\nimport { spreadReducer, initialState } from './reducer';\nimport { SpreadAction } from './actions';\n\nexport const SpreadPluginPackage: PluginPackage<\n SpreadPlugin,\n SpreadPluginConfig,\n SpreadState,\n SpreadAction\n> = {\n manifest,\n create: (registry, config) => new SpreadPlugin(SPREAD_PLUGIN_ID, registry, config),\n reducer: spreadReducer,\n initialState,\n};\n\nexport * from './spread-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":["SpreadMode"],"mappings":";AAOO,IAAK,+BAAAA,gBAAL;AACLA,cAAA,MAAA,IAAO;AACPA,cAAA,KAAA,IAAM;AACNA,cAAA,MAAA,IAAO;AAHG,SAAAA;AAAA,GAAA,cAAA,CAAA,CAAA;ACHL,MAAM,oBAAoB;AAC1B,MAAM,uBAAuB;AAC7B,MAAM,6BAA6B;AAGnC,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AA6C1B,SAAS,gBACd,YACA,OACuB;AACvB,SAAO,EAAE,MAAM,mBAAmB,SAAS,EAAE,YAAY,QAAM;AACjE;AAEO,SAAS,mBAAmB,YAA8C;AAC/E,SAAO,EAAE,MAAM,sBAAsB,SAAS,WAAA;AAChD;AAEO,SAAS,wBAAwB,YAA0D;AAChG,SAAO,EAAE,MAAM,4BAA4B,SAAS,WAAA;AACtD;AAEO,SAAS,cAAc,YAAoB,YAA6C;AAC7F,SAAO,EAAE,MAAM,iBAAiB,SAAS,EAAE,YAAY,aAAW;AACpE;AAEO,SAAS,gBAAgB,YAAoB,UAA6C;AAC/F,SAAO,EAAE,MAAM,mBAAmB,SAAS,EAAE,YAAY,WAAS;AACpE;ACxDO,MAAM,gBAAN,MAAM,sBAAqB,WAKhC;AAAA,EAOA,YAAY,IAAY,UAA0B,KAAyB;;AACzE,UAAM,IAAI,QAAQ;AALpB,SAAiB,iBAAiB,sBAAA;AAMhC,SAAK,oBAAoB,IAAI,qBAAqB,WAAW;AAE7D,SAAK,aAAW,cAAS,UAA0B,UAAU,MAA7C,mBAAgD,eAAc;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAMmB,yBAAyB,YAA0B;;AAEpE,UAAM,WAAgC;AAAA,MACpC,YAAY,KAAK;AAAA,IAAA;AAGnB,SAAK,SAAS,gBAAgB,YAAY,QAAQ,CAAC;AACnD,eAAK,aAAL,mBAAe,KAAK,UAAU;AAC9B,SAAK,OAAO;AAAA,MACV;AAAA,MACA;AAAA,MACA,0CAA0C,UAAU;AAAA,IAAA;AAAA,EAExD;AAAA,EAEmB,iBAAiB,YAA0B;;AAE5D,UAAM,UAAU,KAAK,UAAU,KAAK,UAAU,UAAU;AACxD,QAAI,mCAAS,UAAU;AACrB,YAAM,WAAW,KAAK,sBAAsB,YAAY,QAAQ,SAAS,MAAM,MAAM;AAGrF,WAAK,SAAS,gBAAgB,YAAY,QAAQ,CAAC;AAAA,IACrD;AACA,eAAK,aAAL,mBAAe,YAAY,UAAU;AAAA,EACvC;AAAA,EAEmB,iBAAiB,YAA0B;AAC5D,SAAK,SAAS,mBAAmB,UAAU,CAAC;AAE5C,SAAK,OAAO;AAAA,MACV;AAAA,MACA;AAAA,MACA,yCAAyC,UAAU;AAAA,IAAA;AAAA,EAEvD;AAAA;AAAA;AAAA;AAAA,EAMU,kBAAoC;AAC5C,WAAO;AAAA;AAAA,MAEL,eAAe,CAAC,SAAqB,KAAK,yBAAyB,IAAI;AAAA,MACvE,eAAe,MAAM,KAAK,yBAAA;AAAA,MAC1B,gBAAgB,MAAM,KAAK,eAAA;AAAA;AAAA,MAE3B,aAAa,CAAC,eAAuB,KAAK,kBAAkB,UAAU;AAAA;AAAA,MAGtE,gBAAgB,KAAK,eAAe;AAAA,IAAA;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,YAAiC;AACzD,WAAO;AAAA,MACL,eAAe,CAAC,SAAqB,KAAK,yBAAyB,MAAM,UAAU;AAAA,MACnF,eAAe,MAAM,KAAK,yBAAyB,UAAU;AAAA,MAC7D,gBAAgB,MAAM,KAAK,eAAe,UAAU;AAAA,MACpD,gBAAgB,CAAC,aACf,KAAK,eAAe,GAAG,CAAC,UAAU;AAChC,YAAI,MAAM,eAAe,WAAY,UAAS,MAAM,UAAU;AAAA,MAChE,CAAC;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,YAAiD;AACxE,UAAM,KAAK,cAAc,KAAK,oBAAA;AAC9B,WAAO,KAAK,MAAM,UAAU,EAAE,KAAK;AAAA,EACrC;AAAA,EAEQ,wBAAwB,YAA0C;AACxE,UAAM,QAAQ,KAAK,iBAAiB,UAAU;AAC9C,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,wCAAwC,cAAc,QAAQ,EAAE;AAAA,IAClF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,MAAkB,YAA2B;AAC5E,UAAM,KAAK,cAAc,KAAK,oBAAA;AAC9B,UAAM,eAAe,KAAK,wBAAwB,EAAE;AACpD,UAAM,UAAU,KAAK,UAAU,KAAK,UAAU,EAAE;AAEhD,QAAI,EAAC,mCAAS,WAAU;AACtB,YAAM,IAAI,MAAM,YAAY,EAAE,aAAa;AAAA,IAC7C;AAEA,QAAI,aAAa,eAAe,MAAM;AAEpC,WAAK,SAAS,cAAc,IAAI,IAAI,CAAC;AAGrC,YAAM,WAAW,KAAK,sBAAsB,IAAI,QAAQ,SAAS,MAAM,MAAM;AAC7E,WAAK,SAAS,gBAAgB,IAAI,QAAQ,CAAC;AAG3C,WAAK,eAAe,KAAK;AAAA,QACvB,YAAY;AAAA,QACZ,YAAY;AAAA,MAAA,CACb;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,yBAAyB,YAAiC;AAChE,WAAO,KAAK,wBAAwB,UAAU,EAAE;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAAsB,YAAoB,WAA+B;AAC/E,UAAM,WAAW,KAAK,wBAAwB,UAAU;AACxD,UAAM,aAAa,SAAS;AAE5B,YAAQ,YAAA;AAAA,MACN,KAAK,WAAW;AAEd,eAAO,MAAM,KAAK,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,MAExD,KAAK,WAAW;AAEd,eAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,KAAK,YAAY,CAAC,EAAA,GAAK,CAAC,GAAG,MAAM;AAChE,gBAAM,UAAU,CAAC,IAAI,CAAC;AACtB,cAAI,IAAI,IAAI,IAAI,mBAAmB,KAAK,IAAI,IAAI,CAAC;AACjD,iBAAO;AAAA,QACT,CAAC;AAAA,MAEH,KAAK,WAAW;AAEd,eAAO;AAAA,UACL,CAAC,CAAC;AAAA,UACF,GAAG,MAAM,KAAK,EAAE,QAAQ,KAAK,MAAM,YAAY,KAAK,CAAC,EAAA,GAAK,CAAC,GAAG,MAAM;AAClE,kBAAM,UAAU,CAAC,IAAI,IAAI,CAAC;AAC1B,gBAAI,IAAI,IAAI,IAAI,IAAI,mBAAmB,KAAK,IAAI,IAAI,IAAI,CAAC;AACzD,mBAAO;AAAA,UACT,CAAC;AAAA,QAAA;AAAA,MAGL;AACE,eAAO,MAAM,KAAK,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,IAAA;AAAA,EAE5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,YAAwC;AAC7D,UAAM,KAAK,cAAc,KAAK,oBAAA;AAC9B,UAAM,UAAU,KAAK,UAAU,KAAK,UAAU,EAAE;AAChD,UAAM,cAAc,KAAK,wBAAwB,EAAE;AAEnD,QAAI,EAAC,mCAAS,WAAU;AACtB,YAAM,IAAI,MAAM,YAAY,EAAE,aAAa;AAAA,IAC7C;AAEA,UAAM,WAAW,YAAY,gBAAgB,CAAA;AAC7C,UAAM,QAAQ,QAAQ,SAAS;AAG/B,WAAO,SAAS,IAAI,CAAC,YAAY,QAAQ,IAAI,CAAC,QAAQ,MAAM,GAAG,CAAC,EAAE,OAAO,OAAO,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAMS,eAAe,WAAwB,UAA6B;AAE3E,eAAW,cAAc,SAAS,WAAW;AAC3C,YAAM,UAAU,UAAU,UAAU,UAAU;AAC9C,YAAM,SAAS,SAAS,UAAU,UAAU;AAE5C,WAAI,mCAAS,gBAAe,OAAO,YAAY;AAC7C,aAAK,OAAO;AAAA,UACV;AAAA,UACA;AAAA,UACA,oCAAoC,UAAU,MAAK,mCAAS,eAAc,WAAW,IAAI,OAAO,OAAO,UAAU;AAAA,QAAA;AAAA,MAErH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,SAA4C;AAC3D,SAAK,OAAO,KAAK,gBAAgB,cAAc,2BAA2B;AAAA,EAC5E;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,eAAe,MAAA;AACpB,UAAM,QAAA;AAAA,EACR;AACF;AAlOE,cAAgB,KAAK;AANhB,IAAM,eAAN;ACjBA,MAAM,mBAAmB;AAEzB,MAAM,WAA+C;AAAA,EAC1D,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU,CAAC,QAAQ;AAAA,EACnB,UAAU,CAAA;AAAA,EACV,UAAU,CAAC,UAAU;AAAA,EACrB,eAAe;AAAA,IACb,SAAS;AAAA,EAAA;AAEb;ACJO,MAAM,uBAA4C;AAAA,EACvD,YAAY,WAAW;AACzB;AAEO,MAAM,eAA4B;AAAA,EACvC,WAAW,CAAA;AAAA,EACX,kBAAkB;AACpB;AAEO,MAAM,gBAAoD,CAAC,QAAQ,cAAc,WAAW;AACjG,UAAQ,OAAO,MAAA;AAAA,IACb,KAAK,mBAAmB;AACtB,YAAM,EAAE,YAAY,OAAO,SAAA,IAAa,OAAO;AAC/C,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW;AAAA,UACT,GAAG,MAAM;AAAA,UACT,CAAC,UAAU,GAAG;AAAA,QAAA;AAAA;AAAA,QAGhB,kBAAkB,MAAM,oBAAoB;AAAA,MAAA;AAAA,IAEhD;AAAA,IAEA,KAAK,sBAAsB;AACzB,YAAM,aAAa,OAAO;AAC1B,YAAM,EAAE,CAAC,UAAU,GAAG,SAAS,GAAG,cAAA,IAAkB,MAAM;AAC1D,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW;AAAA,QACX,kBAAkB,MAAM,qBAAqB,aAAa,OAAO,MAAM;AAAA,MAAA;AAAA,IAE3E;AAAA,IAEA,KAAK,4BAA4B;AAC/B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,kBAAkB,OAAO;AAAA,MAAA;AAAA,IAE7B;AAAA,IAEA,KAAK,iBAAiB;AACpB,YAAM,EAAE,YAAY,WAAA,IAAe,OAAO;AAC1C,YAAM,WAAW,MAAM,UAAU,UAAU;AAC3C,UAAI,CAAC,SAAU,QAAO;AAEtB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW;AAAA,UACT,GAAG,MAAM;AAAA,UACT,CAAC,UAAU,GAAG;AAAA,YACZ,GAAG;AAAA,YACH;AAAA,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAAA,IAEA,KAAK,mBAAmB;AACtB,YAAM,EAAE,YAAY,SAAA,IAAa,OAAO;AACxC,YAAM,WAAW,MAAM,UAAU,UAAU;AAC3C,UAAI,CAAC,SAAU,QAAO;AAEtB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW;AAAA,UACT,GAAG,MAAM;AAAA,UACT,CAAC,UAAU,GAAG;AAAA,YACZ,GAAG;AAAA,YACH,cAAc;AAAA,UAAA;AAAA,QAChB;AAAA,MACF;AAAA,IAEJ;AAAA,IAEA;AACE,aAAO;AAAA,EAAA;AAEb;AClFO,MAAM,sBAKT;AAAA,EACF;AAAA,EACA,QAAQ,CAAC,UAAU,WAAW,IAAI,aAAa,kBAAkB,UAAU,MAAM;AAAA,EACjF,SAAS;AAAA,EACT;AACF;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/lib/types.ts","../src/lib/actions.ts","../src/lib/spread-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { BasePluginConfig, EventHook } from '@embedpdf/core';\nimport { PdfPageObject } from '@embedpdf/models';\n\nexport interface SpreadPluginConfig extends BasePluginConfig {\n defaultSpreadMode?: SpreadMode;\n}\n\nexport enum SpreadMode {\n None = 'none',\n Odd = 'odd',\n Even = 'even',\n}\n\n// Per-document spread state\nexport interface SpreadDocumentState {\n spreadMode: SpreadMode;\n pageGrouping?: number[][]; // [[0], [1,2], [3,4], ...]\n}\n\nexport interface SpreadState {\n documents: Record<string, SpreadDocumentState>;\n activeDocumentId: string | null;\n}\n\n// Events include documentId\nexport interface SpreadChangeEvent {\n documentId: string;\n spreadMode: SpreadMode;\n}\n\n// Scoped spread capability\nexport interface SpreadScope {\n setSpreadMode(mode: SpreadMode): void;\n getSpreadMode(): SpreadMode;\n getSpreadPages(): PdfPageObject[][];\n onSpreadChange: EventHook<SpreadMode>;\n}\n\nexport interface SpreadCapability {\n // Active document operations\n setSpreadMode(mode: SpreadMode): void;\n getSpreadMode(): SpreadMode;\n getSpreadPages(documentId?: string): PdfPageObject[][];\n\n // Document-scoped operations\n forDocument(documentId: string): SpreadScope;\n\n // Events\n onSpreadChange: EventHook<SpreadChangeEvent>;\n}\n","import { Action } from '@embedpdf/core';\nimport { SpreadMode, SpreadDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_SPREAD_STATE = 'SPREAD/INIT_STATE';\nexport const CLEANUP_SPREAD_STATE = 'SPREAD/CLEANUP_STATE';\nexport const SET_ACTIVE_SPREAD_DOCUMENT = 'SPREAD/SET_ACTIVE_DOCUMENT';\n\n// Spread operations\nexport const SET_SPREAD_MODE = 'SPREAD/SET_SPREAD_MODE';\nexport const SET_PAGE_GROUPING = 'SPREAD/SET_PAGE_GROUPING';\n\n// Document lifecycle actions\nexport interface InitSpreadStateAction extends Action {\n type: typeof INIT_SPREAD_STATE;\n payload: {\n documentId: string;\n state: SpreadDocumentState;\n };\n}\n\nexport interface CleanupSpreadStateAction extends Action {\n type: typeof CLEANUP_SPREAD_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveSpreadDocumentAction extends Action {\n type: typeof SET_ACTIVE_SPREAD_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetSpreadModeAction extends Action {\n type: typeof SET_SPREAD_MODE;\n payload: {\n documentId: string;\n spreadMode: SpreadMode;\n };\n}\n\nexport interface SetPageGroupingAction extends Action {\n type: typeof SET_PAGE_GROUPING;\n payload: {\n documentId: string;\n grouping: number[][];\n };\n}\n\nexport type SpreadAction =\n | InitSpreadStateAction\n | CleanupSpreadStateAction\n | SetActiveSpreadDocumentAction\n | SetSpreadModeAction\n | SetPageGroupingAction;\n\n// Action Creators\nexport function initSpreadState(\n documentId: string,\n state: SpreadDocumentState,\n): InitSpreadStateAction {\n return { type: INIT_SPREAD_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupSpreadState(documentId: string): CleanupSpreadStateAction {\n return { type: CLEANUP_SPREAD_STATE, payload: documentId };\n}\n\nexport function setActiveSpreadDocument(documentId: string | null): SetActiveSpreadDocumentAction {\n return { type: SET_ACTIVE_SPREAD_DOCUMENT, payload: documentId };\n}\n\nexport function setSpreadMode(documentId: string, spreadMode: SpreadMode): SetSpreadModeAction {\n return { type: SET_SPREAD_MODE, payload: { documentId, spreadMode } };\n}\n\nexport function setPageGrouping(documentId: string, grouping: number[][]): SetPageGroupingAction {\n return { type: SET_PAGE_GROUPING, payload: { documentId, grouping } };\n}\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport { PdfPageObject } from '@embedpdf/models';\nimport {\n SpreadCapability,\n SpreadMode,\n SpreadPluginConfig,\n SpreadState,\n SpreadScope,\n SpreadChangeEvent,\n SpreadDocumentState,\n} from './types';\nimport {\n setSpreadMode,\n initSpreadState,\n cleanupSpreadState,\n SpreadAction,\n setPageGrouping,\n} from './actions';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport class SpreadPlugin extends BasePlugin<\n SpreadPluginConfig,\n SpreadCapability,\n SpreadState,\n SpreadAction\n> {\n static readonly id = 'spread' as const;\n\n private readonly spreadEmitter$ = createBehaviorEmitter<SpreadChangeEvent>();\n private readonly defaultSpreadMode: SpreadMode;\n private readonly viewport: ViewportCapability | null;\n\n constructor(id: string, registry: PluginRegistry, cfg: SpreadPluginConfig) {\n super(id, registry);\n this.defaultSpreadMode = cfg.defaultSpreadMode ?? SpreadMode.None;\n\n this.viewport = registry.getPlugin<ViewportPlugin>('viewport')?.provides() ?? null;\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize spread state for this document\n const docState: SpreadDocumentState = {\n spreadMode: this.defaultSpreadMode,\n };\n\n this.dispatch(initSpreadState(documentId, docState));\n this.viewport?.gate('spread', documentId);\n this.logger.debug(\n 'SpreadPlugin',\n 'DocumentOpened',\n `Initialized spread state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentLoaded(documentId: string): void {\n // Calculate grouping indices and store in plugin state\n const coreDoc = this.coreState.core.documents[documentId];\n if (coreDoc?.document) {\n const grouping = this.calculatePageGrouping(documentId, coreDoc.document.pages.length);\n\n // Store grouping in plugin state\n this.dispatch(setPageGrouping(documentId, grouping));\n }\n this.viewport?.releaseGate('spread', documentId);\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.dispatch(cleanupSpreadState(documentId));\n\n this.logger.debug(\n 'SpreadPlugin',\n 'DocumentClosed',\n `Cleaned up spread state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): SpreadCapability {\n return {\n // Active document operations\n setSpreadMode: (mode: SpreadMode) => this.setSpreadModeForDocument(mode),\n getSpreadMode: () => this.getSpreadModeForDocument(),\n getSpreadPages: () => this.getSpreadPages(),\n // Document-scoped operations\n forDocument: (documentId: string) => this.createSpreadScope(documentId),\n\n // Events\n onSpreadChange: this.spreadEmitter$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createSpreadScope(documentId: string): SpreadScope {\n return {\n setSpreadMode: (mode: SpreadMode) => this.setSpreadModeForDocument(mode, documentId),\n getSpreadMode: () => this.getSpreadModeForDocument(documentId),\n getSpreadPages: () => this.getSpreadPages(documentId),\n onSpreadChange: (listener: Listener<SpreadMode>) =>\n this.spreadEmitter$.on((event) => {\n if (event.documentId === documentId) listener(event.spreadMode);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n private getDocumentState(documentId?: string): SpreadDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): SpreadDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Spread state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private setSpreadModeForDocument(mode: SpreadMode, documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n const currentState = this.getDocumentStateOrThrow(id);\n const coreDoc = this.coreState.core.documents[id];\n\n if (!coreDoc?.document) {\n throw new Error(`Document ${id} not loaded`);\n }\n\n if (currentState.spreadMode !== mode) {\n // Update plugin state\n this.dispatch(setSpreadMode(id, mode));\n\n // Calculate new grouping\n const grouping = this.calculatePageGrouping(id, coreDoc.document.pages.length);\n this.dispatch(setPageGrouping(id, grouping));\n\n // Emit event\n this.spreadEmitter$.emit({\n documentId: id,\n spreadMode: mode,\n });\n }\n }\n\n private getSpreadModeForDocument(documentId?: string): SpreadMode {\n return this.getDocumentStateOrThrow(documentId).spreadMode;\n }\n\n /**\n * Calculate page grouping indices based on spread mode\n * Returns indices, not actual page objects\n */\n private calculatePageGrouping(documentId: string, pageCount: number): number[][] {\n const docState = this.getDocumentStateOrThrow(documentId);\n const spreadMode = docState.spreadMode;\n\n switch (spreadMode) {\n case SpreadMode.None:\n // [[0], [1], [2], [3], ...]\n return Array.from({ length: pageCount }, (_, i) => [i]);\n\n case SpreadMode.Odd:\n // [[0, 1], [2, 3], [4, 5], ...]\n return Array.from({ length: Math.ceil(pageCount / 2) }, (_, i) => {\n const indices = [i * 2];\n if (i * 2 + 1 < pageCount) indices.push(i * 2 + 1);\n return indices;\n });\n\n case SpreadMode.Even:\n // [[0], [1, 2], [3, 4], [5, 6], ...]\n return [\n [0],\n ...Array.from({ length: Math.ceil((pageCount - 1) / 2) }, (_, i) => {\n const indices = [1 + i * 2];\n if (1 + i * 2 + 1 < pageCount) indices.push(1 + i * 2 + 1);\n return indices;\n }),\n ];\n\n default:\n return Array.from({ length: pageCount }, (_, i) => [i]);\n }\n }\n\n /**\n * Get the actual page objects grouped according to spread mode\n * This is computed on-demand, not stored\n */\n private getSpreadPages(documentId?: string): PdfPageObject[][] {\n const id = documentId ?? this.getActiveDocumentId();\n const coreDoc = this.coreState.core.documents[id];\n const spreadState = this.getDocumentStateOrThrow(id);\n\n if (!coreDoc?.document) {\n throw new Error(`Document ${id} not loaded`);\n }\n\n const grouping = spreadState.pageGrouping ?? [];\n const pages = coreDoc.document.pages;\n\n // Map indices to actual page objects\n return grouping.map((indices) => indices.map((idx) => pages[idx]).filter(Boolean));\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: SpreadState, newState: SpreadState): void {\n // Emit spread change events 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?.spreadMode !== newDoc.spreadMode) {\n this.logger.debug(\n 'SpreadPlugin',\n 'SpreadModeChanged',\n `Spread mode changed for document ${documentId}: ${prevDoc?.spreadMode ?? SpreadMode.None} -> ${newDoc.spreadMode}`,\n );\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_config: SpreadPluginConfig): Promise<void> {\n this.logger.info('SpreadPlugin', 'Initialize', 'Spread plugin initialized');\n }\n\n async destroy(): Promise<void> {\n this.spreadEmitter$.clear();\n super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SpreadPluginConfig } from './types';\n\nexport const SPREAD_PLUGIN_ID = 'spread';\n\nexport const manifest: PluginManifest<SpreadPluginConfig> = {\n id: SPREAD_PLUGIN_ID,\n name: 'Spread Plugin',\n version: '1.0.0',\n provides: ['spread'],\n requires: [],\n optional: ['viewport'],\n defaultConfig: {},\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n SpreadAction,\n INIT_SPREAD_STATE,\n CLEANUP_SPREAD_STATE,\n SET_ACTIVE_SPREAD_DOCUMENT,\n SET_SPREAD_MODE,\n SET_PAGE_GROUPING,\n} from './actions';\nimport { SpreadState, SpreadDocumentState, SpreadMode } from './types';\n\nexport const initialDocumentState: SpreadDocumentState = {\n spreadMode: SpreadMode.None,\n};\n\nexport const initialState: SpreadState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const spreadReducer: Reducer<SpreadState, SpreadAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_SPREAD_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_SPREAD_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_SPREAD_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_SPREAD_MODE: {\n const { documentId, spreadMode } = 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 spreadMode,\n },\n },\n };\n }\n\n case SET_PAGE_GROUPING: {\n const { documentId, grouping } = 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 pageGrouping: grouping,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SpreadPlugin } from './spread-plugin';\nimport { manifest, SPREAD_PLUGIN_ID } from './manifest';\nimport { SpreadPluginConfig, SpreadState } from './types';\nimport { spreadReducer, initialState } from './reducer';\nimport { SpreadAction } from './actions';\n\nexport const SpreadPluginPackage: PluginPackage<\n SpreadPlugin,\n SpreadPluginConfig,\n SpreadState,\n SpreadAction\n> = {\n manifest,\n create: (registry, config) => new SpreadPlugin(SPREAD_PLUGIN_ID, registry, config),\n reducer: spreadReducer,\n initialState,\n};\n\nexport * from './spread-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":["SpreadMode"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@embedpdf/plugin-spread",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -34,14 +34,14 @@
|
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@embedpdf/models": "2.0.0-next.
|
|
37
|
+
"@embedpdf/models": "2.0.0-next.3"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/react": "^18.2.0",
|
|
41
41
|
"typescript": "^5.0.0",
|
|
42
|
-
"@embedpdf/core": "2.0.0-next.1",
|
|
43
42
|
"@embedpdf/build": "1.1.0",
|
|
44
|
-
"@embedpdf/
|
|
43
|
+
"@embedpdf/core": "2.0.0-next.3",
|
|
44
|
+
"@embedpdf/plugin-viewport": "2.0.0-next.3"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"react": ">=16.8.0",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"preact": "^10.26.4",
|
|
50
50
|
"vue": ">=3.2.0",
|
|
51
51
|
"svelte": ">=5 <6",
|
|
52
|
-
"@embedpdf/core": "2.0.0-next.
|
|
52
|
+
"@embedpdf/core": "2.0.0-next.3"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
55
55
|
"dist",
|