@edrlab/thorium-web 1.5.5 → 1.5.7
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/{ThPreferencesAdapter-B3a-f5v-.d.mts → ThPreferencesAdapter-GepvYoaL.d.mts} +4 -3
- package/dist/{ThSettingsWrapper-D4WIzlXA.d.mts → ThSettingsWrapper-DyYC678Q.d.mts} +1 -1
- package/dist/{actions-C33UN3Ji.d.mts → actions-CTg9C4C-.d.mts} +1 -1
- package/dist/{actionsReducer-Bzcj3wk3.d.mts → actionsReducer-Cnd7Cdh9.d.mts} +1 -1
- package/dist/{chunk-I572ZFCT.mjs → chunk-2YS5JTIR.mjs} +55 -35
- package/dist/chunk-2YS5JTIR.mjs.map +1 -0
- package/dist/{chunk-VYSDLACR.mjs → chunk-3R5JARA2.mjs} +3 -3
- package/dist/{chunk-VYSDLACR.mjs.map → chunk-3R5JARA2.mjs.map} +1 -1
- package/dist/{chunk-UOFADXXI.mjs → chunk-6DR4EAK3.mjs} +40 -47
- package/dist/chunk-6DR4EAK3.mjs.map +1 -0
- package/dist/chunk-7SMOXFAF.mjs +121 -0
- package/dist/chunk-7SMOXFAF.mjs.map +1 -0
- package/dist/{chunk-7A6UGSHQ.mjs → chunk-C6LWEQL2.mjs} +82 -69
- package/dist/chunk-C6LWEQL2.mjs.map +1 -0
- package/dist/{chunk-AEEGHJVM.mjs → chunk-CXKDZVAV.mjs} +113 -258
- package/dist/chunk-CXKDZVAV.mjs.map +1 -0
- package/dist/{chunk-GFSLVQIG.mjs → chunk-EREFYF5J.mjs} +3 -3
- package/dist/{chunk-GFSLVQIG.mjs.map → chunk-EREFYF5J.mjs.map} +1 -1
- package/dist/{chunk-G2M4MYVF.mjs → chunk-I765HTBI.mjs} +15 -109
- package/dist/chunk-I765HTBI.mjs.map +1 -0
- package/dist/{chunk-7AHUCM7Z.mjs → chunk-JXHRUQKP.mjs} +39 -16
- package/dist/chunk-JXHRUQKP.mjs.map +1 -0
- package/dist/{chunk-NJOWH5YK.mjs → chunk-MBWYHA4U.mjs} +43 -48
- package/dist/chunk-MBWYHA4U.mjs.map +1 -0
- package/dist/{chunk-NQ2ZSGCX.mjs → chunk-MFVZ5AEN.mjs} +7 -3
- package/dist/chunk-MFVZ5AEN.mjs.map +1 -0
- package/dist/{chunk-2YRT7RNW.mjs → chunk-QOU3R5ZT.mjs} +9 -3
- package/dist/chunk-QOU3R5ZT.mjs.map +1 -0
- package/dist/{chunk-N6MQQMTM.mjs → chunk-TNXLY2ZQ.mjs} +41 -18
- package/dist/chunk-TNXLY2ZQ.mjs.map +1 -0
- package/dist/components/Audio/index.d.mts +13 -13
- package/dist/components/Audio/index.mjs +10 -11
- package/dist/components/Epub/index.d.mts +13 -13
- package/dist/components/Epub/index.mjs +11 -12
- package/dist/components/Reader/index.d.mts +12 -12
- package/dist/components/Reader/index.mjs +18 -18
- package/dist/components/WebPub/index.d.mts +13 -13
- package/dist/components/WebPub/index.mjs +11 -12
- package/dist/core/Components/index.d.mts +6 -6
- package/dist/core/Helpers/index.d.mts +4 -4
- package/dist/core/Helpers/index.mjs +2 -2
- package/dist/core/Hooks/index.d.mts +14 -9
- package/dist/core/Hooks/index.mjs +4 -4
- package/dist/lib/index.d.mts +38 -27
- package/dist/lib/index.mjs +3 -4
- package/dist/locales/ar/thorium-shared.json +39 -0
- package/dist/locales/bg/thorium-web.json +23 -0
- package/dist/locales/brh/thorium-shared.json +1 -0
- package/dist/locales/brh/thorium-web.json +1 -0
- package/dist/locales/da/thorium-shared.json +3 -0
- package/dist/locales/el/thorium-web.json +41 -6
- package/dist/locales/en/thorium-shared.json +3 -0
- package/dist/locales/es/thorium-shared.json +3 -0
- package/dist/locales/et/thorium-shared.json +3 -0
- package/dist/locales/fi/thorium-shared.json +3 -0
- package/dist/locales/fi/thorium-web.json +3 -3
- package/dist/locales/fr/thorium-shared.json +3 -0
- package/dist/locales/he/thorium-shared.json +3 -1
- package/dist/locales/it/thorium-shared.json +3 -0
- package/dist/locales/lt/thorium-shared.json +36 -10
- package/dist/locales/pt-PT/thorium-shared.json +8 -5
- package/dist/locales/sv/thorium-shared.json +3 -3
- package/dist/locales/tr/thorium-shared.json +80 -0
- package/dist/preferences/index.d.mts +10 -10
- package/dist/preferences/index.mjs +4 -5
- package/dist/{settingsReducer-Pp9aoiiC.d.mts → settingsReducer-DRWEq8Cm.d.mts} +1 -1
- package/dist/{ui-DnZZhozX.d.mts → ui-DHQ_zvWn.d.mts} +7 -1
- package/dist/{useAudioNavigator-9RuOpLGB.d.mts → useAudioNavigator-B4NBPvmZ.d.mts} +4 -5
- package/dist/{useContrast-Bl08zDTU.d.mts → useContrast-Unp3534Z.d.mts} +1 -1
- package/dist/{usePreferences-Cy7-JN2x.d.mts → usePreferences-Bi-ptif0.d.mts} +6 -9
- package/dist/usePublicationProgress-DT-X5ZLf.d.mts +44 -0
- package/dist/{useReaderTransitions-BsTdWZDK.d.mts → useReaderTransitions-B9fOF61y.d.mts} +10 -14
- package/package.json +23 -15
- package/dist/chunk-2YRT7RNW.mjs.map +0 -1
- package/dist/chunk-7A6UGSHQ.mjs.map +0 -1
- package/dist/chunk-7AHUCM7Z.mjs.map +0 -1
- package/dist/chunk-A575ZW4A.mjs +0 -10
- package/dist/chunk-A575ZW4A.mjs.map +0 -1
- package/dist/chunk-AEEGHJVM.mjs.map +0 -1
- package/dist/chunk-G2M4MYVF.mjs.map +0 -1
- package/dist/chunk-I572ZFCT.mjs.map +0 -1
- package/dist/chunk-N6MQQMTM.mjs.map +0 -1
- package/dist/chunk-NJOWH5YK.mjs.map +0 -1
- package/dist/chunk-NQ2ZSGCX.mjs.map +0 -1
- package/dist/chunk-TEZB4ULX.mjs +0 -57
- package/dist/chunk-TEZB4ULX.mjs.map +0 -1
- package/dist/chunk-UOFADXXI.mjs.map +0 -1
- package/dist/useTimeline-DCZ1qoCO.d.mts +0 -55
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { setAdjacentTimelineItems } from './chunk-7SMOXFAF.mjs';
|
|
2
|
+
import { useAppDispatch } from './chunk-MFVZ5AEN.mjs';
|
|
2
3
|
import { isIOSish } from './chunk-KQ3KS5O5.mjs';
|
|
3
4
|
import { useEffect, useState, useRef, useCallback, useMemo } from 'react';
|
|
4
|
-
import { Layout, Link, Locator } from '@readium/shared';
|
|
5
5
|
import { AudioPreferences, AudioNavigator, EpubPreferences, EpubNavigator, getScriptMode, WebPubPreferences, ExperimentalWebPubNavigator } from '@readium/navigator';
|
|
6
|
+
import { Locator } from '@readium/shared';
|
|
6
7
|
|
|
7
8
|
var useDocumentTitle = (title) => {
|
|
8
9
|
useEffect(() => {
|
|
@@ -93,220 +94,109 @@ var useObservableCondition = (value) => {
|
|
|
93
94
|
}, [value]);
|
|
94
95
|
return condition;
|
|
95
96
|
};
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
|
|
98
|
+
// src/helpers/timelineFallback.ts
|
|
99
|
+
var walkPrecedingResources = (timeline, href, resolve) => {
|
|
100
|
+
const timelineItems = timeline.items;
|
|
101
|
+
const startIndex = timelineItems.findIndex((item) => timeline.linkFor(item)?.href === href);
|
|
102
|
+
if (startIndex === -1) return void 0;
|
|
103
|
+
for (let i = startIndex - 1; i >= 0; i--) {
|
|
104
|
+
const candidate = timelineItems[i];
|
|
105
|
+
if (!candidate) continue;
|
|
106
|
+
const result = resolve(candidate, startIndex - i);
|
|
107
|
+
if (result !== void 0) return result;
|
|
108
|
+
}
|
|
109
|
+
return void 0;
|
|
110
|
+
};
|
|
111
|
+
var resolveChapterTitle = (timeline, item) => {
|
|
112
|
+
if (item.title !== void 0) return item.title;
|
|
113
|
+
const href = timeline.linkFor(item)?.href;
|
|
114
|
+
if (!href) return void 0;
|
|
115
|
+
return walkPrecedingResources(
|
|
116
|
+
timeline,
|
|
117
|
+
href,
|
|
118
|
+
(candidate, stepsBack) => candidate.title !== void 0 ? `${candidate.title} (${stepsBack + 1})` : void 0
|
|
119
|
+
);
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// src/core/Hooks/usePublicationProgress.ts
|
|
123
|
+
var usePublicationProgress = ({
|
|
98
124
|
publication,
|
|
125
|
+
getNavigatorTimeline,
|
|
126
|
+
currentTimelineItem,
|
|
99
127
|
currentLocation,
|
|
100
128
|
currentPositions,
|
|
101
129
|
positionsList,
|
|
102
130
|
onChange
|
|
103
131
|
}) => {
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const [currentTocEntry, setCurrentTocEntry] = useState(null);
|
|
108
|
-
const [currentItem, setCurrentItem] = useState(null);
|
|
109
|
-
const [previousItem, setPreviousItem] = useState(null);
|
|
110
|
-
const [nextItem, setNextItem] = useState(null);
|
|
111
|
-
const [relativeProgression, setRelativeProgression] = useState(void 0);
|
|
112
|
-
const [totalProgression, setTotalProgression] = useState(void 0);
|
|
113
|
-
const idCounterRef = useRef(0);
|
|
114
|
-
const timeline = useMemo(() => ({
|
|
115
|
-
title: publication?.metadata.title.getTranslation("en"),
|
|
116
|
-
items: timelineItems,
|
|
117
|
-
toc: {
|
|
118
|
-
tree: tocTree,
|
|
119
|
-
currentEntry: currentTocEntry
|
|
120
|
-
},
|
|
121
|
-
currentItem,
|
|
122
|
-
previousItem,
|
|
123
|
-
nextItem,
|
|
124
|
-
progression: {
|
|
125
|
-
totalItems: publication?.readingOrder.items.length,
|
|
126
|
-
currentIndex: currentItem?.readingOrderIndex !== void 0 ? currentItem.readingOrderIndex + 1 : void 0,
|
|
127
|
-
totalPositions: positionsList?.length,
|
|
128
|
-
currentPositions: currentPositions || [],
|
|
129
|
-
relativeProgression,
|
|
130
|
-
totalProgression,
|
|
131
|
-
currentChapter: currentItem?.title,
|
|
132
|
-
positionsLeft: (() => {
|
|
133
|
-
const endPosition = currentItem?.positionRange?.[1];
|
|
134
|
-
const currentPosition = currentPositions?.[0];
|
|
135
|
-
if (!positionsList?.length || endPosition === void 0 || currentPosition === void 0) {
|
|
136
|
-
return void 0;
|
|
137
|
-
}
|
|
138
|
-
return Math.max(0, endPosition - currentPosition);
|
|
139
|
-
})()
|
|
140
|
-
}
|
|
141
|
-
}), [
|
|
142
|
-
publication?.metadata.title,
|
|
143
|
-
publication?.readingOrder.items,
|
|
144
|
-
timelineItems,
|
|
145
|
-
tocTree,
|
|
146
|
-
currentTocEntry,
|
|
147
|
-
currentItem,
|
|
148
|
-
previousItem,
|
|
149
|
-
nextItem,
|
|
150
|
-
positionsList,
|
|
151
|
-
currentPositions,
|
|
152
|
-
relativeProgression,
|
|
153
|
-
totalProgression
|
|
154
|
-
]);
|
|
155
|
-
const handleTocEntryOnNav = useCallback((locator, currentPos) => {
|
|
156
|
-
if (!locator || !tocTree.length) return;
|
|
157
|
-
const findMatch = (items, link) => {
|
|
158
|
-
for (const item of items) {
|
|
159
|
-
if (item.href === link?.href) {
|
|
160
|
-
return item;
|
|
161
|
-
}
|
|
162
|
-
if (item.children) {
|
|
163
|
-
const match = findMatch(item.children, link);
|
|
164
|
-
if (match) return match;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return void 0;
|
|
168
|
-
};
|
|
169
|
-
const currentMatch = findMatch(tocTree, new Link(locator));
|
|
170
|
-
if (currentMatch) {
|
|
171
|
-
setCurrentTocEntry((prev) => prev?.id === currentMatch.id ? prev : toEntryRef(currentMatch));
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
if (layout === Layout.fixed) {
|
|
175
|
-
if (currentPos && currentPos.length === 2) {
|
|
176
|
-
const otherPosition = currentPos[0] === locator.locations.position ? currentPos[1] : currentPos[0];
|
|
177
|
-
const otherPositionInList = positionsList?.find((pos) => pos.locations.position === otherPosition);
|
|
178
|
-
if (otherPositionInList) {
|
|
179
|
-
const match = findMatch(tocTree, new Link(otherPositionInList));
|
|
180
|
-
if (match) {
|
|
181
|
-
setCurrentTocEntry((prev) => prev?.id === match.id ? prev : toEntryRef(match));
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
const otherPositions = currentPos?.filter((pos) => pos !== locator.locations.position) || [];
|
|
188
|
-
for (const otherPosition of otherPositions) {
|
|
189
|
-
const otherPositionInList = positionsList?.find((pos) => pos.locations.position === otherPosition);
|
|
190
|
-
if (otherPositionInList) {
|
|
191
|
-
const match = findMatch(tocTree, new Link(otherPositionInList));
|
|
192
|
-
if (match) {
|
|
193
|
-
setCurrentTocEntry((prev) => prev?.id === match.id ? prev : toEntryRef(match));
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}, [tocTree, layout, positionsList]);
|
|
199
|
-
const buildTimelineItems = useCallback(() => {
|
|
200
|
-
const timelineItems2 = {};
|
|
132
|
+
const positionEntries = useMemo(() => {
|
|
133
|
+
const entries = {};
|
|
134
|
+
if (!positionsList?.length) return entries;
|
|
201
135
|
const readingOrder = publication?.readingOrder?.items || [];
|
|
202
|
-
const toc = publication?.toc?.items && publication?.toc?.items.length > 0 ? publication.toc.items : publication?.readingOrder?.items || [];
|
|
203
|
-
const flatToc = toc.flatMap((t) => [t, ...t.children?.items || []]);
|
|
204
|
-
const getBaseUrl = (url) => {
|
|
205
|
-
const [base] = url.split("#");
|
|
206
|
-
const [path] = base.split("?");
|
|
207
|
-
return path;
|
|
208
|
-
};
|
|
209
|
-
const findNearestTitle = (currentHref) => {
|
|
210
|
-
const currentIndex = readingOrder.findIndex((item) => getBaseUrl(item.href) === getBaseUrl(currentHref));
|
|
211
|
-
if (currentIndex === -1) return "";
|
|
212
|
-
for (let i = currentIndex; i >= 0; i--) {
|
|
213
|
-
const item = readingOrder[i];
|
|
214
|
-
const matchingTocItems = flatToc.filter(
|
|
215
|
-
(t) => getBaseUrl(t.href) === getBaseUrl(item.href)
|
|
216
|
-
);
|
|
217
|
-
const title = matchingTocItems[0]?.title?.trim();
|
|
218
|
-
if (title) {
|
|
219
|
-
const diff = currentIndex - i;
|
|
220
|
-
return diff > 0 ? `${title} (${diff + 1})` : title;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return "";
|
|
224
|
-
};
|
|
225
|
-
readingOrder.forEach((item, index) => {
|
|
226
|
-
const matchingTocItems = flatToc.filter((t) => {
|
|
227
|
-
const baseHref = getBaseUrl(t.href);
|
|
228
|
-
const baseItemHref = getBaseUrl(item.href);
|
|
229
|
-
return baseHref === baseItemHref;
|
|
230
|
-
});
|
|
231
|
-
const timelineItem = {
|
|
232
|
-
href: item.href,
|
|
233
|
-
readingOrderIndex: index,
|
|
234
|
-
title: item.title || matchingTocItems[0]?.title || findNearestTitle(item.href),
|
|
235
|
-
fragments: matchingTocItems.map((t) => t.href.split("#")[1]).filter(Boolean),
|
|
236
|
-
children: matchingTocItems[0]?.children?.items?.map((child) => ({
|
|
237
|
-
// We do not care about index for children
|
|
238
|
-
// since currentLocation is guaranteed to be in the reading order
|
|
239
|
-
title: child.title,
|
|
240
|
-
href: child.href
|
|
241
|
-
})) || []
|
|
242
|
-
};
|
|
243
|
-
timelineItems2[item.href] = timelineItem;
|
|
244
|
-
});
|
|
245
136
|
for (const item of readingOrder) {
|
|
246
|
-
const
|
|
247
|
-
if (
|
|
248
|
-
const
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
timelineItem.progressionRange = start.progression !== void 0 ? [start.progression, end.progression] : void 0;
|
|
254
|
-
timelineItem.totalProgressionRange = start.totalProgression !== void 0 ? [start.totalProgression, end.totalProgression] : void 0;
|
|
255
|
-
}
|
|
137
|
+
const positions = positionsList.filter((p) => p.href === item.href).sort((a, b) => (a.locations?.position || 0) - (b.locations?.position || 0));
|
|
138
|
+
if (positions.length === 0) continue;
|
|
139
|
+
const start = positions[0].locations;
|
|
140
|
+
const end = positions.length > 1 ? positions[positions.length - 1].locations : start;
|
|
141
|
+
entries[item.href] = {
|
|
142
|
+
positionRange: start?.position !== void 0 ? [start.position, end?.position] : void 0
|
|
143
|
+
};
|
|
256
144
|
}
|
|
257
|
-
return
|
|
145
|
+
return entries;
|
|
258
146
|
}, [publication, positionsList]);
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
setTimelineItems(buildTimelineItems());
|
|
291
|
-
}, [publication, positionsList, buildTimelineItems]);
|
|
292
|
-
useEffect(() => {
|
|
293
|
-
if (!tocTree.length || !timelineItems) return;
|
|
294
|
-
if (currentLocation) {
|
|
295
|
-
handleTocEntryOnNav(currentLocation, currentPositions);
|
|
296
|
-
} else if (tocTree.length > 0) {
|
|
297
|
-
handleTocEntryOnNav(new Locator({ href: tocTree[0].href, type: "" }), currentPositions);
|
|
298
|
-
}
|
|
299
|
-
updateTimelineItems(currentLocation);
|
|
300
|
-
setRelativeProgression(currentLocation?.locations.progression);
|
|
301
|
-
setTotalProgression(currentLocation?.locations.totalProgression);
|
|
302
|
-
}, [currentLocation, currentPositions, tocTree, timelineItems, handleTocEntryOnNav, updateTimelineItems]);
|
|
147
|
+
const navigatorTimeline = getNavigatorTimeline();
|
|
148
|
+
const currentHref = currentLocation?.href;
|
|
149
|
+
const currentIndex = currentHref ? publication?.readingOrder.items.findIndex((item) => item.href === currentHref) : void 0;
|
|
150
|
+
const currentChapter = currentTimelineItem && navigatorTimeline ? resolveChapterTitle(navigatorTimeline, currentTimelineItem) : void 0;
|
|
151
|
+
const progress = useMemo(() => {
|
|
152
|
+
const positionRange = currentHref ? positionEntries[currentHref]?.positionRange : void 0;
|
|
153
|
+
const endPosition = positionRange?.[1];
|
|
154
|
+
const currentPosition = currentPositions?.[0];
|
|
155
|
+
return {
|
|
156
|
+
title: publication?.metadata.title.getTranslation("en"),
|
|
157
|
+
progression: {
|
|
158
|
+
totalItems: publication?.readingOrder.items.length,
|
|
159
|
+
currentIndex: currentIndex !== void 0 && currentIndex >= 0 ? currentIndex + 1 : void 0,
|
|
160
|
+
totalPositions: positionsList?.length,
|
|
161
|
+
currentPositions: currentPositions || [],
|
|
162
|
+
relativeProgression: currentLocation?.locations.progression,
|
|
163
|
+
totalProgression: currentLocation?.locations.totalProgression,
|
|
164
|
+
currentChapter,
|
|
165
|
+
positionsLeft: !positionsList?.length || endPosition === void 0 || currentPosition === void 0 ? void 0 : Math.max(0, endPosition - currentPosition)
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}, [
|
|
169
|
+
publication,
|
|
170
|
+
currentChapter,
|
|
171
|
+
currentHref,
|
|
172
|
+
currentIndex,
|
|
173
|
+
positionEntries,
|
|
174
|
+
positionsList,
|
|
175
|
+
currentPositions,
|
|
176
|
+
currentLocation
|
|
177
|
+
]);
|
|
303
178
|
useEffect(() => {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
179
|
+
if (onChange) onChange(progress);
|
|
180
|
+
}, [progress, onChange]);
|
|
181
|
+
return progress;
|
|
182
|
+
};
|
|
183
|
+
var useTimelineAdjacency = (getNavigatorTimeline) => {
|
|
184
|
+
const dispatch = useAppDispatch();
|
|
185
|
+
const updateAdjacentItems = useCallback((item) => {
|
|
186
|
+
const tl = getNavigatorTimeline();
|
|
187
|
+
if (!tl) return;
|
|
188
|
+
const { previous, next } = tl.navigableFrom(item);
|
|
189
|
+
const previousHref = previous ? tl.linkFor(previous)?.href : void 0;
|
|
190
|
+
const nextHref = next ? tl.linkFor(next)?.href : void 0;
|
|
191
|
+
dispatch(setAdjacentTimelineItems({
|
|
192
|
+
previous: previous && previousHref ? { title: resolveChapterTitle(tl, previous), href: previousHref } : null,
|
|
193
|
+
next: next && nextHref ? { title: resolveChapterTitle(tl, next), href: nextHref } : null
|
|
194
|
+
}));
|
|
195
|
+
}, [dispatch, getNavigatorTimeline]);
|
|
196
|
+
const clearAdjacentItems = useCallback(() => {
|
|
197
|
+
dispatch(setAdjacentTimelineItems({ previous: null, next: null }));
|
|
198
|
+
}, [dispatch]);
|
|
199
|
+
return { updateAdjacentItems, clearAdjacentItems };
|
|
310
200
|
};
|
|
311
201
|
var navigatorInstance = null;
|
|
312
202
|
var useAudioNavigator = () => {
|
|
@@ -397,6 +287,9 @@ var useAudioNavigator = () => {
|
|
|
397
287
|
const currentTime = useCallback(() => {
|
|
398
288
|
return navigatorInstance?.currentTime || 0;
|
|
399
289
|
}, []);
|
|
290
|
+
const timeline = useCallback(() => {
|
|
291
|
+
return navigatorInstance?.timeline;
|
|
292
|
+
}, []);
|
|
400
293
|
return {
|
|
401
294
|
AudioNavigatorLoad,
|
|
402
295
|
AudioNavigatorDestroy,
|
|
@@ -424,7 +317,7 @@ var useAudioNavigator = () => {
|
|
|
424
317
|
remotePlayback: navigatorInstance?.remotePlayback,
|
|
425
318
|
getSetting,
|
|
426
319
|
submitPreferences,
|
|
427
|
-
timeline
|
|
320
|
+
timeline
|
|
428
321
|
};
|
|
429
322
|
};
|
|
430
323
|
var useAudioSettingsCache = (volume, playbackRate, preservePitch, skipBackwardInterval, skipForwardInterval, skipInterval, pollInterval, autoPlay, enableMediaSession) => {
|
|
@@ -487,7 +380,7 @@ var useEpubNavigator = () => {
|
|
|
487
380
|
config.container,
|
|
488
381
|
config.publication,
|
|
489
382
|
config.listeners,
|
|
490
|
-
config.positionsList,
|
|
383
|
+
config.positionsList?.map((p) => Locator.deserialize(p)).filter((l) => !!l),
|
|
491
384
|
config.initialPosition,
|
|
492
385
|
{
|
|
493
386
|
preferences: config.preferences || {},
|
|
@@ -532,27 +425,6 @@ var useEpubNavigator = () => {
|
|
|
532
425
|
const currentLocator = useCallback(() => {
|
|
533
426
|
return navigatorInstance2?.currentLocator;
|
|
534
427
|
}, []);
|
|
535
|
-
const getLocatorAtOffset = useCallback((offset) => {
|
|
536
|
-
const readingOrder = navigatorInstance2?.publication?.readingOrder;
|
|
537
|
-
if (!readingOrder) return null;
|
|
538
|
-
const currentLocator2 = navigatorInstance2?.currentLocator;
|
|
539
|
-
if (!currentLocator2) return null;
|
|
540
|
-
const currentLocatorIndex = readingOrder.findIndexWithHref(currentLocator2.href);
|
|
541
|
-
if (currentLocatorIndex === -1) return null;
|
|
542
|
-
const newIndex = currentLocatorIndex + offset;
|
|
543
|
-
if (newIndex < 0 || newIndex >= readingOrder.items.length) return null;
|
|
544
|
-
return readingOrder.items[newIndex];
|
|
545
|
-
}, []);
|
|
546
|
-
const previousLocator = useCallback(() => {
|
|
547
|
-
const link = getLocatorAtOffset(-1);
|
|
548
|
-
if (!link) return null;
|
|
549
|
-
return navigatorInstance2?.publication?.manifest?.locatorFromLink(link);
|
|
550
|
-
}, [getLocatorAtOffset]);
|
|
551
|
-
const nextLocator = useCallback(() => {
|
|
552
|
-
const link = getLocatorAtOffset(1);
|
|
553
|
-
if (!link) return null;
|
|
554
|
-
return navigatorInstance2?.publication?.manifest?.locatorFromLink(link);
|
|
555
|
-
}, [getLocatorAtOffset]);
|
|
556
428
|
const currentPositions = useCallback(() => {
|
|
557
429
|
return navigatorInstance2?.viewport?.positions;
|
|
558
430
|
}, []);
|
|
@@ -576,6 +448,9 @@ var useEpubNavigator = () => {
|
|
|
576
448
|
if (!metadata) return void 0;
|
|
577
449
|
return getScriptMode(metadata);
|
|
578
450
|
}, []);
|
|
451
|
+
const timeline = useCallback(() => {
|
|
452
|
+
return navigatorInstance2?.timeline;
|
|
453
|
+
}, []);
|
|
579
454
|
return {
|
|
580
455
|
EpubNavigatorLoad,
|
|
581
456
|
EpubNavigatorDestroy,
|
|
@@ -587,8 +462,6 @@ var useEpubNavigator = () => {
|
|
|
587
462
|
go,
|
|
588
463
|
navLayout,
|
|
589
464
|
currentLocator,
|
|
590
|
-
previousLocator,
|
|
591
|
-
nextLocator,
|
|
592
465
|
currentPositions,
|
|
593
466
|
canGoBackward,
|
|
594
467
|
canGoForward,
|
|
@@ -598,7 +471,8 @@ var useEpubNavigator = () => {
|
|
|
598
471
|
getSetting,
|
|
599
472
|
submitPreferences,
|
|
600
473
|
getCframes,
|
|
601
|
-
getScriptMode: currentScriptMode
|
|
474
|
+
getScriptMode: currentScriptMode,
|
|
475
|
+
timeline
|
|
602
476
|
};
|
|
603
477
|
};
|
|
604
478
|
var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWeight, hyphens, letterSpacing, ligatures, lineLength, lineHeight, noRuby, paragraphIndent, paragraphSpacing, publisherStyles, scroll, textNormalization, wordSpacing, theme) => {
|
|
@@ -729,27 +603,6 @@ var useWebPubNavigator = () => {
|
|
|
729
603
|
const currentLocator = useCallback(() => {
|
|
730
604
|
return navigatorInstance3?.currentLocator;
|
|
731
605
|
}, []);
|
|
732
|
-
const getLocatorAtOffset = useCallback((offset) => {
|
|
733
|
-
const readingOrder = navigatorInstance3?.publication?.readingOrder;
|
|
734
|
-
if (!readingOrder) return null;
|
|
735
|
-
const currentLocator2 = navigatorInstance3?.currentLocator;
|
|
736
|
-
if (!currentLocator2) return null;
|
|
737
|
-
const currentLocatorIndex = readingOrder.findIndexWithHref(currentLocator2.href);
|
|
738
|
-
if (currentLocatorIndex === -1) return null;
|
|
739
|
-
const newIndex = currentLocatorIndex + offset;
|
|
740
|
-
if (newIndex < 0 || newIndex >= readingOrder.items.length) return null;
|
|
741
|
-
return readingOrder.items[newIndex];
|
|
742
|
-
}, []);
|
|
743
|
-
const previousLocator = useCallback(() => {
|
|
744
|
-
const link = getLocatorAtOffset(-1);
|
|
745
|
-
if (!link) return null;
|
|
746
|
-
return navigatorInstance3?.publication?.manifest?.locatorFromLink(link);
|
|
747
|
-
}, [getLocatorAtOffset]);
|
|
748
|
-
const nextLocator = useCallback(() => {
|
|
749
|
-
const link = getLocatorAtOffset(1);
|
|
750
|
-
if (!link) return null;
|
|
751
|
-
return navigatorInstance3?.publication?.manifest?.locatorFromLink(link);
|
|
752
|
-
}, [getLocatorAtOffset]);
|
|
753
606
|
const currentPositions = useCallback(() => {
|
|
754
607
|
return navigatorInstance3?.viewport?.positions;
|
|
755
608
|
}, []);
|
|
@@ -773,6 +626,9 @@ var useWebPubNavigator = () => {
|
|
|
773
626
|
if (!metadata) return void 0;
|
|
774
627
|
return getScriptMode(metadata);
|
|
775
628
|
}, []);
|
|
629
|
+
const timeline = useCallback(() => {
|
|
630
|
+
return navigatorInstance3?.timeline;
|
|
631
|
+
}, []);
|
|
776
632
|
return {
|
|
777
633
|
WebPubNavigatorLoad,
|
|
778
634
|
WebPubNavigatorDestroy,
|
|
@@ -783,8 +639,6 @@ var useWebPubNavigator = () => {
|
|
|
783
639
|
goLink,
|
|
784
640
|
go,
|
|
785
641
|
currentLocator,
|
|
786
|
-
previousLocator,
|
|
787
|
-
nextLocator,
|
|
788
642
|
currentPositions,
|
|
789
643
|
canGoBackward,
|
|
790
644
|
canGoForward,
|
|
@@ -794,7 +648,8 @@ var useWebPubNavigator = () => {
|
|
|
794
648
|
getSetting,
|
|
795
649
|
submitPreferences,
|
|
796
650
|
getCframes,
|
|
797
|
-
getScriptMode: currentScriptMode
|
|
651
|
+
getScriptMode: currentScriptMode,
|
|
652
|
+
timeline
|
|
798
653
|
};
|
|
799
654
|
};
|
|
800
655
|
var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, ligatures, lineHeight, noRuby, paragraphIndent, paragraphSpacing, publisherStyles, textAlign, textNormalization, wordSpacing, zoom) => {
|
|
@@ -853,6 +708,6 @@ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, li
|
|
|
853
708
|
return cache;
|
|
854
709
|
};
|
|
855
710
|
|
|
856
|
-
export {
|
|
857
|
-
//# sourceMappingURL=chunk-
|
|
858
|
-
//# sourceMappingURL=chunk-
|
|
711
|
+
export { useAudioNavigator, useAudioSettingsCache, useDocumentTitle, useEpubNavigator, useEpubSettingsCache, useFullscreen, useIsClient, useLocalStorage, useObservableCondition, usePublicationProgress, useTimelineAdjacency, useWebPubNavigator, useWebPubSettingsCache };
|
|
712
|
+
//# sourceMappingURL=chunk-CXKDZVAV.mjs.map
|
|
713
|
+
//# sourceMappingURL=chunk-CXKDZVAV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/Hooks/useDocumentTitle.ts","../src/core/Hooks/useIsClient.ts","../src/core/Hooks/useFullscreen.ts","../src/core/Hooks/useLocalStorage.ts","../src/core/Hooks/useObservableCondition.ts","../src/helpers/timelineFallback.ts","../src/core/Hooks/usePublicationProgress.ts","../src/core/Hooks/useTimelineAdjacency.ts","../src/core/Hooks/Audio/useAudioNavigator.ts","../src/core/Hooks/Audio/useAudioSettingsCache.ts","../src/core/Hooks/Epub/useEpubNavigator.ts","../src/core/Hooks/Epub/useEpubSettingsCache.ts","../src/core/Hooks/WebPub/useWebPubNavigator.ts","../src/core/Hooks/WebPub/useWebPubSettingsCache.ts"],"names":["useEffect","useState","useRef","useCallback","useMemo","navigatorInstance","getScriptMode"],"mappings":"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","file":"chunk-CXKDZVAV.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\n\nexport const useDocumentTitle = (title?: string) => {\n useEffect(() => {\n if (title) document.title = title;\n }, [title]);\n};","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nexport const useIsClient = () => {\n const [isClient, setIsClient] = useState(false);\n const isClientRef = useRef(false);\n\n useEffect(() => {\n isClientRef.current = true;\n setIsClient(true);\n }, []);\n\n return { isClient, isClientRef };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useIsClient } from \"./useIsClient\";\nimport { isIOSish } from \"../Helpers/getPlatform\";\n\nexport const useFullscreen = (onChange?: (isFullscreen: boolean) => void) => {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const { isClient, isClientRef } = useIsClient();\n const isSupported = isClient && !isIOSish() && Boolean(document.fullscreenEnabled);\n\n const handleFullscreen = useCallback(() => {\n if (!isClientRef.current || isIOSish()) return;\n\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen();\n } else if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n }, [isClientRef]);\n\n useEffect(() => {\n const onFSchange = () => {\n const isFs = Boolean(document.fullscreenElement);\n setIsFullscreen(isFs);\n onChange && onChange(isFs);\n };\n document.addEventListener(\"fullscreenchange\", onFSchange);\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFSchange);\n };\n }, [onChange]);\n\n return { isFullscreen, isSupported, handleFullscreen };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const useLocalStorage = (key: string | null) => {\n const [localData, setLocalData] = useState<any>(null);\n const cachedLocalData = useRef<any>(null);\n\n const setValue = useCallback((newValue: any) => {\n if (!key) return;\n setLocalData(newValue);\n localStorage.setItem(key, JSON.stringify(newValue));\n }, [key]);\n\n const getValue = useCallback(() => {\n if (!key) return null;\n if (localData !== null) return localData;\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n }, [key, localData]);\n\n const clearValue = useCallback(() => {\n if (!key) return;\n setLocalData(null);\n localStorage.removeItem(key);\n }, [key]);\n\n useEffect(() => {\n if (!key) return;\n cachedLocalData.current = localData;\n }, [localData, key]);\n\n return {\n setLocalData: setValue,\n getLocalData: getValue,\n clearLocalData: clearValue,\n localData: key ? localData : null,\n cachedLocalData\n };\n};","import { useEffect, useRef } from \"react\";\nimport { ObservableCondition } from \"@readium/navigator-html-injectables\";\n\nexport const useObservableCondition = (value: boolean): ObservableCondition => {\n const listeners = useRef(new Set<(v: boolean) => void>());\n const current = useRef(value);\n\n const condition = useRef<ObservableCondition>({\n subscribe(cb) {\n listeners.current.add(cb);\n cb(current.current);\n return () => listeners.current.delete(cb);\n },\n }).current;\n\n useEffect(() => {\n if (current.current === value) return;\n current.current = value;\n listeners.current.forEach(cb => cb(value));\n }, [value]);\n\n return condition;\n};\n","import { Timeline, TimelineItem } from \"@readium/shared\";\n\n// A TOC entry can span several resources with only the first one titled.\n// Walks backward from `href`, resolved fresh each call (so it works for\n// non-linear navigation too), stopping at the first defined result.\nconst walkPrecedingResources = <T,>(\n timeline: Timeline,\n href: string,\n resolve: (candidate: TimelineItem, stepsBack: number) => T | undefined\n): T | undefined => {\n const timelineItems = timeline.items;\n const startIndex = timelineItems.findIndex(item => timeline.linkFor(item)?.href === href);\n if (startIndex === -1) return undefined;\n\n for (let i = startIndex - 1; i >= 0; i--) {\n const candidate = timelineItems[i];\n if (!candidate) continue;\n const result = resolve(candidate, startIndex - i);\n if (result !== undefined) return result;\n }\n\n return undefined;\n};\n\n// Falls back to a preceding resource's title; appends \"(N)\" when inherited so repeated\n// labels (e.g. next/next) don't look identical.\n// `timeline` must come from the navigator (not `publication.timeline` directly) so it\n// stays the single source of truth across every module that reads it.\nexport const resolveChapterTitle = (\n timeline: Timeline,\n item: TimelineItem\n): string | undefined => {\n if (item.title !== undefined) return item.title;\n\n const href = timeline.linkFor(item)?.href;\n if (!href) return undefined;\n\n return walkPrecedingResources(timeline, href, (candidate, stepsBack) =>\n candidate.title !== undefined ? `${ candidate.title } (${ stepsBack + 1 })` : undefined\n );\n};\n","import { useEffect, useMemo } from \"react\";\n\nimport { Locator, Publication, Timeline, TimelineItem } from \"@readium/shared\";\nimport { SerializedLocator } from \"@/helpers/serializePositions\";\nimport { resolveChapterTitle } from \"@/helpers/timelineFallback\";\n\nexport interface ProgressionDetails {\n totalItems?: number;\n currentIndex?: number;\n totalPositions?: number;\n currentPositions?: number[];\n relativeProgression?: number;\n totalProgression?: number;\n currentChapter?: string;\n positionsLeft?: number;\n}\n\nexport interface Progress {\n title?: string;\n progression?: ProgressionDetails;\n}\n\ninterface PositionEntry {\n positionRange?: [number, number?];\n}\n\nexport const usePublicationProgress = ({\n publication,\n getNavigatorTimeline,\n currentTimelineItem,\n currentLocation,\n currentPositions,\n positionsList,\n onChange\n}: {\n publication: Publication | null;\n getNavigatorTimeline: () => Timeline | undefined;\n currentTimelineItem?: TimelineItem;\n currentLocation?: Locator;\n currentPositions?: number[];\n positionsList?: SerializedLocator[];\n onChange?: (progress: Progress) => void;\n}): Progress => {\n // Per-href position range table, derived once from positionsList — kept fully\n // decoupled from chapter/TOC resolution, which now comes from the real Timeline.\n const positionEntries = useMemo(() => {\n const entries: { [href: string]: PositionEntry } = {};\n if (!positionsList?.length) return entries;\n\n const readingOrder = publication?.readingOrder?.items || [];\n for (const item of readingOrder) {\n const positions = positionsList\n .filter(p => p.href === item.href)\n .sort((a, b) => (a.locations?.position || 0) - (b.locations?.position || 0));\n\n if (positions.length === 0) continue;\n\n const start = positions[0].locations;\n const end = positions.length > 1 ? positions[positions.length - 1].locations : start;\n\n entries[item.href] = {\n positionRange: start?.position !== undefined ? [start.position, end?.position] : undefined\n };\n }\n\n return entries;\n }, [publication, positionsList]);\n\n const navigatorTimeline = getNavigatorTimeline();\n\n const currentHref = currentLocation?.href;\n\n const currentIndex = currentHref\n ? publication?.readingOrder.items.findIndex(item => item.href === currentHref)\n : undefined;\n\n const currentChapter = currentTimelineItem && navigatorTimeline\n ? resolveChapterTitle(navigatorTimeline, currentTimelineItem)\n : undefined;\n\n const progress: Progress = useMemo(() => {\n const positionRange = currentHref ? positionEntries[currentHref]?.positionRange : undefined;\n const endPosition = positionRange?.[1];\n const currentPosition = currentPositions?.[0];\n\n return {\n title: publication?.metadata.title.getTranslation(\"en\"),\n progression: {\n totalItems: publication?.readingOrder.items.length,\n currentIndex: currentIndex !== undefined && currentIndex >= 0 ? currentIndex + 1 : undefined,\n totalPositions: positionsList?.length,\n currentPositions: currentPositions || [],\n relativeProgression: currentLocation?.locations.progression,\n totalProgression: currentLocation?.locations.totalProgression,\n currentChapter,\n positionsLeft: (!positionsList?.length || endPosition === undefined || currentPosition === undefined)\n ? undefined\n : Math.max(0, endPosition - currentPosition)\n }\n };\n }, [\n publication,\n currentChapter,\n currentHref,\n currentIndex,\n positionEntries,\n positionsList,\n currentPositions,\n currentLocation\n ]);\n\n useEffect(() => {\n if (onChange) onChange(progress);\n }, [progress, onChange]);\n\n return progress;\n};\n","import { useCallback } from \"react\";\n\nimport { Timeline, TimelineItem } from \"@readium/shared\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setAdjacentTimelineItems } from \"@/lib/publicationReducer\";\nimport { resolveChapterTitle } from \"@/helpers/timelineFallback\";\n\nexport const useTimelineAdjacency = (getNavigatorTimeline: () => Timeline | undefined) => {\n const dispatch = useAppDispatch();\n\n const updateAdjacentItems = useCallback((item: TimelineItem) => {\n const tl = getNavigatorTimeline();\n if (!tl) return;\n\n const { previous, next } = tl.navigableFrom(item);\n\n const previousHref = previous ? tl.linkFor(previous)?.href : undefined;\n const nextHref = next ? tl.linkFor(next)?.href : undefined;\n\n dispatch(setAdjacentTimelineItems({\n previous: previous && previousHref\n ? { title: resolveChapterTitle(tl, previous), href: previousHref }\n : null,\n next: next && nextHref\n ? { title: resolveChapterTitle(tl, next), href: nextHref }\n : null\n }));\n }, [dispatch, getNavigatorTimeline]);\n\n const clearAdjacentItems = useCallback(() => {\n dispatch(setAdjacentTimelineItems({ previous: null, next: null }));\n }, [dispatch]);\n\n return { updateAdjacentItems, clearAdjacentItems };\n};\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication,\n Timeline\n} from \"@readium/shared\";\nimport {\n AudioNavigator,\n AudioNavigatorListeners,\n AudioPreferences,\n IAudioPreferences,\n IAudioDefaults,\n IContentProtectionConfig,\n IKeyboardPeripheralsConfig,\n} from \"@readium/navigator\";\nimport { AudioSettings } from \"./useAudioSettingsCache\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: AudioNavigator | null = null;\n\nexport interface AudioNavigatorLoadProps {\n publication: Publication;\n listeners: AudioNavigatorListeners;\n initialPosition?: Locator;\n preferences?: IAudioPreferences;\n defaults?: IAudioDefaults;\n contentProtection?: IContentProtectionConfig;\n keyboardPeripherals?: IKeyboardPeripheralsConfig;\n audioContext?: AudioContext;\n}\n\nexport const useAudioNavigator = () => {\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IAudioPreferences) => {\n await navigatorInstance?.submitPreferences(new AudioPreferences(preferences));\n }, []);\n\n const getSetting = useCallback(<K extends keyof AudioSettings>(settingKey: K) => {\n return navigatorInstance?.settings?.[settingKey as keyof typeof navigatorInstance.settings];\n }, []);\n\n const AudioNavigatorLoad = useCallback((config: AudioNavigatorLoadProps, cb: Function) => {\n publication.current = config.publication;\n\n navigatorInstance = new AudioNavigator(\n config.publication,\n config.listeners,\n config.initialPosition,\n {\n preferences: config.preferences || {},\n defaults: config.defaults || {},\n contentProtection: config.contentProtection,\n keyboardPeripherals: config.keyboardPeripherals,\n }\n );\n\n cb();\n }, []);\n\n const AudioNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n navigatorInstance?.destroy();\n navigatorInstance = null;\n }, []);\n\n const play = useCallback(() => {\n navigatorInstance?.play();\n }, []);\n\n const pause = useCallback(() => {\n navigatorInstance?.pause();\n }, []);\n\n const stop = useCallback(() => {\n navigatorInstance?.stop();\n }, []);\n\n const seek = useCallback((time: number) => {\n navigatorInstance?.seek(time);\n }, []);\n\n const jump = useCallback((seconds: number) => {\n navigatorInstance?.jump(seconds);\n }, []);\n\n const skipForward = useCallback(() => {\n navigatorInstance?.skipForward();\n }, []);\n\n const skipBackward = useCallback(() => {\n navigatorInstance?.skipBackward();\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward || false;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward || false;\n }, []);\n\n const isTrackStart = useCallback(() => {\n return navigatorInstance?.isTrackStart || false;\n }, []);\n\n const isTrackEnd = useCallback(() => {\n return navigatorInstance?.isTrackEnd || false;\n }, []);\n\n const isPlaying = useCallback(() => {\n return navigatorInstance?.isPlaying || false;\n }, []);\n\n const isPaused = useCallback(() => {\n return navigatorInstance?.isPaused || false;\n }, []);\n\n const duration = useCallback(() => {\n return navigatorInstance?.duration || 0;\n }, []);\n\n const currentTime = useCallback(() => {\n return navigatorInstance?.currentTime || 0;\n }, []);\n\n const timeline = useCallback((): Timeline | undefined => {\n return navigatorInstance?.timeline;\n }, []);\n\n return {\n AudioNavigatorLoad, \n AudioNavigatorDestroy, \n play,\n pause,\n stop,\n seek,\n jump,\n skipForward,\n skipBackward,\n go, \n goLink, \n goForward,\n goBackward,\n currentLocator,\n canGoBackward,\n canGoForward,\n isTrackStart,\n isTrackEnd,\n isPlaying,\n isPaused,\n duration,\n currentTime,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n remotePlayback: (navigatorInstance as any)?.remotePlayback as RemotePlayback | undefined,\n getSetting,\n submitPreferences,\n timeline,\n }\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\n\nexport interface AudioSettings {\n volume: number;\n playbackRate: number;\n preservePitch: boolean;\n skipBackwardInterval: number;\n skipForwardInterval: number;\n skipInterval: number;\n pollInterval: number;\n autoPlay: boolean;\n enableMediaSession: boolean;\n}\n\nexport interface AudioSettingsCache {\n settings: AudioSettings;\n}\n\nexport const useAudioSettingsCache = (\n volume: number,\n playbackRate: number,\n preservePitch: boolean,\n skipBackwardInterval: number,\n skipForwardInterval: number,\n skipInterval: number,\n pollInterval: number,\n autoPlay: boolean,\n enableMediaSession: boolean\n) => {\n const cache = useRef<AudioSettingsCache>({\n settings: {\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n },\n }), [\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n ]);\n\n cache.current = memoizedCache;\n\n return cache;\n};\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication,\n Timeline\n} from \"@readium/shared\";\nimport { SerializedLocator } from \"@/helpers/serializePositions\";\nimport {\n EpubNavigator,\n EpubNavigatorListeners,\n EpubPreferences,\n EpubSettings,\n IContentProtectionConfig,\n IEpubDefaults,\n IEpubPreferences,\n IInjectablesConfig,\n IKeyboardPeripheralsConfig,\n getScriptMode,\n ScriptMode\n} from \"@readium/navigator\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: EpubNavigator | null = null;\n\nexport interface EpubNavigatorLoadProps {\n container: HTMLDivElement | null;\n publication: Publication;\n listeners: EpubNavigatorListeners;\n positionsList?: SerializedLocator[];\n initialPosition?: Locator;\n preferences?: IEpubPreferences;\n defaults?: IEpubDefaults;\n injectables?: IInjectablesConfig;\n contentProtection?: IContentProtectionConfig;\n keyboardPeripherals?: IKeyboardPeripheralsConfig;\n}\n\nexport const useEpubNavigator = () => {\n const container = useRef<HTMLDivElement | null>(null);\n const containerParent = useRef<HTMLElement | null>(null);\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IEpubPreferences) => {\n await navigatorInstance?.submitPreferences(new EpubPreferences(preferences));\n }, []);\n\n const getSetting = useCallback(<K extends keyof EpubSettings>(settingKey: K) => {\n return navigatorInstance?.settings[settingKey] as EpubSettings[K];\n }, []);\n\n const EpubNavigatorLoad = useCallback((config: EpubNavigatorLoadProps, cb: Function) => {\n if (config.container) {\n container.current = config.container;\n containerParent.current = container.current? container.current.parentElement : null;\n \n publication.current = config.publication;\n\n navigatorInstance = new EpubNavigator(\n config.container,\n config.publication,\n config.listeners,\n config.positionsList?.map((p) => Locator.deserialize(p)).filter((l): l is Locator => !!l),\n config.initialPosition,\n {\n preferences: config.preferences || {},\n defaults: config.defaults || {},\n injectables: config.injectables || undefined,\n contentProtection: config.contentProtection || undefined,\n keyboardPeripherals: config.keyboardPeripherals || [],\n }\n );\n\n navigatorInstance.load().then(() => {\n cb();\n });\n }\n }, []);\n\n const EpubNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n\n navigatorInstance?.destroy().then(() => {\n navigatorInstance = null; // Clear the singleton reference\n });\n }, []);\n\n const goRight = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goRight(animated, callback);\n }, []);\n\n const goLeft = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goLeft(animated, callback)\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const navLayout = useCallback(() => {\n return navigatorInstance?.layout;\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const currentPositions = useCallback(() => {\n return navigatorInstance?.viewport?.positions;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward;\n }, []);\n\n const isScrollStart = useCallback(() => {\n return navigatorInstance?.isScrollStart;\n }, []);\n\n const isScrollEnd = useCallback(() => {\n return navigatorInstance?.isScrollEnd;\n }, []);\n\n // Warning: this is an internal member that will become private, do not rely on it\n // See https://github.com/edrlab/thorium-web/issues/25\n const getCframes = useCallback(() => {\n return navigatorInstance?._cframes;\n }, []);\n\n const currentScriptMode = useCallback((): ScriptMode | undefined => {\n const metadata = navigatorInstance?.publication?.metadata;\n if (!metadata) return undefined;\n return getScriptMode(metadata);\n }, []);\n\n const timeline = useCallback((): Timeline | undefined => {\n return navigatorInstance?.timeline;\n }, []);\n\n return { \n EpubNavigatorLoad, \n EpubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n navLayout, \n currentLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode,\n timeline,\n }\n}","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { LineLengthStateObject, FontFamilyStateObject } from \"@/lib/settingsReducer\";\n\nexport interface ReadiumCSSSettings {\n columnCount: string;\n fontFamily: FontFamilyStateObject;\n fontSize: number;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineLength: LineLengthStateObject | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n scroll: boolean;\n textAlign: ThTextAlignOptions | null;\n textNormalization: boolean;\n theme?: string;\n wordSpacing: number | null;\n}\n\nexport interface EPubSettingsCache {\n settings: ReadiumCSSSettings;\n}\n\nexport const useEpubSettingsCache = (\n textAlign: ThTextAlignOptions | null,\n columnCount: string,\n fontFamily: FontFamilyStateObject,\n fontSize: number,\n fontWeight: number,\n hyphens: boolean | null,\n letterSpacing: number | null,\n ligatures: boolean | null,\n lineLength: LineLengthStateObject | null,\n lineHeight: ThLineHeightOptions | null,\n noRuby: boolean | null,\n paragraphIndent: number | null,\n paragraphSpacing: number | null,\n publisherStyles: boolean,\n scroll: boolean,\n textNormalization: boolean,\n wordSpacing: number | null,\n theme: string | undefined\n) => {\n const cache = useRef<EPubSettingsCache>({\n settings: {\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll: scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll: scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n },\n }), [\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\n\n return cache;\n};\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication,\n Timeline\n} from \"@readium/shared\";\nimport {\n ExperimentalWebPubNavigator,\n WebPubNavigatorListeners,\n WebPubPreferences,\n WebPubSettings,\n IWebPubDefaults,\n IWebPubPreferences,\n IInjectablesConfig,\n IContentProtectionConfig,\n IKeyboardPeripheralsConfig,\n getScriptMode,\n ScriptMode\n} from \"@readium/navigator\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: InstanceType<typeof ExperimentalWebPubNavigator> | null = null;\n\nexport interface WebPubNavigatorLoadProps {\n container: HTMLDivElement | null;\n publication: Publication;\n listeners: WebPubNavigatorListeners;\n initialPosition?: Locator;\n preferences?: IWebPubPreferences;\n defaults?: IWebPubDefaults;\n injectables?: IInjectablesConfig;\n contentProtection?: IContentProtectionConfig;\n keyboardPeripherals?: IKeyboardPeripheralsConfig;\n}\n\nexport const useWebPubNavigator = () => {\n const container = useRef<HTMLDivElement | null>(null);\n const containerParent = useRef<HTMLElement | null>(null);\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IWebPubPreferences) => {\n await navigatorInstance?.submitPreferences(new WebPubPreferences(preferences));\n }, []);\n \n const getSetting = useCallback(<K extends keyof WebPubSettings>(settingKey: K) => {\n return navigatorInstance?.settings[settingKey] as WebPubSettings[K];\n }, []);\n\n const WebPubNavigatorLoad = useCallback((config: WebPubNavigatorLoadProps, cb: Function) => {\n if (config.container) {\n container.current = config.container;\n containerParent.current = container.current?.parentElement || null;\n\n publication.current = config.publication;\n\n navigatorInstance = new ExperimentalWebPubNavigator(\n config.container, \n config.publication, \n config.listeners, \n config.initialPosition, \n {\n preferences: config.preferences || {},\n defaults: config.defaults || {},\n injectables: config.injectables || undefined,\n contentProtection: config.contentProtection || undefined,\n keyboardPeripherals: config.keyboardPeripherals || []\n }\n );\n\n navigatorInstance.load().then(() => {\n cb();\n });\n }\n }, []);\n\n const WebPubNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n navigatorInstance?.destroy().then(() => {\n navigatorInstance = null; // Clear the singleton reference\n });\n }, []);\n\n const goRight = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goRight(animated, callback);\n }, []);\n\n const goLeft = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goLeft(animated, callback);\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const currentPositions = useCallback(() => {\n return navigatorInstance?.viewport?.positions;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward;\n }, []);\n\n const isScrollStart = useCallback(() => {\n return navigatorInstance?.isScrollStart;\n }, []);\n\n const isScrollEnd = useCallback(() => {\n return navigatorInstance?.isScrollEnd;\n }, []);\n\n const getCframes = useCallback(() => {\n return navigatorInstance?._cframes;\n }, []);\n\n const currentScriptMode = useCallback((): ScriptMode | undefined => {\n const metadata = navigatorInstance?.publication?.metadata;\n if (!metadata) return undefined;\n return getScriptMode(metadata);\n }, []);\n\n const timeline = useCallback((): Timeline | undefined => {\n return navigatorInstance?.timeline;\n }, []);\n\n return {\n WebPubNavigatorLoad, \n WebPubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n currentLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode,\n timeline,\n }\n}","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { FontFamilyStateObject } from \"@/lib/settingsReducer\";\n\nexport interface WebPubCSSSettings {\n fontFamily: FontFamilyStateObject;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n textAlign: ThTextAlignOptions | null;\n textNormalization: boolean;\n wordSpacing: number | null;\n zoom: number;\n}\n\nexport interface WebPubStatelessCache {\n settings: WebPubCSSSettings;\n}\n\nexport const useWebPubSettingsCache = (\n fontFamily: FontFamilyStateObject,\n fontWeight: number,\n hyphens: boolean | null,\n letterSpacing: number | null,\n ligatures: boolean | null,\n lineHeight: ThLineHeightOptions | null,\n noRuby: boolean | null,\n paragraphIndent: number | null,\n paragraphSpacing: number | null,\n publisherStyles: boolean,\n textAlign: ThTextAlignOptions | null,\n textNormalization: boolean,\n wordSpacing: number | null,\n zoom: number\n) => {\n const cache = useRef<WebPubStatelessCache>({\n settings: {\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n },\n }), [\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\n\n return cache;\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useMediaQuery } from './chunk-
|
|
1
|
+
import { useMediaQuery } from './chunk-MFVZ5AEN.mjs';
|
|
2
2
|
import { useState, useMemo, useEffect } from 'react';
|
|
3
3
|
|
|
4
4
|
var useBreakpoints = (map, onChange) => {
|
|
@@ -120,5 +120,5 @@ var useMonochrome = (onChange) => {
|
|
|
120
120
|
};
|
|
121
121
|
|
|
122
122
|
export { useBreakpoints, useForcedColors, useMonochrome, useReducedMotion, useReducedTransparency };
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
124
|
-
//# sourceMappingURL=chunk-
|
|
123
|
+
//# sourceMappingURL=chunk-EREFYF5J.mjs.map
|
|
124
|
+
//# sourceMappingURL=chunk-EREFYF5J.mjs.map
|