@edrlab/thorium-web 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-GRYEOCGD.mjs → chunk-2B3HE57E.mjs} +36 -49
- package/dist/chunk-2B3HE57E.mjs.map +1 -0
- package/dist/{chunk-BBCSLDQT.mjs → chunk-3ITHCTDL.mjs} +61 -66
- package/dist/chunk-3ITHCTDL.mjs.map +1 -0
- package/dist/{chunk-PRQBFBJ7.mjs → chunk-3VB756GR.mjs} +19 -8
- package/dist/chunk-3VB756GR.mjs.map +1 -0
- package/dist/{chunk-ZD4LTF6G.mjs → chunk-AXX4U2FW.mjs} +25 -133
- package/dist/chunk-AXX4U2FW.mjs.map +1 -0
- package/dist/{chunk-2T65MDBR.mjs → chunk-CCHCCVSF.mjs} +3 -3
- package/dist/{chunk-2T65MDBR.mjs.map → chunk-CCHCCVSF.mjs.map} +1 -1
- package/dist/{chunk-63LKYJFG.mjs → chunk-J6XDICU2.mjs} +45 -15
- package/dist/chunk-J6XDICU2.mjs.map +1 -0
- package/dist/chunk-KQ3KS5O5.mjs +37 -0
- package/dist/chunk-KQ3KS5O5.mjs.map +1 -0
- package/dist/{chunk-DQDOOTCE.mjs → chunk-KT2QY5QU.mjs} +3 -3
- package/dist/{chunk-DQDOOTCE.mjs.map → chunk-KT2QY5QU.mjs.map} +1 -1
- package/dist/{chunk-Y5X74VW7.mjs → chunk-KXOIN35D.mjs} +9 -9
- package/dist/{chunk-Y5X74VW7.mjs.map → chunk-KXOIN35D.mjs.map} +1 -1
- package/dist/{chunk-BCXKBHU3.mjs → chunk-MTH2RF6V.mjs} +30 -15
- package/dist/chunk-MTH2RF6V.mjs.map +1 -0
- package/dist/{chunk-KJ55Q63A.mjs → chunk-THOJRBVD.mjs} +208 -59
- package/dist/chunk-THOJRBVD.mjs.map +1 -0
- package/dist/{chunk-VENFFPK2.mjs → chunk-VYSDLACR.mjs} +2 -2
- package/dist/{chunk-VENFFPK2.mjs.map → chunk-VYSDLACR.mjs.map} +1 -1
- package/dist/{chunk-KOR74F6M.mjs → chunk-X63WSMOH.mjs} +4 -36
- package/dist/chunk-X63WSMOH.mjs.map +1 -0
- package/dist/{chunk-PAFJZH7O.mjs → chunk-YE5QOQUT.mjs} +3 -3
- package/dist/{chunk-PAFJZH7O.mjs.map → chunk-YE5QOQUT.mjs.map} +1 -1
- package/dist/components/Audio/index.d.mts +3 -3
- package/dist/components/Audio/index.mjs +13 -12
- package/dist/components/Epub/index.d.mts +3 -3
- package/dist/components/Epub/index.mjs +14 -13
- package/dist/components/Misc/index.mjs +4 -4
- package/dist/components/Reader/index.d.mts +2 -2
- package/dist/components/Reader/index.mjs +20 -19
- package/dist/components/Reader/index.mjs.map +1 -1
- package/dist/components/WebPub/index.d.mts +3 -3
- package/dist/components/WebPub/index.mjs +14 -13
- package/dist/core/Components/index.d.mts +4 -20
- package/dist/core/Components/index.mjs +1 -1
- package/dist/core/Helpers/index.mjs +3 -2
- package/dist/core/Hooks/index.d.mts +10 -4
- package/dist/core/Hooks/index.mjs +2 -1
- package/dist/i18n/index.mjs +2 -2
- package/dist/lib/index.mjs +3 -2
- package/dist/locales/da/thorium-shared.json +217 -10
- package/dist/locales/he/thorium-shared.json +8 -0
- package/dist/locales/it/thorium-shared.json +2 -2
- package/dist/locales/it/thorium-web.json +3 -3
- package/dist/locales/lt/thorium-shared.json +85 -1
- package/dist/locales/sv/thorium-shared.json +5 -5
- package/dist/preferences/index.d.mts +2 -0
- package/dist/preferences/index.mjs +4 -3
- package/dist/{useAudioNavigator-pGwxhXLj.d.mts → useAudioNavigator-9RuOpLGB.d.mts} +4 -4
- package/dist/{useReaderTransitions-Zvomj9RQ.d.mts → useReaderTransitions-CpgrXS5g.d.mts} +25 -6
- package/package.json +5 -5
- package/dist/chunk-63LKYJFG.mjs.map +0 -1
- package/dist/chunk-BBCSLDQT.mjs.map +0 -1
- package/dist/chunk-BCXKBHU3.mjs.map +0 -1
- package/dist/chunk-GRYEOCGD.mjs.map +0 -1
- package/dist/chunk-KJ55Q63A.mjs.map +0 -1
- package/dist/chunk-KOR74F6M.mjs.map +0 -1
- package/dist/chunk-PRQBFBJ7.mjs.map +0 -1
- package/dist/chunk-ZD4LTF6G.mjs.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { toEntryRef, buildTocTree } from './chunk-TEZB4ULX.mjs';
|
|
2
|
-
import {
|
|
2
|
+
import { isIOSish } from './chunk-KQ3KS5O5.mjs';
|
|
3
|
+
import { useEffect, useState, useRef, useCallback, useMemo } from 'react';
|
|
3
4
|
import { Layout, Link, Locator } from '@readium/shared';
|
|
4
5
|
import { AudioPreferences, AudioNavigator, EpubPreferences, EpubNavigator, getScriptMode, WebPubPreferences, ExperimentalWebPubNavigator } from '@readium/navigator';
|
|
5
6
|
|
|
@@ -10,24 +11,27 @@ var useDocumentTitle = (title) => {
|
|
|
10
11
|
};
|
|
11
12
|
var useIsClient = () => {
|
|
12
13
|
const [isClient, setIsClient] = useState(false);
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
const isClientRef = useRef(false);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
isClientRef.current = true;
|
|
17
|
+
setIsClient(true);
|
|
15
18
|
}, []);
|
|
16
|
-
return isClient;
|
|
19
|
+
return { isClient, isClientRef };
|
|
17
20
|
};
|
|
18
21
|
|
|
19
22
|
// src/core/Hooks/useFullscreen.ts
|
|
20
23
|
var useFullscreen = (onChange) => {
|
|
21
24
|
const [isFullscreen, setIsFullscreen] = useState(false);
|
|
22
|
-
const isClient = useIsClient();
|
|
25
|
+
const { isClient, isClientRef } = useIsClient();
|
|
26
|
+
const isSupported = isClient && !isIOSish() && Boolean(document.fullscreenEnabled);
|
|
23
27
|
const handleFullscreen = useCallback(() => {
|
|
24
|
-
if (!
|
|
28
|
+
if (!isClientRef.current || isIOSish()) return;
|
|
25
29
|
if (!document.fullscreenElement) {
|
|
26
30
|
document.documentElement.requestFullscreen();
|
|
27
31
|
} else if (document.exitFullscreen) {
|
|
28
32
|
document.exitFullscreen();
|
|
29
33
|
}
|
|
30
|
-
}, [
|
|
34
|
+
}, [isClientRef]);
|
|
31
35
|
useEffect(() => {
|
|
32
36
|
const onFSchange = () => {
|
|
33
37
|
const isFs = Boolean(document.fullscreenElement);
|
|
@@ -39,10 +43,7 @@ var useFullscreen = (onChange) => {
|
|
|
39
43
|
document.removeEventListener("fullscreenchange", onFSchange);
|
|
40
44
|
};
|
|
41
45
|
}, [onChange]);
|
|
42
|
-
return {
|
|
43
|
-
isFullscreen,
|
|
44
|
-
handleFullscreen
|
|
45
|
-
};
|
|
46
|
+
return { isFullscreen, isSupported, handleFullscreen };
|
|
46
47
|
};
|
|
47
48
|
var useLocalStorage = (key) => {
|
|
48
49
|
const [localData, setLocalData] = useState(null);
|
|
@@ -75,6 +76,23 @@ var useLocalStorage = (key) => {
|
|
|
75
76
|
cachedLocalData
|
|
76
77
|
};
|
|
77
78
|
};
|
|
79
|
+
var useObservableCondition = (value) => {
|
|
80
|
+
const listeners = useRef(/* @__PURE__ */ new Set());
|
|
81
|
+
const current = useRef(value);
|
|
82
|
+
const condition = useRef({
|
|
83
|
+
subscribe(cb) {
|
|
84
|
+
listeners.current.add(cb);
|
|
85
|
+
cb(current.current);
|
|
86
|
+
return () => listeners.current.delete(cb);
|
|
87
|
+
}
|
|
88
|
+
}).current;
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (current.current === value) return;
|
|
91
|
+
current.current = value;
|
|
92
|
+
listeners.current.forEach((cb) => cb(value));
|
|
93
|
+
}, [value]);
|
|
94
|
+
return condition;
|
|
95
|
+
};
|
|
78
96
|
var timelineInstance;
|
|
79
97
|
var useTimeline = ({
|
|
80
98
|
publication,
|
|
@@ -460,30 +478,11 @@ var useEpubNavigator = () => {
|
|
|
460
478
|
const getSetting = useCallback((settingKey) => {
|
|
461
479
|
return navigatorInstance2?.settings[settingKey];
|
|
462
480
|
}, []);
|
|
463
|
-
const
|
|
464
|
-
const FXLPositionChanged = useMemo(() => {
|
|
465
|
-
return new MutationObserver((mutationsList) => {
|
|
466
|
-
for (const mutation of mutationsList) {
|
|
467
|
-
const re = /translate3d\(([^)]+)\)/;
|
|
468
|
-
const newVal = mutation.target.getAttribute(mutation.attributeName);
|
|
469
|
-
const oldVal = mutation.oldValue;
|
|
470
|
-
if (newVal?.split(re)[1] !== oldVal?.split(re)[1]) {
|
|
471
|
-
const locator = navigatorInstance2?.currentLocator;
|
|
472
|
-
if (locator && FXLPositionChangedCallbackRef.current) {
|
|
473
|
-
FXLPositionChangedCallbackRef.current(locator);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
});
|
|
478
|
-
}, []);
|
|
479
|
-
const EpubNavigatorLoad = useCallback((config, cb, fxlCallback) => {
|
|
481
|
+
const EpubNavigatorLoad = useCallback((config, cb) => {
|
|
480
482
|
if (config.container) {
|
|
481
483
|
container.current = config.container;
|
|
482
484
|
containerParent.current = container.current ? container.current.parentElement : null;
|
|
483
485
|
publication.current = config.publication;
|
|
484
|
-
if (fxlCallback) {
|
|
485
|
-
FXLPositionChangedCallbackRef.current = fxlCallback;
|
|
486
|
-
}
|
|
487
486
|
navigatorInstance2 = new EpubNavigator(
|
|
488
487
|
config.container,
|
|
489
488
|
config.publication,
|
|
@@ -500,24 +499,15 @@ var useEpubNavigator = () => {
|
|
|
500
499
|
);
|
|
501
500
|
navigatorInstance2.load().then(() => {
|
|
502
501
|
cb();
|
|
503
|
-
if (navigatorInstance2?.layout === Layout.fixed) {
|
|
504
|
-
FXLPositionChanged.observe(navigatorInstance2?.pool.spineElement, {
|
|
505
|
-
attributeFilter: ["style"],
|
|
506
|
-
attributeOldValue: true
|
|
507
|
-
});
|
|
508
|
-
}
|
|
509
502
|
});
|
|
510
503
|
}
|
|
511
|
-
}, [
|
|
504
|
+
}, []);
|
|
512
505
|
const EpubNavigatorDestroy = useCallback((cb) => {
|
|
513
506
|
cb();
|
|
514
|
-
if (navigatorInstance2?.layout === Layout.fixed) {
|
|
515
|
-
FXLPositionChanged.disconnect();
|
|
516
|
-
}
|
|
517
507
|
navigatorInstance2?.destroy().then(() => {
|
|
518
508
|
navigatorInstance2 = null;
|
|
519
509
|
});
|
|
520
|
-
}, [
|
|
510
|
+
}, []);
|
|
521
511
|
const goRight = useCallback((animated, callback) => {
|
|
522
512
|
navigatorInstance2?.goRight(animated, callback);
|
|
523
513
|
}, []);
|
|
@@ -608,10 +598,7 @@ var useEpubNavigator = () => {
|
|
|
608
598
|
getSetting,
|
|
609
599
|
submitPreferences,
|
|
610
600
|
getCframes,
|
|
611
|
-
getScriptMode: currentScriptMode
|
|
612
|
-
onFXLPositionChange: (cb) => {
|
|
613
|
-
FXLPositionChangedCallbackRef.current = cb;
|
|
614
|
-
}
|
|
601
|
+
getScriptMode: currentScriptMode
|
|
615
602
|
};
|
|
616
603
|
};
|
|
617
604
|
var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWeight, hyphens, letterSpacing, ligatures, lineLength, lineHeight, noRuby, paragraphIndent, paragraphSpacing, publisherStyles, scroll, textNormalization, wordSpacing, theme) => {
|
|
@@ -866,6 +853,6 @@ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, li
|
|
|
866
853
|
return cache;
|
|
867
854
|
};
|
|
868
855
|
|
|
869
|
-
export { timelineInstance, useAudioNavigator, useAudioSettingsCache, useDocumentTitle, useEpubNavigator, useEpubSettingsCache, useFullscreen, useIsClient, useLocalStorage, useTimeline, useWebPubNavigator, useWebPubSettingsCache };
|
|
870
|
-
//# sourceMappingURL=chunk-
|
|
871
|
-
//# sourceMappingURL=chunk-
|
|
856
|
+
export { timelineInstance, useAudioNavigator, useAudioSettingsCache, useDocumentTitle, useEpubNavigator, useEpubSettingsCache, useFullscreen, useIsClient, useLocalStorage, useObservableCondition, useTimeline, useWebPubNavigator, useWebPubSettingsCache };
|
|
857
|
+
//# sourceMappingURL=chunk-2B3HE57E.mjs.map
|
|
858
|
+
//# sourceMappingURL=chunk-2B3HE57E.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/core/Hooks/useTimeline.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","timelineItems","currentItem","useMemo","navigatorInstance","currentLocator","getScriptMode"],"mappings":"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","file":"chunk-2B3HE57E.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 { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\n\nimport { Layout, Link, Locator, Publication } from \"@readium/shared\";\nimport { TocItem, TocEntryRef, buildTocTree, toEntryRef } from \"@/helpers/buildTocTree\";\n\nexport type { TocItem, TocEntryRef } from \"@/helpers/buildTocTree\";\n\nexport interface TimelineItem {\n href: string;\n readingOrderIndex?: number;\n title?: string;\n fragments?: string[];\n positionRange?: [number, number?];\n progressionRange?: [number, number?];\n totalProgressionRange?: [number, number?];\n children?: TimelineItem[];\n}\n\nexport interface TimelineProgression {\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 UnstableTimeline {\n title?: string;\n items?: {\n [href: string]: TimelineItem;\n };\n toc?: {\n tree?: TocItem[];\n currentEntry?: TocEntryRef | null;\n };\n currentItem?: TimelineItem | null;\n previousItem?: TimelineItem | null;\n nextItem?: TimelineItem | null;\n progression?: TimelineProgression;\n}\n\nexport let timelineInstance: UnstableTimeline | undefined;\n\nexport const useTimeline = ({\n publication, \n currentLocation, \n currentPositions,\n positionsList,\n onChange\n}: {\n publication: Publication | null, \n currentLocation?: Locator, \n currentPositions?: number[],\n positionsList?: Locator[],\n onChange?: (timeline: UnstableTimeline) => void\n}): UnstableTimeline => {\n const layout = publication?.metadata.effectiveLayout || Layout.reflowable;\n\n const [timelineItems, setTimelineItems] = useState<{ [href: string]: TimelineItem }>({});\n const [tocTree, setTocTree] = useState<TocItem[]>([]);\n const [currentTocEntry, setCurrentTocEntry] = useState<TocEntryRef | null>(null);\n const [currentItem, setCurrentItem] = useState<TimelineItem | null>(null);\n const [previousItem, setPreviousItem] = useState<TimelineItem | null>(null);\n const [nextItem, setNextItem] = useState<TimelineItem | null>(null);\n\n const [relativeProgression, setRelativeProgression] = useState<number | undefined>(undefined);\n const [totalProgression, setTotalProgression] = useState<number | undefined>(undefined);\n\n const idCounterRef = useRef(0);\n\n // Create the timeline object\n const timeline = useMemo(() => ({\n title: publication?.metadata.title.getTranslation(\"en\"),\n items: timelineItems,\n toc: {\n tree: tocTree,\n currentEntry: currentTocEntry\n },\n currentItem,\n previousItem,\n nextItem,\n progression: {\n totalItems: publication?.readingOrder.items.length,\n currentIndex: currentItem?.readingOrderIndex !== undefined ? currentItem.readingOrderIndex + 1 : undefined,\n totalPositions: positionsList?.length,\n currentPositions: currentPositions || [],\n relativeProgression: relativeProgression,\n totalProgression: totalProgression,\n currentChapter: currentItem?.title,\n positionsLeft: (() => {\n const endPosition = currentItem?.positionRange?.[1];\n const currentPosition = currentPositions?.[0];\n \n // Only calculate positionsLeft if we have all required position data\n if (!positionsList?.length || endPosition === undefined || currentPosition === undefined) {\n return undefined;\n }\n \n return Math.max(0, endPosition - currentPosition);\n })()\n }\n }), [\n publication?.metadata.title,\n publication?.readingOrder.items,\n timelineItems,\n tocTree,\n currentTocEntry,\n currentItem,\n previousItem,\n nextItem,\n positionsList,\n currentPositions,\n relativeProgression,\n totalProgression\n ]);\n\n\n const handleTocEntryOnNav = useCallback((locator?: Locator, currentPos?: number[]) => {\n if (!locator || !tocTree.length) return;\n\n const findMatch = (items: TocItem[], link?: Link): TocItem | undefined => {\n for (const item of items) {\n if (item.href === link?.href) {\n return item;\n }\n if (item.children) {\n const match = findMatch(item.children, link);\n if (match) return match;\n }\n }\n return undefined;\n };\n\n const currentMatch = findMatch(tocTree, new Link(locator));\n if (currentMatch) {\n setCurrentTocEntry(prev => prev?.id === currentMatch.id ? prev : toEntryRef(currentMatch));\n return;\n }\n\n // If we're in FXL and didn't find a match, try to find a match for the other position in the spread\n if (layout === Layout.fixed) {\n if (currentPos && currentPos.length === 2) {\n const otherPosition = currentPos[0] === locator.locations.position ? currentPos[1] : currentPos[0];\n const otherPositionInList = positionsList?.find((pos: Locator) => pos.locations.position === otherPosition);\n if (otherPositionInList) {\n const match = findMatch(tocTree, new Link(otherPositionInList));\n if (match) {\n setCurrentTocEntry(prev => prev?.id === match.id ? prev : toEntryRef(match));\n return;\n }\n }\n }\n }\n\n // If no match, try to find a match for other positions\n const otherPositions = currentPos?.filter(pos => pos !== locator.locations.position) || [];\n for (const otherPosition of otherPositions) {\n const otherPositionInList = positionsList?.find((pos: Locator) => pos.locations.position === otherPosition);\n if (otherPositionInList) {\n const match = findMatch(tocTree, new Link(otherPositionInList));\n if (match) {\n setCurrentTocEntry(prev => prev?.id === match.id ? prev : toEntryRef(match));\n return;\n }\n }\n }\n }, [tocTree, layout, positionsList]);\n\n const buildTimelineItems = useCallback(() => {\n const timelineItems: { [href: string]: TimelineItem } = {};\n const readingOrder = publication?.readingOrder?.items || [];\n const toc = publication?.toc?.items && publication?.toc?.items.length > 0\n ? publication.toc.items\n : publication?.readingOrder?.items || [];\n const flatToc = toc.flatMap(t => [t, ...(t.children?.items || [])]);\n \n // Helper function to get URL base (without params and fragment)\n const getBaseUrl = (url: string): string => {\n const [base] = url.split(\"#\");\n const [path] = base.split(\"?\");\n return path;\n };\n\n // Function to find the first non-empty title by searching backward \n // in flatToc from the current item\"s position\n // The issue with this fallback is that for progressionOfResource\n // the progression is effectively scoped to the reading order item\n // so we have to differentiate using the index \n const findNearestTitle = (currentHref: string): string => {\n const currentIndex = readingOrder.findIndex(item => getBaseUrl(item.href) === getBaseUrl(currentHref));\n \n if (currentIndex === -1) return \"\";\n \n for (let i = currentIndex; i >= 0; i--) {\n const item = readingOrder[i];\n // Find matching TOC items for this reading order item\n const matchingTocItems = flatToc.filter(t => \n getBaseUrl(t.href) === getBaseUrl(item.href)\n );\n \n // If we have a matching TOC item with a title, return it with the difference in indices\n const title = matchingTocItems[0]?.title?.trim();\n if (title) {\n const diff = currentIndex - i;\n return diff > 0 ? `${ title } (${ diff + 1 })` : title;\n }\n }\n \n return \"\";\n };\n\n // Process reading order items\n readingOrder.forEach((item, index) => {\n // Find all matching TOC items (with or without fragment)\n const matchingTocItems = flatToc.filter(t => {\n const baseHref = getBaseUrl(t.href);\n const baseItemHref = getBaseUrl(item.href);\n return baseHref === baseItemHref;\n });\n\n // Create timeline item with all matching titles\n const timelineItem: TimelineItem = {\n href: item.href,\n readingOrderIndex: index,\n title: item.title || matchingTocItems[0]?.title || findNearestTitle(item.href),\n fragments: matchingTocItems\n .map(t => t.href.split(\"#\")[1])\n .filter(Boolean),\n children: matchingTocItems[0]?.children?.items?.map(child => ({\n // We do not care about index for children\n // since currentLocation is guaranteed to be in the reading order\n title: child.title,\n href: child.href\n })) || []\n };\n\n timelineItems[item.href] = timelineItem;\n });\n \n // Then add position and progression information from positionsList\n for (const item of readingOrder) {\n const timelineItem = timelineItems[item.href];\n if (!timelineItem) continue;\n\n const positions = positionsList\n ? positionsList\n .filter(p => p.href === item.href)\n .sort((a, b) => (a.locations.position || 0) - (b.locations.position || 0))\n : [];\n \n if (positions.length > 0) {\n const start = positions[0].locations;\n // For single position, use the same location for start and end\n const end = positions.length > 1 \n ? positions[positions.length - 1].locations \n : start; // Use start as end for single position\n \n timelineItem.positionRange = start.position !== undefined \n ? [start.position, end.position]\n : undefined;\n \n timelineItem.progressionRange = start.progression !== undefined \n ? [start.progression, end.progression]\n : undefined;\n \n timelineItem.totalProgressionRange = start.totalProgression !== undefined \n ? [start.totalProgression, end.totalProgression]\n : undefined;\n }\n }\n\n return timelineItems;\n }, [publication, positionsList]);\n\n const updateTimelineItems = useCallback((currentLoc?: Locator) => {\n if (!currentLoc || !timelineItems) {\n setPreviousItem(null);\n setNextItem(null);\n setCurrentItem(null);\n return;\n }\n\n const currentItem = timelineItems[currentLoc.href];\n if (!currentItem) {\n setPreviousItem(null);\n setNextItem(null);\n setCurrentItem(null);\n return;\n }\n\n setCurrentItem(currentItem);\n\n const timelineItemsArray = Object.values(timelineItems);\n const currentIndex = timelineItemsArray.findIndex(item => item.href === currentLoc.href);\n\n if (currentIndex === -1) {\n setPreviousItem(null);\n setNextItem(null);\n } else {\n setPreviousItem(currentIndex > 0 ? timelineItemsArray[currentIndex - 1] : null);\n setNextItem(currentIndex < timelineItemsArray.length - 1 ? timelineItemsArray[currentIndex + 1] : null);\n }\n }, [timelineItems]);\n\n useEffect(() => {\n if (!publication) return;\n\n const idGenerator = () => `toc-${ ++idCounterRef.current }`;\n const tocItems = publication.toc?.items && publication.toc.items.length > 0\n ? publication.toc.items\n : publication.readingOrder?.items || [];\n const publicationTitle = publication?.metadata.title.getTranslation(\"en\");\n setTocTree(buildTocTree(tocItems, idGenerator, positionsList, publicationTitle));\n setTimelineItems(buildTimelineItems());\n }, [publication, positionsList, buildTimelineItems]);\n\n useEffect(() => {\n if (!tocTree.length || !timelineItems) return;\n\n // If we have a current location, use it\n if (currentLocation) {\n handleTocEntryOnNav(currentLocation, currentPositions);\n }\n // Otherwise, use the first TOC entry\n else if (tocTree.length > 0) {\n handleTocEntryOnNav(new Locator({ href: tocTree[0].href, type: \"\" }), currentPositions);\n }\n\n updateTimelineItems(currentLocation);\n\n // Update progression state when location changes\n setRelativeProgression(currentLocation?.locations.progression);\n setTotalProgression(currentLocation?.locations.totalProgression);\n }, [currentLocation, currentPositions, tocTree, timelineItems, handleTocEntryOnNav, updateTimelineItems]);\n\n // Update the singleton and call onChange\n useEffect(() => {\n timelineInstance = timeline;\n if (onChange) {\n onChange(timeline);\n }\n }, [timeline, onChange]);\n\n return timeline;\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 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: useCallback((): Timeline | undefined => navigatorInstance?.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} from \"@readium/shared\";\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?: Locator[];\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,\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 getLocatorAtOffset = useCallback((offset: number) => {\n const readingOrder = navigatorInstance?.publication?.readingOrder;\n if (!readingOrder) return null;\n\n const currentLocator = navigatorInstance?.currentLocator;\n if (!currentLocator) return null;\n\n const currentLocatorIndex = readingOrder.findIndexWithHref(currentLocator.href);\n if (currentLocatorIndex === -1) return null;\n \n const newIndex = currentLocatorIndex + offset;\n if (newIndex < 0 || newIndex >= readingOrder.items.length) return null;\n \n return readingOrder.items[newIndex];\n }, []);\n\n const previousLocator = useCallback(() => {\n const link = getLocatorAtOffset(-1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const nextLocator = useCallback(() => {\n const link = getLocatorAtOffset(1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\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 return { \n EpubNavigatorLoad, \n EpubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n navLayout, \n currentLocator,\n previousLocator,\n nextLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode,\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} 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 getLocatorAtOffset = useCallback((offset: number) => {\n const readingOrder = navigatorInstance?.publication?.readingOrder;\n if (!readingOrder) return null;\n\n const currentLocator = navigatorInstance?.currentLocator;\n if (!currentLocator) return null;\n\n const currentLocatorIndex = readingOrder.findIndexWithHref(currentLocator.href);\n if (currentLocatorIndex === -1) return null;\n\n const newIndex = currentLocatorIndex + offset;\n if (newIndex < 0 || newIndex >= readingOrder.items.length) return null;\n\n return readingOrder.items[newIndex];\n }, []);\n\n const previousLocator = useCallback(() => {\n const link = getLocatorAtOffset(-1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const nextLocator = useCallback(() => {\n const link = getLocatorAtOffset(1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\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 return {\n WebPubNavigatorLoad, \n WebPubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n currentLocator,\n previousLocator,\n nextLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode\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,20 +1,20 @@
|
|
|
1
|
-
import { useFonts, useZoomCallbacks, getReaderClassNames, StatefulReaderHeader, StatefulReaderFooter } from './chunk-
|
|
2
|
-
import { createDefaultPlugin, useSpacingPresets, useSettingsComponentStatus, useIsScroll, usePositionStorage, fromActionPeripheralType, NavPeripheralType, NavigatorProvider, thorium_web_reader_app_default, StatefulDockingWrapper, useReaderTransitions, thorium_web_button_default, useLineHeight, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS, toActionPeripheralType } from './chunk-
|
|
3
|
-
import { makeBreakpointsMap, isActiveElement, isKeyboardTriggered } from './chunk-
|
|
4
|
-
import { useFullscreen, useEpubNavigator, useTimeline, useDocumentTitle, useEpubSettingsCache } from './chunk-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { useFonts, useZoomCallbacks, getReaderClassNames, StatefulReaderHeader, StatefulReaderFooter } from './chunk-KXOIN35D.mjs';
|
|
2
|
+
import { ThPluginRegistry, createDefaultPlugin, ThPluginProvider, useSpacingPresets, useSettingsComponentStatus, useIsScroll, useFocusedDockableKey, usePositionStorage, fromActionPeripheralType, fromDockingPeripheralType, NavPeripheralType, NavigatorProvider, thorium_web_reader_app_default, StatefulDockingWrapper, useReaderTransitions, thorium_web_button_default, useLineHeight, useActionComponentStatus, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS, toActionPeripheralType, toDockingPeripheralType } from './chunk-THOJRBVD.mjs';
|
|
3
|
+
import { makeBreakpointsMap, isActiveElement, isKeyboardTriggered } from './chunk-VYSDLACR.mjs';
|
|
4
|
+
import { useFullscreen, useEpubNavigator, useTimeline, useDocumentTitle, useEpubSettingsCache, useObservableCondition } from './chunk-2B3HE57E.mjs';
|
|
5
|
+
import { useI18n } from './chunk-2NCN2AG2.mjs';
|
|
6
|
+
import { setImmersive, setFullscreen, setTimeline, setHovering, toggleImmersive, setPublicationStart, setPublicationEnd, toggleActionOpen, dockAction, setScrollAffordance, debounce, setDirection, setPlatformModifier, setUserNavigated, setTheme, setHasArrows, setLoading } from './chunk-YE5QOQUT.mjs';
|
|
7
|
+
import { useFilteredPreferenceKeys, usePreferences, resolveContentProtectionConfig, buildThemeObject, useActionsPreferences } from './chunk-3VB756GR.mjs';
|
|
7
8
|
import { ThArrowVariant } from './chunk-2YRT7RNW.mjs';
|
|
8
9
|
import { useAppSelector, useAppDispatch } from './chunk-A575ZW4A.mjs';
|
|
9
|
-
import { getPlatformModifier } from './chunk-
|
|
10
|
-
import {
|
|
10
|
+
import { getPlatformModifier } from './chunk-X63WSMOH.mjs';
|
|
11
|
+
import { ThNavigationButton } from './chunk-AXX4U2FW.mjs';
|
|
11
12
|
import { usePrevious } from './chunk-YZ73DHRU.mjs';
|
|
12
|
-
import { useI18n } from './chunk-2NCN2AG2.mjs';
|
|
13
13
|
import { useState, useLayoutEffect, useRef, useEffect, useCallback, useMemo } from 'react';
|
|
14
|
-
import { useLocale } from 'react-aria';
|
|
15
14
|
import { Layout, Locator } from '@readium/shared';
|
|
16
15
|
import classNames2 from 'classnames';
|
|
17
16
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
17
|
+
import { useLocale } from 'react-aria';
|
|
18
18
|
|
|
19
19
|
// src/components/assets/styles/thorium-web.reader.paginatedArrow.module.css
|
|
20
20
|
var thorium_web_reader_paginatedArrow_default = {
|
|
@@ -216,32 +216,26 @@ var useEpubStatelessCache = (textAlign, columnCount, fontFamily, fontSize, fontW
|
|
|
216
216
|
cache.current.reducedMotion = reducedMotion;
|
|
217
217
|
return cache;
|
|
218
218
|
};
|
|
219
|
-
var useObservableCondition = (value) => {
|
|
220
|
-
const listeners = useRef(/* @__PURE__ */ new Set());
|
|
221
|
-
const current = useRef(value);
|
|
222
|
-
const condition = useRef({
|
|
223
|
-
subscribe(cb) {
|
|
224
|
-
listeners.current.add(cb);
|
|
225
|
-
cb(current.current);
|
|
226
|
-
return () => listeners.current.delete(cb);
|
|
227
|
-
}
|
|
228
|
-
}).current;
|
|
229
|
-
useEffect(() => {
|
|
230
|
-
if (current.current === value) return;
|
|
231
|
-
current.current = value;
|
|
232
|
-
listeners.current.forEach((cb) => cb(value));
|
|
233
|
-
}, [value]);
|
|
234
|
-
return condition;
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
// src/components/Epub/Hooks/useEpubKeyboardPeripherals.ts
|
|
238
219
|
var useEpubKeyboardPeripherals = () => {
|
|
239
220
|
const isScroll = useIsScroll();
|
|
240
221
|
const isFXL = useAppSelector((state) => state.publication.isFXL);
|
|
241
222
|
const noScroll = useObservableCondition(!isScroll);
|
|
242
223
|
const zoomActive = useObservableCondition(!isFXL);
|
|
243
|
-
const { actionsKeys } = useActionsPreferences();
|
|
224
|
+
const { actionsKeys, docking } = useActionsPreferences();
|
|
225
|
+
const { isSupported: isFullscreenSupported } = useFullscreen();
|
|
226
|
+
const { reflowActionKeys, fxlActionKeys } = useFilteredPreferenceKeys();
|
|
227
|
+
const orderArray = isFXL ? fxlActionKeys : reflowActionKeys;
|
|
228
|
+
const { isComponentAvailable: isFullscreenAvailable } = useActionComponentStatus({ actionKey: "fullscreen" /* fullscreen */, orderArray, additionalCondition: isFullscreenSupported });
|
|
229
|
+
const { isComponentAvailable: isTocAvailable } = useActionComponentStatus({ actionKey: "toc" /* toc */, orderArray });
|
|
230
|
+
const { isComponentAvailable: isSettingsAvailable } = useActionComponentStatus({ actionKey: "settings" /* settings */, orderArray });
|
|
231
|
+
const { isComponentAvailable: isJumpToPositionAvailable } = useActionComponentStatus({ actionKey: "jumpToPosition" /* jumpToPosition */, orderArray });
|
|
244
232
|
return useMemo(() => {
|
|
233
|
+
const actionAvailability = {
|
|
234
|
+
["fullscreen" /* fullscreen */]: isFullscreenAvailable,
|
|
235
|
+
["toc" /* toc */]: isTocAvailable,
|
|
236
|
+
["settings" /* settings */]: isSettingsAvailable,
|
|
237
|
+
["jumpToPosition" /* jumpToPosition */]: isJumpToPositionAvailable
|
|
238
|
+
};
|
|
245
239
|
const config = [
|
|
246
240
|
{ type: NavPeripheralType.progressForward, keyCombos: [{ keyCode: 32, suppressOnInteractiveElement: true, condition: noScroll }] },
|
|
247
241
|
{ type: NavPeripheralType.progressBackward, keyCombos: [{ keyCode: 32, shift: true, suppressOnInteractiveElement: true, condition: noScroll }] },
|
|
@@ -262,10 +256,14 @@ var useEpubKeyboardPeripherals = () => {
|
|
|
262
256
|
];
|
|
263
257
|
for (const [key, tokens] of Object.entries(actionsKeys)) {
|
|
264
258
|
const shortcut = tokens?.shortcut;
|
|
265
|
-
|
|
259
|
+
const isAvailable = actionAvailability[key] ?? true;
|
|
260
|
+
if (shortcut && isAvailable) config.push({ type: toActionPeripheralType(key), keyCombos: shortcut.keyCombos });
|
|
261
|
+
}
|
|
262
|
+
for (const [key, tokens] of Object.entries(docking.keys)) {
|
|
263
|
+
if (tokens?.shortcut) config.push({ type: toDockingPeripheralType(key), keyCombos: tokens.shortcut.keyCombos });
|
|
266
264
|
}
|
|
267
265
|
return config;
|
|
268
|
-
}, [noScroll, zoomActive, actionsKeys]);
|
|
266
|
+
}, [noScroll, zoomActive, actionsKeys, docking.keys, isFullscreenAvailable, isTocAvailable, isSettingsAvailable, isJumpToPositionAvailable]);
|
|
269
267
|
};
|
|
270
268
|
var useEpubPreferencesConfig = ({
|
|
271
269
|
isFXL,
|
|
@@ -485,8 +483,7 @@ var useEpubReaderInit = ({
|
|
|
485
483
|
contentProtectionConfig,
|
|
486
484
|
onNavigatorReady,
|
|
487
485
|
onNavigatorLoaded,
|
|
488
|
-
onCleanup
|
|
489
|
-
fxlProgressionCallback
|
|
486
|
+
onCleanup
|
|
490
487
|
}) => {
|
|
491
488
|
const [navigatorReady, setNavigatorReady] = useState(false);
|
|
492
489
|
const { epubPreferences, epubDefaults } = useEpubPreferencesConfig({
|
|
@@ -538,7 +535,7 @@ var useEpubReaderInit = ({
|
|
|
538
535
|
EpubNavigatorLoad(config, () => {
|
|
539
536
|
setNavigatorReady(true);
|
|
540
537
|
onNavigatorLoaded?.();
|
|
541
|
-
}
|
|
538
|
+
});
|
|
542
539
|
return () => {
|
|
543
540
|
if (isNavigatorLoadedEpub.current) {
|
|
544
541
|
setNavigatorReady(false);
|
|
@@ -661,13 +658,14 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
|
|
|
661
658
|
const atPublicationStart = useAppSelector((state) => state.publication.atPublicationStart);
|
|
662
659
|
const atPublicationEnd = useAppSelector((state) => state.publication.atPublicationEnd);
|
|
663
660
|
const dispatch = useAppDispatch();
|
|
661
|
+
const getFocusedDockableKey = useFocusedDockableKey();
|
|
664
662
|
useEffect(() => {
|
|
665
663
|
dispatch(setImmersive(false));
|
|
666
664
|
}, [isScroll, dispatch]);
|
|
667
665
|
const onFsChange = useCallback((isFullscreen) => {
|
|
668
666
|
dispatch(setFullscreen(isFullscreen));
|
|
669
667
|
}, [dispatch]);
|
|
670
|
-
useFullscreen(onFsChange);
|
|
668
|
+
const { handleFullscreen } = useFullscreen(onFsChange);
|
|
671
669
|
const epubNavigator = useEpubNavigator();
|
|
672
670
|
const {
|
|
673
671
|
goLeft,
|
|
@@ -675,7 +673,6 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
|
|
|
675
673
|
goBackward,
|
|
676
674
|
goForward,
|
|
677
675
|
navLayout,
|
|
678
|
-
currentLocator,
|
|
679
676
|
currentPositions,
|
|
680
677
|
canGoBackward,
|
|
681
678
|
canGoForward,
|
|
@@ -770,18 +767,6 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
|
|
|
770
767
|
dispatch(setPublicationEnd(true));
|
|
771
768
|
}
|
|
772
769
|
}, [canGoBackward, canGoForward, dispatch]);
|
|
773
|
-
const handleFXLProgression = useCallback((locator) => {
|
|
774
|
-
setLocalData(locator);
|
|
775
|
-
updatePublicationNavigationState();
|
|
776
|
-
}, [setLocalData, updatePublicationNavigationState]);
|
|
777
|
-
const initReadingEnv = useCallback(async () => {
|
|
778
|
-
if (navLayout() === Layout.fixed) {
|
|
779
|
-
const cLoc = currentLocator();
|
|
780
|
-
if (cLoc) {
|
|
781
|
-
handleFXLProgression(cLoc);
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
}, [navLayout, currentLocator, handleFXLProgression]);
|
|
785
770
|
const moveTo = useCallback((direction) => {
|
|
786
771
|
const navigationCallback = () => {
|
|
787
772
|
dispatch(setUserNavigated(true));
|
|
@@ -808,19 +793,16 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
|
|
|
808
793
|
}, [dispatch, activateImmersiveOnAction, cache, goBackward, goForward]);
|
|
809
794
|
const listeners = useMemo(() => ({
|
|
810
795
|
frameLoaded: async function(_wnd) {
|
|
811
|
-
await initReadingEnv();
|
|
812
796
|
},
|
|
813
797
|
positionChanged: async function(locator) {
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
debouncedHandleProgression();
|
|
823
|
-
}
|
|
798
|
+
const debouncedHandleProgression = debounce(
|
|
799
|
+
async () => {
|
|
800
|
+
setLocalData(locator);
|
|
801
|
+
updatePublicationNavigationState();
|
|
802
|
+
},
|
|
803
|
+
250
|
|
804
|
+
);
|
|
805
|
+
debouncedHandleProgression();
|
|
824
806
|
},
|
|
825
807
|
tap: function(_e) {
|
|
826
808
|
handleTap(_e);
|
|
@@ -908,11 +890,25 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
|
|
|
908
890
|
break;
|
|
909
891
|
default: {
|
|
910
892
|
const actionKey = fromActionPeripheralType(data.type);
|
|
911
|
-
if (actionKey
|
|
893
|
+
if (actionKey === "fullscreen" /* fullscreen */) {
|
|
894
|
+
handleFullscreen();
|
|
895
|
+
return;
|
|
896
|
+
}
|
|
897
|
+
if (actionKey && profile) {
|
|
898
|
+
dispatch(toggleActionOpen({ key: actionKey, profile }));
|
|
899
|
+
return;
|
|
900
|
+
}
|
|
901
|
+
const dockingKey = fromDockingPeripheralType(data.type);
|
|
902
|
+
if (dockingKey && profile) {
|
|
903
|
+
const actionKey2 = getFocusedDockableKey(dockingKey);
|
|
904
|
+
if (actionKey2) {
|
|
905
|
+
dispatch(dockAction({ key: actionKey2, dockingKey, profile }));
|
|
906
|
+
}
|
|
907
|
+
}
|
|
912
908
|
}
|
|
913
909
|
}
|
|
914
910
|
}
|
|
915
|
-
}), [
|
|
911
|
+
}), [navLayout, setLocalData, dispatch, handleTap, handleClick, cache, preferences.affordances.scroll, isScrollStart, isScrollEnd, updatePublicationNavigationState, moveTo, goProgression, zoomIn, zoomOut, profile, handleFullscreen, getFocusedDockableKey]);
|
|
916
912
|
const initialPosition = useMemo(() => getLocalData(), [getLocalData]);
|
|
917
913
|
const { navigatorReady } = useEpubReaderInit({
|
|
918
914
|
container,
|
|
@@ -938,8 +934,7 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
|
|
|
938
934
|
contentProtectionConfig: resolveContentProtectionConfig(preferences.contentProtection, t),
|
|
939
935
|
onNavigatorReady: () => {
|
|
940
936
|
dispatch(setLoading(false));
|
|
941
|
-
}
|
|
942
|
-
fxlProgressionCallback: handleFXLProgression
|
|
937
|
+
}
|
|
943
938
|
});
|
|
944
939
|
const applyConstraint = useCallback(async (value) => {
|
|
945
940
|
await submitPreferences({
|
|
@@ -1044,5 +1039,5 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
|
|
|
1044
1039
|
};
|
|
1045
1040
|
|
|
1046
1041
|
export { StatefulReader };
|
|
1047
|
-
//# sourceMappingURL=chunk-
|
|
1048
|
-
//# sourceMappingURL=chunk-
|
|
1042
|
+
//# sourceMappingURL=chunk-3ITHCTDL.mjs.map
|
|
1043
|
+
//# sourceMappingURL=chunk-3ITHCTDL.mjs.map
|