@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.
Files changed (64) hide show
  1. package/dist/{chunk-GRYEOCGD.mjs → chunk-2B3HE57E.mjs} +36 -49
  2. package/dist/chunk-2B3HE57E.mjs.map +1 -0
  3. package/dist/{chunk-BBCSLDQT.mjs → chunk-3ITHCTDL.mjs} +61 -66
  4. package/dist/chunk-3ITHCTDL.mjs.map +1 -0
  5. package/dist/{chunk-PRQBFBJ7.mjs → chunk-3VB756GR.mjs} +19 -8
  6. package/dist/chunk-3VB756GR.mjs.map +1 -0
  7. package/dist/{chunk-ZD4LTF6G.mjs → chunk-AXX4U2FW.mjs} +25 -133
  8. package/dist/chunk-AXX4U2FW.mjs.map +1 -0
  9. package/dist/{chunk-2T65MDBR.mjs → chunk-CCHCCVSF.mjs} +3 -3
  10. package/dist/{chunk-2T65MDBR.mjs.map → chunk-CCHCCVSF.mjs.map} +1 -1
  11. package/dist/{chunk-63LKYJFG.mjs → chunk-J6XDICU2.mjs} +45 -15
  12. package/dist/chunk-J6XDICU2.mjs.map +1 -0
  13. package/dist/chunk-KQ3KS5O5.mjs +37 -0
  14. package/dist/chunk-KQ3KS5O5.mjs.map +1 -0
  15. package/dist/{chunk-DQDOOTCE.mjs → chunk-KT2QY5QU.mjs} +3 -3
  16. package/dist/{chunk-DQDOOTCE.mjs.map → chunk-KT2QY5QU.mjs.map} +1 -1
  17. package/dist/{chunk-Y5X74VW7.mjs → chunk-KXOIN35D.mjs} +9 -9
  18. package/dist/{chunk-Y5X74VW7.mjs.map → chunk-KXOIN35D.mjs.map} +1 -1
  19. package/dist/{chunk-BCXKBHU3.mjs → chunk-MTH2RF6V.mjs} +30 -15
  20. package/dist/chunk-MTH2RF6V.mjs.map +1 -0
  21. package/dist/{chunk-KJ55Q63A.mjs → chunk-THOJRBVD.mjs} +208 -59
  22. package/dist/chunk-THOJRBVD.mjs.map +1 -0
  23. package/dist/{chunk-VENFFPK2.mjs → chunk-VYSDLACR.mjs} +2 -2
  24. package/dist/{chunk-VENFFPK2.mjs.map → chunk-VYSDLACR.mjs.map} +1 -1
  25. package/dist/{chunk-KOR74F6M.mjs → chunk-X63WSMOH.mjs} +4 -36
  26. package/dist/chunk-X63WSMOH.mjs.map +1 -0
  27. package/dist/{chunk-PAFJZH7O.mjs → chunk-YE5QOQUT.mjs} +3 -3
  28. package/dist/{chunk-PAFJZH7O.mjs.map → chunk-YE5QOQUT.mjs.map} +1 -1
  29. package/dist/components/Audio/index.d.mts +3 -3
  30. package/dist/components/Audio/index.mjs +13 -12
  31. package/dist/components/Epub/index.d.mts +3 -3
  32. package/dist/components/Epub/index.mjs +14 -13
  33. package/dist/components/Misc/index.mjs +4 -4
  34. package/dist/components/Reader/index.d.mts +2 -2
  35. package/dist/components/Reader/index.mjs +20 -19
  36. package/dist/components/Reader/index.mjs.map +1 -1
  37. package/dist/components/WebPub/index.d.mts +3 -3
  38. package/dist/components/WebPub/index.mjs +14 -13
  39. package/dist/core/Components/index.d.mts +4 -20
  40. package/dist/core/Components/index.mjs +1 -1
  41. package/dist/core/Helpers/index.mjs +3 -2
  42. package/dist/core/Hooks/index.d.mts +10 -4
  43. package/dist/core/Hooks/index.mjs +2 -1
  44. package/dist/i18n/index.mjs +2 -2
  45. package/dist/lib/index.mjs +3 -2
  46. package/dist/locales/da/thorium-shared.json +217 -10
  47. package/dist/locales/he/thorium-shared.json +8 -0
  48. package/dist/locales/it/thorium-shared.json +2 -2
  49. package/dist/locales/it/thorium-web.json +3 -3
  50. package/dist/locales/lt/thorium-shared.json +85 -1
  51. package/dist/locales/sv/thorium-shared.json +5 -5
  52. package/dist/preferences/index.d.mts +2 -0
  53. package/dist/preferences/index.mjs +4 -3
  54. package/dist/{useAudioNavigator-pGwxhXLj.d.mts → useAudioNavigator-9RuOpLGB.d.mts} +4 -4
  55. package/dist/{useReaderTransitions-Zvomj9RQ.d.mts → useReaderTransitions-CpgrXS5g.d.mts} +25 -6
  56. package/package.json +5 -5
  57. package/dist/chunk-63LKYJFG.mjs.map +0 -1
  58. package/dist/chunk-BBCSLDQT.mjs.map +0 -1
  59. package/dist/chunk-BCXKBHU3.mjs.map +0 -1
  60. package/dist/chunk-GRYEOCGD.mjs.map +0 -1
  61. package/dist/chunk-KJ55Q63A.mjs.map +0 -1
  62. package/dist/chunk-KOR74F6M.mjs.map +0 -1
  63. package/dist/chunk-PRQBFBJ7.mjs.map +0 -1
  64. package/dist/chunk-ZD4LTF6G.mjs.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { toEntryRef, buildTocTree } from './chunk-TEZB4ULX.mjs';
2
- import { useEffect, useState, useLayoutEffect, useCallback, useRef, useMemo } from 'react';
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
- useLayoutEffect(() => {
14
- if (typeof window !== "undefined") setIsClient(true);
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 (!isClient) return;
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
- }, [isClient]);
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 FXLPositionChangedCallbackRef = useRef(void 0);
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
- }, [FXLPositionChanged]);
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
- }, [FXLPositionChanged]);
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-GRYEOCGD.mjs.map
871
- //# sourceMappingURL=chunk-GRYEOCGD.mjs.map
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-Y5X74VW7.mjs';
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-KJ55Q63A.mjs';
3
- import { makeBreakpointsMap, isActiveElement, isKeyboardTriggered } from './chunk-VENFFPK2.mjs';
4
- import { useFullscreen, useEpubNavigator, useTimeline, useDocumentTitle, useEpubSettingsCache } from './chunk-GRYEOCGD.mjs';
5
- import { setImmersive, setFullscreen, setTimeline, setHovering, toggleImmersive, setPublicationStart, setPublicationEnd, toggleActionOpen, setScrollAffordance, debounce, setDirection, setPlatformModifier, setUserNavigated, setTheme, setHasArrows, setLoading } from './chunk-PAFJZH7O.mjs';
6
- import { useFilteredPreferenceKeys, usePreferences, resolveContentProtectionConfig, buildThemeObject, useActionsPreferences } from './chunk-PRQBFBJ7.mjs';
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-KOR74F6M.mjs';
10
- import { ThPluginRegistry, ThPluginProvider, ThNavigationButton } from './chunk-ZD4LTF6G.mjs';
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
- if (shortcut) config.push({ type: toActionPeripheralType(key), keyCombos: shortcut.keyCombos });
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
- }, fxlProgressionCallback);
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
- if (navLayout() !== Layout.fixed) {
815
- const debouncedHandleProgression = debounce(
816
- async () => {
817
- setLocalData(locator);
818
- updatePublicationNavigationState();
819
- },
820
- 250
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 && profile) dispatch(toggleActionOpen({ key: actionKey, profile }));
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
- }), [initReadingEnv, navLayout, setLocalData, dispatch, handleTap, handleClick, cache, preferences.affordances.scroll, isScrollStart, isScrollEnd, updatePublicationNavigationState, moveTo, goProgression, zoomIn, zoomOut, profile]);
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-BBCSLDQT.mjs.map
1048
- //# sourceMappingURL=chunk-BBCSLDQT.mjs.map
1042
+ //# sourceMappingURL=chunk-3ITHCTDL.mjs.map
1043
+ //# sourceMappingURL=chunk-3ITHCTDL.mjs.map