@internetarchive/bookreader 5.0.0-94 → 5.0.0-95
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/.github/workflows/npm-publish.yml +2 -12
- package/CHANGELOG.md +7 -0
- package/README.md +0 -2
- package/package.json +1 -1
- package/scripts/version.js +0 -3
- package/BookReader/BookReader.css +0 -2251
- package/BookReader/BookReader.js +0 -3
- package/BookReader/BookReader.js.LICENSE.txt +0 -72
- package/BookReader/BookReader.js.map +0 -1
- package/BookReader/ia-bookreader-bundle.js +0 -1782
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +0 -7
- package/BookReader/ia-bookreader-bundle.js.map +0 -1
- package/BookReader/icons/1up.svg +0 -1
- package/BookReader/icons/2up.svg +0 -1
- package/BookReader/icons/advance.svg +0 -3
- package/BookReader/icons/chevron-right.svg +0 -1
- package/BookReader/icons/close-circle-dark.svg +0 -1
- package/BookReader/icons/close-circle.svg +0 -1
- package/BookReader/icons/fullscreen.svg +0 -1
- package/BookReader/icons/fullscreen_exit.svg +0 -1
- package/BookReader/icons/hamburger.svg +0 -1
- package/BookReader/icons/left-arrow.svg +0 -1
- package/BookReader/icons/magnify-minus.svg +0 -1
- package/BookReader/icons/magnify-plus.svg +0 -1
- package/BookReader/icons/magnify.svg +0 -1
- package/BookReader/icons/pause.svg +0 -1
- package/BookReader/icons/play.svg +0 -1
- package/BookReader/icons/playback-speed.svg +0 -1
- package/BookReader/icons/read-aloud.svg +0 -1
- package/BookReader/icons/review.svg +0 -3
- package/BookReader/icons/thumbnails.svg +0 -1
- package/BookReader/icons/voice.svg +0 -1
- package/BookReader/icons/volume-full.svg +0 -1
- package/BookReader/images/BRicons.png +0 -0
- package/BookReader/images/BRicons.svg +0 -5
- package/BookReader/images/BRicons_ia.png +0 -0
- package/BookReader/images/back_pages.png +0 -0
- package/BookReader/images/book_bottom_icon.png +0 -0
- package/BookReader/images/book_down_icon.png +0 -0
- package/BookReader/images/book_left_icon.png +0 -0
- package/BookReader/images/book_leftmost_icon.png +0 -0
- package/BookReader/images/book_right_icon.png +0 -0
- package/BookReader/images/book_rightmost_icon.png +0 -0
- package/BookReader/images/book_top_icon.png +0 -0
- package/BookReader/images/book_up_icon.png +0 -0
- package/BookReader/images/books_graphic.svg +0 -1
- package/BookReader/images/booksplit.png +0 -0
- package/BookReader/images/control_pause_icon.png +0 -0
- package/BookReader/images/control_play_icon.png +0 -0
- package/BookReader/images/embed_icon.png +0 -0
- package/BookReader/images/hypothesis.ico +0 -0
- package/BookReader/images/icon-home-ia.png +0 -0
- package/BookReader/images/icon_OL-logo-xs.png +0 -0
- package/BookReader/images/icon_alert-xs.png +0 -0
- package/BookReader/images/icon_book.svg +0 -1
- package/BookReader/images/icon_bookmark.svg +0 -1
- package/BookReader/images/icon_close-pop.png +0 -0
- package/BookReader/images/icon_download.png +0 -0
- package/BookReader/images/icon_gear.svg +0 -1
- package/BookReader/images/icon_hamburger.svg +0 -1
- package/BookReader/images/icon_home.png +0 -0
- package/BookReader/images/icon_home.svg +0 -1
- package/BookReader/images/icon_home_ia.png +0 -0
- package/BookReader/images/icon_indicator.png +0 -0
- package/BookReader/images/icon_info.svg +0 -1
- package/BookReader/images/icon_one_page.svg +0 -1
- package/BookReader/images/icon_pause.svg +0 -1
- package/BookReader/images/icon_play.svg +0 -1
- package/BookReader/images/icon_playback-rate.svg +0 -1
- package/BookReader/images/icon_return.png +0 -0
- package/BookReader/images/icon_search_button.svg +0 -1
- package/BookReader/images/icon_share.svg +0 -1
- package/BookReader/images/icon_skip-ahead.svg +0 -1
- package/BookReader/images/icon_skip-back.svg +0 -2
- package/BookReader/images/icon_speaker.svg +0 -1
- package/BookReader/images/icon_speaker_open.svg +0 -1
- package/BookReader/images/icon_thumbnails.svg +0 -1
- package/BookReader/images/icon_toc.svg +0 -1
- package/BookReader/images/icon_two_pages.svg +0 -1
- package/BookReader/images/icon_zoomer.png +0 -0
- package/BookReader/images/loading.gif +0 -0
- package/BookReader/images/logo_icon.png +0 -0
- package/BookReader/images/marker_chap-off.png +0 -0
- package/BookReader/images/marker_chap-off.svg +0 -1
- package/BookReader/images/marker_chap-off_ia.png +0 -0
- package/BookReader/images/marker_chap-on.png +0 -0
- package/BookReader/images/marker_chap-on.svg +0 -1
- package/BookReader/images/marker_srch-on.svg +0 -1
- package/BookReader/images/marker_srchchap-off.png +0 -0
- package/BookReader/images/marker_srchchap-on.png +0 -0
- package/BookReader/images/nav_control-dn.png +0 -0
- package/BookReader/images/nav_control-dn_ia.png +0 -0
- package/BookReader/images/nav_control-up.png +0 -0
- package/BookReader/images/nav_control-up_ia.png +0 -0
- package/BookReader/images/nav_control.png +0 -0
- package/BookReader/images/one_page_mode_icon.png +0 -0
- package/BookReader/images/paper-badge.png +0 -0
- package/BookReader/images/print_icon.png +0 -0
- package/BookReader/images/progressbar.gif +0 -0
- package/BookReader/images/right_edges.png +0 -0
- package/BookReader/images/slider.png +0 -0
- package/BookReader/images/slider_ia.png +0 -0
- package/BookReader/images/thumbnail_mode_icon.png +0 -0
- package/BookReader/images/transparent.png +0 -0
- package/BookReader/images/two_page_mode_icon.png +0 -0
- package/BookReader/images/unviewable_page.png +0 -0
- package/BookReader/images/zoom_in_icon.png +0 -0
- package/BookReader/images/zoom_out_icon.png +0 -0
- package/BookReader/jquery-3.js +0 -2
- package/BookReader/jquery-3.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.archive_analytics.js +0 -2
- package/BookReader/plugins/plugin.archive_analytics.js.map +0 -1
- package/BookReader/plugins/plugin.autoplay.js +0 -2
- package/BookReader/plugins/plugin.autoplay.js.map +0 -1
- package/BookReader/plugins/plugin.chapters.js +0 -26
- package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +0 -1
- package/BookReader/plugins/plugin.chapters.js.map +0 -1
- package/BookReader/plugins/plugin.experiments.js +0 -3
- package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +0 -1
- package/BookReader/plugins/plugin.experiments.js.map +0 -1
- package/BookReader/plugins/plugin.iframe.js +0 -2
- package/BookReader/plugins/plugin.iframe.js.map +0 -1
- package/BookReader/plugins/plugin.iiif.js +0 -2
- package/BookReader/plugins/plugin.iiif.js.map +0 -1
- package/BookReader/plugins/plugin.resume.js +0 -2
- package/BookReader/plugins/plugin.resume.js.map +0 -1
- package/BookReader/plugins/plugin.search.js +0 -3
- package/BookReader/plugins/plugin.search.js.LICENSE.txt +0 -1
- package/BookReader/plugins/plugin.search.js.map +0 -1
- package/BookReader/plugins/plugin.text_selection.js +0 -3
- package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +0 -1
- package/BookReader/plugins/plugin.text_selection.js.map +0 -1
- package/BookReader/plugins/plugin.tts.js +0 -3
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +0 -29
- package/BookReader/plugins/plugin.tts.js.map +0 -1
- package/BookReader/plugins/plugin.url.js +0 -2
- package/BookReader/plugins/plugin.url.js.map +0 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +0 -2
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +0 -1
- package/BookReader/webcomponents-bundle.js +0 -3
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +0 -9
- package/BookReader/webcomponents-bundle.js.map +0 -1
- package/src/BookReader/BookModel.js +0 -564
- package/src/BookReader/DragScrollable.js +0 -233
- package/src/BookReader/ImageCache.js +0 -149
- package/src/BookReader/Mode1Up.js +0 -110
- package/src/BookReader/Mode1UpLit.js +0 -388
- package/src/BookReader/Mode2Up.js +0 -107
- package/src/BookReader/Mode2UpLit.js +0 -777
- package/src/BookReader/ModeCoordinateSpace.js +0 -29
- package/src/BookReader/ModeSmoothZoom.js +0 -312
- package/src/BookReader/ModeThumb.js +0 -344
- package/src/BookReader/Navbar/Navbar.js +0 -355
- package/src/BookReader/PageContainer.js +0 -172
- package/src/BookReader/ReduceSet.js +0 -26
- package/src/BookReader/Toolbar/Toolbar.js +0 -362
- package/src/BookReader/events.js +0 -19
- package/src/BookReader/options.js +0 -387
- package/src/BookReader/utils/HTMLDimensionsCacher.js +0 -44
- package/src/BookReader/utils/ScrollClassAdder.js +0 -31
- package/src/BookReader/utils/SelectionObserver.js +0 -45
- package/src/BookReader/utils/classes.js +0 -36
- package/src/BookReader/utils.js +0 -313
- package/tests/jest/BookReader/BookModel.test.js +0 -372
- package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +0 -263
- package/tests/jest/BookReader/ImageCache.test.js +0 -150
- package/tests/jest/BookReader/Mode1UpLit.test.js +0 -73
- package/tests/jest/BookReader/Mode2Up.test.js +0 -98
- package/tests/jest/BookReader/Mode2UpLit.test.js +0 -190
- package/tests/jest/BookReader/ModeCoordinateSpace.test.js +0 -16
- package/tests/jest/BookReader/ModeSmoothZoom.test.js +0 -218
- package/tests/jest/BookReader/ModeThumb.test.js +0 -71
- package/tests/jest/BookReader/Navbar/Navbar.test.js +0 -182
- package/tests/jest/BookReader/PageContainer.test.js +0 -249
- package/tests/jest/BookReader/ReduceSet.test.js +0 -38
- package/tests/jest/BookReader/Toolbar/Toolbar.test.js +0 -26
- package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +0 -59
- package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +0 -49
- package/tests/jest/BookReader/utils/SelectionObserver.test.js +0 -57
- package/tests/jest/BookReader/utils/classes.test.js +0 -88
- package/tests/jest/BookReader/utils.test.js +0 -250
@@ -1,388 +0,0 @@
|
|
1
|
-
// @ts-check
|
2
|
-
import { customElement, property, query } from 'lit/decorators.js';
|
3
|
-
import {LitElement, html} from 'lit';
|
4
|
-
import { styleMap } from 'lit/directives/style-map.js';
|
5
|
-
import { ModeSmoothZoom } from './ModeSmoothZoom.js';
|
6
|
-
import { arrChanged, genToArray, sum, throttle } from './utils.js';
|
7
|
-
import { HTMLDimensionsCacher } from "./utils/HTMLDimensionsCacher.js";
|
8
|
-
import { ScrollClassAdder } from './utils/ScrollClassAdder.js';
|
9
|
-
import { ModeCoordinateSpace } from './ModeCoordinateSpace.js';
|
10
|
-
/** @typedef {import('./BookModel').BookModel} BookModel */
|
11
|
-
/** @typedef {import('./BookModel').PageIndex} PageIndex */
|
12
|
-
/** @typedef {import('./BookModel').PageModel} PageModel */
|
13
|
-
/** @typedef {import('./ModeSmoothZoom').SmoothZoomable} SmoothZoomable */
|
14
|
-
/** @typedef {import('./PageContainer').PageContainer} PageContainer */
|
15
|
-
/** @typedef {import('../BookReader').default} BookReader */
|
16
|
-
|
17
|
-
// I _have_ to make this globally public, otherwise it won't let me call
|
18
|
-
// it's constructor :/
|
19
|
-
/** @implements {SmoothZoomable} */
|
20
|
-
@customElement('br-mode-1up')
|
21
|
-
export class Mode1UpLit extends LitElement {
|
22
|
-
/****************************************/
|
23
|
-
/************** PROPERTIES **************/
|
24
|
-
/****************************************/
|
25
|
-
|
26
|
-
/** @type {BookReader} */
|
27
|
-
br;
|
28
|
-
|
29
|
-
/************** BOOK-RELATED PROPERTIES **************/
|
30
|
-
|
31
|
-
/** @type {BookModel} */
|
32
|
-
@property({ type: Object })
|
33
|
-
book;
|
34
|
-
|
35
|
-
/** @type {PageModel[]} */
|
36
|
-
@property({ type: Array })
|
37
|
-
pages = [];
|
38
|
-
|
39
|
-
/** @type {Record<PageIndex, number>} in world coordinates (inches) */
|
40
|
-
@property({ type: Object })
|
41
|
-
pageTops = {};
|
42
|
-
|
43
|
-
/************** SCALE-RELATED PROPERTIES **************/
|
44
|
-
|
45
|
-
/** @type {ModeCoordinateSpace} Manage conversion between coordinates */
|
46
|
-
coordSpace = new ModeCoordinateSpace(this);
|
47
|
-
|
48
|
-
@property({ type: Number })
|
49
|
-
scale = 1;
|
50
|
-
|
51
|
-
/************** VIRTUAL-SCROLLING PROPERTIES **************/
|
52
|
-
|
53
|
-
/** in world coordinates (inches) */
|
54
|
-
@property({ type: Object })
|
55
|
-
visibleRegion = {
|
56
|
-
top: 0,
|
57
|
-
left: 0,
|
58
|
-
width: 100,
|
59
|
-
height: 100,
|
60
|
-
};
|
61
|
-
|
62
|
-
/** @type {PageModel[]} */
|
63
|
-
@property({ type: Array, hasChanged: arrChanged })
|
64
|
-
visiblePages = [];
|
65
|
-
|
66
|
-
/** @type {PageModel[]} */
|
67
|
-
@property({ type: Array })
|
68
|
-
renderedPages = [];
|
69
|
-
|
70
|
-
/** @type {Record<PageIndex, PageContainer>} position in inches */
|
71
|
-
pageContainerCache = {};
|
72
|
-
|
73
|
-
/************** WORLD-RELATED PROPERTIES **************/
|
74
|
-
/**
|
75
|
-
* The world is an imaginary giant document that contains all the pages.
|
76
|
-
* The "world"'s size is used to determine how long the scroll bar should
|
77
|
-
* be, for example.
|
78
|
-
*/
|
79
|
-
|
80
|
-
/** @type {HTMLElement} */
|
81
|
-
@query('.br-mode-1up__world')
|
82
|
-
$world;
|
83
|
-
|
84
|
-
worldDimensions = { width: 100, height: 100 };
|
85
|
-
|
86
|
-
get worldStyle() {
|
87
|
-
const wToR = this.coordSpace.worldUnitsToRenderedPixels;
|
88
|
-
return {
|
89
|
-
width: wToR(this.worldDimensions.width) + "px",
|
90
|
-
height: wToR(this.worldDimensions.height) + "px",
|
91
|
-
};
|
92
|
-
}
|
93
|
-
|
94
|
-
/** @type {HTMLElement} */
|
95
|
-
get $container() { return this; }
|
96
|
-
|
97
|
-
/** @type {HTMLElement} */
|
98
|
-
@query('.br-mode-1up__visible-world')
|
99
|
-
$visibleWorld;
|
100
|
-
|
101
|
-
/************** DOM-RELATED PROPERTIES **************/
|
102
|
-
|
103
|
-
/** @type {HTMLDimensionsCacher} Cache things like clientWidth to reduce repaints */
|
104
|
-
htmlDimensionsCacher = new HTMLDimensionsCacher(this);
|
105
|
-
|
106
|
-
smoothZoomer = new ModeSmoothZoom(this);
|
107
|
-
|
108
|
-
scrollClassAdder = new ScrollClassAdder(this, 'BRscrolling-active');
|
109
|
-
|
110
|
-
/************** CONSTANT PROPERTIES **************/
|
111
|
-
|
112
|
-
/** Vertical space between/around the pages in inches */
|
113
|
-
SPACING_IN = 0.2;
|
114
|
-
|
115
|
-
/** How much to zoom when zoom button pressed */
|
116
|
-
ZOOM_FACTOR = 1.1;
|
117
|
-
|
118
|
-
/****************************************/
|
119
|
-
/************** PUBLIC API **************/
|
120
|
-
/****************************************/
|
121
|
-
|
122
|
-
/************** MAIN PUBLIC METHODS **************/
|
123
|
-
|
124
|
-
/**
|
125
|
-
* @param {PageIndex} index
|
126
|
-
*/
|
127
|
-
jumpToIndex(index, { smooth = false } = {}) {
|
128
|
-
if (smooth) {
|
129
|
-
this.style.scrollBehavior = 'smooth';
|
130
|
-
}
|
131
|
-
this.scrollTop = this.coordSpace.worldUnitsToVisiblePixels(this.pageTops[index] - this.SPACING_IN / 2);
|
132
|
-
// TODO: Also h center?
|
133
|
-
if (smooth) {
|
134
|
-
setTimeout(() => this.style.scrollBehavior = '', 100);
|
135
|
-
}
|
136
|
-
}
|
137
|
-
|
138
|
-
zoomIn() {
|
139
|
-
this.scale *= this.ZOOM_FACTOR;
|
140
|
-
}
|
141
|
-
|
142
|
-
zoomOut() {
|
143
|
-
this.scale *= 1 / this.ZOOM_FACTOR;
|
144
|
-
}
|
145
|
-
|
146
|
-
/********************************************/
|
147
|
-
/************** INTERNAL STUFF **************/
|
148
|
-
/********************************************/
|
149
|
-
|
150
|
-
/************** LIFE CYCLE **************/
|
151
|
-
|
152
|
-
/**
|
153
|
-
* @param {BookModel} book
|
154
|
-
* @param {BookReader} br
|
155
|
-
*/
|
156
|
-
constructor(book, br) {
|
157
|
-
super();
|
158
|
-
this.book = book;
|
159
|
-
|
160
|
-
/** @type {BookReader} */
|
161
|
-
this.br = br;
|
162
|
-
}
|
163
|
-
|
164
|
-
/** @override */
|
165
|
-
firstUpdated(changedProps) {
|
166
|
-
super.firstUpdated(changedProps);
|
167
|
-
this.htmlDimensionsCacher.updateClientSizes();
|
168
|
-
this.smoothZoomer.attach();
|
169
|
-
}
|
170
|
-
|
171
|
-
/**
|
172
|
-
* @param {PageIndex} startIndex
|
173
|
-
*/
|
174
|
-
initFirstRender(startIndex) {
|
175
|
-
const page = this.book.getPage(startIndex);
|
176
|
-
this.scale = this.computeDefaultScale(page);
|
177
|
-
}
|
178
|
-
|
179
|
-
/** @override */
|
180
|
-
updated(changedProps) {
|
181
|
-
// this.X is the new value
|
182
|
-
// changedProps.get('X') is the old value
|
183
|
-
if (changedProps.has('book')) {
|
184
|
-
this.updatePages();
|
185
|
-
}
|
186
|
-
if (changedProps.has('pages')) {
|
187
|
-
this.worldDimensions = this.computeWorldDimensions();
|
188
|
-
this.pageTops = this.computePageTops(this.pages, this.SPACING_IN);
|
189
|
-
}
|
190
|
-
if (changedProps.has('visibleRegion')) {
|
191
|
-
this.visiblePages = this.computeVisiblePages();
|
192
|
-
}
|
193
|
-
if (changedProps.has('visiblePages')) {
|
194
|
-
this.throttledUpdateRenderedPages();
|
195
|
-
if (this.visiblePages.length) {
|
196
|
-
// unclear why this is ever really happening
|
197
|
-
this.br.displayedIndices = this.visiblePages.map(p => p.index);
|
198
|
-
this.br.updateFirstIndex(this.br.displayedIndices[0]);
|
199
|
-
this.br._components.navbar.updateNavIndexThrottled();
|
200
|
-
}
|
201
|
-
}
|
202
|
-
if (changedProps.has('scale')) {
|
203
|
-
const oldVal = changedProps.get('scale');
|
204
|
-
// Need to set this scale to actually scale the pages
|
205
|
-
this.$visibleWorld.style.transform = `scale(${this.scale})`;
|
206
|
-
this.smoothZoomer.updateViewportOnZoom(this.scale, oldVal);
|
207
|
-
this.updateVisibleRegion();
|
208
|
-
// Need to set this scale to update the world size, so the scrollbar gets the correct size
|
209
|
-
this.$world.style.transform = `scale(${this.scale})`;
|
210
|
-
}
|
211
|
-
}
|
212
|
-
|
213
|
-
updatePages() {
|
214
|
-
this.pages = genToArray(this.book.pagesIterator({ combineConsecutiveUnviewables: true }));
|
215
|
-
}
|
216
|
-
|
217
|
-
/** @override */
|
218
|
-
connectedCallback() {
|
219
|
-
super.connectedCallback();
|
220
|
-
this.htmlDimensionsCacher.attachResizeListener();
|
221
|
-
this.attachScrollListeners();
|
222
|
-
this.smoothZoomer.attach();
|
223
|
-
}
|
224
|
-
|
225
|
-
/** @override */
|
226
|
-
disconnectedCallback() {
|
227
|
-
this.htmlDimensionsCacher.detachResizeListener();
|
228
|
-
this.detachScrollListeners();
|
229
|
-
this.smoothZoomer.detach();
|
230
|
-
super.disconnectedCallback();
|
231
|
-
}
|
232
|
-
|
233
|
-
/************** LIT CONFIGS **************/
|
234
|
-
|
235
|
-
/** @override */
|
236
|
-
createRenderRoot() {
|
237
|
-
// Disable shadow DOM; that would require a huge rejiggering of CSS
|
238
|
-
return this;
|
239
|
-
}
|
240
|
-
|
241
|
-
/************** RENDERING **************/
|
242
|
-
|
243
|
-
/** @override */
|
244
|
-
render() {
|
245
|
-
return html`
|
246
|
-
<div class="br-mode-1up__world" style=${styleMap(this.worldStyle)}></div>
|
247
|
-
<div class="br-mode-1up__visible-world">
|
248
|
-
${this.renderedPages.map(p => this.renderPage(p))}
|
249
|
-
</div>`;
|
250
|
-
}
|
251
|
-
|
252
|
-
/** @param {PageModel} page */
|
253
|
-
createPageContainer = (page) => {
|
254
|
-
return this.pageContainerCache[page.index] || (
|
255
|
-
this.pageContainerCache[page.index] = (
|
256
|
-
// @ts-ignore I know it's protected, TS! But Mode1Up and BookReader are friends.
|
257
|
-
this.br._createPageContainer(page.index)
|
258
|
-
)
|
259
|
-
);
|
260
|
-
}
|
261
|
-
|
262
|
-
/** @param {PageModel} page */
|
263
|
-
renderPage = (page) => {
|
264
|
-
const wToR = this.coordSpace.worldUnitsToRenderedPixels;
|
265
|
-
const wToV = this.coordSpace.worldUnitsToVisiblePixels;
|
266
|
-
const containerWidth = this.coordSpace.visiblePixelsToWorldUnits(this.htmlDimensionsCacher.clientWidth);
|
267
|
-
|
268
|
-
const width = wToR(page.widthInches);
|
269
|
-
const height = wToR(page.heightInches);
|
270
|
-
const left = Math.max(this.SPACING_IN, (containerWidth - page.widthInches) / 2);
|
271
|
-
const top = this.pageTops[page.index];
|
272
|
-
|
273
|
-
const transform = `translate(${wToR(left)}px, ${wToR(top)}px)`;
|
274
|
-
const pageContainerEl = this.createPageContainer(page)
|
275
|
-
.update({
|
276
|
-
dimensions: {
|
277
|
-
width,
|
278
|
-
height,
|
279
|
-
top: 0,
|
280
|
-
left: 0,
|
281
|
-
},
|
282
|
-
reduce: page.width / wToV(page.widthInches),
|
283
|
-
}).$container[0];
|
284
|
-
|
285
|
-
pageContainerEl.style.transform = transform;
|
286
|
-
pageContainerEl.classList.toggle('BRpage-visible', this.visiblePages.includes(page));
|
287
|
-
return pageContainerEl;
|
288
|
-
}
|
289
|
-
|
290
|
-
/************** VIRTUAL SCROLLING LOGIC **************/
|
291
|
-
|
292
|
-
updateVisibleRegion = () => {
|
293
|
-
const { scrollTop, scrollLeft } = this;
|
294
|
-
// clientHeight excludes scrollbars, which is good.
|
295
|
-
const clientWidth = this.htmlDimensionsCacher.clientWidth;
|
296
|
-
const clientHeight = this.htmlDimensionsCacher.clientHeight;
|
297
|
-
|
298
|
-
// Note: scrollTop, and clientWidth all are in visible space;
|
299
|
-
// i.e. they are affects by the CSS transforms.
|
300
|
-
|
301
|
-
const vToW = this.coordSpace.visiblePixelsToWorldUnits;
|
302
|
-
this.visibleRegion = {
|
303
|
-
top: vToW(scrollTop),
|
304
|
-
height: vToW(clientHeight),
|
305
|
-
// TODO: These are very likely wrong
|
306
|
-
left: vToW(scrollLeft),
|
307
|
-
width: vToW(clientWidth),
|
308
|
-
};
|
309
|
-
}
|
310
|
-
|
311
|
-
/**
|
312
|
-
* @returns {PageModel[]}
|
313
|
-
*/
|
314
|
-
computeRenderedPages() {
|
315
|
-
// Also render 1 page before/after
|
316
|
-
// @ts-ignore TS doesn't understand the filtering out of null values
|
317
|
-
return [
|
318
|
-
this.visiblePages[0]?.prev,
|
319
|
-
...this.visiblePages,
|
320
|
-
this.visiblePages[this.visiblePages.length - 1]?.next,
|
321
|
-
]
|
322
|
-
.filter(p => p)
|
323
|
-
// Never render more than 10 pages! Usually means something is wrong
|
324
|
-
.slice(0, 10);
|
325
|
-
}
|
326
|
-
|
327
|
-
throttledUpdateRenderedPages = throttle(() => {
|
328
|
-
this.renderedPages = this.computeRenderedPages();
|
329
|
-
this.requestUpdate();
|
330
|
-
}, 100, null)
|
331
|
-
|
332
|
-
/**
|
333
|
-
* @param {PageModel[]} pages
|
334
|
-
* @param {number} spacing
|
335
|
-
*/
|
336
|
-
computePageTops(pages, spacing) {
|
337
|
-
/** @type {{ [pageIndex: string]: number }} */
|
338
|
-
const result = {};
|
339
|
-
let top = spacing;
|
340
|
-
for (const page of pages) {
|
341
|
-
result[page.index] = top;
|
342
|
-
top += page.heightInches + spacing;
|
343
|
-
}
|
344
|
-
return result;
|
345
|
-
}
|
346
|
-
|
347
|
-
/**
|
348
|
-
* @param {PageModel} page
|
349
|
-
* @returns {number}
|
350
|
-
*/
|
351
|
-
computeDefaultScale(page) {
|
352
|
-
// Default to real size if it fits, otherwise default to full width
|
353
|
-
const containerWidthIn = this.coordSpace.renderedPixelsToWorldUnits(this.clientWidth);
|
354
|
-
return Math.min(1, containerWidthIn / (page.widthInches + 2 * this.SPACING_IN)) || 1;
|
355
|
-
}
|
356
|
-
|
357
|
-
computeWorldDimensions() {
|
358
|
-
return {
|
359
|
-
width: Math.max(...this.pages.map(p => p.widthInches)) + 2 * this.SPACING_IN,
|
360
|
-
height:
|
361
|
-
sum(this.pages.map(p => p.heightInches)) +
|
362
|
-
(this.pages.length + 1) * this.SPACING_IN,
|
363
|
-
};
|
364
|
-
}
|
365
|
-
|
366
|
-
computeVisiblePages() {
|
367
|
-
return this.pages.filter(page => {
|
368
|
-
const PT = this.pageTops[page.index];
|
369
|
-
const PB = PT + page.heightInches;
|
370
|
-
|
371
|
-
const VT = this.visibleRegion.top;
|
372
|
-
const VB = VT + this.visibleRegion.height;
|
373
|
-
return PT <= VB && PB >= VT;
|
374
|
-
});
|
375
|
-
}
|
376
|
-
|
377
|
-
/************** INPUT HANDLERS **************/
|
378
|
-
|
379
|
-
attachScrollListeners = () => {
|
380
|
-
this.addEventListener("scroll", this.updateVisibleRegion);
|
381
|
-
this.scrollClassAdder.attach();
|
382
|
-
}
|
383
|
-
|
384
|
-
detachScrollListeners = () => {
|
385
|
-
this.removeEventListener("scroll", this.updateVisibleRegion);
|
386
|
-
this.scrollClassAdder.detach();
|
387
|
-
}
|
388
|
-
}
|
@@ -1,107 +0,0 @@
|
|
1
|
-
// @ts-check
|
2
|
-
import { Mode2UpLit } from './Mode2UpLit.js';
|
3
|
-
import { DragScrollable } from './DragScrollable.js';
|
4
|
-
/** @typedef {import('../BookReader.js').default} BookReader */
|
5
|
-
/** @typedef {import('./BookModel.js').BookModel} BookModel */
|
6
|
-
/** @typedef {import('./BookModel.js').PageIndex} PageIndex */
|
7
|
-
|
8
|
-
export class Mode2Up {
|
9
|
-
name = '2up';
|
10
|
-
|
11
|
-
/**
|
12
|
-
* @param {BookReader} br
|
13
|
-
* @param {BookModel} bookModel
|
14
|
-
*/
|
15
|
-
constructor(br, bookModel) {
|
16
|
-
this.br = br;
|
17
|
-
this.book = bookModel;
|
18
|
-
this.mode2UpLit = new Mode2UpLit(bookModel, br);
|
19
|
-
this.mode2UpLit.flipSpeed = br.flipSpeed;
|
20
|
-
|
21
|
-
/** @private */
|
22
|
-
this.$el = $(this.mode2UpLit)
|
23
|
-
.attr('autoFit', this.br.options.twoPage.autofit)
|
24
|
-
// We CANNOT use `br-mode-2up` as a class, because it's the same
|
25
|
-
// as the name of the web component, and the webcomponents polyfill
|
26
|
-
// uses the name of component as a class for style scoping 😒
|
27
|
-
.addClass('br-mode-2up__root BRmode2up');
|
28
|
-
|
29
|
-
/** Has mode2up ever been rendered before? */
|
30
|
-
this.everShown = false;
|
31
|
-
}
|
32
|
-
|
33
|
-
/**
|
34
|
-
* This is called when we switch into this mode
|
35
|
-
*/
|
36
|
-
prepare() {
|
37
|
-
const startLeaf = this.br.currentIndex();
|
38
|
-
this.br.refs.$brContainer
|
39
|
-
.empty()
|
40
|
-
.css({ overflow: 'hidden' })
|
41
|
-
.append(this.$el);
|
42
|
-
this.mode2UpLit.style.opacity = '0';
|
43
|
-
|
44
|
-
// Need this in a setTimeout so that it happens after the browser has _actually_
|
45
|
-
// appended the element to the DOM
|
46
|
-
setTimeout(async () => {
|
47
|
-
if (!this.everShown) {
|
48
|
-
this.mode2UpLit.initFirstRender(startLeaf);
|
49
|
-
this.everShown = true;
|
50
|
-
this.mode2UpLit.requestUpdate();
|
51
|
-
await this.mode2UpLit.updateComplete;
|
52
|
-
|
53
|
-
new DragScrollable(this.mode2UpLit, {
|
54
|
-
preventDefault: true,
|
55
|
-
dragSelector: '.br-mode-2up__book',
|
56
|
-
// Only handle mouse events; let browser/HammerJS handle touch
|
57
|
-
dragstart: 'mousedown',
|
58
|
-
dragcontinue: 'mousemove',
|
59
|
-
dragend: 'mouseup',
|
60
|
-
});
|
61
|
-
} else {
|
62
|
-
await this.mode2UpLit.jumpToIndex(startLeaf, { smooth: false });
|
63
|
-
this.resizePageView();
|
64
|
-
}
|
65
|
-
this.mode2UpLit.style.opacity = '1';
|
66
|
-
});
|
67
|
-
this.br.updateBrClasses();
|
68
|
-
}
|
69
|
-
|
70
|
-
/**
|
71
|
-
* BREAKING CHANGE: No longer supports pageX/pageY
|
72
|
-
* @param {PageIndex} index
|
73
|
-
* @param {number} [pageX] x position on the page (in pixels) to center on
|
74
|
-
* @param {number} [pageY] y position on the page (in pixels) to center on
|
75
|
-
* @param {boolean} [noAnimate]
|
76
|
-
*/
|
77
|
-
jumpToIndex(index, pageX, pageY, noAnimate) {
|
78
|
-
this.mode2UpLit.jumpToIndex(index);
|
79
|
-
}
|
80
|
-
|
81
|
-
/**
|
82
|
-
* @param {'in' | 'out'} direction
|
83
|
-
*/
|
84
|
-
zoom(direction) {
|
85
|
-
switch (direction) {
|
86
|
-
case 'in':
|
87
|
-
this.mode2UpLit.zoomIn();
|
88
|
-
break;
|
89
|
-
case 'out':
|
90
|
-
this.mode2UpLit.zoomOut();
|
91
|
-
break;
|
92
|
-
default:
|
93
|
-
console.error(`Unsupported direction: ${direction}`);
|
94
|
-
}
|
95
|
-
}
|
96
|
-
|
97
|
-
resizePageView() {
|
98
|
-
this.mode2UpLit.htmlDimensionsCacher.updateClientSizes();
|
99
|
-
if (this.mode2UpLit.scale < this.mode2UpLit.initialScale && this.mode2UpLit.autoFit == 'none') {
|
100
|
-
this.mode2UpLit.autoFit = 'auto';
|
101
|
-
}
|
102
|
-
if (this.mode2UpLit.autoFit != 'none') {
|
103
|
-
this.mode2UpLit.resizeViaAutofit();
|
104
|
-
}
|
105
|
-
this.mode2UpLit.recenter();
|
106
|
-
}
|
107
|
-
}
|