@papyrus-sdk/core 0.2.5 → 0.2.6

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.d.mts CHANGED
@@ -42,25 +42,26 @@ interface ViewerState {
42
42
  annotationColor: string;
43
43
  outline: OutlineItem[];
44
44
  sidebarLeftOpen: boolean;
45
- sidebarLeftTab: 'thumbnails' | 'summary';
45
+ sidebarLeftTab: "thumbnails" | "summary";
46
46
  outlineSearchQuery: string;
47
47
  sidebarRightOpen: boolean;
48
- sidebarRightTab: 'search' | 'annotations' | 'pages';
48
+ sidebarRightTab: "search" | "annotations" | "pages";
49
49
  searchQuery: string;
50
50
  searchResults: SearchResult[];
51
51
  activeSearchIndex: number;
52
52
  scrollToPageSignal: number | null;
53
53
  annotations: Annotation[];
54
- activeTool: 'select' | 'highlight' | 'underline' | 'squiggly' | 'strikeout' | 'text' | 'comment' | 'ink';
54
+ activeTool: "select" | "highlight" | "underline" | "squiggly" | "strikeout" | "text" | "comment" | "ink";
55
55
  selectedAnnotationId: string | null;
56
- interactionMode: 'pan' | 'select';
56
+ interactionMode: "pan" | "select";
57
57
  selectionActive: boolean;
58
+ toolDockOpen: boolean;
58
59
  initializeStore: (config: PapyrusConfig) => void;
59
60
  setDocumentState: (state: Partial<ViewerState>) => void;
60
61
  toggleSidebarLeft: () => void;
61
- setSidebarLeftTab: (tab: 'thumbnails' | 'summary') => void;
62
+ setSidebarLeftTab: (tab: "thumbnails" | "summary") => void;
62
63
  setOutlineSearch: (query: string) => void;
63
- toggleSidebarRight: (tab?: 'search' | 'annotations' | 'pages') => void;
64
+ toggleSidebarRight: (tab?: "search" | "annotations" | "pages") => void;
64
65
  addAnnotation: (annotation: Annotation) => void;
65
66
  updateAnnotation: (id: string, updates: Partial<Annotation>) => void;
66
67
  removeAnnotation: (id: string) => void;
@@ -70,7 +71,7 @@ interface ViewerState {
70
71
  prevSearchResult: () => void;
71
72
  triggerScrollToPage: (pageIndex: number) => void;
72
73
  setAnnotationColor: (color: string) => void;
73
- setInteractionMode: (mode: 'pan' | 'select') => void;
74
+ setInteractionMode: (mode: "pan" | "select") => void;
74
75
  setSelectionActive: (active: boolean) => void;
75
76
  setAccentColor: (color: string) => void;
76
77
  }
package/dist/index.d.ts CHANGED
@@ -42,25 +42,26 @@ interface ViewerState {
42
42
  annotationColor: string;
43
43
  outline: OutlineItem[];
44
44
  sidebarLeftOpen: boolean;
45
- sidebarLeftTab: 'thumbnails' | 'summary';
45
+ sidebarLeftTab: "thumbnails" | "summary";
46
46
  outlineSearchQuery: string;
47
47
  sidebarRightOpen: boolean;
48
- sidebarRightTab: 'search' | 'annotations' | 'pages';
48
+ sidebarRightTab: "search" | "annotations" | "pages";
49
49
  searchQuery: string;
50
50
  searchResults: SearchResult[];
51
51
  activeSearchIndex: number;
52
52
  scrollToPageSignal: number | null;
53
53
  annotations: Annotation[];
54
- activeTool: 'select' | 'highlight' | 'underline' | 'squiggly' | 'strikeout' | 'text' | 'comment' | 'ink';
54
+ activeTool: "select" | "highlight" | "underline" | "squiggly" | "strikeout" | "text" | "comment" | "ink";
55
55
  selectedAnnotationId: string | null;
56
- interactionMode: 'pan' | 'select';
56
+ interactionMode: "pan" | "select";
57
57
  selectionActive: boolean;
58
+ toolDockOpen: boolean;
58
59
  initializeStore: (config: PapyrusConfig) => void;
59
60
  setDocumentState: (state: Partial<ViewerState>) => void;
60
61
  toggleSidebarLeft: () => void;
61
- setSidebarLeftTab: (tab: 'thumbnails' | 'summary') => void;
62
+ setSidebarLeftTab: (tab: "thumbnails" | "summary") => void;
62
63
  setOutlineSearch: (query: string) => void;
63
- toggleSidebarRight: (tab?: 'search' | 'annotations' | 'pages') => void;
64
+ toggleSidebarRight: (tab?: "search" | "annotations" | "pages") => void;
64
65
  addAnnotation: (annotation: Annotation) => void;
65
66
  updateAnnotation: (id: string, updates: Partial<Annotation>) => void;
66
67
  removeAnnotation: (id: string) => void;
@@ -70,7 +71,7 @@ interface ViewerState {
70
71
  prevSearchResult: () => void;
71
72
  triggerScrollToPage: (pageIndex: number) => void;
72
73
  setAnnotationColor: (color: string) => void;
73
- setInteractionMode: (mode: 'pan' | 'select') => void;
74
+ setInteractionMode: (mode: "pan" | "select") => void;
74
75
  setSelectionActive: (active: boolean) => void;
75
76
  setAccentColor: (color: string) => void;
76
77
  }
package/dist/index.js CHANGED
@@ -90,6 +90,7 @@ var useViewerStore = (0, import_zustand.create)((set, get) => ({
90
90
  selectedAnnotationId: null,
91
91
  interactionMode: "pan",
92
92
  selectionActive: false,
93
+ toolDockOpen: false,
93
94
  initializeStore: (config) => set((state) => ({
94
95
  ...state,
95
96
  currentPage: config.initialPage ?? state.currentPage,
@@ -109,13 +110,17 @@ var useViewerStore = (0, import_zustand.create)((set, get) => ({
109
110
  const oldZoom = get().zoom;
110
111
  set((prev) => ({ ...prev, ...state }));
111
112
  if (state.currentPage !== void 0 && state.currentPage !== oldPage) {
112
- papyrusEvents.emit(import_types.PapyrusEventType.PAGE_CHANGED, { pageNumber: state.currentPage });
113
+ papyrusEvents.emit(import_types.PapyrusEventType.PAGE_CHANGED, {
114
+ pageNumber: state.currentPage
115
+ });
113
116
  }
114
117
  if (state.zoom !== void 0 && state.zoom !== oldZoom) {
115
118
  papyrusEvents.emit(import_types.PapyrusEventType.ZOOM_CHANGED, { zoom: state.zoom });
116
119
  }
117
120
  if (state.isLoaded === true) {
118
- papyrusEvents.emit(import_types.PapyrusEventType.DOCUMENT_LOADED, { pageCount: get().pageCount });
121
+ papyrusEvents.emit(import_types.PapyrusEventType.DOCUMENT_LOADED, {
122
+ pageCount: get().pageCount
123
+ });
119
124
  }
120
125
  },
121
126
  toggleSidebarLeft: () => set((state) => ({ sidebarLeftOpen: !state.sidebarLeftOpen })),
@@ -127,25 +132,38 @@ var useViewerStore = (0, import_zustand.create)((set, get) => ({
127
132
  })),
128
133
  setAnnotationColor: (color) => set({ annotationColor: color }),
129
134
  addAnnotation: (ann) => {
130
- set((state) => ({ annotations: [...state.annotations, ann], selectedAnnotationId: ann.id }));
131
- papyrusEvents.emit(import_types.PapyrusEventType.ANNOTATION_CREATED, { annotation: ann });
135
+ set((state) => ({
136
+ annotations: [...state.annotations, ann],
137
+ selectedAnnotationId: ann.id
138
+ }));
139
+ papyrusEvents.emit(import_types.PapyrusEventType.ANNOTATION_CREATED, {
140
+ annotation: ann
141
+ });
132
142
  },
133
143
  updateAnnotation: (id, updates) => set((state) => ({
134
- annotations: state.annotations.map((a) => a.id === id ? { ...a, ...updates } : a)
144
+ annotations: state.annotations.map(
145
+ (a) => a.id === id ? { ...a, ...updates } : a
146
+ )
135
147
  })),
136
148
  removeAnnotation: (id) => {
137
149
  set((state) => ({
138
150
  annotations: state.annotations.filter((a) => a.id !== id),
139
151
  selectedAnnotationId: state.selectedAnnotationId === id ? null : state.selectedAnnotationId
140
152
  }));
141
- papyrusEvents.emit(import_types.PapyrusEventType.ANNOTATION_DELETED, { annotationId: id });
153
+ papyrusEvents.emit(import_types.PapyrusEventType.ANNOTATION_DELETED, {
154
+ annotationId: id
155
+ });
142
156
  },
143
157
  setSelectedAnnotation: (id) => set({ selectedAnnotationId: id }),
144
158
  setInteractionMode: (mode) => set({ interactionMode: mode }),
145
159
  setSelectionActive: (active) => set({ selectionActive: active }),
146
160
  setAccentColor: (color) => set({ accentColor: color }),
147
161
  setSearch: (query, results) => {
148
- set({ searchQuery: query, searchResults: results, activeSearchIndex: results.length > 0 ? 0 : -1 });
162
+ set({
163
+ searchQuery: query,
164
+ searchResults: results,
165
+ activeSearchIndex: results.length > 0 ? 0 : -1
166
+ });
149
167
  papyrusEvents.emit(import_types.PapyrusEventType.SEARCH_TRIGGERED, { query });
150
168
  },
151
169
  nextSearchResult: () => {
@@ -153,14 +171,22 @@ var useViewerStore = (0, import_zustand.create)((set, get) => ({
153
171
  if (state.searchResults.length === 0) return;
154
172
  const nextIndex = (state.activeSearchIndex + 1) % state.searchResults.length;
155
173
  const pageIndex = state.searchResults[nextIndex].pageIndex;
156
- set({ activeSearchIndex: nextIndex, scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 });
174
+ set({
175
+ activeSearchIndex: nextIndex,
176
+ scrollToPageSignal: pageIndex,
177
+ currentPage: pageIndex + 1
178
+ });
157
179
  },
158
180
  prevSearchResult: () => {
159
181
  const state = get();
160
182
  if (state.searchResults.length === 0) return;
161
183
  const prevIndex = (state.activeSearchIndex - 1 + state.searchResults.length) % state.searchResults.length;
162
184
  const pageIndex = state.searchResults[prevIndex].pageIndex;
163
- set({ activeSearchIndex: prevIndex, scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 });
185
+ set({
186
+ activeSearchIndex: prevIndex,
187
+ scrollToPageSignal: pageIndex,
188
+ currentPage: pageIndex + 1
189
+ });
164
190
  },
165
191
  triggerScrollToPage: (pageIndex) => set({ scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 })
166
192
  }));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../engine.ts","../store.ts","../services/event-emitter.ts","../services/search-service.ts"],"sourcesContent":["\nexport * from './engine';\nexport * from './store';\nexport * from './services/search-service';\nexport * from './services/event-emitter';\n","\r\nimport { DocumentEngine, TextItem, OutlineItem, DocumentLoadInput, TextSelection, PageDestination } from '@papyrus-sdk/types';\r\n\r\nexport abstract class BaseDocumentEngine implements DocumentEngine {\r\n abstract load(source: DocumentLoadInput): Promise<void>;\r\n abstract getPageCount(): number;\r\n abstract getCurrentPage(): number;\r\n abstract goToPage(page: number): void;\r\n abstract setZoom(zoom: number): void;\r\n abstract getZoom(): number;\r\n abstract rotate(direction: 'clockwise' | 'counterclockwise'): void;\r\n abstract getRotation(): number;\r\n abstract renderPage(pageIndex: number, target: any, scale: number): Promise<void>;\r\n abstract renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void>;\r\n abstract getTextContent(pageIndex: number): Promise<TextItem[]>;\r\n abstract getPageDimensions(pageIndex: number): Promise<{ width: number, height: number }>;\r\n abstract selectText(pageIndex: number, rect: { x: number; y: number; width: number; height: number }): Promise<TextSelection | null>;\r\n abstract getOutline(): Promise<OutlineItem[]>;\r\n abstract getPageIndex(dest: PageDestination): Promise<number | null>;\r\n abstract destroy(): void;\r\n}\r\n","\r\nimport { create } from 'zustand';\r\nimport { ViewMode, Annotation, SearchResult, UITheme, PageTheme, OutlineItem, PapyrusEventType, PapyrusConfig, Locale } from '@papyrus-sdk/types';\r\nimport { papyrusEvents } from './services/event-emitter';\r\n\r\ninterface ViewerState {\r\n isLoaded: boolean;\r\n pageCount: number;\r\n currentPage: number;\r\n zoom: number;\r\n rotation: number;\r\n viewMode: ViewMode;\r\n uiTheme: UITheme;\r\n pageTheme: PageTheme;\r\n locale: Locale;\r\n accentColor: string;\r\n annotationColor: string;\r\n outline: OutlineItem[];\r\n sidebarLeftOpen: boolean;\r\n sidebarLeftTab: 'thumbnails' | 'summary';\r\n outlineSearchQuery: string;\r\n sidebarRightOpen: boolean;\r\n sidebarRightTab: 'search' | 'annotations' | 'pages';\r\n searchQuery: string;\r\n searchResults: SearchResult[];\r\n activeSearchIndex: number;\r\n scrollToPageSignal: number | null;\r\n annotations: Annotation[];\r\n activeTool: 'select' | 'highlight' | 'underline' | 'squiggly' | 'strikeout' | 'text' | 'comment' | 'ink';\n selectedAnnotationId: string | null;\r\n interactionMode: 'pan' | 'select';\r\n selectionActive: boolean;\r\n\r\n initializeStore: (config: PapyrusConfig) => void;\r\n setDocumentState: (state: Partial<ViewerState>) => void;\r\n toggleSidebarLeft: () => void;\r\n setSidebarLeftTab: (tab: 'thumbnails' | 'summary') => void;\r\n setOutlineSearch: (query: string) => void;\r\n toggleSidebarRight: (tab?: 'search' | 'annotations' | 'pages') => void;\r\n addAnnotation: (annotation: Annotation) => void;\r\n updateAnnotation: (id: string, updates: Partial<Annotation>) => void;\r\n removeAnnotation: (id: string) => void;\r\n setSelectedAnnotation: (id: string | null) => void;\r\n setSearch: (query: string, results: SearchResult[]) => void;\r\n nextSearchResult: () => void;\r\n prevSearchResult: () => void;\r\n triggerScrollToPage: (pageIndex: number) => void;\r\n setAnnotationColor: (color: string) => void;\r\n setInteractionMode: (mode: 'pan' | 'select') => void;\r\n setSelectionActive: (active: boolean) => void;\r\n setAccentColor: (color: string) => void;\r\n}\r\n\r\nexport const useViewerStore = create<ViewerState>((set, get) => ({\r\n isLoaded: false,\r\n pageCount: 0,\r\n currentPage: 1,\r\n zoom: 1.0,\r\n rotation: 0,\r\n viewMode: 'continuous',\r\n uiTheme: 'light',\r\n pageTheme: 'normal',\r\n locale: 'en',\r\n accentColor: '#2563eb',\r\n annotationColor: '#fbbf24',\r\n outline: [],\r\n sidebarLeftOpen: true,\r\n sidebarLeftTab: 'thumbnails',\r\n outlineSearchQuery: '',\r\n sidebarRightOpen: false,\r\n sidebarRightTab: 'search',\r\n searchQuery: '',\r\n searchResults: [],\r\n activeSearchIndex: -1,\r\n scrollToPageSignal: null,\r\n annotations: [],\r\n activeTool: 'select',\n selectedAnnotationId: null,\r\n interactionMode: 'pan',\r\n selectionActive: false,\r\n\r\n initializeStore: (config) => set((state) => ({\r\n ...state,\r\n currentPage: config.initialPage ?? state.currentPage,\r\n zoom: config.initialZoom ?? state.zoom,\r\n rotation: config.initialRotation ?? state.rotation,\r\n viewMode: config.initialViewMode ?? state.viewMode,\r\n uiTheme: config.initialUITheme ?? state.uiTheme,\r\n pageTheme: config.initialPageTheme ?? state.pageTheme,\r\n locale: config.initialLocale ?? state.locale,\r\n accentColor: config.initialAccentColor ?? state.accentColor,\r\n annotations: config.initialAnnotations ?? state.annotations,\r\n sidebarLeftOpen: config.sidebarLeftOpen ?? state.sidebarLeftOpen,\r\n sidebarRightOpen: config.sidebarRightOpen ?? state.sidebarRightOpen,\r\n })),\r\n\r\n setDocumentState: (state) => {\r\n const oldPage = get().currentPage;\r\n const oldZoom = get().zoom;\r\n \r\n set((prev) => ({ ...prev, ...state }));\r\n\r\n if (state.currentPage !== undefined && state.currentPage !== oldPage) {\r\n papyrusEvents.emit(PapyrusEventType.PAGE_CHANGED, { pageNumber: state.currentPage });\r\n }\r\n if (state.zoom !== undefined && state.zoom !== oldZoom) {\r\n papyrusEvents.emit(PapyrusEventType.ZOOM_CHANGED, { zoom: state.zoom });\r\n }\r\n if (state.isLoaded === true) {\r\n papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, { pageCount: get().pageCount });\r\n }\r\n },\r\n\r\n toggleSidebarLeft: () => set((state) => ({ sidebarLeftOpen: !state.sidebarLeftOpen })),\r\n setSidebarLeftTab: (tab) => set({ sidebarLeftTab: tab }),\r\n setOutlineSearch: (query) => set({ outlineSearchQuery: query }),\r\n toggleSidebarRight: (tab) => set((state) => ({ \r\n sidebarRightOpen: tab ? true : !state.sidebarRightOpen,\r\n sidebarRightTab: tab || state.sidebarRightTab \r\n })),\r\n setAnnotationColor: (color) => set({ annotationColor: color }),\r\n\r\n addAnnotation: (ann) => {\r\n set((state) => ({ annotations: [...state.annotations, ann], selectedAnnotationId: ann.id }));\r\n papyrusEvents.emit(PapyrusEventType.ANNOTATION_CREATED, { annotation: ann });\r\n },\r\n\r\n updateAnnotation: (id, updates) => set((state) => ({\r\n annotations: state.annotations.map(a => a.id === id ? { ...a, ...updates } : a)\r\n })),\r\n\r\n removeAnnotation: (id) => {\r\n set((state) => ({ \r\n annotations: state.annotations.filter(a => a.id !== id),\r\n selectedAnnotationId: state.selectedAnnotationId === id ? null : state.selectedAnnotationId\r\n }));\r\n papyrusEvents.emit(PapyrusEventType.ANNOTATION_DELETED, { annotationId: id });\r\n },\r\n\r\n setSelectedAnnotation: (id) => set({ selectedAnnotationId: id }),\r\n setInteractionMode: (mode) => set({ interactionMode: mode }),\r\n setSelectionActive: (active) => set({ selectionActive: active }),\r\n setAccentColor: (color) => set({ accentColor: color }),\r\n \r\n setSearch: (query, results) => {\r\n set({ searchQuery: query, searchResults: results, activeSearchIndex: results.length > 0 ? 0 : -1 });\r\n papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, { query });\r\n },\r\n\r\n nextSearchResult: () => {\r\n const state = get();\r\n if (state.searchResults.length === 0) return;\r\n const nextIndex = (state.activeSearchIndex + 1) % state.searchResults.length;\r\n const pageIndex = state.searchResults[nextIndex].pageIndex;\r\n set({ activeSearchIndex: nextIndex, scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 });\r\n },\r\n\r\n prevSearchResult: () => {\r\n const state = get();\r\n if (state.searchResults.length === 0) return;\r\n const prevIndex = (state.activeSearchIndex - 1 + state.searchResults.length) % state.searchResults.length;\r\n const pageIndex = state.searchResults[prevIndex].pageIndex;\r\n set({ activeSearchIndex: prevIndex, scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 });\r\n },\r\n\r\n triggerScrollToPage: (pageIndex) => set({ scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 }),\r\n}));\r\n","\r\nimport { PapyrusEventType, PapyrusEventListener, EventPayloads } from '@papyrus-sdk/types';\r\n\r\nexport class PapyrusEventEmitter {\r\n private listeners: Map<PapyrusEventType, Set<PapyrusEventListener<any>>> = new Map();\r\n\r\n on<T extends PapyrusEventType>(event: T, listener: PapyrusEventListener<T>): () => void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(listener);\r\n\r\n // Return an unsubscribe function\r\n return () => this.off(event, listener);\r\n }\r\n\r\n off<T extends PapyrusEventType>(event: T, listener: PapyrusEventListener<T>): void {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n eventListeners.delete(listener);\r\n }\r\n }\r\n\r\n emit<T extends PapyrusEventType>(event: T, payload: EventPayloads[T]): void {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n eventListeners.forEach((listener) => listener(payload));\r\n }\r\n }\r\n}\r\n\r\n// Singleton instance for the core package\r\nexport const papyrusEvents = new PapyrusEventEmitter();\r\n","\r\nimport { DocumentEngine, SearchResult } from '@papyrus-sdk/types';\r\n\r\nexport class SearchService {\r\n private engine: DocumentEngine;\r\n constructor(engine: DocumentEngine) { this.engine = engine; }\r\n\r\n async search(query: string): Promise<SearchResult[]> {\r\n if (!query || query.length < 2) return [];\r\n if (typeof this.engine.searchText === 'function') {\r\n return await this.engine.searchText(query);\r\n }\r\n const results: SearchResult[] = [];\r\n const pageCount = this.engine.getPageCount();\r\n const normalizedQuery = query.toLowerCase();\r\n\r\n for (let i = 0; i < pageCount; i++) {\r\n const textContent = await this.engine.getTextContent(i);\r\n const fullPageText = textContent.map(item => item.str).join(' ');\r\n let pos = fullPageText.toLowerCase().indexOf(normalizedQuery, 0);\r\n let matchIndex = 0;\r\n while (pos !== -1) {\r\n const start = Math.max(0, pos - 20);\r\n const end = Math.min(fullPageText.length, pos + query.length + 20);\r\n results.push({ pageIndex: i, text: fullPageText.substring(start, end), matchIndex: matchIndex++ });\r\n pos = fullPageText.toLowerCase().indexOf(normalizedQuery, pos + 1);\r\n }\r\n }\r\n return results;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../index.ts","../engine.ts","../store.ts","../services/event-emitter.ts","../services/search-service.ts"],"sourcesContent":["\nexport * from './engine';\nexport * from './store';\nexport * from './services/search-service';\nexport * from './services/event-emitter';\n","\r\nimport { DocumentEngine, TextItem, OutlineItem, DocumentLoadInput, TextSelection, PageDestination } from '@papyrus-sdk/types';\r\n\r\nexport abstract class BaseDocumentEngine implements DocumentEngine {\r\n abstract load(source: DocumentLoadInput): Promise<void>;\r\n abstract getPageCount(): number;\r\n abstract getCurrentPage(): number;\r\n abstract goToPage(page: number): void;\r\n abstract setZoom(zoom: number): void;\r\n abstract getZoom(): number;\r\n abstract rotate(direction: 'clockwise' | 'counterclockwise'): void;\r\n abstract getRotation(): number;\r\n abstract renderPage(pageIndex: number, target: any, scale: number): Promise<void>;\r\n abstract renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void>;\r\n abstract getTextContent(pageIndex: number): Promise<TextItem[]>;\r\n abstract getPageDimensions(pageIndex: number): Promise<{ width: number, height: number }>;\r\n abstract selectText(pageIndex: number, rect: { x: number; y: number; width: number; height: number }): Promise<TextSelection | null>;\r\n abstract getOutline(): Promise<OutlineItem[]>;\r\n abstract getPageIndex(dest: PageDestination): Promise<number | null>;\r\n abstract destroy(): void;\r\n}\r\n","import { create } from \"zustand\";\nimport {\n ViewMode,\n Annotation,\n SearchResult,\n UITheme,\n PageTheme,\n OutlineItem,\n PapyrusEventType,\n PapyrusConfig,\n Locale,\n} from \"@papyrus-sdk/types\";\nimport { papyrusEvents } from \"./services/event-emitter\";\n\ninterface ViewerState {\n isLoaded: boolean;\n pageCount: number;\n currentPage: number;\n zoom: number;\n rotation: number;\n viewMode: ViewMode;\n uiTheme: UITheme;\n pageTheme: PageTheme;\n locale: Locale;\n accentColor: string;\n annotationColor: string;\n outline: OutlineItem[];\n sidebarLeftOpen: boolean;\n sidebarLeftTab: \"thumbnails\" | \"summary\";\n outlineSearchQuery: string;\n sidebarRightOpen: boolean;\n sidebarRightTab: \"search\" | \"annotations\" | \"pages\";\n searchQuery: string;\n searchResults: SearchResult[];\n activeSearchIndex: number;\n scrollToPageSignal: number | null;\n annotations: Annotation[];\n activeTool:\n | \"select\"\n | \"highlight\"\n | \"underline\"\n | \"squiggly\"\n | \"strikeout\"\n | \"text\"\n | \"comment\"\n | \"ink\";\n selectedAnnotationId: string | null;\n interactionMode: \"pan\" | \"select\";\n selectionActive: boolean;\n toolDockOpen: boolean;\n\n initializeStore: (config: PapyrusConfig) => void;\n setDocumentState: (state: Partial<ViewerState>) => void;\n toggleSidebarLeft: () => void;\n setSidebarLeftTab: (tab: \"thumbnails\" | \"summary\") => void;\n setOutlineSearch: (query: string) => void;\n toggleSidebarRight: (tab?: \"search\" | \"annotations\" | \"pages\") => void;\n addAnnotation: (annotation: Annotation) => void;\n updateAnnotation: (id: string, updates: Partial<Annotation>) => void;\n removeAnnotation: (id: string) => void;\n setSelectedAnnotation: (id: string | null) => void;\n setSearch: (query: string, results: SearchResult[]) => void;\n nextSearchResult: () => void;\n prevSearchResult: () => void;\n triggerScrollToPage: (pageIndex: number) => void;\n setAnnotationColor: (color: string) => void;\n setInteractionMode: (mode: \"pan\" | \"select\") => void;\n setSelectionActive: (active: boolean) => void;\n setAccentColor: (color: string) => void;\n}\n\nexport const useViewerStore = create<ViewerState>((set, get) => ({\n isLoaded: false,\n pageCount: 0,\n currentPage: 1,\n zoom: 1.0,\n rotation: 0,\n viewMode: \"continuous\",\n uiTheme: \"light\",\n pageTheme: \"normal\",\n locale: \"en\",\n accentColor: \"#2563eb\",\n annotationColor: \"#fbbf24\",\n outline: [],\n sidebarLeftOpen: true,\n sidebarLeftTab: \"thumbnails\",\n outlineSearchQuery: \"\",\n sidebarRightOpen: false,\n sidebarRightTab: \"search\",\n searchQuery: \"\",\n searchResults: [],\n activeSearchIndex: -1,\n scrollToPageSignal: null,\n annotations: [],\n activeTool: \"select\",\n selectedAnnotationId: null,\n interactionMode: \"pan\",\n selectionActive: false,\n toolDockOpen: false,\n\n initializeStore: (config) =>\n set((state) => ({\n ...state,\n currentPage: config.initialPage ?? state.currentPage,\n zoom: config.initialZoom ?? state.zoom,\n rotation: config.initialRotation ?? state.rotation,\n viewMode: config.initialViewMode ?? state.viewMode,\n uiTheme: config.initialUITheme ?? state.uiTheme,\n pageTheme: config.initialPageTheme ?? state.pageTheme,\n locale: config.initialLocale ?? state.locale,\n accentColor: config.initialAccentColor ?? state.accentColor,\n annotations: config.initialAnnotations ?? state.annotations,\n sidebarLeftOpen: config.sidebarLeftOpen ?? state.sidebarLeftOpen,\n sidebarRightOpen: config.sidebarRightOpen ?? state.sidebarRightOpen,\n })),\n\n setDocumentState: (state) => {\n const oldPage = get().currentPage;\n const oldZoom = get().zoom;\n\n set((prev) => ({ ...prev, ...state }));\n\n if (state.currentPage !== undefined && state.currentPage !== oldPage) {\n papyrusEvents.emit(PapyrusEventType.PAGE_CHANGED, {\n pageNumber: state.currentPage,\n });\n }\n if (state.zoom !== undefined && state.zoom !== oldZoom) {\n papyrusEvents.emit(PapyrusEventType.ZOOM_CHANGED, { zoom: state.zoom });\n }\n if (state.isLoaded === true) {\n papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, {\n pageCount: get().pageCount,\n });\n }\n },\n\n toggleSidebarLeft: () =>\n set((state) => ({ sidebarLeftOpen: !state.sidebarLeftOpen })),\n setSidebarLeftTab: (tab) => set({ sidebarLeftTab: tab }),\n setOutlineSearch: (query) => set({ outlineSearchQuery: query }),\n toggleSidebarRight: (tab) =>\n set((state) => ({\n sidebarRightOpen: tab ? true : !state.sidebarRightOpen,\n sidebarRightTab: tab || state.sidebarRightTab,\n })),\n setAnnotationColor: (color) => set({ annotationColor: color }),\n\n addAnnotation: (ann) => {\n set((state) => ({\n annotations: [...state.annotations, ann],\n selectedAnnotationId: ann.id,\n }));\n papyrusEvents.emit(PapyrusEventType.ANNOTATION_CREATED, {\n annotation: ann,\n });\n },\n\n updateAnnotation: (id, updates) =>\n set((state) => ({\n annotations: state.annotations.map((a) =>\n a.id === id ? { ...a, ...updates } : a\n ),\n })),\n\n removeAnnotation: (id) => {\n set((state) => ({\n annotations: state.annotations.filter((a) => a.id !== id),\n selectedAnnotationId:\n state.selectedAnnotationId === id ? null : state.selectedAnnotationId,\n }));\n papyrusEvents.emit(PapyrusEventType.ANNOTATION_DELETED, {\n annotationId: id,\n });\n },\n\n setSelectedAnnotation: (id) => set({ selectedAnnotationId: id }),\n setInteractionMode: (mode) => set({ interactionMode: mode }),\n setSelectionActive: (active) => set({ selectionActive: active }),\n setAccentColor: (color) => set({ accentColor: color }),\n\n setSearch: (query, results) => {\n set({\n searchQuery: query,\n searchResults: results,\n activeSearchIndex: results.length > 0 ? 0 : -1,\n });\n papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, { query });\n },\n\n nextSearchResult: () => {\n const state = get();\n if (state.searchResults.length === 0) return;\n const nextIndex =\n (state.activeSearchIndex + 1) % state.searchResults.length;\n const pageIndex = state.searchResults[nextIndex].pageIndex;\n set({\n activeSearchIndex: nextIndex,\n scrollToPageSignal: pageIndex,\n currentPage: pageIndex + 1,\n });\n },\n\n prevSearchResult: () => {\n const state = get();\n if (state.searchResults.length === 0) return;\n const prevIndex =\n (state.activeSearchIndex - 1 + state.searchResults.length) %\n state.searchResults.length;\n const pageIndex = state.searchResults[prevIndex].pageIndex;\n set({\n activeSearchIndex: prevIndex,\n scrollToPageSignal: pageIndex,\n currentPage: pageIndex + 1,\n });\n },\n\n triggerScrollToPage: (pageIndex) =>\n set({ scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 }),\n}));\n","\r\nimport { PapyrusEventType, PapyrusEventListener, EventPayloads } from '@papyrus-sdk/types';\r\n\r\nexport class PapyrusEventEmitter {\r\n private listeners: Map<PapyrusEventType, Set<PapyrusEventListener<any>>> = new Map();\r\n\r\n on<T extends PapyrusEventType>(event: T, listener: PapyrusEventListener<T>): () => void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(listener);\r\n\r\n // Return an unsubscribe function\r\n return () => this.off(event, listener);\r\n }\r\n\r\n off<T extends PapyrusEventType>(event: T, listener: PapyrusEventListener<T>): void {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n eventListeners.delete(listener);\r\n }\r\n }\r\n\r\n emit<T extends PapyrusEventType>(event: T, payload: EventPayloads[T]): void {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n eventListeners.forEach((listener) => listener(payload));\r\n }\r\n }\r\n}\r\n\r\n// Singleton instance for the core package\r\nexport const papyrusEvents = new PapyrusEventEmitter();\r\n","\r\nimport { DocumentEngine, SearchResult } from '@papyrus-sdk/types';\r\n\r\nexport class SearchService {\r\n private engine: DocumentEngine;\r\n constructor(engine: DocumentEngine) { this.engine = engine; }\r\n\r\n async search(query: string): Promise<SearchResult[]> {\r\n if (!query || query.length < 2) return [];\r\n if (typeof this.engine.searchText === 'function') {\r\n return await this.engine.searchText(query);\r\n }\r\n const results: SearchResult[] = [];\r\n const pageCount = this.engine.getPageCount();\r\n const normalizedQuery = query.toLowerCase();\r\n\r\n for (let i = 0; i < pageCount; i++) {\r\n const textContent = await this.engine.getTextContent(i);\r\n const fullPageText = textContent.map(item => item.str).join(' ');\r\n let pos = fullPageText.toLowerCase().indexOf(normalizedQuery, 0);\r\n let matchIndex = 0;\r\n while (pos !== -1) {\r\n const start = Math.max(0, pos - 20);\r\n const end = Math.min(fullPageText.length, pos + query.length + 20);\r\n results.push({ pageIndex: i, text: fullPageText.substring(start, end), matchIndex: matchIndex++ });\r\n pos = fullPageText.toLowerCase().indexOf(normalizedQuery, pos + 1);\r\n }\r\n }\r\n return results;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -4,7 +4,9 @@ var BaseDocumentEngine = class {
4
4
 
5
5
  // store.ts
6
6
  import { create } from "zustand";
7
- import { PapyrusEventType } from "@papyrus-sdk/types";
7
+ import {
8
+ PapyrusEventType
9
+ } from "@papyrus-sdk/types";
8
10
 
9
11
  // services/event-emitter.ts
10
12
  var PapyrusEventEmitter = class {
@@ -61,6 +63,7 @@ var useViewerStore = create((set, get) => ({
61
63
  selectedAnnotationId: null,
62
64
  interactionMode: "pan",
63
65
  selectionActive: false,
66
+ toolDockOpen: false,
64
67
  initializeStore: (config) => set((state) => ({
65
68
  ...state,
66
69
  currentPage: config.initialPage ?? state.currentPage,
@@ -80,13 +83,17 @@ var useViewerStore = create((set, get) => ({
80
83
  const oldZoom = get().zoom;
81
84
  set((prev) => ({ ...prev, ...state }));
82
85
  if (state.currentPage !== void 0 && state.currentPage !== oldPage) {
83
- papyrusEvents.emit(PapyrusEventType.PAGE_CHANGED, { pageNumber: state.currentPage });
86
+ papyrusEvents.emit(PapyrusEventType.PAGE_CHANGED, {
87
+ pageNumber: state.currentPage
88
+ });
84
89
  }
85
90
  if (state.zoom !== void 0 && state.zoom !== oldZoom) {
86
91
  papyrusEvents.emit(PapyrusEventType.ZOOM_CHANGED, { zoom: state.zoom });
87
92
  }
88
93
  if (state.isLoaded === true) {
89
- papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, { pageCount: get().pageCount });
94
+ papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, {
95
+ pageCount: get().pageCount
96
+ });
90
97
  }
91
98
  },
92
99
  toggleSidebarLeft: () => set((state) => ({ sidebarLeftOpen: !state.sidebarLeftOpen })),
@@ -98,25 +105,38 @@ var useViewerStore = create((set, get) => ({
98
105
  })),
99
106
  setAnnotationColor: (color) => set({ annotationColor: color }),
100
107
  addAnnotation: (ann) => {
101
- set((state) => ({ annotations: [...state.annotations, ann], selectedAnnotationId: ann.id }));
102
- papyrusEvents.emit(PapyrusEventType.ANNOTATION_CREATED, { annotation: ann });
108
+ set((state) => ({
109
+ annotations: [...state.annotations, ann],
110
+ selectedAnnotationId: ann.id
111
+ }));
112
+ papyrusEvents.emit(PapyrusEventType.ANNOTATION_CREATED, {
113
+ annotation: ann
114
+ });
103
115
  },
104
116
  updateAnnotation: (id, updates) => set((state) => ({
105
- annotations: state.annotations.map((a) => a.id === id ? { ...a, ...updates } : a)
117
+ annotations: state.annotations.map(
118
+ (a) => a.id === id ? { ...a, ...updates } : a
119
+ )
106
120
  })),
107
121
  removeAnnotation: (id) => {
108
122
  set((state) => ({
109
123
  annotations: state.annotations.filter((a) => a.id !== id),
110
124
  selectedAnnotationId: state.selectedAnnotationId === id ? null : state.selectedAnnotationId
111
125
  }));
112
- papyrusEvents.emit(PapyrusEventType.ANNOTATION_DELETED, { annotationId: id });
126
+ papyrusEvents.emit(PapyrusEventType.ANNOTATION_DELETED, {
127
+ annotationId: id
128
+ });
113
129
  },
114
130
  setSelectedAnnotation: (id) => set({ selectedAnnotationId: id }),
115
131
  setInteractionMode: (mode) => set({ interactionMode: mode }),
116
132
  setSelectionActive: (active) => set({ selectionActive: active }),
117
133
  setAccentColor: (color) => set({ accentColor: color }),
118
134
  setSearch: (query, results) => {
119
- set({ searchQuery: query, searchResults: results, activeSearchIndex: results.length > 0 ? 0 : -1 });
135
+ set({
136
+ searchQuery: query,
137
+ searchResults: results,
138
+ activeSearchIndex: results.length > 0 ? 0 : -1
139
+ });
120
140
  papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, { query });
121
141
  },
122
142
  nextSearchResult: () => {
@@ -124,14 +144,22 @@ var useViewerStore = create((set, get) => ({
124
144
  if (state.searchResults.length === 0) return;
125
145
  const nextIndex = (state.activeSearchIndex + 1) % state.searchResults.length;
126
146
  const pageIndex = state.searchResults[nextIndex].pageIndex;
127
- set({ activeSearchIndex: nextIndex, scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 });
147
+ set({
148
+ activeSearchIndex: nextIndex,
149
+ scrollToPageSignal: pageIndex,
150
+ currentPage: pageIndex + 1
151
+ });
128
152
  },
129
153
  prevSearchResult: () => {
130
154
  const state = get();
131
155
  if (state.searchResults.length === 0) return;
132
156
  const prevIndex = (state.activeSearchIndex - 1 + state.searchResults.length) % state.searchResults.length;
133
157
  const pageIndex = state.searchResults[prevIndex].pageIndex;
134
- set({ activeSearchIndex: prevIndex, scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 });
158
+ set({
159
+ activeSearchIndex: prevIndex,
160
+ scrollToPageSignal: pageIndex,
161
+ currentPage: pageIndex + 1
162
+ });
135
163
  },
136
164
  triggerScrollToPage: (pageIndex) => set({ scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 })
137
165
  }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../engine.ts","../store.ts","../services/event-emitter.ts","../services/search-service.ts"],"sourcesContent":["\r\nimport { DocumentEngine, TextItem, OutlineItem, DocumentLoadInput, TextSelection, PageDestination } from '@papyrus-sdk/types';\r\n\r\nexport abstract class BaseDocumentEngine implements DocumentEngine {\r\n abstract load(source: DocumentLoadInput): Promise<void>;\r\n abstract getPageCount(): number;\r\n abstract getCurrentPage(): number;\r\n abstract goToPage(page: number): void;\r\n abstract setZoom(zoom: number): void;\r\n abstract getZoom(): number;\r\n abstract rotate(direction: 'clockwise' | 'counterclockwise'): void;\r\n abstract getRotation(): number;\r\n abstract renderPage(pageIndex: number, target: any, scale: number): Promise<void>;\r\n abstract renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void>;\r\n abstract getTextContent(pageIndex: number): Promise<TextItem[]>;\r\n abstract getPageDimensions(pageIndex: number): Promise<{ width: number, height: number }>;\r\n abstract selectText(pageIndex: number, rect: { x: number; y: number; width: number; height: number }): Promise<TextSelection | null>;\r\n abstract getOutline(): Promise<OutlineItem[]>;\r\n abstract getPageIndex(dest: PageDestination): Promise<number | null>;\r\n abstract destroy(): void;\r\n}\r\n","\r\nimport { create } from 'zustand';\r\nimport { ViewMode, Annotation, SearchResult, UITheme, PageTheme, OutlineItem, PapyrusEventType, PapyrusConfig, Locale } from '@papyrus-sdk/types';\r\nimport { papyrusEvents } from './services/event-emitter';\r\n\r\ninterface ViewerState {\r\n isLoaded: boolean;\r\n pageCount: number;\r\n currentPage: number;\r\n zoom: number;\r\n rotation: number;\r\n viewMode: ViewMode;\r\n uiTheme: UITheme;\r\n pageTheme: PageTheme;\r\n locale: Locale;\r\n accentColor: string;\r\n annotationColor: string;\r\n outline: OutlineItem[];\r\n sidebarLeftOpen: boolean;\r\n sidebarLeftTab: 'thumbnails' | 'summary';\r\n outlineSearchQuery: string;\r\n sidebarRightOpen: boolean;\r\n sidebarRightTab: 'search' | 'annotations' | 'pages';\r\n searchQuery: string;\r\n searchResults: SearchResult[];\r\n activeSearchIndex: number;\r\n scrollToPageSignal: number | null;\r\n annotations: Annotation[];\r\n activeTool: 'select' | 'highlight' | 'underline' | 'squiggly' | 'strikeout' | 'text' | 'comment' | 'ink';\n selectedAnnotationId: string | null;\r\n interactionMode: 'pan' | 'select';\r\n selectionActive: boolean;\r\n\r\n initializeStore: (config: PapyrusConfig) => void;\r\n setDocumentState: (state: Partial<ViewerState>) => void;\r\n toggleSidebarLeft: () => void;\r\n setSidebarLeftTab: (tab: 'thumbnails' | 'summary') => void;\r\n setOutlineSearch: (query: string) => void;\r\n toggleSidebarRight: (tab?: 'search' | 'annotations' | 'pages') => void;\r\n addAnnotation: (annotation: Annotation) => void;\r\n updateAnnotation: (id: string, updates: Partial<Annotation>) => void;\r\n removeAnnotation: (id: string) => void;\r\n setSelectedAnnotation: (id: string | null) => void;\r\n setSearch: (query: string, results: SearchResult[]) => void;\r\n nextSearchResult: () => void;\r\n prevSearchResult: () => void;\r\n triggerScrollToPage: (pageIndex: number) => void;\r\n setAnnotationColor: (color: string) => void;\r\n setInteractionMode: (mode: 'pan' | 'select') => void;\r\n setSelectionActive: (active: boolean) => void;\r\n setAccentColor: (color: string) => void;\r\n}\r\n\r\nexport const useViewerStore = create<ViewerState>((set, get) => ({\r\n isLoaded: false,\r\n pageCount: 0,\r\n currentPage: 1,\r\n zoom: 1.0,\r\n rotation: 0,\r\n viewMode: 'continuous',\r\n uiTheme: 'light',\r\n pageTheme: 'normal',\r\n locale: 'en',\r\n accentColor: '#2563eb',\r\n annotationColor: '#fbbf24',\r\n outline: [],\r\n sidebarLeftOpen: true,\r\n sidebarLeftTab: 'thumbnails',\r\n outlineSearchQuery: '',\r\n sidebarRightOpen: false,\r\n sidebarRightTab: 'search',\r\n searchQuery: '',\r\n searchResults: [],\r\n activeSearchIndex: -1,\r\n scrollToPageSignal: null,\r\n annotations: [],\r\n activeTool: 'select',\n selectedAnnotationId: null,\r\n interactionMode: 'pan',\r\n selectionActive: false,\r\n\r\n initializeStore: (config) => set((state) => ({\r\n ...state,\r\n currentPage: config.initialPage ?? state.currentPage,\r\n zoom: config.initialZoom ?? state.zoom,\r\n rotation: config.initialRotation ?? state.rotation,\r\n viewMode: config.initialViewMode ?? state.viewMode,\r\n uiTheme: config.initialUITheme ?? state.uiTheme,\r\n pageTheme: config.initialPageTheme ?? state.pageTheme,\r\n locale: config.initialLocale ?? state.locale,\r\n accentColor: config.initialAccentColor ?? state.accentColor,\r\n annotations: config.initialAnnotations ?? state.annotations,\r\n sidebarLeftOpen: config.sidebarLeftOpen ?? state.sidebarLeftOpen,\r\n sidebarRightOpen: config.sidebarRightOpen ?? state.sidebarRightOpen,\r\n })),\r\n\r\n setDocumentState: (state) => {\r\n const oldPage = get().currentPage;\r\n const oldZoom = get().zoom;\r\n \r\n set((prev) => ({ ...prev, ...state }));\r\n\r\n if (state.currentPage !== undefined && state.currentPage !== oldPage) {\r\n papyrusEvents.emit(PapyrusEventType.PAGE_CHANGED, { pageNumber: state.currentPage });\r\n }\r\n if (state.zoom !== undefined && state.zoom !== oldZoom) {\r\n papyrusEvents.emit(PapyrusEventType.ZOOM_CHANGED, { zoom: state.zoom });\r\n }\r\n if (state.isLoaded === true) {\r\n papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, { pageCount: get().pageCount });\r\n }\r\n },\r\n\r\n toggleSidebarLeft: () => set((state) => ({ sidebarLeftOpen: !state.sidebarLeftOpen })),\r\n setSidebarLeftTab: (tab) => set({ sidebarLeftTab: tab }),\r\n setOutlineSearch: (query) => set({ outlineSearchQuery: query }),\r\n toggleSidebarRight: (tab) => set((state) => ({ \r\n sidebarRightOpen: tab ? true : !state.sidebarRightOpen,\r\n sidebarRightTab: tab || state.sidebarRightTab \r\n })),\r\n setAnnotationColor: (color) => set({ annotationColor: color }),\r\n\r\n addAnnotation: (ann) => {\r\n set((state) => ({ annotations: [...state.annotations, ann], selectedAnnotationId: ann.id }));\r\n papyrusEvents.emit(PapyrusEventType.ANNOTATION_CREATED, { annotation: ann });\r\n },\r\n\r\n updateAnnotation: (id, updates) => set((state) => ({\r\n annotations: state.annotations.map(a => a.id === id ? { ...a, ...updates } : a)\r\n })),\r\n\r\n removeAnnotation: (id) => {\r\n set((state) => ({ \r\n annotations: state.annotations.filter(a => a.id !== id),\r\n selectedAnnotationId: state.selectedAnnotationId === id ? null : state.selectedAnnotationId\r\n }));\r\n papyrusEvents.emit(PapyrusEventType.ANNOTATION_DELETED, { annotationId: id });\r\n },\r\n\r\n setSelectedAnnotation: (id) => set({ selectedAnnotationId: id }),\r\n setInteractionMode: (mode) => set({ interactionMode: mode }),\r\n setSelectionActive: (active) => set({ selectionActive: active }),\r\n setAccentColor: (color) => set({ accentColor: color }),\r\n \r\n setSearch: (query, results) => {\r\n set({ searchQuery: query, searchResults: results, activeSearchIndex: results.length > 0 ? 0 : -1 });\r\n papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, { query });\r\n },\r\n\r\n nextSearchResult: () => {\r\n const state = get();\r\n if (state.searchResults.length === 0) return;\r\n const nextIndex = (state.activeSearchIndex + 1) % state.searchResults.length;\r\n const pageIndex = state.searchResults[nextIndex].pageIndex;\r\n set({ activeSearchIndex: nextIndex, scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 });\r\n },\r\n\r\n prevSearchResult: () => {\r\n const state = get();\r\n if (state.searchResults.length === 0) return;\r\n const prevIndex = (state.activeSearchIndex - 1 + state.searchResults.length) % state.searchResults.length;\r\n const pageIndex = state.searchResults[prevIndex].pageIndex;\r\n set({ activeSearchIndex: prevIndex, scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 });\r\n },\r\n\r\n triggerScrollToPage: (pageIndex) => set({ scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 }),\r\n}));\r\n","\r\nimport { PapyrusEventType, PapyrusEventListener, EventPayloads } from '@papyrus-sdk/types';\r\n\r\nexport class PapyrusEventEmitter {\r\n private listeners: Map<PapyrusEventType, Set<PapyrusEventListener<any>>> = new Map();\r\n\r\n on<T extends PapyrusEventType>(event: T, listener: PapyrusEventListener<T>): () => void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(listener);\r\n\r\n // Return an unsubscribe function\r\n return () => this.off(event, listener);\r\n }\r\n\r\n off<T extends PapyrusEventType>(event: T, listener: PapyrusEventListener<T>): void {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n eventListeners.delete(listener);\r\n }\r\n }\r\n\r\n emit<T extends PapyrusEventType>(event: T, payload: EventPayloads[T]): void {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n eventListeners.forEach((listener) => listener(payload));\r\n }\r\n }\r\n}\r\n\r\n// Singleton instance for the core package\r\nexport const papyrusEvents = new PapyrusEventEmitter();\r\n","\r\nimport { DocumentEngine, SearchResult } from '@papyrus-sdk/types';\r\n\r\nexport class SearchService {\r\n private engine: DocumentEngine;\r\n constructor(engine: DocumentEngine) { this.engine = engine; }\r\n\r\n async search(query: string): Promise<SearchResult[]> {\r\n if (!query || query.length < 2) return [];\r\n if (typeof this.engine.searchText === 'function') {\r\n return await this.engine.searchText(query);\r\n }\r\n const results: SearchResult[] = [];\r\n const pageCount = this.engine.getPageCount();\r\n const normalizedQuery = query.toLowerCase();\r\n\r\n for (let i = 0; i < pageCount; i++) {\r\n const textContent = await this.engine.getTextContent(i);\r\n const fullPageText = textContent.map(item => item.str).join(' ');\r\n let pos = fullPageText.toLowerCase().indexOf(normalizedQuery, 0);\r\n let matchIndex = 0;\r\n while (pos !== -1) {\r\n const start = Math.max(0, pos - 20);\r\n const end = Math.min(fullPageText.length, pos + query.length + 20);\r\n results.push({ pageIndex: i, text: fullPageText.substring(start, end), matchIndex: matchIndex++ });\r\n pos = fullPageText.toLowerCase().indexOf(normalizedQuery, pos + 1);\r\n }\r\n }\r\n return results;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../engine.ts","../store.ts","../services/event-emitter.ts","../services/search-service.ts"],"sourcesContent":["\r\nimport { DocumentEngine, TextItem, OutlineItem, DocumentLoadInput, TextSelection, PageDestination } from '@papyrus-sdk/types';\r\n\r\nexport abstract class BaseDocumentEngine implements DocumentEngine {\r\n abstract load(source: DocumentLoadInput): Promise<void>;\r\n abstract getPageCount(): number;\r\n abstract getCurrentPage(): number;\r\n abstract goToPage(page: number): void;\r\n abstract setZoom(zoom: number): void;\r\n abstract getZoom(): number;\r\n abstract rotate(direction: 'clockwise' | 'counterclockwise'): void;\r\n abstract getRotation(): number;\r\n abstract renderPage(pageIndex: number, target: any, scale: number): Promise<void>;\r\n abstract renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void>;\r\n abstract getTextContent(pageIndex: number): Promise<TextItem[]>;\r\n abstract getPageDimensions(pageIndex: number): Promise<{ width: number, height: number }>;\r\n abstract selectText(pageIndex: number, rect: { x: number; y: number; width: number; height: number }): Promise<TextSelection | null>;\r\n abstract getOutline(): Promise<OutlineItem[]>;\r\n abstract getPageIndex(dest: PageDestination): Promise<number | null>;\r\n abstract destroy(): void;\r\n}\r\n","import { create } from \"zustand\";\nimport {\n ViewMode,\n Annotation,\n SearchResult,\n UITheme,\n PageTheme,\n OutlineItem,\n PapyrusEventType,\n PapyrusConfig,\n Locale,\n} from \"@papyrus-sdk/types\";\nimport { papyrusEvents } from \"./services/event-emitter\";\n\ninterface ViewerState {\n isLoaded: boolean;\n pageCount: number;\n currentPage: number;\n zoom: number;\n rotation: number;\n viewMode: ViewMode;\n uiTheme: UITheme;\n pageTheme: PageTheme;\n locale: Locale;\n accentColor: string;\n annotationColor: string;\n outline: OutlineItem[];\n sidebarLeftOpen: boolean;\n sidebarLeftTab: \"thumbnails\" | \"summary\";\n outlineSearchQuery: string;\n sidebarRightOpen: boolean;\n sidebarRightTab: \"search\" | \"annotations\" | \"pages\";\n searchQuery: string;\n searchResults: SearchResult[];\n activeSearchIndex: number;\n scrollToPageSignal: number | null;\n annotations: Annotation[];\n activeTool:\n | \"select\"\n | \"highlight\"\n | \"underline\"\n | \"squiggly\"\n | \"strikeout\"\n | \"text\"\n | \"comment\"\n | \"ink\";\n selectedAnnotationId: string | null;\n interactionMode: \"pan\" | \"select\";\n selectionActive: boolean;\n toolDockOpen: boolean;\n\n initializeStore: (config: PapyrusConfig) => void;\n setDocumentState: (state: Partial<ViewerState>) => void;\n toggleSidebarLeft: () => void;\n setSidebarLeftTab: (tab: \"thumbnails\" | \"summary\") => void;\n setOutlineSearch: (query: string) => void;\n toggleSidebarRight: (tab?: \"search\" | \"annotations\" | \"pages\") => void;\n addAnnotation: (annotation: Annotation) => void;\n updateAnnotation: (id: string, updates: Partial<Annotation>) => void;\n removeAnnotation: (id: string) => void;\n setSelectedAnnotation: (id: string | null) => void;\n setSearch: (query: string, results: SearchResult[]) => void;\n nextSearchResult: () => void;\n prevSearchResult: () => void;\n triggerScrollToPage: (pageIndex: number) => void;\n setAnnotationColor: (color: string) => void;\n setInteractionMode: (mode: \"pan\" | \"select\") => void;\n setSelectionActive: (active: boolean) => void;\n setAccentColor: (color: string) => void;\n}\n\nexport const useViewerStore = create<ViewerState>((set, get) => ({\n isLoaded: false,\n pageCount: 0,\n currentPage: 1,\n zoom: 1.0,\n rotation: 0,\n viewMode: \"continuous\",\n uiTheme: \"light\",\n pageTheme: \"normal\",\n locale: \"en\",\n accentColor: \"#2563eb\",\n annotationColor: \"#fbbf24\",\n outline: [],\n sidebarLeftOpen: true,\n sidebarLeftTab: \"thumbnails\",\n outlineSearchQuery: \"\",\n sidebarRightOpen: false,\n sidebarRightTab: \"search\",\n searchQuery: \"\",\n searchResults: [],\n activeSearchIndex: -1,\n scrollToPageSignal: null,\n annotations: [],\n activeTool: \"select\",\n selectedAnnotationId: null,\n interactionMode: \"pan\",\n selectionActive: false,\n toolDockOpen: false,\n\n initializeStore: (config) =>\n set((state) => ({\n ...state,\n currentPage: config.initialPage ?? state.currentPage,\n zoom: config.initialZoom ?? state.zoom,\n rotation: config.initialRotation ?? state.rotation,\n viewMode: config.initialViewMode ?? state.viewMode,\n uiTheme: config.initialUITheme ?? state.uiTheme,\n pageTheme: config.initialPageTheme ?? state.pageTheme,\n locale: config.initialLocale ?? state.locale,\n accentColor: config.initialAccentColor ?? state.accentColor,\n annotations: config.initialAnnotations ?? state.annotations,\n sidebarLeftOpen: config.sidebarLeftOpen ?? state.sidebarLeftOpen,\n sidebarRightOpen: config.sidebarRightOpen ?? state.sidebarRightOpen,\n })),\n\n setDocumentState: (state) => {\n const oldPage = get().currentPage;\n const oldZoom = get().zoom;\n\n set((prev) => ({ ...prev, ...state }));\n\n if (state.currentPage !== undefined && state.currentPage !== oldPage) {\n papyrusEvents.emit(PapyrusEventType.PAGE_CHANGED, {\n pageNumber: state.currentPage,\n });\n }\n if (state.zoom !== undefined && state.zoom !== oldZoom) {\n papyrusEvents.emit(PapyrusEventType.ZOOM_CHANGED, { zoom: state.zoom });\n }\n if (state.isLoaded === true) {\n papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, {\n pageCount: get().pageCount,\n });\n }\n },\n\n toggleSidebarLeft: () =>\n set((state) => ({ sidebarLeftOpen: !state.sidebarLeftOpen })),\n setSidebarLeftTab: (tab) => set({ sidebarLeftTab: tab }),\n setOutlineSearch: (query) => set({ outlineSearchQuery: query }),\n toggleSidebarRight: (tab) =>\n set((state) => ({\n sidebarRightOpen: tab ? true : !state.sidebarRightOpen,\n sidebarRightTab: tab || state.sidebarRightTab,\n })),\n setAnnotationColor: (color) => set({ annotationColor: color }),\n\n addAnnotation: (ann) => {\n set((state) => ({\n annotations: [...state.annotations, ann],\n selectedAnnotationId: ann.id,\n }));\n papyrusEvents.emit(PapyrusEventType.ANNOTATION_CREATED, {\n annotation: ann,\n });\n },\n\n updateAnnotation: (id, updates) =>\n set((state) => ({\n annotations: state.annotations.map((a) =>\n a.id === id ? { ...a, ...updates } : a\n ),\n })),\n\n removeAnnotation: (id) => {\n set((state) => ({\n annotations: state.annotations.filter((a) => a.id !== id),\n selectedAnnotationId:\n state.selectedAnnotationId === id ? null : state.selectedAnnotationId,\n }));\n papyrusEvents.emit(PapyrusEventType.ANNOTATION_DELETED, {\n annotationId: id,\n });\n },\n\n setSelectedAnnotation: (id) => set({ selectedAnnotationId: id }),\n setInteractionMode: (mode) => set({ interactionMode: mode }),\n setSelectionActive: (active) => set({ selectionActive: active }),\n setAccentColor: (color) => set({ accentColor: color }),\n\n setSearch: (query, results) => {\n set({\n searchQuery: query,\n searchResults: results,\n activeSearchIndex: results.length > 0 ? 0 : -1,\n });\n papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, { query });\n },\n\n nextSearchResult: () => {\n const state = get();\n if (state.searchResults.length === 0) return;\n const nextIndex =\n (state.activeSearchIndex + 1) % state.searchResults.length;\n const pageIndex = state.searchResults[nextIndex].pageIndex;\n set({\n activeSearchIndex: nextIndex,\n scrollToPageSignal: pageIndex,\n currentPage: pageIndex + 1,\n });\n },\n\n prevSearchResult: () => {\n const state = get();\n if (state.searchResults.length === 0) return;\n const prevIndex =\n (state.activeSearchIndex - 1 + state.searchResults.length) %\n state.searchResults.length;\n const pageIndex = state.searchResults[prevIndex].pageIndex;\n set({\n activeSearchIndex: prevIndex,\n scrollToPageSignal: pageIndex,\n currentPage: pageIndex + 1,\n });\n },\n\n triggerScrollToPage: (pageIndex) =>\n set({ scrollToPageSignal: pageIndex, currentPage: pageIndex + 1 }),\n}));\n","\r\nimport { PapyrusEventType, PapyrusEventListener, EventPayloads } from '@papyrus-sdk/types';\r\n\r\nexport class PapyrusEventEmitter {\r\n private listeners: Map<PapyrusEventType, Set<PapyrusEventListener<any>>> = new Map();\r\n\r\n on<T extends PapyrusEventType>(event: T, listener: PapyrusEventListener<T>): () => void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(listener);\r\n\r\n // Return an unsubscribe function\r\n return () => this.off(event, listener);\r\n }\r\n\r\n off<T extends PapyrusEventType>(event: T, listener: PapyrusEventListener<T>): void {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n eventListeners.delete(listener);\r\n }\r\n }\r\n\r\n emit<T extends PapyrusEventType>(event: T, payload: EventPayloads[T]): void {\r\n const eventListeners = this.listeners.get(event);\r\n if (eventListeners) {\r\n eventListeners.forEach((listener) => listener(payload));\r\n }\r\n }\r\n}\r\n\r\n// Singleton instance for the core package\r\nexport const papyrusEvents = new PapyrusEventEmitter();\r\n","\r\nimport { DocumentEngine, SearchResult } from '@papyrus-sdk/types';\r\n\r\nexport class SearchService {\r\n private engine: DocumentEngine;\r\n constructor(engine: DocumentEngine) { this.engine = engine; }\r\n\r\n async search(query: string): Promise<SearchResult[]> {\r\n if (!query || query.length < 2) return [];\r\n if (typeof this.engine.searchText === 'function') {\r\n return await this.engine.searchText(query);\r\n }\r\n const results: SearchResult[] = [];\r\n const pageCount = this.engine.getPageCount();\r\n const normalizedQuery = query.toLowerCase();\r\n\r\n for (let i = 0; i < pageCount; i++) {\r\n const textContent = await this.engine.getTextContent(i);\r\n const fullPageText = textContent.map(item => item.str).join(' ');\r\n let pos = fullPageText.toLowerCase().indexOf(normalizedQuery, 0);\r\n let matchIndex = 0;\r\n while (pos !== -1) {\r\n const start = Math.max(0, pos - 20);\r\n const end = Math.min(fullPageText.length, pos + query.length + 20);\r\n results.push({ pageIndex: i, text: fullPageText.substring(start, end), matchIndex: matchIndex++ });\r\n pos = fullPageText.toLowerCase().indexOf(normalizedQuery, pos + 1);\r\n }\r\n }\r\n return results;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@papyrus-sdk/core",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "license": "MIT",
5
5
  "keywords": [
6
6
  "papyrus",
@@ -38,11 +38,11 @@
38
38
  "bugs": {
39
39
  "url": "https://github.com/solrachix/Papyrus/issues"
40
40
  },
41
+ "scripts": {
42
+ "build": "tsup index.ts --dts --format cjs,esm --out-dir dist --clean --sourcemap"
43
+ },
41
44
  "dependencies": {
42
45
  "@papyrus-sdk/types": "0.2.1",
43
46
  "zustand": "^5.0.0"
44
- },
45
- "scripts": {
46
- "build": "tsup index.ts --dts --format cjs,esm --out-dir dist --clean --sourcemap"
47
47
  }
48
- }
48
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Papyrus Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.