react-3d-flipbook 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1005 -0
- package/dist/components/BookmarksPanel.d.ts +21 -0
- package/dist/components/Flipbook.d.ts +5 -0
- package/dist/components/SearchPanel.d.ts +26 -0
- package/dist/components/TableOfContents.d.ts +13 -0
- package/dist/components/ThumbnailsPanel.d.ts +14 -0
- package/dist/components/WebGLPageFlip.d.ts +46 -0
- package/dist/components/index.d.ts +12 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/useAutoplay.d.ts +58 -0
- package/dist/hooks/useFlipbook.d.ts +48 -0
- package/dist/hooks/usePdfLoader.d.ts +127 -0
- package/dist/index.d.ts +1121 -0
- package/dist/index.esm.js +25056 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +25121 -0
- package/dist/index.js.map +1 -0
- package/dist/setupTests.d.ts +1 -0
- package/dist/types/index.d.ts +481 -0
- package/dist/utils/index.d.ts +131 -0
- package/dist/utils/pdfUtils.d.ts +158 -0
- package/package.json +122 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,1121 @@
|
|
|
1
|
+
import * as React$1 from 'react';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
|
|
4
|
+
interface FlipbookPage {
|
|
5
|
+
/** Image source URL for the page */
|
|
6
|
+
src: string;
|
|
7
|
+
/** Thumbnail image URL */
|
|
8
|
+
thumb?: string;
|
|
9
|
+
/** Page title for table of contents */
|
|
10
|
+
title?: string;
|
|
11
|
+
/** HTML content to overlay on the page */
|
|
12
|
+
htmlContent?: string;
|
|
13
|
+
/** JSON data associated with the page */
|
|
14
|
+
json?: Record<string, unknown>;
|
|
15
|
+
/** Which side of a double page spread */
|
|
16
|
+
side?: "left" | "right";
|
|
17
|
+
/** Whether this is an empty/placeholder page */
|
|
18
|
+
empty?: boolean;
|
|
19
|
+
/** Page width in pixels (for landscape/portrait support) */
|
|
20
|
+
width?: number;
|
|
21
|
+
/** Page height in pixels (for landscape/portrait support) */
|
|
22
|
+
height?: number;
|
|
23
|
+
/** Page orientation - auto-detected from width/height if not specified */
|
|
24
|
+
orientation?: "portrait" | "landscape";
|
|
25
|
+
}
|
|
26
|
+
interface TocItem {
|
|
27
|
+
title: string;
|
|
28
|
+
page: number;
|
|
29
|
+
children?: TocItem[];
|
|
30
|
+
}
|
|
31
|
+
type ViewMode = "webgl";
|
|
32
|
+
type SkinType = "dark" | "light" | "gradient";
|
|
33
|
+
type LayoutType = "1" | "2" | "3" | "4";
|
|
34
|
+
type HAlign = "left" | "center" | "right";
|
|
35
|
+
type VAlign = "top" | "middle" | "bottom";
|
|
36
|
+
interface ButtonConfig {
|
|
37
|
+
enabled?: boolean;
|
|
38
|
+
title?: string;
|
|
39
|
+
iconFA?: string;
|
|
40
|
+
iconM?: string;
|
|
41
|
+
iconFA_alt?: string;
|
|
42
|
+
iconM_alt?: string;
|
|
43
|
+
hAlign?: HAlign;
|
|
44
|
+
vAlign?: VAlign;
|
|
45
|
+
hideOnMobile?: boolean;
|
|
46
|
+
}
|
|
47
|
+
interface DownloadButtonConfig extends ButtonConfig {
|
|
48
|
+
url?: string;
|
|
49
|
+
name?: string;
|
|
50
|
+
forceDownload?: boolean;
|
|
51
|
+
openInNewWindow?: boolean;
|
|
52
|
+
}
|
|
53
|
+
interface CurrentPageConfig {
|
|
54
|
+
enabled?: boolean;
|
|
55
|
+
title?: string;
|
|
56
|
+
vAlign?: VAlign;
|
|
57
|
+
hAlign?: HAlign;
|
|
58
|
+
marginH?: number;
|
|
59
|
+
marginV?: number;
|
|
60
|
+
color?: string;
|
|
61
|
+
background?: string;
|
|
62
|
+
}
|
|
63
|
+
interface CloseButtonConfig extends ButtonConfig {
|
|
64
|
+
size?: number;
|
|
65
|
+
}
|
|
66
|
+
interface ShareProviderConfig {
|
|
67
|
+
enabled?: boolean;
|
|
68
|
+
icon?: string;
|
|
69
|
+
}
|
|
70
|
+
interface ShareConfig {
|
|
71
|
+
whatsapp?: ShareProviderConfig;
|
|
72
|
+
twitter?: ShareProviderConfig;
|
|
73
|
+
facebook?: ShareProviderConfig;
|
|
74
|
+
pinterest?: ShareProviderConfig;
|
|
75
|
+
email?: ShareProviderConfig;
|
|
76
|
+
linkedin?: ShareProviderConfig;
|
|
77
|
+
digg?: ShareProviderConfig;
|
|
78
|
+
reddit?: ShareProviderConfig;
|
|
79
|
+
}
|
|
80
|
+
interface PdfConfig {
|
|
81
|
+
annotationLayer?: boolean;
|
|
82
|
+
}
|
|
83
|
+
interface FillPreloaderConfig {
|
|
84
|
+
enabled?: boolean;
|
|
85
|
+
imgEmpty?: string;
|
|
86
|
+
imgFull?: string;
|
|
87
|
+
}
|
|
88
|
+
interface LocalizationStrings {
|
|
89
|
+
print?: string;
|
|
90
|
+
printLeftPage?: string;
|
|
91
|
+
printRightPage?: string;
|
|
92
|
+
printCurrentPage?: string;
|
|
93
|
+
printAllPages?: string;
|
|
94
|
+
download?: string;
|
|
95
|
+
downloadLeftPage?: string;
|
|
96
|
+
downloadRightPage?: string;
|
|
97
|
+
downloadCurrentPage?: string;
|
|
98
|
+
downloadAllPages?: string;
|
|
99
|
+
bookmarks?: string;
|
|
100
|
+
bookmarkLeftPage?: string;
|
|
101
|
+
bookmarkRightPage?: string;
|
|
102
|
+
bookmarkCurrentPage?: string;
|
|
103
|
+
search?: string;
|
|
104
|
+
findInDocument?: string;
|
|
105
|
+
pagesFoundContaining?: string;
|
|
106
|
+
noMatches?: string;
|
|
107
|
+
matchesFound?: string;
|
|
108
|
+
thumbnails?: string;
|
|
109
|
+
tableOfContent?: string;
|
|
110
|
+
share?: string;
|
|
111
|
+
pressEscToClose?: string;
|
|
112
|
+
password?: string;
|
|
113
|
+
}
|
|
114
|
+
interface MobileConfig {
|
|
115
|
+
shadows?: boolean;
|
|
116
|
+
pageSegmentsW?: number;
|
|
117
|
+
}
|
|
118
|
+
interface AssetsConfig {
|
|
119
|
+
preloader?: string;
|
|
120
|
+
overlay?: string;
|
|
121
|
+
flipMp3?: string;
|
|
122
|
+
spinner?: string;
|
|
123
|
+
backgroundMp3?: string;
|
|
124
|
+
}
|
|
125
|
+
interface LightboxConfig {
|
|
126
|
+
enabled?: boolean;
|
|
127
|
+
opened?: boolean;
|
|
128
|
+
fullscreen?: boolean;
|
|
129
|
+
closeOnClick?: boolean;
|
|
130
|
+
resetOnOpen?: boolean;
|
|
131
|
+
background?: string;
|
|
132
|
+
backgroundColor?: string;
|
|
133
|
+
backgroundPattern?: string;
|
|
134
|
+
backgroundImage?: string;
|
|
135
|
+
startPage?: number;
|
|
136
|
+
marginV?: number;
|
|
137
|
+
marginH?: number;
|
|
138
|
+
css?: string;
|
|
139
|
+
preload?: boolean;
|
|
140
|
+
showMenu?: boolean;
|
|
141
|
+
closeOnBack?: boolean;
|
|
142
|
+
}
|
|
143
|
+
interface FlipbookOptions {
|
|
144
|
+
name?: string;
|
|
145
|
+
pages?: FlipbookPage[];
|
|
146
|
+
tableOfContent?: TocItem[];
|
|
147
|
+
tableOfContentCloseOnClick?: boolean;
|
|
148
|
+
thumbsCloseOnClick?: boolean;
|
|
149
|
+
deeplinkingEnabled?: boolean;
|
|
150
|
+
deeplinkingPrefix?: string;
|
|
151
|
+
assets?: AssetsConfig;
|
|
152
|
+
pdfUrl?: string | null;
|
|
153
|
+
pdfBrowserViewerIfMobile?: boolean;
|
|
154
|
+
pdfBrowserViewerIfIE?: boolean;
|
|
155
|
+
pdfBrowserViewerFullscreen?: boolean;
|
|
156
|
+
pdfBrowserViewerFullscreenTarget?: string;
|
|
157
|
+
rangeChunkSize?: number;
|
|
158
|
+
disableRange?: boolean;
|
|
159
|
+
disableStream?: boolean;
|
|
160
|
+
disableAutoFetch?: boolean;
|
|
161
|
+
pdfAutoLinks?: boolean;
|
|
162
|
+
pdf?: PdfConfig;
|
|
163
|
+
pdfTextLayer?: boolean;
|
|
164
|
+
annotationLayer?: boolean;
|
|
165
|
+
htmlLayer?: boolean;
|
|
166
|
+
rightToLeft?: boolean;
|
|
167
|
+
startPage?: number;
|
|
168
|
+
sound?: boolean;
|
|
169
|
+
backgroundColor?: string;
|
|
170
|
+
backgroundImage?: string;
|
|
171
|
+
backgroundPattern?: string;
|
|
172
|
+
backgroundTransparent?: boolean;
|
|
173
|
+
thumbSize?: number;
|
|
174
|
+
loadAllPages?: boolean;
|
|
175
|
+
loadPagesF?: number;
|
|
176
|
+
loadPagesB?: number;
|
|
177
|
+
autoplayOnStart?: boolean;
|
|
178
|
+
autoplayInterval?: number;
|
|
179
|
+
autoplayLoop?: boolean;
|
|
180
|
+
skin?: SkinType;
|
|
181
|
+
layout?: LayoutType;
|
|
182
|
+
skinColor?: string;
|
|
183
|
+
skinBackground?: string;
|
|
184
|
+
menuOverBook?: boolean;
|
|
185
|
+
menuFloating?: boolean;
|
|
186
|
+
menuBackground?: string;
|
|
187
|
+
menuShadow?: string;
|
|
188
|
+
menuMargin?: number;
|
|
189
|
+
menuPadding?: number;
|
|
190
|
+
menuTransparent?: boolean;
|
|
191
|
+
hideMenu?: boolean;
|
|
192
|
+
menu2OverBook?: boolean;
|
|
193
|
+
menu2Floating?: boolean;
|
|
194
|
+
menu2Background?: string;
|
|
195
|
+
menu2Shadow?: string;
|
|
196
|
+
menu2Margin?: number;
|
|
197
|
+
menu2Padding?: number;
|
|
198
|
+
menu2Transparent?: boolean;
|
|
199
|
+
btnColor?: string;
|
|
200
|
+
btnBackground?: string;
|
|
201
|
+
btnSize?: number;
|
|
202
|
+
btnRadius?: number;
|
|
203
|
+
btnMargin?: number;
|
|
204
|
+
btnPaddingV?: number;
|
|
205
|
+
btnPaddingH?: number;
|
|
206
|
+
btnShadow?: string;
|
|
207
|
+
btnTextShadow?: string;
|
|
208
|
+
btnBorder?: string;
|
|
209
|
+
btnColorHover?: string;
|
|
210
|
+
btnBackgroundHover?: string;
|
|
211
|
+
sideBtnColor?: string;
|
|
212
|
+
sideBtnBackground?: string;
|
|
213
|
+
sideBtnSize?: number;
|
|
214
|
+
sideBtnRadius?: number;
|
|
215
|
+
sideBtnMargin?: number;
|
|
216
|
+
sideBtnPaddingV?: number;
|
|
217
|
+
sideBtnPaddingH?: number;
|
|
218
|
+
sideBtnShadow?: string;
|
|
219
|
+
sideBtnTextShadow?: string;
|
|
220
|
+
sideBtnBorder?: string;
|
|
221
|
+
sideBtnColorHover?: string;
|
|
222
|
+
sideBtnBackgroundHover?: string;
|
|
223
|
+
floatingBtnColor?: string;
|
|
224
|
+
floatingBtnColorHover?: string;
|
|
225
|
+
floatingBtnBackground?: string;
|
|
226
|
+
floatingBtnBackgroundHover?: string;
|
|
227
|
+
floatingBtnSize?: number | null;
|
|
228
|
+
floatingBtnRadius?: number | null;
|
|
229
|
+
floatingBtnMargin?: number | null;
|
|
230
|
+
floatingBtnPadding?: number | null;
|
|
231
|
+
floatingBtnShadow?: string;
|
|
232
|
+
floatingBtnTextShadow?: string;
|
|
233
|
+
floatingBtnBorder?: string;
|
|
234
|
+
currentPage?: CurrentPageConfig;
|
|
235
|
+
btnFirst?: ButtonConfig;
|
|
236
|
+
btnPrev?: ButtonConfig;
|
|
237
|
+
btnNext?: ButtonConfig;
|
|
238
|
+
btnLast?: ButtonConfig;
|
|
239
|
+
btnZoomIn?: ButtonConfig;
|
|
240
|
+
btnZoomOut?: ButtonConfig;
|
|
241
|
+
btnRotateLeft?: ButtonConfig;
|
|
242
|
+
btnRotateRight?: ButtonConfig;
|
|
243
|
+
btnAutoplay?: ButtonConfig;
|
|
244
|
+
btnSearch?: ButtonConfig;
|
|
245
|
+
btnSelect?: ButtonConfig;
|
|
246
|
+
btnBookmark?: ButtonConfig;
|
|
247
|
+
btnToc?: ButtonConfig;
|
|
248
|
+
btnThumbs?: ButtonConfig;
|
|
249
|
+
btnShare?: ButtonConfig;
|
|
250
|
+
btnPrint?: ButtonConfig;
|
|
251
|
+
btnDownloadPages?: DownloadButtonConfig;
|
|
252
|
+
btnDownloadPdf?: DownloadButtonConfig;
|
|
253
|
+
btnSound?: ButtonConfig;
|
|
254
|
+
btnExpand?: ButtonConfig;
|
|
255
|
+
btnClose?: CloseButtonConfig;
|
|
256
|
+
btnOrder?: string[];
|
|
257
|
+
btnShareIfMobile?: boolean;
|
|
258
|
+
btnSoundIfMobile?: boolean;
|
|
259
|
+
btnPrintIfMobile?: boolean;
|
|
260
|
+
sideNavigationButtons?: boolean;
|
|
261
|
+
shareUrl?: string;
|
|
262
|
+
shareTitle?: string;
|
|
263
|
+
shareImage?: string;
|
|
264
|
+
share?: ShareConfig;
|
|
265
|
+
pageTextureSize?: number;
|
|
266
|
+
pageTextureSizeSmall?: number;
|
|
267
|
+
thumbTextureSize?: number;
|
|
268
|
+
pageTextureSizeMobile?: number;
|
|
269
|
+
pageTextureSizeMobileSmall?: number;
|
|
270
|
+
viewMode?: ViewMode;
|
|
271
|
+
singlePageMode?: boolean;
|
|
272
|
+
singlePageModeIfMobile?: boolean;
|
|
273
|
+
zoomMin?: number;
|
|
274
|
+
zoomMax2?: number;
|
|
275
|
+
zoomSize?: number;
|
|
276
|
+
zoomStep?: number;
|
|
277
|
+
zoomTime?: number;
|
|
278
|
+
zoomReset?: boolean;
|
|
279
|
+
zoomResetTime?: number;
|
|
280
|
+
wheelDisabledNotFullscreen?: boolean;
|
|
281
|
+
arrowsDisabledNotFullscreen?: boolean;
|
|
282
|
+
arrowsAlwaysEnabledForNavigation?: boolean;
|
|
283
|
+
touchSwipeEnabled?: boolean;
|
|
284
|
+
doubleClickZoomDisabled?: boolean;
|
|
285
|
+
pageDragDisabled?: boolean;
|
|
286
|
+
rightClickEnabled?: boolean;
|
|
287
|
+
responsiveView?: boolean;
|
|
288
|
+
responsiveViewRatio?: number;
|
|
289
|
+
responsiveViewTreshold?: number;
|
|
290
|
+
minPixelRatio?: number;
|
|
291
|
+
pageFlipDuration?: number;
|
|
292
|
+
contentOnStart?: boolean;
|
|
293
|
+
thumbnailsOnStart?: boolean;
|
|
294
|
+
searchOnStart?: boolean;
|
|
295
|
+
sideMenuOverBook?: boolean;
|
|
296
|
+
sideMenuOverMenu?: boolean;
|
|
297
|
+
sideMenuOverMenu2?: boolean;
|
|
298
|
+
sideMenuPosition?: "left" | "right";
|
|
299
|
+
lightBox?: boolean;
|
|
300
|
+
lightBoxOpened?: boolean;
|
|
301
|
+
lightBoxFullscreen?: boolean;
|
|
302
|
+
lightboxCloseOnClick?: boolean;
|
|
303
|
+
lightboxResetOnOpen?: boolean;
|
|
304
|
+
lightboxBackground?: string;
|
|
305
|
+
lightboxBackgroundColor?: string;
|
|
306
|
+
lightboxBackgroundPattern?: string;
|
|
307
|
+
lightboxBackgroundImage?: string;
|
|
308
|
+
lightboxStartPage?: number;
|
|
309
|
+
lightboxMarginV?: number;
|
|
310
|
+
lightboxMarginH?: number;
|
|
311
|
+
lightboxCSS?: string;
|
|
312
|
+
lightboxPreload?: boolean;
|
|
313
|
+
lightboxShowMenu?: boolean;
|
|
314
|
+
lightboxCloseOnBack?: boolean;
|
|
315
|
+
disableImageResize?: boolean;
|
|
316
|
+
pan?: number;
|
|
317
|
+
panMax?: number;
|
|
318
|
+
panMax2?: number;
|
|
319
|
+
panMin?: number;
|
|
320
|
+
panMin2?: number;
|
|
321
|
+
tilt?: number;
|
|
322
|
+
tiltMax?: number;
|
|
323
|
+
tiltMax2?: number;
|
|
324
|
+
tiltMin?: number;
|
|
325
|
+
tiltMin2?: number;
|
|
326
|
+
rotateCameraOnMouseMove?: boolean;
|
|
327
|
+
rotateCameraOnMouseDrag?: boolean;
|
|
328
|
+
lights?: boolean;
|
|
329
|
+
lightColor?: number;
|
|
330
|
+
lightPositionX?: number;
|
|
331
|
+
lightPositionZ?: number;
|
|
332
|
+
lightPositionY?: number;
|
|
333
|
+
lightIntensity?: number;
|
|
334
|
+
shadows?: boolean;
|
|
335
|
+
shadowMapSize?: number;
|
|
336
|
+
shadowOpacity?: number;
|
|
337
|
+
shadowDistance?: number;
|
|
338
|
+
pageRoughness?: number;
|
|
339
|
+
pageMetalness?: number;
|
|
340
|
+
pageHardness?: number;
|
|
341
|
+
coverHardness?: number;
|
|
342
|
+
pageSegmentsW?: number;
|
|
343
|
+
pageSegmentsH?: number;
|
|
344
|
+
pageMiddleShadowSize?: number;
|
|
345
|
+
pageMiddleShadowColorL?: string;
|
|
346
|
+
pageMiddleShadowColorR?: string;
|
|
347
|
+
antialias?: boolean;
|
|
348
|
+
/** Camera zoom/margin factor - higher values move camera further back (default: 1.35) */
|
|
349
|
+
cameraZoom?: number;
|
|
350
|
+
/** Camera vertical position offset (default: 0) */
|
|
351
|
+
cameraPositionY?: number;
|
|
352
|
+
/** Camera look-at Y position (default: 0) */
|
|
353
|
+
cameraLookAtY?: number;
|
|
354
|
+
/** Field of view in degrees (default: 45) */
|
|
355
|
+
cameraFov?: number;
|
|
356
|
+
/** Base page scale in world units - affects overall page size (default: 6) */
|
|
357
|
+
pageScale?: number;
|
|
358
|
+
preloaderText?: string;
|
|
359
|
+
fillPreloader?: FillPreloaderConfig;
|
|
360
|
+
logoImg?: string;
|
|
361
|
+
logoUrl?: string;
|
|
362
|
+
logoCSS?: string;
|
|
363
|
+
logoHideOnMobile?: boolean;
|
|
364
|
+
printMenu?: boolean;
|
|
365
|
+
downloadMenu?: boolean;
|
|
366
|
+
cover?: boolean;
|
|
367
|
+
backCover?: boolean;
|
|
368
|
+
googleAnalyticsTrackingCode?: string;
|
|
369
|
+
minimumAndroidVersion?: number;
|
|
370
|
+
linkColor?: string;
|
|
371
|
+
linkColorHover?: string;
|
|
372
|
+
linkOpacity?: number;
|
|
373
|
+
linkTarget?: string;
|
|
374
|
+
pageNumberOffset?: number;
|
|
375
|
+
flipSound?: boolean;
|
|
376
|
+
backgroundMusic?: string;
|
|
377
|
+
strings?: LocalizationStrings;
|
|
378
|
+
mobile?: MobileConfig;
|
|
379
|
+
}
|
|
380
|
+
interface FlipbookEventMap {
|
|
381
|
+
pageFlip: {
|
|
382
|
+
page: number;
|
|
383
|
+
direction: "next" | "prev";
|
|
384
|
+
};
|
|
385
|
+
pageFlipStart: {
|
|
386
|
+
page: number;
|
|
387
|
+
direction: "next" | "prev";
|
|
388
|
+
};
|
|
389
|
+
pageFlipEnd: {
|
|
390
|
+
page: number;
|
|
391
|
+
};
|
|
392
|
+
zoomChange: {
|
|
393
|
+
zoom: number;
|
|
394
|
+
};
|
|
395
|
+
ready: void;
|
|
396
|
+
loadProgress: {
|
|
397
|
+
progress: number;
|
|
398
|
+
};
|
|
399
|
+
pageLoaded: {
|
|
400
|
+
page: number;
|
|
401
|
+
};
|
|
402
|
+
fullscreenChange: {
|
|
403
|
+
isFullscreen: boolean;
|
|
404
|
+
};
|
|
405
|
+
lightboxOpen: void;
|
|
406
|
+
lightboxClose: void;
|
|
407
|
+
soundToggle: {
|
|
408
|
+
enabled: boolean;
|
|
409
|
+
};
|
|
410
|
+
autoplayToggle: {
|
|
411
|
+
enabled: boolean;
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
interface FlipbookInstance {
|
|
415
|
+
nextPage: () => void;
|
|
416
|
+
prevPage: () => void;
|
|
417
|
+
firstPage: () => void;
|
|
418
|
+
lastPage: () => void;
|
|
419
|
+
goToPage: (page: number) => void;
|
|
420
|
+
zoomIn: () => void;
|
|
421
|
+
zoomOut: () => void;
|
|
422
|
+
zoomTo: (zoom: number) => void;
|
|
423
|
+
getCurrentPage: () => number;
|
|
424
|
+
getNumPages: () => number;
|
|
425
|
+
getZoom: () => number;
|
|
426
|
+
isFullscreen: () => boolean;
|
|
427
|
+
toggleFullscreen: () => void;
|
|
428
|
+
toggleAutoplay: () => void;
|
|
429
|
+
toggleSound: () => void;
|
|
430
|
+
toggleThumbnails: () => void;
|
|
431
|
+
toggleTableOfContents: () => void;
|
|
432
|
+
toggleSearch: () => void;
|
|
433
|
+
openLightbox: () => void;
|
|
434
|
+
closeLightbox: () => void;
|
|
435
|
+
bookmarkPage: (page: number) => void;
|
|
436
|
+
removeBookmark: (page: number) => void;
|
|
437
|
+
getBookmarkedPages: () => number[];
|
|
438
|
+
printCurrentPage: () => void;
|
|
439
|
+
downloadCurrentPage: () => void;
|
|
440
|
+
destroy: () => void;
|
|
441
|
+
}
|
|
442
|
+
interface FlipbookProps extends Partial<FlipbookOptions> {
|
|
443
|
+
/** Pages to display in the flipbook */
|
|
444
|
+
pages: FlipbookPage[];
|
|
445
|
+
/** Class name for the container element */
|
|
446
|
+
className?: string;
|
|
447
|
+
/** Inline styles for the container */
|
|
448
|
+
style?: React.CSSProperties;
|
|
449
|
+
/** Width of the flipbook container */
|
|
450
|
+
width?: number | string;
|
|
451
|
+
/** Height of the flipbook container */
|
|
452
|
+
height?: number | string;
|
|
453
|
+
onPageFlip?: (event: FlipbookEventMap["pageFlip"]) => void;
|
|
454
|
+
onPageFlipStart?: (event: FlipbookEventMap["pageFlipStart"]) => void;
|
|
455
|
+
onPageFlipEnd?: (event: FlipbookEventMap["pageFlipEnd"]) => void;
|
|
456
|
+
onZoomChange?: (event: FlipbookEventMap["zoomChange"]) => void;
|
|
457
|
+
onReady?: () => void;
|
|
458
|
+
onLoadProgress?: (event: FlipbookEventMap["loadProgress"]) => void;
|
|
459
|
+
onPageLoaded?: (event: FlipbookEventMap["pageLoaded"]) => void;
|
|
460
|
+
onFullscreenChange?: (event: FlipbookEventMap["fullscreenChange"]) => void;
|
|
461
|
+
onLightboxOpen?: () => void;
|
|
462
|
+
onLightboxClose?: () => void;
|
|
463
|
+
onSoundToggle?: (event: FlipbookEventMap["soundToggle"]) => void;
|
|
464
|
+
onAutoplayToggle?: (event: FlipbookEventMap["autoplayToggle"]) => void;
|
|
465
|
+
}
|
|
466
|
+
interface UseFlipbookReturn$1 {
|
|
467
|
+
containerRef: React.RefObject<HTMLDivElement>;
|
|
468
|
+
flipbookRef: React.RefObject<FlipbookInstance>;
|
|
469
|
+
currentPage: number;
|
|
470
|
+
numPages: number;
|
|
471
|
+
zoom: number;
|
|
472
|
+
isFullscreen: boolean;
|
|
473
|
+
isLoading: boolean;
|
|
474
|
+
isReady: boolean;
|
|
475
|
+
}
|
|
476
|
+
interface FlipbookContextValue {
|
|
477
|
+
options: FlipbookOptions;
|
|
478
|
+
currentPage: number;
|
|
479
|
+
numPages: number;
|
|
480
|
+
zoom: number;
|
|
481
|
+
isFullscreen: boolean;
|
|
482
|
+
isLoading: boolean;
|
|
483
|
+
instance: FlipbookInstance | null;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
declare const Flipbook: React__default.ForwardRefExoticComponent<FlipbookProps & React__default.RefAttributes<FlipbookInstance>>;
|
|
487
|
+
|
|
488
|
+
interface WebGLPageFlipProps {
|
|
489
|
+
pages: FlipbookPage[];
|
|
490
|
+
currentPage: number;
|
|
491
|
+
width: number;
|
|
492
|
+
height: number;
|
|
493
|
+
singlePageMode?: boolean;
|
|
494
|
+
flipDuration?: number;
|
|
495
|
+
pageHardness?: number;
|
|
496
|
+
coverHardness?: number;
|
|
497
|
+
pageSegmentsW?: number;
|
|
498
|
+
pageSegmentsH?: number;
|
|
499
|
+
shadows?: boolean;
|
|
500
|
+
shadowOpacity?: number;
|
|
501
|
+
lights?: boolean;
|
|
502
|
+
lightIntensity?: number;
|
|
503
|
+
lightColor?: number;
|
|
504
|
+
pageRoughness?: number;
|
|
505
|
+
pageMetalness?: number;
|
|
506
|
+
antialias?: boolean;
|
|
507
|
+
backgroundColor?: string;
|
|
508
|
+
/** Camera zoom/margin factor - higher values move camera further back (default: 1.35) */
|
|
509
|
+
cameraZoom?: number;
|
|
510
|
+
/** Base page scale in world units - affects overall page size (default: 6) */
|
|
511
|
+
pageScale?: number;
|
|
512
|
+
/** Camera vertical position offset (default: 0) */
|
|
513
|
+
cameraPositionY?: number;
|
|
514
|
+
/** Camera look-at Y position (default: 0) */
|
|
515
|
+
cameraLookAtY?: number;
|
|
516
|
+
/** Field of view in degrees (default: 45) */
|
|
517
|
+
cameraFov?: number;
|
|
518
|
+
onFlipStart?: (page: number, direction: "next" | "prev") => void;
|
|
519
|
+
onFlipEnd?: (page: number) => void;
|
|
520
|
+
onPageChange?: (page: number) => void;
|
|
521
|
+
}
|
|
522
|
+
interface WebGLPageFlipInstance {
|
|
523
|
+
flipNext: () => void;
|
|
524
|
+
flipPrev: () => void;
|
|
525
|
+
flipToPage: (page: number) => void;
|
|
526
|
+
flipToFirst: () => void;
|
|
527
|
+
flipToLast: () => void;
|
|
528
|
+
isFlipping: () => boolean;
|
|
529
|
+
dispose: () => void;
|
|
530
|
+
}
|
|
531
|
+
declare const WebGLPageFlip: React$1.ForwardRefExoticComponent<WebGLPageFlipProps & React$1.RefAttributes<WebGLPageFlipInstance>>;
|
|
532
|
+
|
|
533
|
+
interface ThumbnailsPanelProps {
|
|
534
|
+
pages: FlipbookPage[];
|
|
535
|
+
currentPage: number;
|
|
536
|
+
isOpen: boolean;
|
|
537
|
+
position?: 'left' | 'right';
|
|
538
|
+
thumbnailSize?: number;
|
|
539
|
+
showPageNumbers?: boolean;
|
|
540
|
+
onPageSelect: (page: number) => void;
|
|
541
|
+
onClose: () => void;
|
|
542
|
+
}
|
|
543
|
+
declare const ThumbnailsPanel: React__default.FC<ThumbnailsPanelProps>;
|
|
544
|
+
|
|
545
|
+
interface TableOfContentsProps {
|
|
546
|
+
items: TocItem[];
|
|
547
|
+
currentPage: number;
|
|
548
|
+
isOpen: boolean;
|
|
549
|
+
position?: 'left' | 'right';
|
|
550
|
+
closeOnClick?: boolean;
|
|
551
|
+
onPageSelect: (page: number) => void;
|
|
552
|
+
onClose: () => void;
|
|
553
|
+
}
|
|
554
|
+
declare const TableOfContents: React__default.FC<TableOfContentsProps>;
|
|
555
|
+
|
|
556
|
+
interface SearchResult {
|
|
557
|
+
pageNumber: number;
|
|
558
|
+
pageIndex: number;
|
|
559
|
+
text: string;
|
|
560
|
+
matchIndex: number;
|
|
561
|
+
contextBefore: string;
|
|
562
|
+
contextAfter: string;
|
|
563
|
+
}
|
|
564
|
+
interface SearchPanelProps {
|
|
565
|
+
pages: FlipbookPage[];
|
|
566
|
+
pageTextContent?: Map<number, string>;
|
|
567
|
+
currentPage: number;
|
|
568
|
+
isOpen: boolean;
|
|
569
|
+
position?: "left" | "right";
|
|
570
|
+
minQueryLength?: number;
|
|
571
|
+
maxResults?: number;
|
|
572
|
+
highlightColor?: string;
|
|
573
|
+
onPageSelect: (page: number) => void;
|
|
574
|
+
onClose: () => void;
|
|
575
|
+
onSearchStart?: () => void;
|
|
576
|
+
onSearchEnd?: (results: SearchResult[]) => void;
|
|
577
|
+
}
|
|
578
|
+
declare const SearchPanel: React__default.FC<SearchPanelProps>;
|
|
579
|
+
|
|
580
|
+
interface Bookmark {
|
|
581
|
+
page: number;
|
|
582
|
+
title?: string;
|
|
583
|
+
createdAt: Date;
|
|
584
|
+
note?: string;
|
|
585
|
+
}
|
|
586
|
+
interface BookmarksPanelProps {
|
|
587
|
+
pages: FlipbookPage[];
|
|
588
|
+
bookmarks: number[];
|
|
589
|
+
currentPage: number;
|
|
590
|
+
isOpen: boolean;
|
|
591
|
+
position?: 'left' | 'right';
|
|
592
|
+
showThumbnails?: boolean;
|
|
593
|
+
onPageSelect: (page: number) => void;
|
|
594
|
+
onRemoveBookmark: (page: number) => void;
|
|
595
|
+
onClose: () => void;
|
|
596
|
+
}
|
|
597
|
+
declare const BookmarksPanel: React__default.FC<BookmarksPanelProps>;
|
|
598
|
+
|
|
599
|
+
interface UseFlipbookOptions extends Partial<FlipbookOptions> {
|
|
600
|
+
pages: FlipbookPage[];
|
|
601
|
+
initialPage?: number;
|
|
602
|
+
onPageChange?: (page: number) => void;
|
|
603
|
+
onZoomChange?: (zoom: number) => void;
|
|
604
|
+
onFullscreenChange?: (isFullscreen: boolean) => void;
|
|
605
|
+
}
|
|
606
|
+
interface UseFlipbookReturn {
|
|
607
|
+
currentPage: number;
|
|
608
|
+
numPages: number;
|
|
609
|
+
zoom: number;
|
|
610
|
+
isFullscreen: boolean;
|
|
611
|
+
isLoading: boolean;
|
|
612
|
+
isAnimating: boolean;
|
|
613
|
+
canGoNext: boolean;
|
|
614
|
+
canGoPrev: boolean;
|
|
615
|
+
bookmarkedPages: number[];
|
|
616
|
+
containerRef: React.RefObject<HTMLDivElement>;
|
|
617
|
+
nextPage: () => void;
|
|
618
|
+
prevPage: () => void;
|
|
619
|
+
firstPage: () => void;
|
|
620
|
+
lastPage: () => void;
|
|
621
|
+
goToPage: (page: number) => void;
|
|
622
|
+
setCurrentPageDirect: (page: number) => void;
|
|
623
|
+
zoomIn: () => void;
|
|
624
|
+
zoomOut: () => void;
|
|
625
|
+
zoomTo: (zoom: number) => void;
|
|
626
|
+
resetZoom: () => void;
|
|
627
|
+
toggleFullscreen: () => void;
|
|
628
|
+
enterFullscreen: () => void;
|
|
629
|
+
exitFullscreenMode: () => void;
|
|
630
|
+
toggleBookmark: (page?: number) => void;
|
|
631
|
+
isPageBookmarked: (page: number) => boolean;
|
|
632
|
+
preloadPages: (pageIndices: number[]) => Promise<void>;
|
|
633
|
+
getInstance: () => FlipbookInstance;
|
|
634
|
+
}
|
|
635
|
+
declare function useFlipbook(options: UseFlipbookOptions): UseFlipbookReturn;
|
|
636
|
+
declare function useSwipeGesture(containerRef: React.RefObject<HTMLElement>, onSwipeLeft: () => void, onSwipeRight: () => void, options?: {
|
|
637
|
+
threshold?: number;
|
|
638
|
+
enabled?: boolean;
|
|
639
|
+
}): void;
|
|
640
|
+
declare function useWheelZoom(containerRef: React.RefObject<HTMLElement>, onZoom: (delta: number) => void, options?: {
|
|
641
|
+
enabled?: boolean;
|
|
642
|
+
sensitivity?: number;
|
|
643
|
+
}): void;
|
|
644
|
+
declare function useResizeObserver(ref: React.RefObject<HTMLElement>, callback: (entry: ResizeObserverEntry) => void): void;
|
|
645
|
+
|
|
646
|
+
interface UseAutoplayOptions {
|
|
647
|
+
/** Total number of pages */
|
|
648
|
+
numPages: number;
|
|
649
|
+
/** Current page number (1-based) */
|
|
650
|
+
currentPage: number;
|
|
651
|
+
/** Interval between page flips in milliseconds */
|
|
652
|
+
interval?: number;
|
|
653
|
+
/** Whether to loop back to the first page after the last */
|
|
654
|
+
loop?: boolean;
|
|
655
|
+
/** Whether to start autoplay automatically */
|
|
656
|
+
autoStart?: boolean;
|
|
657
|
+
/** Number of pages to flip at a time (1 for single, 2 for spread) */
|
|
658
|
+
pageIncrement?: number;
|
|
659
|
+
/** Whether the flipbook is in right-to-left mode */
|
|
660
|
+
rightToLeft?: boolean;
|
|
661
|
+
/** Callback when page should change */
|
|
662
|
+
onPageChange: (page: number) => void;
|
|
663
|
+
/** Callback when autoplay starts */
|
|
664
|
+
onStart?: () => void;
|
|
665
|
+
/** Callback when autoplay stops */
|
|
666
|
+
onStop?: () => void;
|
|
667
|
+
/** Callback when autoplay pauses */
|
|
668
|
+
onPause?: () => void;
|
|
669
|
+
/** Callback when autoplay resumes */
|
|
670
|
+
onResume?: () => void;
|
|
671
|
+
/** Callback when autoplay completes (reaches end without loop) */
|
|
672
|
+
onComplete?: () => void;
|
|
673
|
+
}
|
|
674
|
+
interface UseAutoplayReturn {
|
|
675
|
+
/** Whether autoplay is currently active */
|
|
676
|
+
isPlaying: boolean;
|
|
677
|
+
/** Whether autoplay is paused */
|
|
678
|
+
isPaused: boolean;
|
|
679
|
+
/** Current autoplay interval in milliseconds */
|
|
680
|
+
interval: number;
|
|
681
|
+
/** Time remaining until next page flip (ms) */
|
|
682
|
+
timeRemaining: number;
|
|
683
|
+
/** Progress through current interval (0-1) */
|
|
684
|
+
progress: number;
|
|
685
|
+
/** Start autoplay */
|
|
686
|
+
start: () => void;
|
|
687
|
+
/** Stop autoplay completely */
|
|
688
|
+
stop: () => void;
|
|
689
|
+
/** Pause autoplay (can resume) */
|
|
690
|
+
pause: () => void;
|
|
691
|
+
/** Resume paused autoplay */
|
|
692
|
+
resume: () => void;
|
|
693
|
+
/** Toggle between play and pause */
|
|
694
|
+
toggle: () => void;
|
|
695
|
+
/** Set the autoplay interval */
|
|
696
|
+
setInterval: (ms: number) => void;
|
|
697
|
+
/** Skip to next page immediately */
|
|
698
|
+
skipNext: () => void;
|
|
699
|
+
/** Reset autoplay to beginning */
|
|
700
|
+
reset: () => void;
|
|
701
|
+
}
|
|
702
|
+
declare function useAutoplay(options: UseAutoplayOptions): UseAutoplayReturn;
|
|
703
|
+
|
|
704
|
+
interface PDFDocumentProxy {
|
|
705
|
+
numPages: number;
|
|
706
|
+
getPage: (pageNumber: number) => Promise<PDFPageProxy>;
|
|
707
|
+
destroy: () => Promise<void>;
|
|
708
|
+
}
|
|
709
|
+
interface PDFPageProxy {
|
|
710
|
+
getViewport: (options: {
|
|
711
|
+
scale: number;
|
|
712
|
+
rotation?: number;
|
|
713
|
+
}) => PDFPageViewport;
|
|
714
|
+
render: (params: PDFRenderParams) => PDFRenderTask;
|
|
715
|
+
getTextContent: (params?: {
|
|
716
|
+
normalizeWhitespace?: boolean;
|
|
717
|
+
}) => Promise<PDFTextContent>;
|
|
718
|
+
cleanup: () => void;
|
|
719
|
+
}
|
|
720
|
+
interface PDFPageViewport {
|
|
721
|
+
width: number;
|
|
722
|
+
height: number;
|
|
723
|
+
scale: number;
|
|
724
|
+
rotation: number;
|
|
725
|
+
viewBox: number[];
|
|
726
|
+
transform: number[];
|
|
727
|
+
clone: (options?: {
|
|
728
|
+
scale?: number;
|
|
729
|
+
rotation?: number;
|
|
730
|
+
}) => PDFPageViewport;
|
|
731
|
+
}
|
|
732
|
+
interface PDFRenderParams {
|
|
733
|
+
canvasContext: CanvasRenderingContext2D;
|
|
734
|
+
viewport: PDFPageViewport;
|
|
735
|
+
enableWebGL?: boolean;
|
|
736
|
+
renderInteractiveForms?: boolean;
|
|
737
|
+
transform?: number[];
|
|
738
|
+
}
|
|
739
|
+
interface PDFRenderTask {
|
|
740
|
+
promise: Promise<void>;
|
|
741
|
+
cancel: () => void;
|
|
742
|
+
}
|
|
743
|
+
interface PDFTextContent {
|
|
744
|
+
items: PDFTextItem[];
|
|
745
|
+
styles: Record<string, unknown>;
|
|
746
|
+
}
|
|
747
|
+
interface PDFTextItem {
|
|
748
|
+
str: string;
|
|
749
|
+
dir: string;
|
|
750
|
+
transform: number[];
|
|
751
|
+
width: number;
|
|
752
|
+
height: number;
|
|
753
|
+
fontName: string;
|
|
754
|
+
}
|
|
755
|
+
interface PDFDocumentLoadingTask {
|
|
756
|
+
promise: Promise<PDFDocumentProxy>;
|
|
757
|
+
destroy: () => Promise<void>;
|
|
758
|
+
onProgress?: (progress: {
|
|
759
|
+
loaded: number;
|
|
760
|
+
total: number;
|
|
761
|
+
}) => void;
|
|
762
|
+
}
|
|
763
|
+
interface PDFJSLib {
|
|
764
|
+
getDocument: (src: string | {
|
|
765
|
+
url: string;
|
|
766
|
+
[key: string]: unknown;
|
|
767
|
+
} | ArrayBuffer | Uint8Array) => PDFDocumentLoadingTask;
|
|
768
|
+
GlobalWorkerOptions: {
|
|
769
|
+
workerSrc: string;
|
|
770
|
+
};
|
|
771
|
+
version: string;
|
|
772
|
+
}
|
|
773
|
+
declare global {
|
|
774
|
+
interface Window {
|
|
775
|
+
pdfjsLib?: PDFJSLib;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
interface UsePdfLoaderOptions {
|
|
779
|
+
/** PDF file URL or ArrayBuffer */
|
|
780
|
+
source: string | ArrayBuffer | Uint8Array | null;
|
|
781
|
+
/** PDF.js worker source URL (required for PDF.js to work) */
|
|
782
|
+
workerSrc?: string;
|
|
783
|
+
/** Scale factor for rendering pages (default: 1.5) */
|
|
784
|
+
scale?: number;
|
|
785
|
+
/** Whether to extract text content for search */
|
|
786
|
+
extractText?: boolean;
|
|
787
|
+
/** Maximum texture size for page rendering */
|
|
788
|
+
maxTextureSize?: number;
|
|
789
|
+
/** Callback when loading starts */
|
|
790
|
+
onLoadStart?: () => void;
|
|
791
|
+
/** Callback for loading progress */
|
|
792
|
+
onLoadProgress?: (progress: number) => void;
|
|
793
|
+
/** Callback when loading completes */
|
|
794
|
+
onLoadComplete?: (numPages: number) => void;
|
|
795
|
+
/** Callback when loading fails */
|
|
796
|
+
onLoadError?: (error: Error) => void;
|
|
797
|
+
/** Callback when a page is rendered */
|
|
798
|
+
onPageRendered?: (pageNumber: number, dataUrl: string) => void;
|
|
799
|
+
}
|
|
800
|
+
interface UsePdfLoaderReturn {
|
|
801
|
+
/** Whether PDF.js is available */
|
|
802
|
+
isAvailable: boolean;
|
|
803
|
+
/** Whether the PDF is currently loading */
|
|
804
|
+
isLoading: boolean;
|
|
805
|
+
/** Loading progress (0-1) */
|
|
806
|
+
progress: number;
|
|
807
|
+
/** Any error that occurred during loading */
|
|
808
|
+
error: Error | null;
|
|
809
|
+
/** Number of pages in the PDF */
|
|
810
|
+
numPages: number;
|
|
811
|
+
/** Generated flipbook pages */
|
|
812
|
+
pages: FlipbookPage[];
|
|
813
|
+
/** Text content extracted from pages (for search) */
|
|
814
|
+
textContent: Map<number, string>;
|
|
815
|
+
/** Load a PDF from a source */
|
|
816
|
+
loadPdf: (source: string | ArrayBuffer | Uint8Array) => Promise<void>;
|
|
817
|
+
/** Render a specific page to canvas/image */
|
|
818
|
+
renderPage: (pageNumber: number, options?: {
|
|
819
|
+
scale?: number;
|
|
820
|
+
format?: "png" | "jpeg";
|
|
821
|
+
quality?: number;
|
|
822
|
+
}) => Promise<string>;
|
|
823
|
+
/** Get text content from a specific page */
|
|
824
|
+
getPageText: (pageNumber: number) => Promise<string>;
|
|
825
|
+
/** Cleanup and destroy the PDF document */
|
|
826
|
+
destroy: () => void;
|
|
827
|
+
}
|
|
828
|
+
declare function usePdfLoader(options?: UsePdfLoaderOptions): UsePdfLoaderReturn;
|
|
829
|
+
|
|
830
|
+
interface FlipbookSizeOptions {
|
|
831
|
+
/** Maximum width constraint for the container (default: 1200) */
|
|
832
|
+
maxWidth?: number;
|
|
833
|
+
/** Maximum height constraint for the container (default: 900) */
|
|
834
|
+
maxHeight?: number;
|
|
835
|
+
/** Whether the flipbook is in single-page mode (default: false) */
|
|
836
|
+
singlePageMode?: boolean;
|
|
837
|
+
}
|
|
838
|
+
interface FlipbookSize {
|
|
839
|
+
/** Calculated container width in pixels */
|
|
840
|
+
width: number;
|
|
841
|
+
/** Calculated container height in pixels */
|
|
842
|
+
height: number;
|
|
843
|
+
/** The aspect ratio of the container (width / height) */
|
|
844
|
+
aspectRatio: number;
|
|
845
|
+
/** Whether the page is landscape orientation */
|
|
846
|
+
isLandscape: boolean;
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* Calculate optimal flipbook container size based on page dimensions
|
|
850
|
+
*
|
|
851
|
+
* This function calculates the best container size that:
|
|
852
|
+
* - Maintains the PDF page aspect ratio
|
|
853
|
+
* - Fits within the specified max width/height constraints
|
|
854
|
+
* - Accounts for single-page vs two-page spread modes
|
|
855
|
+
*
|
|
856
|
+
* @param pageWidth - The PDF page width (in points or pixels)
|
|
857
|
+
* @param pageHeight - The PDF page height (in points or pixels)
|
|
858
|
+
* @param options - Sizing options
|
|
859
|
+
* @returns Calculated container dimensions
|
|
860
|
+
*
|
|
861
|
+
* @example
|
|
862
|
+
* ```typescript
|
|
863
|
+
* // Get first page info from PDF
|
|
864
|
+
* const pdfInfo = await getPdfInfo('document.pdf');
|
|
865
|
+
* const firstPage = pdfInfo.pageInfos[0];
|
|
866
|
+
*
|
|
867
|
+
* // Calculate optimal size for single-page mode
|
|
868
|
+
* const size = calculateFlipbookSize(firstPage.width, firstPage.height, {
|
|
869
|
+
* singlePageMode: true,
|
|
870
|
+
* maxWidth: 800,
|
|
871
|
+
* maxHeight: 600,
|
|
872
|
+
* });
|
|
873
|
+
*
|
|
874
|
+
* // Use with Flipbook component
|
|
875
|
+
* <Flipbook pages={pages} width={size.width} height={size.height} singlePageMode />
|
|
876
|
+
* ```
|
|
877
|
+
*/
|
|
878
|
+
declare function calculateFlipbookSize(pageWidth: number, pageHeight: number, options?: FlipbookSizeOptions): FlipbookSize;
|
|
879
|
+
/**
|
|
880
|
+
* Calculate optimal flipbook size from a FlipbookPage array
|
|
881
|
+
* Uses the first page's dimensions for calculation
|
|
882
|
+
*
|
|
883
|
+
* @param pages - Array of FlipbookPage objects (must have at least one page with width/height)
|
|
884
|
+
* @param options - Sizing options
|
|
885
|
+
* @returns Calculated container dimensions, or null if pages don't have size info
|
|
886
|
+
*
|
|
887
|
+
* @example
|
|
888
|
+
* ```typescript
|
|
889
|
+
* const pages = await pdfToFlipbookPages('document.pdf');
|
|
890
|
+
* const size = calculateFlipbookSizeFromPages(pages, { singlePageMode: true });
|
|
891
|
+
*
|
|
892
|
+
* if (size) {
|
|
893
|
+
* <Flipbook pages={pages} width={size.width} height={size.height} />
|
|
894
|
+
* }
|
|
895
|
+
* ```
|
|
896
|
+
*/
|
|
897
|
+
declare function calculateFlipbookSizeFromPages(pages: FlipbookPage[], options?: FlipbookSizeOptions): FlipbookSize | null;
|
|
898
|
+
/**
|
|
899
|
+
* Set the PDF.js worker source URL
|
|
900
|
+
* Must be called before using any PDF functions
|
|
901
|
+
*
|
|
902
|
+
* @example
|
|
903
|
+
* // For Vite
|
|
904
|
+
* import workerSrc from 'pdfjs-dist/build/pdf.worker.mjs?url';
|
|
905
|
+
* setPdfWorkerSrc(workerSrc);
|
|
906
|
+
*
|
|
907
|
+
* // For CDN
|
|
908
|
+
* setPdfWorkerSrc('https://unpkg.com/pdfjs-dist@4.0.379/build/pdf.worker.mjs');
|
|
909
|
+
*/
|
|
910
|
+
declare function setPdfWorkerSrc(workerSrc: string): void;
|
|
911
|
+
interface PdfToImagesOptions {
|
|
912
|
+
/** Scale factor for rendering (default: 2 for high DPI) */
|
|
913
|
+
scale?: number;
|
|
914
|
+
/** Image format: 'png' or 'jpeg' (default: 'png') */
|
|
915
|
+
format?: "png" | "jpeg";
|
|
916
|
+
/** JPEG quality 0-1 (default: 0.92) */
|
|
917
|
+
quality?: number;
|
|
918
|
+
/** Callback for progress updates */
|
|
919
|
+
onProgress?: (current: number, total: number) => void;
|
|
920
|
+
/** Specific page numbers to render (1-indexed). If not provided, renders all pages */
|
|
921
|
+
pageNumbers?: number[];
|
|
922
|
+
}
|
|
923
|
+
interface PdfPageInfo {
|
|
924
|
+
/** Page number (1-indexed) */
|
|
925
|
+
pageNumber: number;
|
|
926
|
+
/** Original PDF page width in points */
|
|
927
|
+
width: number;
|
|
928
|
+
/** Original PDF page height in points */
|
|
929
|
+
height: number;
|
|
930
|
+
/** Detected orientation */
|
|
931
|
+
orientation: "portrait" | "landscape";
|
|
932
|
+
/** Data URL of the rendered image */
|
|
933
|
+
dataUrl: string;
|
|
934
|
+
}
|
|
935
|
+
/**
|
|
936
|
+
* Load a PDF and convert pages to images
|
|
937
|
+
*
|
|
938
|
+
* @param source - PDF source: URL string, ArrayBuffer, or Uint8Array
|
|
939
|
+
* @param options - Conversion options
|
|
940
|
+
* @returns Promise resolving to array of FlipbookPage objects
|
|
941
|
+
*
|
|
942
|
+
* @example
|
|
943
|
+
* ```typescript
|
|
944
|
+
* import { pdfToFlipbookPages, setPdfWorkerSrc } from 'react-3d-flipbook/utils';
|
|
945
|
+
*
|
|
946
|
+
* // Set up worker first
|
|
947
|
+
* setPdfWorkerSrc('https://unpkg.com/pdfjs-dist@4.0.379/build/pdf.worker.mjs');
|
|
948
|
+
*
|
|
949
|
+
* // Convert PDF to flipbook pages
|
|
950
|
+
* const pages = await pdfToFlipbookPages('https://example.com/document.pdf', {
|
|
951
|
+
* scale: 2,
|
|
952
|
+
* onProgress: (current, total) => console.log(`Rendering page ${current}/${total}`)
|
|
953
|
+
* });
|
|
954
|
+
*
|
|
955
|
+
* // Use with Flipbook component
|
|
956
|
+
* <Flipbook pages={pages} width={800} height={600} />
|
|
957
|
+
* ```
|
|
958
|
+
*/
|
|
959
|
+
declare function pdfToFlipbookPages(source: string | ArrayBuffer | Uint8Array, options?: PdfToImagesOptions): Promise<FlipbookPage[]>;
|
|
960
|
+
/**
|
|
961
|
+
* Get PDF document info without rendering pages
|
|
962
|
+
*/
|
|
963
|
+
declare function getPdfInfo(source: string | ArrayBuffer | Uint8Array): Promise<{
|
|
964
|
+
numPages: number;
|
|
965
|
+
pageInfos: Array<{
|
|
966
|
+
pageNumber: number;
|
|
967
|
+
width: number;
|
|
968
|
+
height: number;
|
|
969
|
+
orientation: "portrait" | "landscape";
|
|
970
|
+
}>;
|
|
971
|
+
}>;
|
|
972
|
+
/**
|
|
973
|
+
* Load PDF pages lazily (one at a time) for memory efficiency
|
|
974
|
+
* Returns an async generator that yields pages one by one
|
|
975
|
+
*
|
|
976
|
+
* @example
|
|
977
|
+
* ```typescript
|
|
978
|
+
* const pages: FlipbookPage[] = [];
|
|
979
|
+
* for await (const page of pdfToFlipbookPagesLazy(pdfUrl)) {
|
|
980
|
+
* pages.push(page);
|
|
981
|
+
* // Update UI progressively
|
|
982
|
+
* setPages([...pages]);
|
|
983
|
+
* }
|
|
984
|
+
* ```
|
|
985
|
+
*/
|
|
986
|
+
declare function pdfToFlipbookPagesLazy(source: string | ArrayBuffer | Uint8Array, options?: PdfToImagesOptions): AsyncGenerator<FlipbookPage, void, unknown>;
|
|
987
|
+
|
|
988
|
+
/**
|
|
989
|
+
* Clamp a value between min and max
|
|
990
|
+
*/
|
|
991
|
+
declare function clamp(value: number, min: number, max: number): number;
|
|
992
|
+
/**
|
|
993
|
+
* Linear interpolation between two values
|
|
994
|
+
*/
|
|
995
|
+
declare function lerp(start: number, end: number, t: number): number;
|
|
996
|
+
/**
|
|
997
|
+
* Convert degrees to radians
|
|
998
|
+
*/
|
|
999
|
+
declare function degToRad(degrees: number): number;
|
|
1000
|
+
/**
|
|
1001
|
+
* Convert radians to degrees
|
|
1002
|
+
*/
|
|
1003
|
+
declare function radToDeg(radians: number): number;
|
|
1004
|
+
/**
|
|
1005
|
+
* Debounce a function
|
|
1006
|
+
*/
|
|
1007
|
+
declare function debounce<T extends (...args: never[]) => void>(func: T, wait: number): (...args: Parameters<T>) => void;
|
|
1008
|
+
/**
|
|
1009
|
+
* Throttle a function
|
|
1010
|
+
*/
|
|
1011
|
+
declare function throttle<T extends (...args: unknown[]) => unknown>(func: T, limit: number): (...args: Parameters<T>) => void;
|
|
1012
|
+
/**
|
|
1013
|
+
* Check if a value is a number
|
|
1014
|
+
*/
|
|
1015
|
+
declare function isNumber(value: unknown): value is number;
|
|
1016
|
+
/**
|
|
1017
|
+
* Check if running on mobile device
|
|
1018
|
+
*/
|
|
1019
|
+
declare function isMobile(): boolean;
|
|
1020
|
+
/**
|
|
1021
|
+
* Check if touch device
|
|
1022
|
+
*/
|
|
1023
|
+
declare function isTouchDevice(): boolean;
|
|
1024
|
+
/**
|
|
1025
|
+
* Check if WebGL is supported
|
|
1026
|
+
*/
|
|
1027
|
+
declare function isWebGLSupported(): boolean;
|
|
1028
|
+
/**
|
|
1029
|
+
* Get the aspect ratio of an image
|
|
1030
|
+
*/
|
|
1031
|
+
declare function getImageAspectRatio(width: number, height: number): number;
|
|
1032
|
+
/**
|
|
1033
|
+
* Calculate page dimensions based on container and aspect ratio
|
|
1034
|
+
*/
|
|
1035
|
+
declare function calculatePageDimensions(containerWidth: number, containerHeight: number, pageAspectRatio: number, isDoublePage?: boolean): {
|
|
1036
|
+
width: number;
|
|
1037
|
+
height: number;
|
|
1038
|
+
};
|
|
1039
|
+
/**
|
|
1040
|
+
* Preload an image
|
|
1041
|
+
*/
|
|
1042
|
+
declare function preloadImage(src: string): Promise<HTMLImageElement>;
|
|
1043
|
+
/**
|
|
1044
|
+
* Preload multiple images
|
|
1045
|
+
*/
|
|
1046
|
+
declare function preloadImages(srcs: string[], onProgress?: (loaded: number, total: number) => void): Promise<HTMLImageElement[]>;
|
|
1047
|
+
/**
|
|
1048
|
+
* Generate a unique ID
|
|
1049
|
+
*/
|
|
1050
|
+
declare function generateId(prefix?: string): string;
|
|
1051
|
+
/**
|
|
1052
|
+
* Get element offset relative to document
|
|
1053
|
+
*/
|
|
1054
|
+
declare function getElementOffset(element: HTMLElement): {
|
|
1055
|
+
top: number;
|
|
1056
|
+
left: number;
|
|
1057
|
+
};
|
|
1058
|
+
/**
|
|
1059
|
+
* Request fullscreen for an element
|
|
1060
|
+
*/
|
|
1061
|
+
declare function requestFullscreen(element: HTMLElement): Promise<void>;
|
|
1062
|
+
/**
|
|
1063
|
+
* Exit fullscreen
|
|
1064
|
+
*/
|
|
1065
|
+
declare function exitFullscreen(): Promise<void>;
|
|
1066
|
+
/**
|
|
1067
|
+
* Check if currently in fullscreen mode
|
|
1068
|
+
*/
|
|
1069
|
+
declare function isFullscreen(): boolean;
|
|
1070
|
+
/**
|
|
1071
|
+
* Get fullscreen element
|
|
1072
|
+
*/
|
|
1073
|
+
declare function getFullscreenElement(): Element | null;
|
|
1074
|
+
/**
|
|
1075
|
+
* Format page number for display
|
|
1076
|
+
*/
|
|
1077
|
+
declare function formatPageNumber(page: number, totalPages: number, offset?: number): string;
|
|
1078
|
+
/**
|
|
1079
|
+
* Parse page number from URL hash
|
|
1080
|
+
*/
|
|
1081
|
+
declare function getPageFromHash(prefix?: string): number | null;
|
|
1082
|
+
/**
|
|
1083
|
+
* Set page number in URL hash
|
|
1084
|
+
*/
|
|
1085
|
+
declare function setPageHash(page: number, prefix?: string): void;
|
|
1086
|
+
/**
|
|
1087
|
+
* Clear URL hash
|
|
1088
|
+
*/
|
|
1089
|
+
declare function clearHash(): void;
|
|
1090
|
+
/**
|
|
1091
|
+
* Local storage helpers
|
|
1092
|
+
*/
|
|
1093
|
+
declare const storage: {
|
|
1094
|
+
get<T>(key: string, defaultValue: T): T;
|
|
1095
|
+
set<T>(key: string, value: T): void;
|
|
1096
|
+
remove(key: string): void;
|
|
1097
|
+
};
|
|
1098
|
+
/**
|
|
1099
|
+
* Easing functions for animations
|
|
1100
|
+
*/
|
|
1101
|
+
declare const easing: {
|
|
1102
|
+
linear: (t: number) => number;
|
|
1103
|
+
easeInQuad: (t: number) => number;
|
|
1104
|
+
easeOutQuad: (t: number) => number;
|
|
1105
|
+
easeInOutQuad: (t: number) => number;
|
|
1106
|
+
easeInCubic: (t: number) => number;
|
|
1107
|
+
easeOutCubic: (t: number) => number;
|
|
1108
|
+
easeInOutCubic: (t: number) => number;
|
|
1109
|
+
easeInQuart: (t: number) => number;
|
|
1110
|
+
easeOutQuart: (t: number) => number;
|
|
1111
|
+
easeInOutQuart: (t: number) => number;
|
|
1112
|
+
easeInSine: (t: number) => number;
|
|
1113
|
+
easeOutSine: (t: number) => number;
|
|
1114
|
+
easeInOutSine: (t: number) => number;
|
|
1115
|
+
easeInExpo: (t: number) => number;
|
|
1116
|
+
easeOutExpo: (t: number) => number;
|
|
1117
|
+
easeInOutExpo: (t: number) => number;
|
|
1118
|
+
};
|
|
1119
|
+
|
|
1120
|
+
export { BookmarksPanel, Flipbook, SearchPanel, TableOfContents, ThumbnailsPanel, WebGLPageFlip, calculateFlipbookSize, calculateFlipbookSizeFromPages, calculatePageDimensions, clamp, clearHash, debounce, degToRad, easing, exitFullscreen, formatPageNumber, generateId, getElementOffset, getFullscreenElement, getImageAspectRatio, getPageFromHash, getPdfInfo, isFullscreen, isMobile, isNumber, isTouchDevice, isWebGLSupported, lerp, pdfToFlipbookPages, pdfToFlipbookPagesLazy, preloadImage, preloadImages, radToDeg, requestFullscreen, setPageHash, setPdfWorkerSrc, storage, throttle, useAutoplay, useFlipbook, usePdfLoader, useResizeObserver, useSwipeGesture, useWheelZoom };
|
|
1121
|
+
export type { AssetsConfig, Bookmark, BookmarksPanelProps, ButtonConfig, CloseButtonConfig, CurrentPageConfig, DownloadButtonConfig, FillPreloaderConfig, FlipbookContextValue, FlipbookEventMap, FlipbookInstance, FlipbookOptions, FlipbookPage, FlipbookProps, FlipbookSize, FlipbookSizeOptions, HAlign, LayoutType, LightboxConfig, LocalizationStrings, MobileConfig, PdfConfig, PdfPageInfo, PdfToImagesOptions, SearchPanelProps, SearchResult, ShareConfig, ShareProviderConfig, SkinType, TableOfContentsProps, ThumbnailsPanelProps, TocItem, UseAutoplayOptions, UseAutoplayReturn, UseFlipbookReturn$1 as UseFlipbookReturn, UsePdfLoaderOptions, UsePdfLoaderReturn, VAlign, ViewMode, WebGLPageFlipInstance, WebGLPageFlipProps };
|