@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.
Files changed (88) hide show
  1. package/dist/{ThPreferencesAdapter-B3a-f5v-.d.mts → ThPreferencesAdapter-GepvYoaL.d.mts} +4 -3
  2. package/dist/{ThSettingsWrapper-D4WIzlXA.d.mts → ThSettingsWrapper-DyYC678Q.d.mts} +1 -1
  3. package/dist/{actions-C33UN3Ji.d.mts → actions-CTg9C4C-.d.mts} +1 -1
  4. package/dist/{actionsReducer-Bzcj3wk3.d.mts → actionsReducer-Cnd7Cdh9.d.mts} +1 -1
  5. package/dist/{chunk-I572ZFCT.mjs → chunk-2YS5JTIR.mjs} +55 -35
  6. package/dist/chunk-2YS5JTIR.mjs.map +1 -0
  7. package/dist/{chunk-VYSDLACR.mjs → chunk-3R5JARA2.mjs} +3 -3
  8. package/dist/{chunk-VYSDLACR.mjs.map → chunk-3R5JARA2.mjs.map} +1 -1
  9. package/dist/{chunk-UOFADXXI.mjs → chunk-6DR4EAK3.mjs} +40 -47
  10. package/dist/chunk-6DR4EAK3.mjs.map +1 -0
  11. package/dist/chunk-7SMOXFAF.mjs +121 -0
  12. package/dist/chunk-7SMOXFAF.mjs.map +1 -0
  13. package/dist/{chunk-7A6UGSHQ.mjs → chunk-C6LWEQL2.mjs} +82 -69
  14. package/dist/chunk-C6LWEQL2.mjs.map +1 -0
  15. package/dist/{chunk-AEEGHJVM.mjs → chunk-CXKDZVAV.mjs} +113 -258
  16. package/dist/chunk-CXKDZVAV.mjs.map +1 -0
  17. package/dist/{chunk-GFSLVQIG.mjs → chunk-EREFYF5J.mjs} +3 -3
  18. package/dist/{chunk-GFSLVQIG.mjs.map → chunk-EREFYF5J.mjs.map} +1 -1
  19. package/dist/{chunk-G2M4MYVF.mjs → chunk-I765HTBI.mjs} +15 -109
  20. package/dist/chunk-I765HTBI.mjs.map +1 -0
  21. package/dist/{chunk-7AHUCM7Z.mjs → chunk-JXHRUQKP.mjs} +39 -16
  22. package/dist/chunk-JXHRUQKP.mjs.map +1 -0
  23. package/dist/{chunk-NJOWH5YK.mjs → chunk-MBWYHA4U.mjs} +43 -48
  24. package/dist/chunk-MBWYHA4U.mjs.map +1 -0
  25. package/dist/{chunk-NQ2ZSGCX.mjs → chunk-MFVZ5AEN.mjs} +7 -3
  26. package/dist/chunk-MFVZ5AEN.mjs.map +1 -0
  27. package/dist/{chunk-2YRT7RNW.mjs → chunk-QOU3R5ZT.mjs} +9 -3
  28. package/dist/chunk-QOU3R5ZT.mjs.map +1 -0
  29. package/dist/{chunk-N6MQQMTM.mjs → chunk-TNXLY2ZQ.mjs} +41 -18
  30. package/dist/chunk-TNXLY2ZQ.mjs.map +1 -0
  31. package/dist/components/Audio/index.d.mts +13 -13
  32. package/dist/components/Audio/index.mjs +10 -11
  33. package/dist/components/Epub/index.d.mts +13 -13
  34. package/dist/components/Epub/index.mjs +11 -12
  35. package/dist/components/Reader/index.d.mts +12 -12
  36. package/dist/components/Reader/index.mjs +18 -18
  37. package/dist/components/WebPub/index.d.mts +13 -13
  38. package/dist/components/WebPub/index.mjs +11 -12
  39. package/dist/core/Components/index.d.mts +6 -6
  40. package/dist/core/Helpers/index.d.mts +4 -4
  41. package/dist/core/Helpers/index.mjs +2 -2
  42. package/dist/core/Hooks/index.d.mts +14 -9
  43. package/dist/core/Hooks/index.mjs +4 -4
  44. package/dist/lib/index.d.mts +38 -27
  45. package/dist/lib/index.mjs +3 -4
  46. package/dist/locales/ar/thorium-shared.json +39 -0
  47. package/dist/locales/bg/thorium-web.json +23 -0
  48. package/dist/locales/brh/thorium-shared.json +1 -0
  49. package/dist/locales/brh/thorium-web.json +1 -0
  50. package/dist/locales/da/thorium-shared.json +3 -0
  51. package/dist/locales/el/thorium-web.json +41 -6
  52. package/dist/locales/en/thorium-shared.json +3 -0
  53. package/dist/locales/es/thorium-shared.json +3 -0
  54. package/dist/locales/et/thorium-shared.json +3 -0
  55. package/dist/locales/fi/thorium-shared.json +3 -0
  56. package/dist/locales/fi/thorium-web.json +3 -3
  57. package/dist/locales/fr/thorium-shared.json +3 -0
  58. package/dist/locales/he/thorium-shared.json +3 -1
  59. package/dist/locales/it/thorium-shared.json +3 -0
  60. package/dist/locales/lt/thorium-shared.json +36 -10
  61. package/dist/locales/pt-PT/thorium-shared.json +8 -5
  62. package/dist/locales/sv/thorium-shared.json +3 -3
  63. package/dist/locales/tr/thorium-shared.json +80 -0
  64. package/dist/preferences/index.d.mts +10 -10
  65. package/dist/preferences/index.mjs +4 -5
  66. package/dist/{settingsReducer-Pp9aoiiC.d.mts → settingsReducer-DRWEq8Cm.d.mts} +1 -1
  67. package/dist/{ui-DnZZhozX.d.mts → ui-DHQ_zvWn.d.mts} +7 -1
  68. package/dist/{useAudioNavigator-9RuOpLGB.d.mts → useAudioNavigator-B4NBPvmZ.d.mts} +4 -5
  69. package/dist/{useContrast-Bl08zDTU.d.mts → useContrast-Unp3534Z.d.mts} +1 -1
  70. package/dist/{usePreferences-Cy7-JN2x.d.mts → usePreferences-Bi-ptif0.d.mts} +6 -9
  71. package/dist/usePublicationProgress-DT-X5ZLf.d.mts +44 -0
  72. package/dist/{useReaderTransitions-BsTdWZDK.d.mts → useReaderTransitions-B9fOF61y.d.mts} +10 -14
  73. package/package.json +23 -15
  74. package/dist/chunk-2YRT7RNW.mjs.map +0 -1
  75. package/dist/chunk-7A6UGSHQ.mjs.map +0 -1
  76. package/dist/chunk-7AHUCM7Z.mjs.map +0 -1
  77. package/dist/chunk-A575ZW4A.mjs +0 -10
  78. package/dist/chunk-A575ZW4A.mjs.map +0 -1
  79. package/dist/chunk-AEEGHJVM.mjs.map +0 -1
  80. package/dist/chunk-G2M4MYVF.mjs.map +0 -1
  81. package/dist/chunk-I572ZFCT.mjs.map +0 -1
  82. package/dist/chunk-N6MQQMTM.mjs.map +0 -1
  83. package/dist/chunk-NJOWH5YK.mjs.map +0 -1
  84. package/dist/chunk-NQ2ZSGCX.mjs.map +0 -1
  85. package/dist/chunk-TEZB4ULX.mjs +0 -57
  86. package/dist/chunk-TEZB4ULX.mjs.map +0 -1
  87. package/dist/chunk-UOFADXXI.mjs.map +0 -1
  88. package/dist/useTimeline-DCZ1qoCO.d.mts +0 -55
@@ -1,8 +1,9 @@
1
- import { toEntryRef, buildTocTree } from './chunk-TEZB4ULX.mjs';
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
- var timelineInstance;
97
- var useTimeline = ({
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 layout = publication?.metadata.effectiveLayout || Layout.reflowable;
105
- const [timelineItems, setTimelineItems] = useState({});
106
- const [tocTree, setTocTree] = useState([]);
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 timelineItem = timelineItems2[item.href];
247
- if (!timelineItem) continue;
248
- const positions = positionsList ? positionsList.filter((p) => p.href === item.href).sort((a, b) => (a.locations.position || 0) - (b.locations.position || 0)) : [];
249
- if (positions.length > 0) {
250
- const start = positions[0].locations;
251
- const end = positions.length > 1 ? positions[positions.length - 1].locations : start;
252
- timelineItem.positionRange = start.position !== void 0 ? [start.position, end.position] : void 0;
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 timelineItems2;
145
+ return entries;
258
146
  }, [publication, positionsList]);
259
- const updateTimelineItems = useCallback((currentLoc) => {
260
- if (!currentLoc || !timelineItems) {
261
- setPreviousItem(null);
262
- setNextItem(null);
263
- setCurrentItem(null);
264
- return;
265
- }
266
- const currentItem2 = timelineItems[currentLoc.href];
267
- if (!currentItem2) {
268
- setPreviousItem(null);
269
- setNextItem(null);
270
- setCurrentItem(null);
271
- return;
272
- }
273
- setCurrentItem(currentItem2);
274
- const timelineItemsArray = Object.values(timelineItems);
275
- const currentIndex = timelineItemsArray.findIndex((item) => item.href === currentLoc.href);
276
- if (currentIndex === -1) {
277
- setPreviousItem(null);
278
- setNextItem(null);
279
- } else {
280
- setPreviousItem(currentIndex > 0 ? timelineItemsArray[currentIndex - 1] : null);
281
- setNextItem(currentIndex < timelineItemsArray.length - 1 ? timelineItemsArray[currentIndex + 1] : null);
282
- }
283
- }, [timelineItems]);
284
- useEffect(() => {
285
- if (!publication) return;
286
- const idGenerator = () => `toc-${++idCounterRef.current}`;
287
- const tocItems = publication.toc?.items && publication.toc.items.length > 0 ? publication.toc.items : publication.readingOrder?.items || [];
288
- const publicationTitle = publication?.metadata.title.getTranslation("en");
289
- setTocTree(buildTocTree(tocItems, idGenerator, positionsList, publicationTitle));
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
- timelineInstance = timeline;
305
- if (onChange) {
306
- onChange(timeline);
307
- }
308
- }, [timeline, onChange]);
309
- return timeline;
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: useCallback(() => navigatorInstance?.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 { timelineInstance, useAudioNavigator, useAudioSettingsCache, useDocumentTitle, useEpubNavigator, useEpubSettingsCache, useFullscreen, useIsClient, useLocalStorage, useObservableCondition, useTimeline, useWebPubNavigator, useWebPubSettingsCache };
857
- //# sourceMappingURL=chunk-AEEGHJVM.mjs.map
858
- //# sourceMappingURL=chunk-AEEGHJVM.mjs.map
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-NQ2ZSGCX.mjs';
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-GFSLVQIG.mjs.map
124
- //# sourceMappingURL=chunk-GFSLVQIG.mjs.map
123
+ //# sourceMappingURL=chunk-EREFYF5J.mjs.map
124
+ //# sourceMappingURL=chunk-EREFYF5J.mjs.map