@edrlab/thorium-web 1.5.4 → 1.5.6

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 (93) hide show
  1. package/dist/{ThPreferencesAdapter-B3a-f5v-.d.mts → ThPreferencesAdapter-GepvYoaL.d.mts} +4 -3
  2. package/dist/{ThSettingsWrapper-D4WIzlXA.d.mts → ThSettingsWrapper-DyYC678Q.d.mts} +1 -1
  3. package/dist/{actions-C33UN3Ji.d.mts → actions-CTg9C4C-.d.mts} +1 -1
  4. package/dist/{actionsReducer-Bzcj3wk3.d.mts → actionsReducer-Cnd7Cdh9.d.mts} +1 -1
  5. package/dist/{chunk-VYSDLACR.mjs → chunk-3R5JARA2.mjs} +3 -3
  6. package/dist/{chunk-VYSDLACR.mjs.map → chunk-3R5JARA2.mjs.map} +1 -1
  7. package/dist/{chunk-X6Z4WZLX.mjs → chunk-5IT53TCU.mjs} +55 -35
  8. package/dist/chunk-5IT53TCU.mjs.map +1 -0
  9. package/dist/{chunk-7WGC22F3.mjs → chunk-6DR4EAK3.mjs} +42 -49
  10. package/dist/chunk-6DR4EAK3.mjs.map +1 -0
  11. package/dist/chunk-7SMOXFAF.mjs +121 -0
  12. package/dist/chunk-7SMOXFAF.mjs.map +1 -0
  13. package/dist/{chunk-AEEGHJVM.mjs → chunk-CXKDZVAV.mjs} +113 -258
  14. package/dist/chunk-CXKDZVAV.mjs.map +1 -0
  15. package/dist/{chunk-MD5LZNDG.mjs → chunk-DKF53WEQ.mjs} +39 -16
  16. package/dist/chunk-DKF53WEQ.mjs.map +1 -0
  17. package/dist/{chunk-GFSLVQIG.mjs → chunk-EREFYF5J.mjs} +3 -3
  18. package/dist/{chunk-GFSLVQIG.mjs.map → chunk-EREFYF5J.mjs.map} +1 -1
  19. package/dist/{chunk-YE5QOQUT.mjs → chunk-I765HTBI.mjs} +15 -109
  20. package/dist/chunk-I765HTBI.mjs.map +1 -0
  21. package/dist/{chunk-G4T4RXFB.mjs → chunk-LF6IMH7J.mjs} +83 -70
  22. package/dist/chunk-LF6IMH7J.mjs.map +1 -0
  23. package/dist/{chunk-NQ2ZSGCX.mjs → chunk-MFVZ5AEN.mjs} +7 -3
  24. package/dist/chunk-MFVZ5AEN.mjs.map +1 -0
  25. package/dist/{chunk-2YRT7RNW.mjs → chunk-QOU3R5ZT.mjs} +9 -3
  26. package/dist/chunk-QOU3R5ZT.mjs.map +1 -0
  27. package/dist/{chunk-G35H3K32.mjs → chunk-VWKUZP5V.mjs} +43 -48
  28. package/dist/chunk-VWKUZP5V.mjs.map +1 -0
  29. package/dist/{chunk-IVCUCIYN.mjs → chunk-WOJR6ALR.mjs} +41 -18
  30. package/dist/chunk-WOJR6ALR.mjs.map +1 -0
  31. package/dist/components/Audio/index.css +1 -0
  32. package/dist/components/Audio/index.css.map +1 -1
  33. package/dist/components/Audio/index.d.mts +13 -13
  34. package/dist/components/Audio/index.mjs +10 -11
  35. package/dist/components/Epub/index.d.mts +13 -13
  36. package/dist/components/Epub/index.mjs +11 -12
  37. package/dist/components/Reader/index.css +1 -0
  38. package/dist/components/Reader/index.css.map +1 -1
  39. package/dist/components/Reader/index.d.mts +12 -12
  40. package/dist/components/Reader/index.mjs +18 -18
  41. package/dist/components/Reader/index.mjs.map +1 -1
  42. package/dist/components/WebPub/index.d.mts +13 -13
  43. package/dist/components/WebPub/index.mjs +11 -12
  44. package/dist/core/Components/index.d.mts +6 -6
  45. package/dist/core/Helpers/index.d.mts +4 -4
  46. package/dist/core/Helpers/index.mjs +2 -2
  47. package/dist/core/Hooks/index.d.mts +14 -9
  48. package/dist/core/Hooks/index.mjs +4 -4
  49. package/dist/lib/index.d.mts +43 -33
  50. package/dist/lib/index.mjs +3 -4
  51. package/dist/locales/ar/thorium-shared.json +39 -0
  52. package/dist/locales/bg/thorium-web.json +23 -0
  53. package/dist/locales/brh/thorium-shared.json +1 -0
  54. package/dist/locales/brh/thorium-web.json +1 -0
  55. package/dist/locales/da/thorium-shared.json +3 -0
  56. package/dist/locales/el/thorium-web.json +41 -6
  57. package/dist/locales/en/thorium-shared.json +3 -0
  58. package/dist/locales/es/thorium-shared.json +3 -0
  59. package/dist/locales/et/thorium-shared.json +3 -0
  60. package/dist/locales/fi/thorium-shared.json +3 -0
  61. package/dist/locales/fi/thorium-web.json +4 -4
  62. package/dist/locales/he/thorium-shared.json +3 -1
  63. package/dist/locales/it/thorium-shared.json +3 -0
  64. package/dist/locales/lt/thorium-shared.json +30 -4
  65. package/dist/locales/pt-PT/thorium-shared.json +8 -5
  66. package/dist/locales/sv/thorium-shared.json +3 -3
  67. package/dist/locales/sv/thorium-web.json +7 -7
  68. package/dist/locales/tr/thorium-shared.json +80 -0
  69. package/dist/preferences/index.d.mts +10 -10
  70. package/dist/preferences/index.mjs +4 -5
  71. package/dist/{settingsReducer-Pp9aoiiC.d.mts → settingsReducer-DRWEq8Cm.d.mts} +1 -1
  72. package/dist/{ui-DnZZhozX.d.mts → ui-DHQ_zvWn.d.mts} +7 -1
  73. package/dist/{useAudioNavigator-9RuOpLGB.d.mts → useAudioNavigator-B4NBPvmZ.d.mts} +4 -5
  74. package/dist/{useContrast-Bl08zDTU.d.mts → useContrast-Unp3534Z.d.mts} +1 -1
  75. package/dist/{usePreferences-Cy7-JN2x.d.mts → usePreferences-Bi-ptif0.d.mts} +6 -9
  76. package/dist/usePublicationProgress-DT-X5ZLf.d.mts +44 -0
  77. package/dist/{useReaderTransitions-BsTdWZDK.d.mts → useReaderTransitions-B9fOF61y.d.mts} +10 -14
  78. package/package.json +13 -10
  79. package/dist/chunk-2YRT7RNW.mjs.map +0 -1
  80. package/dist/chunk-7WGC22F3.mjs.map +0 -1
  81. package/dist/chunk-A575ZW4A.mjs +0 -10
  82. package/dist/chunk-A575ZW4A.mjs.map +0 -1
  83. package/dist/chunk-AEEGHJVM.mjs.map +0 -1
  84. package/dist/chunk-G35H3K32.mjs.map +0 -1
  85. package/dist/chunk-G4T4RXFB.mjs.map +0 -1
  86. package/dist/chunk-IVCUCIYN.mjs.map +0 -1
  87. package/dist/chunk-MD5LZNDG.mjs.map +0 -1
  88. package/dist/chunk-NQ2ZSGCX.mjs.map +0 -1
  89. package/dist/chunk-TEZB4ULX.mjs +0 -57
  90. package/dist/chunk-TEZB4ULX.mjs.map +0 -1
  91. package/dist/chunk-X6Z4WZLX.mjs.map +0 -1
  92. package/dist/chunk-YE5QOQUT.mjs.map +0 -1
  93. package/dist/useTimeline-DCZ1qoCO.d.mts +0 -55
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/Hooks/useDocumentTitle.ts","../src/core/Hooks/useIsClient.ts","../src/core/Hooks/useFullscreen.ts","../src/core/Hooks/useLocalStorage.ts","../src/core/Hooks/useObservableCondition.ts","../src/helpers/timelineFallback.ts","../src/core/Hooks/usePublicationProgress.ts","../src/core/Hooks/useTimelineAdjacency.ts","../src/core/Hooks/Audio/useAudioNavigator.ts","../src/core/Hooks/Audio/useAudioSettingsCache.ts","../src/core/Hooks/Epub/useEpubNavigator.ts","../src/core/Hooks/Epub/useEpubSettingsCache.ts","../src/core/Hooks/WebPub/useWebPubNavigator.ts","../src/core/Hooks/WebPub/useWebPubSettingsCache.ts"],"names":["useEffect","useState","useRef","useCallback","useMemo","navigatorInstance","getScriptMode"],"mappings":"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","file":"chunk-CXKDZVAV.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\n\nexport const useDocumentTitle = (title?: string) => {\n useEffect(() => {\n if (title) document.title = title;\n }, [title]);\n};","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nexport const useIsClient = () => {\n const [isClient, setIsClient] = useState(false);\n const isClientRef = useRef(false);\n\n useEffect(() => {\n isClientRef.current = true;\n setIsClient(true);\n }, []);\n\n return { isClient, isClientRef };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useIsClient } from \"./useIsClient\";\nimport { isIOSish } from \"../Helpers/getPlatform\";\n\nexport const useFullscreen = (onChange?: (isFullscreen: boolean) => void) => {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const { isClient, isClientRef } = useIsClient();\n const isSupported = isClient && !isIOSish() && Boolean(document.fullscreenEnabled);\n\n const handleFullscreen = useCallback(() => {\n if (!isClientRef.current || isIOSish()) return;\n\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen();\n } else if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n }, [isClientRef]);\n\n useEffect(() => {\n const onFSchange = () => {\n const isFs = Boolean(document.fullscreenElement);\n setIsFullscreen(isFs);\n onChange && onChange(isFs);\n };\n document.addEventListener(\"fullscreenchange\", onFSchange);\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFSchange);\n };\n }, [onChange]);\n\n return { isFullscreen, isSupported, handleFullscreen };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const useLocalStorage = (key: string | null) => {\n const [localData, setLocalData] = useState<any>(null);\n const cachedLocalData = useRef<any>(null);\n\n const setValue = useCallback((newValue: any) => {\n if (!key) return;\n setLocalData(newValue);\n localStorage.setItem(key, JSON.stringify(newValue));\n }, [key]);\n\n const getValue = useCallback(() => {\n if (!key) return null;\n if (localData !== null) return localData;\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n }, [key, localData]);\n\n const clearValue = useCallback(() => {\n if (!key) return;\n setLocalData(null);\n localStorage.removeItem(key);\n }, [key]);\n\n useEffect(() => {\n if (!key) return;\n cachedLocalData.current = localData;\n }, [localData, key]);\n\n return {\n setLocalData: setValue,\n getLocalData: getValue,\n clearLocalData: clearValue,\n localData: key ? localData : null,\n cachedLocalData\n };\n};","import { useEffect, useRef } from \"react\";\nimport { ObservableCondition } from \"@readium/navigator-html-injectables\";\n\nexport const useObservableCondition = (value: boolean): ObservableCondition => {\n const listeners = useRef(new Set<(v: boolean) => void>());\n const current = useRef(value);\n\n const condition = useRef<ObservableCondition>({\n subscribe(cb) {\n listeners.current.add(cb);\n cb(current.current);\n return () => listeners.current.delete(cb);\n },\n }).current;\n\n useEffect(() => {\n if (current.current === value) return;\n current.current = value;\n listeners.current.forEach(cb => cb(value));\n }, [value]);\n\n return condition;\n};\n","import { Timeline, TimelineItem } from \"@readium/shared\";\n\n// A TOC entry can span several resources with only the first one titled.\n// Walks backward from `href`, resolved fresh each call (so it works for\n// non-linear navigation too), stopping at the first defined result.\nconst walkPrecedingResources = <T,>(\n timeline: Timeline,\n href: string,\n resolve: (candidate: TimelineItem, stepsBack: number) => T | undefined\n): T | undefined => {\n const timelineItems = timeline.items;\n const startIndex = timelineItems.findIndex(item => timeline.linkFor(item)?.href === href);\n if (startIndex === -1) return undefined;\n\n for (let i = startIndex - 1; i >= 0; i--) {\n const candidate = timelineItems[i];\n if (!candidate) continue;\n const result = resolve(candidate, startIndex - i);\n if (result !== undefined) return result;\n }\n\n return undefined;\n};\n\n// Falls back to a preceding resource's title; appends \"(N)\" when inherited so repeated\n// labels (e.g. next/next) don't look identical.\n// `timeline` must come from the navigator (not `publication.timeline` directly) so it\n// stays the single source of truth across every module that reads it.\nexport const resolveChapterTitle = (\n timeline: Timeline,\n item: TimelineItem\n): string | undefined => {\n if (item.title !== undefined) return item.title;\n\n const href = timeline.linkFor(item)?.href;\n if (!href) return undefined;\n\n return walkPrecedingResources(timeline, href, (candidate, stepsBack) =>\n candidate.title !== undefined ? `${ candidate.title } (${ stepsBack + 1 })` : undefined\n );\n};\n","import { useEffect, useMemo } from \"react\";\n\nimport { Locator, Publication, Timeline, TimelineItem } from \"@readium/shared\";\nimport { SerializedLocator } from \"@/helpers/serializePositions\";\nimport { resolveChapterTitle } from \"@/helpers/timelineFallback\";\n\nexport interface ProgressionDetails {\n totalItems?: number;\n currentIndex?: number;\n totalPositions?: number;\n currentPositions?: number[];\n relativeProgression?: number;\n totalProgression?: number;\n currentChapter?: string;\n positionsLeft?: number;\n}\n\nexport interface Progress {\n title?: string;\n progression?: ProgressionDetails;\n}\n\ninterface PositionEntry {\n positionRange?: [number, number?];\n}\n\nexport const usePublicationProgress = ({\n publication,\n getNavigatorTimeline,\n currentTimelineItem,\n currentLocation,\n currentPositions,\n positionsList,\n onChange\n}: {\n publication: Publication | null;\n getNavigatorTimeline: () => Timeline | undefined;\n currentTimelineItem?: TimelineItem;\n currentLocation?: Locator;\n currentPositions?: number[];\n positionsList?: SerializedLocator[];\n onChange?: (progress: Progress) => void;\n}): Progress => {\n // Per-href position range table, derived once from positionsList — kept fully\n // decoupled from chapter/TOC resolution, which now comes from the real Timeline.\n const positionEntries = useMemo(() => {\n const entries: { [href: string]: PositionEntry } = {};\n if (!positionsList?.length) return entries;\n\n const readingOrder = publication?.readingOrder?.items || [];\n for (const item of readingOrder) {\n const positions = positionsList\n .filter(p => p.href === item.href)\n .sort((a, b) => (a.locations?.position || 0) - (b.locations?.position || 0));\n\n if (positions.length === 0) continue;\n\n const start = positions[0].locations;\n const end = positions.length > 1 ? positions[positions.length - 1].locations : start;\n\n entries[item.href] = {\n positionRange: start?.position !== undefined ? [start.position, end?.position] : undefined\n };\n }\n\n return entries;\n }, [publication, positionsList]);\n\n const navigatorTimeline = getNavigatorTimeline();\n\n const currentHref = currentLocation?.href;\n\n const currentIndex = currentHref\n ? publication?.readingOrder.items.findIndex(item => item.href === currentHref)\n : undefined;\n\n const currentChapter = currentTimelineItem && navigatorTimeline\n ? resolveChapterTitle(navigatorTimeline, currentTimelineItem)\n : undefined;\n\n const progress: Progress = useMemo(() => {\n const positionRange = currentHref ? positionEntries[currentHref]?.positionRange : undefined;\n const endPosition = positionRange?.[1];\n const currentPosition = currentPositions?.[0];\n\n return {\n title: publication?.metadata.title.getTranslation(\"en\"),\n progression: {\n totalItems: publication?.readingOrder.items.length,\n currentIndex: currentIndex !== undefined && currentIndex >= 0 ? currentIndex + 1 : undefined,\n totalPositions: positionsList?.length,\n currentPositions: currentPositions || [],\n relativeProgression: currentLocation?.locations.progression,\n totalProgression: currentLocation?.locations.totalProgression,\n currentChapter,\n positionsLeft: (!positionsList?.length || endPosition === undefined || currentPosition === undefined)\n ? undefined\n : Math.max(0, endPosition - currentPosition)\n }\n };\n }, [\n publication,\n currentChapter,\n currentHref,\n currentIndex,\n positionEntries,\n positionsList,\n currentPositions,\n currentLocation\n ]);\n\n useEffect(() => {\n if (onChange) onChange(progress);\n }, [progress, onChange]);\n\n return progress;\n};\n","import { useCallback } from \"react\";\n\nimport { Timeline, TimelineItem } from \"@readium/shared\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setAdjacentTimelineItems } from \"@/lib/publicationReducer\";\nimport { resolveChapterTitle } from \"@/helpers/timelineFallback\";\n\nexport const useTimelineAdjacency = (getNavigatorTimeline: () => Timeline | undefined) => {\n const dispatch = useAppDispatch();\n\n const updateAdjacentItems = useCallback((item: TimelineItem) => {\n const tl = getNavigatorTimeline();\n if (!tl) return;\n\n const { previous, next } = tl.navigableFrom(item);\n\n const previousHref = previous ? tl.linkFor(previous)?.href : undefined;\n const nextHref = next ? tl.linkFor(next)?.href : undefined;\n\n dispatch(setAdjacentTimelineItems({\n previous: previous && previousHref\n ? { title: resolveChapterTitle(tl, previous), href: previousHref }\n : null,\n next: next && nextHref\n ? { title: resolveChapterTitle(tl, next), href: nextHref }\n : null\n }));\n }, [dispatch, getNavigatorTimeline]);\n\n const clearAdjacentItems = useCallback(() => {\n dispatch(setAdjacentTimelineItems({ previous: null, next: null }));\n }, [dispatch]);\n\n return { updateAdjacentItems, clearAdjacentItems };\n};\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication,\n Timeline\n} from \"@readium/shared\";\nimport {\n AudioNavigator,\n AudioNavigatorListeners,\n AudioPreferences,\n IAudioPreferences,\n IAudioDefaults,\n IContentProtectionConfig,\n IKeyboardPeripheralsConfig,\n} from \"@readium/navigator\";\nimport { AudioSettings } from \"./useAudioSettingsCache\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: AudioNavigator | null = null;\n\nexport interface AudioNavigatorLoadProps {\n publication: Publication;\n listeners: AudioNavigatorListeners;\n initialPosition?: Locator;\n preferences?: IAudioPreferences;\n defaults?: IAudioDefaults;\n contentProtection?: IContentProtectionConfig;\n keyboardPeripherals?: IKeyboardPeripheralsConfig;\n audioContext?: AudioContext;\n}\n\nexport const useAudioNavigator = () => {\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IAudioPreferences) => {\n await navigatorInstance?.submitPreferences(new AudioPreferences(preferences));\n }, []);\n\n const getSetting = useCallback(<K extends keyof AudioSettings>(settingKey: K) => {\n return navigatorInstance?.settings?.[settingKey as keyof typeof navigatorInstance.settings];\n }, []);\n\n const AudioNavigatorLoad = useCallback((config: AudioNavigatorLoadProps, cb: Function) => {\n publication.current = config.publication;\n\n navigatorInstance = new AudioNavigator(\n config.publication,\n config.listeners,\n config.initialPosition,\n {\n preferences: config.preferences || {},\n defaults: config.defaults || {},\n contentProtection: config.contentProtection,\n keyboardPeripherals: config.keyboardPeripherals,\n }\n );\n\n cb();\n }, []);\n\n const AudioNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n navigatorInstance?.destroy();\n navigatorInstance = null;\n }, []);\n\n const play = useCallback(() => {\n navigatorInstance?.play();\n }, []);\n\n const pause = useCallback(() => {\n navigatorInstance?.pause();\n }, []);\n\n const stop = useCallback(() => {\n navigatorInstance?.stop();\n }, []);\n\n const seek = useCallback((time: number) => {\n navigatorInstance?.seek(time);\n }, []);\n\n const jump = useCallback((seconds: number) => {\n navigatorInstance?.jump(seconds);\n }, []);\n\n const skipForward = useCallback(() => {\n navigatorInstance?.skipForward();\n }, []);\n\n const skipBackward = useCallback(() => {\n navigatorInstance?.skipBackward();\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward || false;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward || false;\n }, []);\n\n const isTrackStart = useCallback(() => {\n return navigatorInstance?.isTrackStart || false;\n }, []);\n\n const isTrackEnd = useCallback(() => {\n return navigatorInstance?.isTrackEnd || false;\n }, []);\n\n const isPlaying = useCallback(() => {\n return navigatorInstance?.isPlaying || false;\n }, []);\n\n const isPaused = useCallback(() => {\n return navigatorInstance?.isPaused || false;\n }, []);\n\n const duration = useCallback(() => {\n return navigatorInstance?.duration || 0;\n }, []);\n\n const currentTime = useCallback(() => {\n return navigatorInstance?.currentTime || 0;\n }, []);\n\n const timeline = useCallback((): Timeline | undefined => {\n return navigatorInstance?.timeline;\n }, []);\n\n return {\n AudioNavigatorLoad, \n AudioNavigatorDestroy, \n play,\n pause,\n stop,\n seek,\n jump,\n skipForward,\n skipBackward,\n go, \n goLink, \n goForward,\n goBackward,\n currentLocator,\n canGoBackward,\n canGoForward,\n isTrackStart,\n isTrackEnd,\n isPlaying,\n isPaused,\n duration,\n currentTime,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n remotePlayback: (navigatorInstance as any)?.remotePlayback as RemotePlayback | undefined,\n getSetting,\n submitPreferences,\n timeline,\n }\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\n\nexport interface AudioSettings {\n volume: number;\n playbackRate: number;\n preservePitch: boolean;\n skipBackwardInterval: number;\n skipForwardInterval: number;\n skipInterval: number;\n pollInterval: number;\n autoPlay: boolean;\n enableMediaSession: boolean;\n}\n\nexport interface AudioSettingsCache {\n settings: AudioSettings;\n}\n\nexport const useAudioSettingsCache = (\n volume: number,\n playbackRate: number,\n preservePitch: boolean,\n skipBackwardInterval: number,\n skipForwardInterval: number,\n skipInterval: number,\n pollInterval: number,\n autoPlay: boolean,\n enableMediaSession: boolean\n) => {\n const cache = useRef<AudioSettingsCache>({\n settings: {\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n },\n }), [\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n ]);\n\n cache.current = memoizedCache;\n\n return cache;\n};\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication,\n Timeline\n} from \"@readium/shared\";\nimport { SerializedLocator } from \"@/helpers/serializePositions\";\nimport {\n EpubNavigator,\n EpubNavigatorListeners,\n EpubPreferences,\n EpubSettings,\n IContentProtectionConfig,\n IEpubDefaults,\n IEpubPreferences,\n IInjectablesConfig,\n IKeyboardPeripheralsConfig,\n getScriptMode,\n ScriptMode\n} from \"@readium/navigator\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: EpubNavigator | null = null;\n\nexport interface EpubNavigatorLoadProps {\n container: HTMLDivElement | null;\n publication: Publication;\n listeners: EpubNavigatorListeners;\n positionsList?: SerializedLocator[];\n initialPosition?: Locator;\n preferences?: IEpubPreferences;\n defaults?: IEpubDefaults;\n injectables?: IInjectablesConfig;\n contentProtection?: IContentProtectionConfig;\n keyboardPeripherals?: IKeyboardPeripheralsConfig;\n}\n\nexport const useEpubNavigator = () => {\n const container = useRef<HTMLDivElement | null>(null);\n const containerParent = useRef<HTMLElement | null>(null);\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IEpubPreferences) => {\n await navigatorInstance?.submitPreferences(new EpubPreferences(preferences));\n }, []);\n\n const getSetting = useCallback(<K extends keyof EpubSettings>(settingKey: K) => {\n return navigatorInstance?.settings[settingKey] as EpubSettings[K];\n }, []);\n\n const EpubNavigatorLoad = useCallback((config: EpubNavigatorLoadProps, cb: Function) => {\n if (config.container) {\n container.current = config.container;\n containerParent.current = container.current? container.current.parentElement : null;\n \n publication.current = config.publication;\n\n navigatorInstance = new EpubNavigator(\n config.container,\n config.publication,\n config.listeners,\n config.positionsList?.map((p) => Locator.deserialize(p)).filter((l): l is Locator => !!l),\n config.initialPosition,\n {\n preferences: config.preferences || {},\n defaults: config.defaults || {},\n injectables: config.injectables || undefined,\n contentProtection: config.contentProtection || undefined,\n keyboardPeripherals: config.keyboardPeripherals || [],\n }\n );\n\n navigatorInstance.load().then(() => {\n cb();\n });\n }\n }, []);\n\n const EpubNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n\n navigatorInstance?.destroy().then(() => {\n navigatorInstance = null; // Clear the singleton reference\n });\n }, []);\n\n const goRight = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goRight(animated, callback);\n }, []);\n\n const goLeft = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goLeft(animated, callback)\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const navLayout = useCallback(() => {\n return navigatorInstance?.layout;\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const currentPositions = useCallback(() => {\n return navigatorInstance?.viewport?.positions;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward;\n }, []);\n\n const isScrollStart = useCallback(() => {\n return navigatorInstance?.isScrollStart;\n }, []);\n\n const isScrollEnd = useCallback(() => {\n return navigatorInstance?.isScrollEnd;\n }, []);\n\n // Warning: this is an internal member that will become private, do not rely on it\n // See https://github.com/edrlab/thorium-web/issues/25\n const getCframes = useCallback(() => {\n return navigatorInstance?._cframes;\n }, []);\n\n const currentScriptMode = useCallback((): ScriptMode | undefined => {\n const metadata = navigatorInstance?.publication?.metadata;\n if (!metadata) return undefined;\n return getScriptMode(metadata);\n }, []);\n\n const timeline = useCallback((): Timeline | undefined => {\n return navigatorInstance?.timeline;\n }, []);\n\n return { \n EpubNavigatorLoad, \n EpubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n navLayout, \n currentLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode,\n timeline,\n }\n}","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { LineLengthStateObject, FontFamilyStateObject } from \"@/lib/settingsReducer\";\n\nexport interface ReadiumCSSSettings {\n columnCount: string;\n fontFamily: FontFamilyStateObject;\n fontSize: number;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineLength: LineLengthStateObject | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n scroll: boolean;\n textAlign: ThTextAlignOptions | null;\n textNormalization: boolean;\n theme?: string;\n wordSpacing: number | null;\n}\n\nexport interface EPubSettingsCache {\n settings: ReadiumCSSSettings;\n}\n\nexport const useEpubSettingsCache = (\n textAlign: ThTextAlignOptions | null,\n columnCount: string,\n fontFamily: FontFamilyStateObject,\n fontSize: number,\n fontWeight: number,\n hyphens: boolean | null,\n letterSpacing: number | null,\n ligatures: boolean | null,\n lineLength: LineLengthStateObject | null,\n lineHeight: ThLineHeightOptions | null,\n noRuby: boolean | null,\n paragraphIndent: number | null,\n paragraphSpacing: number | null,\n publisherStyles: boolean,\n scroll: boolean,\n textNormalization: boolean,\n wordSpacing: number | null,\n theme: string | undefined\n) => {\n const cache = useRef<EPubSettingsCache>({\n settings: {\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll: scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll: scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n },\n }), [\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\n\n return cache;\n};\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication,\n Timeline\n} from \"@readium/shared\";\nimport {\n ExperimentalWebPubNavigator,\n WebPubNavigatorListeners,\n WebPubPreferences,\n WebPubSettings,\n IWebPubDefaults,\n IWebPubPreferences,\n IInjectablesConfig,\n IContentProtectionConfig,\n IKeyboardPeripheralsConfig,\n getScriptMode,\n ScriptMode\n} from \"@readium/navigator\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: InstanceType<typeof ExperimentalWebPubNavigator> | null = null;\n\nexport interface WebPubNavigatorLoadProps {\n container: HTMLDivElement | null;\n publication: Publication;\n listeners: WebPubNavigatorListeners;\n initialPosition?: Locator;\n preferences?: IWebPubPreferences;\n defaults?: IWebPubDefaults;\n injectables?: IInjectablesConfig;\n contentProtection?: IContentProtectionConfig;\n keyboardPeripherals?: IKeyboardPeripheralsConfig;\n}\n\nexport const useWebPubNavigator = () => {\n const container = useRef<HTMLDivElement | null>(null);\n const containerParent = useRef<HTMLElement | null>(null);\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IWebPubPreferences) => {\n await navigatorInstance?.submitPreferences(new WebPubPreferences(preferences));\n }, []);\n \n const getSetting = useCallback(<K extends keyof WebPubSettings>(settingKey: K) => {\n return navigatorInstance?.settings[settingKey] as WebPubSettings[K];\n }, []);\n\n const WebPubNavigatorLoad = useCallback((config: WebPubNavigatorLoadProps, cb: Function) => {\n if (config.container) {\n container.current = config.container;\n containerParent.current = container.current?.parentElement || null;\n\n publication.current = config.publication;\n\n navigatorInstance = new ExperimentalWebPubNavigator(\n config.container, \n config.publication, \n config.listeners, \n config.initialPosition, \n {\n preferences: config.preferences || {},\n defaults: config.defaults || {},\n injectables: config.injectables || undefined,\n contentProtection: config.contentProtection || undefined,\n keyboardPeripherals: config.keyboardPeripherals || []\n }\n );\n\n navigatorInstance.load().then(() => {\n cb();\n });\n }\n }, []);\n\n const WebPubNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n navigatorInstance?.destroy().then(() => {\n navigatorInstance = null; // Clear the singleton reference\n });\n }, []);\n\n const goRight = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goRight(animated, callback);\n }, []);\n\n const goLeft = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goLeft(animated, callback);\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const currentPositions = useCallback(() => {\n return navigatorInstance?.viewport?.positions;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward;\n }, []);\n\n const isScrollStart = useCallback(() => {\n return navigatorInstance?.isScrollStart;\n }, []);\n\n const isScrollEnd = useCallback(() => {\n return navigatorInstance?.isScrollEnd;\n }, []);\n\n const getCframes = useCallback(() => {\n return navigatorInstance?._cframes;\n }, []);\n\n const currentScriptMode = useCallback((): ScriptMode | undefined => {\n const metadata = navigatorInstance?.publication?.metadata;\n if (!metadata) return undefined;\n return getScriptMode(metadata);\n }, []);\n\n const timeline = useCallback((): Timeline | undefined => {\n return navigatorInstance?.timeline;\n }, []);\n\n return {\n WebPubNavigatorLoad, \n WebPubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n currentLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode,\n timeline,\n }\n}","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { FontFamilyStateObject } from \"@/lib/settingsReducer\";\n\nexport interface WebPubCSSSettings {\n fontFamily: FontFamilyStateObject;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n textAlign: ThTextAlignOptions | null;\n textNormalization: boolean;\n wordSpacing: number | null;\n zoom: number;\n}\n\nexport interface WebPubStatelessCache {\n settings: WebPubCSSSettings;\n}\n\nexport const useWebPubSettingsCache = (\n fontFamily: FontFamilyStateObject,\n fontWeight: number,\n hyphens: boolean | null,\n letterSpacing: number | null,\n ligatures: boolean | null,\n lineHeight: ThLineHeightOptions | null,\n noRuby: boolean | null,\n paragraphIndent: number | null,\n paragraphSpacing: number | null,\n publisherStyles: boolean,\n textAlign: ThTextAlignOptions | null,\n textNormalization: boolean,\n wordSpacing: number | null,\n zoom: number\n) => {\n const cache = useRef<WebPubStatelessCache>({\n settings: {\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n },\n }), [\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\n\n return cache;\n};\n"]}
@@ -1,9 +1,10 @@
1
- import { useFonts, useZoomCallbacks, StatefulReaderHeader, StatefulReaderFooter, getReaderClassNames } from './chunk-X6Z4WZLX.mjs';
2
- import { ThPluginRegistry, createDefaultPlugin, ThPluginProvider, useSpacingPresets, useSettingsComponentStatus, useFocusedDockableKey, usePositionStorage, fromActionPeripheralType, fromDockingPeripheralType, NavPeripheralType, NavigatorProvider, thorium_web_reader_app_default, StatefulDockingWrapper, useActionComponentStatus, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS, toActionPeripheralType, toDockingPeripheralType, useLineHeight } from './chunk-G4T4RXFB.mjs';
3
- import { useWebPubSettingsCache, useFullscreen, useWebPubNavigator, useTimeline, useDocumentTitle } from './chunk-AEEGHJVM.mjs';
4
- import { setFullscreen, setTimeline, setHovering, toggleImmersive, toggleActionOpen, dockAction, setPublicationStart, setPublicationEnd, setLoading } from './chunk-YE5QOQUT.mjs';
5
- import { usePreferences, resolveContentProtectionConfig, useActionsPreferences, useFilteredPreferenceKeys } from './chunk-7WGC22F3.mjs';
6
- import { useAppSelector, useAppDispatch } from './chunk-A575ZW4A.mjs';
1
+ import { useFonts, useZoomCallbacks, StatefulReaderHeader, StatefulReaderFooter, getReaderClassNames } from './chunk-5IT53TCU.mjs';
2
+ import { ThPluginRegistry, createDefaultPlugin, ThPluginProvider, useSpacingPresets, useSettingsComponentStatus, useFocusedDockableKey, usePositionStorage, useTocEntryTracking, fromActionPeripheralType, fromDockingPeripheralType, NavPeripheralType, useTocTreeBuilder, NavigatorProvider, thorium_web_reader_app_default, StatefulDockingWrapper, useActionComponentStatus, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS, toActionPeripheralType, toDockingPeripheralType, useLineHeight } from './chunk-LF6IMH7J.mjs';
3
+ import { useWebPubSettingsCache, useFullscreen, useWebPubNavigator, useTimelineAdjacency, usePublicationProgress, useDocumentTitle } from './chunk-CXKDZVAV.mjs';
4
+ import { setFullscreen, setHovering, toggleImmersive, toggleActionOpen, dockAction, setLoading } from './chunk-I765HTBI.mjs';
5
+ import { setProgress, setPublicationStart, setPublicationEnd } from './chunk-7SMOXFAF.mjs';
6
+ import { usePreferences, resolveContentProtectionConfig, useActionsPreferences, useFilteredPreferenceKeys } from './chunk-6DR4EAK3.mjs';
7
+ import { useAppSelector, useAppDispatch } from './chunk-MFVZ5AEN.mjs';
7
8
  import { useI18n } from './chunk-2NCN2AG2.mjs';
8
9
  import { useState, useLayoutEffect, useRef, useCallback, useMemo, useEffect } from 'react';
9
10
  import { Locator } from '@readium/shared';
@@ -179,7 +180,7 @@ var useWebPubReaderInit = ({
179
180
  container: container.current,
180
181
  publication,
181
182
  listeners,
182
- initialPosition: initialPosition ? new Locator(initialPosition) : void 0,
183
+ initialPosition: initialPosition ?? void 0,
183
184
  preferences: webPubPreferences,
184
185
  defaults: {
185
186
  experiments: preferences.experiments?.webPub || null
@@ -328,16 +329,23 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
328
329
  const {
329
330
  currentPositions,
330
331
  canGoBackward,
331
- canGoForward
332
+ canGoForward,
333
+ timeline: getNavigatorTimeline
332
334
  } = webPubNavigator;
333
335
  const { setLocalData, getLocalData, localData } = usePositionStorage(localDataKey, positionStorage);
334
- const timeline = useTimeline({
336
+ const tocTree = useAppSelector((state) => state.publication.toc?.tree);
337
+ const [currentTimelineItem, setCurrentTimelineItem] = useState(void 0);
338
+ const { updateAdjacentItems, clearAdjacentItems } = useTimelineAdjacency(getNavigatorTimeline);
339
+ const { updateCurrentTocEntry, clearCurrentTocEntry } = useTocEntryTracking(getNavigatorTimeline, tocTree);
340
+ const timeline = usePublicationProgress({
335
341
  publication,
342
+ getNavigatorTimeline,
343
+ currentTimelineItem,
336
344
  currentLocation: localData,
337
345
  currentPositions: currentPositions() || [],
338
346
  positionsList: void 0,
339
- onChange: (timeline2) => {
340
- dispatch(setTimeline(timeline2));
347
+ onChange: (progress) => {
348
+ dispatch(setProgress(progress));
341
349
  }
342
350
  });
343
351
  const documentTitleFormat = preferences.metadata?.documentTitle?.format;
@@ -377,6 +385,16 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
377
385
  const listeners = useMemo(() => ({
378
386
  frameLoaded: async function(_wnd) {
379
387
  },
388
+ timelineItemChanged: function(item) {
389
+ setCurrentTimelineItem(item);
390
+ if (!item) {
391
+ clearAdjacentItems();
392
+ clearCurrentTocEntry();
393
+ return;
394
+ }
395
+ updateAdjacentItems(item);
396
+ updateCurrentTocEntry(item);
397
+ },
380
398
  positionChanged: async function(locator) {
381
399
  setLocalData(locator);
382
400
  if (canGoBackward()) {
@@ -446,9 +464,12 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
446
464
  }
447
465
  }
448
466
  }
449
- }), [setLocalData, canGoBackward, canGoForward, dispatch, toggleIsImmersive, zoomIn, zoomOut, profile, handleFullscreen, getFocusedDockableKey]);
450
- const initialPosition = useMemo(() => getLocalData(), [getLocalData]);
451
- useWebPubReaderInit({
467
+ }), [setLocalData, canGoBackward, canGoForward, dispatch, toggleIsImmersive, zoomIn, zoomOut, profile, handleFullscreen, getFocusedDockableKey, updateAdjacentItems, clearAdjacentItems, updateCurrentTocEntry, clearCurrentTocEntry]);
468
+ const initialPosition = useMemo(() => {
469
+ const stored = getLocalData();
470
+ return stored ? Locator.deserialize(stored) ?? null : null;
471
+ }, [getLocalData]);
472
+ const { navigatorReady } = useWebPubReaderInit({
452
473
  container,
453
474
  publication,
454
475
  initialPosition,
@@ -468,6 +489,7 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
468
489
  dispatch(setLoading(false));
469
490
  }
470
491
  });
492
+ useTocTreeBuilder(publication, navigatorReady, getNavigatorTimeline);
471
493
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(NavigatorProvider, { visualNavigator: webPubNavigator, children: /* @__PURE__ */ jsx("main", { className: thorium_web_reader_app_default.main, children: /* @__PURE__ */ jsx(StatefulDockingWrapper, { children: /* @__PURE__ */ jsxs(
472
494
  "div",
473
495
  {
@@ -497,6 +519,7 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
497
519
  StatefulReaderFooter,
498
520
  {
499
521
  layout: layoutUI,
522
+ publication,
500
523
  progressionFormatPref: preferences.theming.progression?.format?.webPub,
501
524
  progressionFormatFallback: "readingOrderIndex" /* readingOrderIndex */
502
525
  }
@@ -507,5 +530,5 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
507
530
  };
508
531
 
509
532
  export { ExperimentalWebPubStatefulReader };
510
- //# sourceMappingURL=chunk-MD5LZNDG.mjs.map
511
- //# sourceMappingURL=chunk-MD5LZNDG.mjs.map
533
+ //# sourceMappingURL=chunk-DKF53WEQ.mjs.map
534
+ //# sourceMappingURL=chunk-DKF53WEQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/WebPub/Hooks/usePreferencesConfig.ts","../src/components/WebPub/Hooks/useInjectablesConfig.ts","../src/components/WebPub/Hooks/useReaderInit.ts","../src/components/WebPub/Hooks/useWebPubKeyboardPeripherals.ts","../src/components/WebPub/StatefulReader.tsx"],"names":["useMemo","useState","useRef","useCallback","actionKey"],"mappings":"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","file":"chunk-DKF53WEQ.mjs","sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { IWebPubPreferences, TextAlignment } from \"@readium/navigator\";\nimport { ThLineHeightOptions, ThSettingsKeys } from \"@/preferences/models\";\nimport { FontMetadata } from \"@/preferences/services/fonts\";\nimport { WebPubCSSSettings } from \"@/core/Hooks/WebPub/useWebPubSettingsCache\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\nimport { useLineHeight } from \"@/components/Settings/Spacing/hooks/useLineHeight\";\n\ninterface UseWebPubPreferencesConfigProps {\n settings: WebPubCSSSettings;\n fontLanguage: string;\n hasDisplayTransformability: boolean;\n getFontMetadata: (fontFamily: string) => FontMetadata;\n}\n\nexport const useWebPubPreferencesConfig = ({\n settings,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n}: UseWebPubPreferencesConfigProps) => {\n const { processedValues: lineHeightOptions } = useLineHeight();\n const { isComponentUsed: isFontFamilyUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.fontFamily,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isFontWeightUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.fontWeight,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isHyphensUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.hyphens,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isLigaturesUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.ligatures,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isNoRubyUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.noRuby,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isLetterSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.letterSpacing,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isLineHeightUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.lineHeight,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isParagraphIndentUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.paragraphIndent,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isParagraphSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.paragraphSpacing,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isTextAlignUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.textAlign,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isTextNormalizeUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.textNormalize,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isWordSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.wordSpacing,\n publicationType: \"webpub\",\n });\n\n const webPubPreferences = useMemo(() => {\n const preferences: IWebPubPreferences = {\n zoom: settings.zoom\n };\n\n if (hasDisplayTransformability) {\n if (isFontFamilyUsed) preferences.fontFamily = getFontMetadata(settings.fontFamily[fontLanguage] ?? \"\")?.fontStack || null;\n if (isFontWeightUsed) preferences.fontWeight = settings.fontWeight;\n if (isLigaturesUsed) preferences.ligatures = settings.ligatures;\n if (isNoRubyUsed) preferences.noRuby = settings.noRuby;\n if (isLetterSpacingUsed) preferences.letterSpacing = settings.letterSpacing;\n if (isLineHeightUsed) preferences.lineHeight = settings.lineHeight === null\n ? null\n : lineHeightOptions[settings.lineHeight as ThLineHeightOptions.small | ThLineHeightOptions.medium | ThLineHeightOptions.large];\n if (isParagraphIndentUsed) preferences.paragraphIndent = settings.paragraphIndent;\n if (isParagraphSpacingUsed) preferences.paragraphSpacing = settings.paragraphSpacing;\n if (isTextAlignUsed) preferences.textAlign = settings.textAlign as TextAlignment | null | undefined;\n if (isHyphensUsed && settings.textAlign !== \"publisher\") preferences.hyphens = settings.hyphens;\n if (isTextNormalizeUsed) preferences.textNormalization = settings.textNormalization;\n if (isWordSpacingUsed) preferences.wordSpacing = settings.wordSpacing;\n }\n\n return preferences;\n }, [\n settings,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n isFontFamilyUsed,\n isFontWeightUsed,\n isHyphensUsed,\n isLigaturesUsed,\n isNoRubyUsed,\n isLetterSpacingUsed,\n isLineHeightUsed,\n isParagraphIndentUsed,\n isParagraphSpacingUsed,\n isTextAlignUsed,\n isTextNormalizeUsed,\n isWordSpacingUsed,\n lineHeightOptions\n ]);\n\n return { webPubPreferences };\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { IInjectablesConfig } from \"@readium/navigator\";\nimport { InjectableFontResources } from \"@/preferences/services/fonts\";\n\ninterface UseWebPubInjectablesConfigProps {\n isFontFamilyUsed: boolean;\n fontLanguage: string;\n getFontInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => InjectableFontResources | null;\n}\n\nexport const useWebPubInjectablesConfig = ({\n isFontFamilyUsed,\n fontLanguage,\n getFontInjectables,\n}: UseWebPubInjectablesConfigProps) => {\n const injectables = useMemo(() => {\n let injectablesConfig: IInjectablesConfig | undefined;\n\n if (isFontFamilyUsed) {\n const fontResources = getFontInjectables({ language: fontLanguage });\n if (fontResources) {\n injectablesConfig = {\n allowedDomains: fontResources.allowedDomains,\n rules: [{\n resources: [/\\.xhtml$/, /\\.html$/],\n prepend: fontResources.prepend,\n append: fontResources.append\n }]\n };\n }\n }\n\n return injectablesConfig;\n }, [isFontFamilyUsed, fontLanguage, getFontInjectables]);\n\n return { injectables };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useState, useRef } from \"react\";\n\nimport { Locator, Publication } from \"@readium/shared\";\nimport { WebPubNavigatorListeners, IContentProtectionConfig } from \"@readium/navigator\";\nimport { ThPreferences } from \"@/preferences\";\nimport { FontMetadata, InjectableFontResources } from \"@/preferences/services/fonts\";\nimport { WebPubStatelessCache } from \"@/core/Hooks/WebPub/useWebPubSettingsCache\";\n\nimport { useWebPubPreferencesConfig } from \"./usePreferencesConfig\";\nimport { useWebPubInjectablesConfig } from \"./useInjectablesConfig\";\nimport { useWebPubNavigator, WebPubNavigatorLoadProps } from \"@/core/Hooks/WebPub/useWebPubNavigator\";\nimport { IKeyboardPeripheralsConfig } from \"@readium/navigator\";\n\ninterface UseWebPubReaderInitProps {\n container: React.RefObject<HTMLDivElement | null>;\n publication: Publication | null;\n initialPosition: Locator | null;\n listeners: WebPubNavigatorListeners;\n preferences: ThPreferences;\n cache: React.RefObject<WebPubStatelessCache>;\n isFontFamilyUsed: boolean;\n fontLanguage: string;\n hasDisplayTransformability: boolean;\n getFontMetadata: (fontId: string) => FontMetadata;\n injectFontResources: (resources: InjectableFontResources | null) => void;\n removeFontResources: () => void;\n getFontInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => InjectableFontResources | null;\n contentProtectionConfig?: IContentProtectionConfig;\n keyboardPeripherals?: IKeyboardPeripheralsConfig;\n onNavigatorReady?: () => void;\n onNavigatorLoaded?: () => void;\n onCleanup?: () => void;\n}\n\nexport const useWebPubReaderInit = ({\n container,\n publication,\n initialPosition,\n listeners,\n preferences,\n cache,\n isFontFamilyUsed,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n injectFontResources,\n removeFontResources,\n getFontInjectables,\n contentProtectionConfig,\n keyboardPeripherals,\n onNavigatorReady,\n onNavigatorLoaded,\n onCleanup,\n}: UseWebPubReaderInitProps) => {\n const [navigatorReady, setNavigatorReady] = useState(false);\n\n const { webPubPreferences } = useWebPubPreferencesConfig({\n settings: cache.current.settings,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n });\n\n const { injectables } = useWebPubInjectablesConfig({\n isFontFamilyUsed,\n fontLanguage,\n getFontInjectables,\n });\n\n const handleCleanup = useCallback(() => {\n removeFontResources();\n onCleanup?.();\n }, [removeFontResources, onCleanup]);\n\n const { WebPubNavigatorLoad, WebPubNavigatorDestroy } = useWebPubNavigator();\n const isNavigatorLoadedWebPub = useRef(false);\n \n useEffect(() => {\n // Only initialize once, never re-render\n if (!publication || isNavigatorLoadedWebPub.current) return;\n\n // Add container protection\n if (!container.current) {\n console.error(\"Container ref is not available for navigator initialization\");\n return;\n }\n\n const config: WebPubNavigatorLoadProps = {\n container: container.current,\n publication,\n listeners,\n initialPosition: initialPosition ?? undefined,\n preferences: webPubPreferences,\n defaults: {\n experiments: preferences.experiments?.webPub || null\n },\n injectables,\n contentProtection: contentProtectionConfig,\n keyboardPeripherals,\n };\n\n isNavigatorLoadedWebPub.current = true;\n \n // Call onNavigatorReady outside of navigator load\n onNavigatorReady?.();\n \n // Pass onNavigatorLoaded as the callback to WebPubNavigatorLoad\n WebPubNavigatorLoad(config, () => {\n // Set navigatorReady to true only after navigator actually loads\n setNavigatorReady(true);\n onNavigatorLoaded?.();\n });\n\n return () => {\n if (isNavigatorLoadedWebPub.current) {\n setNavigatorReady(false);\n WebPubNavigatorDestroy(() => {\n isNavigatorLoadedWebPub.current = false;\n handleCleanup();\n });\n }\n };\n }, []);\n\n // Handle font resource injection\n useEffect(() => {\n if (isFontFamilyUsed) {\n const fontResources = getFontInjectables({ language: fontLanguage });\n if (fontResources) {\n injectFontResources(getFontInjectables(undefined, true));\n }\n }\n }, [isFontFamilyUsed, fontLanguage, getFontInjectables, injectFontResources]);\n\n return {\n navigatorReady,\n };\n};\n","import { useMemo } from \"react\";\n\nimport { IKeyboardPeripheralsConfig } from \"@readium/navigator\";\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useFullscreen } from \"@/core/Hooks/useFullscreen\";\nimport { useFilteredPreferenceKeys } from \"@/preferences/hooks/useFilteredPreferenceKeys\";\nimport { useActionComponentStatus } from \"../../Actions/hooks/useActionComponentStatus\";\n\nimport { NavPeripheralType, toActionPeripheralType, toDockingPeripheralType, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS } from \"@/helpers/peripherals\";\n\nexport const useWebPubKeyboardPeripherals = (): IKeyboardPeripheralsConfig => {\n const { actionsKeys, docking } = useActionsPreferences();\n const { isSupported: isFullscreenSupported } = useFullscreen();\n const { webPubActionKeys } = useFilteredPreferenceKeys();\n\n const { isComponentAvailable: isFullscreenAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.fullscreen, orderArray: webPubActionKeys, additionalCondition: isFullscreenSupported });\n const { isComponentAvailable: isTocAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.toc, orderArray: webPubActionKeys });\n const { isComponentAvailable: isSettingsAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.settings, orderArray: webPubActionKeys });\n const { isComponentAvailable: isJumpToPositionAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.jumpToPosition, orderArray: webPubActionKeys });\n\n return useMemo(() => {\n const actionAvailability: Record<string, boolean> = {\n [ThActionsKeys.fullscreen]: isFullscreenAvailable,\n [ThActionsKeys.toc]: isTocAvailable,\n [ThActionsKeys.settings]: isSettingsAvailable,\n [ThActionsKeys.jumpToPosition]: isJumpToPositionAvailable,\n };\n\n const config: IKeyboardPeripheralsConfig = [\n { type: NavPeripheralType.zoomIn, keyCombos: [...ZOOM_IN_KEY_COMBOS] },\n { type: NavPeripheralType.zoomOut, keyCombos: [...ZOOM_OUT_KEY_COMBOS] },\n ];\n\n for (const [key, tokens] of Object.entries(actionsKeys)) {\n const shortcut = tokens?.shortcut;\n const isAvailable = actionAvailability[key] ?? true;\n if (shortcut && isAvailable) config.push({ type: toActionPeripheralType(key), keyCombos: shortcut.keyCombos });\n }\n\n for (const [key, tokens] of Object.entries(docking.keys)) {\n if (tokens?.shortcut) config.push({ type: toDockingPeripheralType(key), keyCombos: tokens.shortcut.keyCombos });\n }\n\n return config;\n }, [actionsKeys, docking.keys, isFullscreenAvailable, isTocAvailable, isSettingsAvailable, isJumpToPositionAvailable]);\n};\n","\"use client\";\n\nimport { useState, useRef, useCallback, useMemo, useLayoutEffect } from \"react\";\n\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\n\nimport { StatefulReaderProps } from \"../Reader/StatefulReaderWrapper\";\n\nimport {\n ThLayoutUI,\n ThDocumentTitleFormat,\n ThProgressionFormat,\n ThSpacingSettingsKeys,\n ThSettingsKeys,\n ThDockingKeys,\n ThActionsKeys\n} from \"@/preferences/models\";\n\nimport { ThPluginRegistry } from \"../Plugins/PluginRegistry\";\n\nimport { ThPluginProvider } from \"../Plugins/PluginProvider\";\nimport { NavigatorProvider } from \"@/core/Navigator\";\n\nimport {\n BasicTextSelection,\n ContextMenuEvent,\n FrameClickEvent,\n SuspiciousActivityEvent,\n} from \"@readium/navigator-html-injectables\";\nimport { WebPubNavigatorListeners } from \"@readium/navigator\";\nimport {\n Locator,\n Publication,\n TimelineItem\n} from \"@readium/shared\";\n\nimport { StatefulDockingWrapper } from \"../Docking/StatefulDockingWrapper\";\nimport { StatefulReaderHeader } from \"../StatefulReaderHeader\";\nimport { StatefulReaderFooter } from \"../StatefulReaderFooter\";\nimport { PositionStorage } from \"../Reader/StatefulReaderWrapper\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\nimport { useWebPubNavigator } from \"@/core/Hooks/WebPub\";\nimport { useWebPubSettingsCache } from \"@/core/Hooks/WebPub/useWebPubSettingsCache\";\nimport { useWebPubReaderInit } from \"./Hooks/useReaderInit\";\nimport { useWebPubKeyboardPeripherals } from \"./Hooks/useWebPubKeyboardPeripherals\";\nimport { useFullscreen } from \"@/core/Hooks/useFullscreen\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePublicationProgress } from \"@/core/Hooks/usePublicationProgress\";\nimport { useTimelineAdjacency } from \"@/core/Hooks/useTimelineAdjacency\";\nimport { useTocEntryTracking } from \"@/components/Actions/Toc/useTocEntryTracking\";\nimport { useTocTreeBuilder } from \"@/core/Hooks/useTocTreeBuilder\";\nimport { usePositionStorage } from \"@/hooks/usePositionStorage\";\nimport { useDocumentTitle } from \"@/core/Hooks/useDocumentTitle\";\nimport { useSpacingPresets } from \"../Settings/Spacing/hooks/useSpacingPresets\";\nimport { useFonts } from \"@/core/Hooks/fonts/useFonts\";\nimport { useZoomCallbacks } from \"@/components/Settings/hooks/useZoomCallbacks\";\nimport { useFocusedDockableKey } from \"../Docking/hooks/useFocusedDockableKey\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport { \n setLoading,\n setHovering, \n toggleImmersive, \n setFullscreen,\n} from \"@/lib/readerReducer\";\nimport {\n setProgress,\n setPublicationStart,\n setPublicationEnd\n} from \"@/lib/publicationReducer\";\nimport { toggleActionOpen, dockAction } from \"@/lib/actionsReducer\";\n\nimport classNames from \"classnames\";\nimport { createDefaultPlugin } from \"../Plugins/helpers/createDefaultPlugin\";\nimport { getReaderClassNames } from \"../Helpers/getReaderClassNames\";\nimport { resolveContentProtectionConfig } from \"@/preferences/models/protection\";\nimport { NavPeripheralType, fromActionPeripheralType, fromDockingPeripheralType } from \"@/helpers/peripherals\";\n\nexport const ExperimentalWebPubStatefulReader = ({\n publication,\n localDataKey,\n plugins,\n positionStorage,\n containerRefSetter\n}: StatefulReaderProps) => {\n const [pluginsRegistered, setPluginsRegistered] = useState(false);\n\n useLayoutEffect(() => {\n if (plugins && plugins.length > 0) {\n plugins.forEach(plugin => {\n ThPluginRegistry.register(plugin);\n });\n } else {\n ThPluginRegistry.register(createDefaultPlugin());\n }\n setPluginsRegistered(true);\n }, [plugins]);\n\n if (!pluginsRegistered) {\n return null;\n }\n\n return (\n <>\n <ThPluginProvider>\n <StatefulReaderInner publication={ publication } localDataKey={ localDataKey } positionStorage={ positionStorage } containerRefSetter={ containerRefSetter } />\n </ThPluginProvider>\n </>\n );\n};\n\nconst StatefulReaderInner = ({ publication, localDataKey, positionStorage, containerRefSetter }: { publication: Publication; localDataKey: string | null; positionStorage?: PositionStorage; containerRefSetter?: (el: Element | null) => void }) => {\n const { preferences, getFontMetadata, getFontInjectables } = usePreferences();\n const { t } = useI18n();\n const { getEffectiveSpacingValue } = useSpacingPresets();\n const { injectFontResources, removeFontResources } = useFonts();\n\n // Check if font family component is being used\n const { isComponentUsed: isFontFamilyUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.fontFamily,\n publicationType: \"webpub\",\n });\n\n const container = useRef<HTMLDivElement>(null);\n\n const textAlign = useAppSelector(state => state.webPubSettings.textAlign);\n const fontFamily = useAppSelector(state => state.webPubSettings.fontFamily);\n const fontWeight = useAppSelector(state => state.webPubSettings.fontWeight);\n const hyphens = useAppSelector(state => state.webPubSettings.hyphens);\n const ligatures = useAppSelector(state => state.webPubSettings.ligatures);\n const noRuby = useAppSelector(state => state.webPubSettings.noRuby);\n const letterSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.letterSpacing);\n const lineHeight = getEffectiveSpacingValue(ThSpacingSettingsKeys.lineHeight);\n const paragraphIndent = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphIndent);\n const paragraphSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphSpacing);\n const publisherStyles = useAppSelector(state => state.webPubSettings.publisherStyles);\n const textNormalization = useAppSelector(state => state.webPubSettings.textNormalization);\n const wordSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.wordSpacing);\n const zoom = useAppSelector(state => state.webPubSettings.zoom);\n const fontLanguage = useAppSelector(state => state.publication.fontLanguage);\n const hasDisplayTransformability = useAppSelector(state => state.publication.hasDisplayTransformability);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n const containerBreakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n\n const cache = useWebPubSettingsCache(\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 const layoutUI = preferences.theming.layout.ui?.webPub || ThLayoutUI.stacked;\n\n const dispatch = useAppDispatch();\n const getFocusedDockableKey = useFocusedDockableKey();\n const profile = useAppSelector(state => state.reader.profile);\n const keyboardPeripherals = useWebPubKeyboardPeripherals();\n\n const onFsChange = useCallback((isFullscreen: boolean) => {\n dispatch(setFullscreen(isFullscreen));\n }, [dispatch]);\n \n const { handleFullscreen } = useFullscreen(onFsChange);\n\n const webPubNavigator = useWebPubNavigator();\n const {\n currentPositions,\n canGoBackward,\n canGoForward,\n timeline: getNavigatorTimeline\n } = webPubNavigator;\n\n const { setLocalData, getLocalData, localData } = usePositionStorage(localDataKey, positionStorage);\n\n const tocTree = useAppSelector(state => state.publication.toc?.tree);\n\n const [currentTimelineItem, setCurrentTimelineItem] = useState<TimelineItem | undefined>(undefined);\n\n const { updateAdjacentItems, clearAdjacentItems } = useTimelineAdjacency(getNavigatorTimeline);\n const { updateCurrentTocEntry, clearCurrentTocEntry } = useTocEntryTracking(getNavigatorTimeline, tocTree);\n\n const timeline = usePublicationProgress({\n publication: publication,\n getNavigatorTimeline,\n currentTimelineItem,\n currentLocation: localData,\n currentPositions: currentPositions() || [],\n positionsList: undefined,\n onChange: (progress) => {\n dispatch(setProgress(progress));\n }\n });\n\n const documentTitleFormat = preferences.metadata?.documentTitle?.format;\n\n let documentTitle: string | undefined;\n\n if (documentTitleFormat) {\n if (typeof documentTitleFormat === \"object\" && \"key\" in documentTitleFormat) {\n const translatedTitle = t(documentTitleFormat.key);\n documentTitle = translatedTitle !== documentTitleFormat.key \n ? translatedTitle \n : documentTitleFormat.fallback;\n } else {\n switch (documentTitleFormat) {\n case ThDocumentTitleFormat.title:\n documentTitle = timeline?.title;\n break;\n case ThDocumentTitleFormat.chapter:\n documentTitle = timeline?.progression?.currentChapter;\n break;\n case ThDocumentTitleFormat.titleAndChapter:\n if (timeline?.title && timeline?.progression?.currentChapter) {\n documentTitle = `${ timeline.title } – ${ timeline.progression.currentChapter }`;\n }\n break;\n case ThDocumentTitleFormat.none:\n documentTitle = undefined;\n break;\n default: \n documentTitle = documentTitleFormat;\n break;\n }\n }\n }\n\n useDocumentTitle(documentTitle);\n\n const toggleIsImmersive = useCallback(() => {\n // If tap/click in iframe, then header/footer no longer hoovering\n dispatch(setHovering(false));\n dispatch(toggleImmersive());\n }, [dispatch]);\n\n const { zoomIn, zoomOut } = useZoomCallbacks(webPubNavigator);\n\n const listeners: WebPubNavigatorListeners = useMemo(() => ({\n frameLoaded: async function (_wnd: Window): Promise<void> {},\n timelineItemChanged: function (item: TimelineItem | undefined): void {\n setCurrentTimelineItem(item);\n\n if (!item) {\n clearAdjacentItems();\n clearCurrentTocEntry();\n return;\n }\n\n updateAdjacentItems(item);\n updateCurrentTocEntry(item);\n },\n positionChanged: async function (locator: Locator): Promise<void> {\n setLocalData(locator);\n\n if (canGoBackward()) {\n dispatch(setPublicationStart(false));\n } else {\n dispatch(setPublicationStart(true));\n }\n\n if (canGoForward()) {\n dispatch(setPublicationEnd(false));\n } else {\n dispatch(setPublicationEnd(true));\n }\n },\n tap: function (_e: FrameClickEvent): boolean {\n toggleIsImmersive();\n return true;\n },\n click: function (_e: FrameClickEvent): boolean {\n return false;\n },\n zoom: function (_scale: number): void { },\n scroll: function (_delta: number): void { },\n customEvent: function (_key: string, _data: unknown): void { },\n handleLocator: function (locator: Locator): boolean {\n const href = locator.href;\n\n if (\n href.startsWith(\"http://\") ||\n href.startsWith(\"https://\") ||\n href.startsWith(\"mailto:\") ||\n href.startsWith(\"tel:\")\n ) {\n if (confirm(`Open \"${href}\" ?`)) window.open(href, \"_blank\");\n } else {\n console.warn(\"Unhandled locator\", locator);\n }\n return false;\n },\n textSelected: function (_selection: BasicTextSelection): void {},\n contentProtection: function (_type: string, _data: SuspiciousActivityEvent): void {},\n contextMenu: function (_data: ContextMenuEvent): void {},\n peripheral: function (data): void {\n switch (data.type) {\n case NavPeripheralType.zoomIn: zoomIn(); break;\n case NavPeripheralType.zoomOut: zoomOut(); break;\n default: {\n const actionKey = fromActionPeripheralType(data.type);\n\n if (actionKey === ThActionsKeys.fullscreen) {\n handleFullscreen();\n return;\n }\n\n if (actionKey && profile) {\n dispatch(toggleActionOpen({ key: actionKey, profile }));\n return;\n }\n\n const dockingKey = fromDockingPeripheralType(data.type);\n\n if (dockingKey && profile) {\n const actionKey = getFocusedDockableKey(dockingKey as ThDockingKeys);\n if (actionKey) {\n dispatch(dockAction({ key: actionKey, dockingKey: dockingKey as ThDockingKeys, profile }));\n }\n }\n }\n }\n },\n }), [setLocalData, canGoBackward, canGoForward, dispatch, toggleIsImmersive, zoomIn, zoomOut, profile, handleFullscreen, getFocusedDockableKey, updateAdjacentItems, clearAdjacentItems, updateCurrentTocEntry, clearCurrentTocEntry]);\n\n // getLocalData() returns a plain JSON.parse()'d object on cold load (not yet a real\n // Locator instance) — the navigator calls Timeline.locate() on this at startup, which\n // needs real prototype methods (.time(), etc.), so deserialize it here at the point of use.\n const initialPosition = useMemo(() => {\n const stored = getLocalData();\n return stored ? (Locator.deserialize(stored) ?? null) : null;\n }, [getLocalData]);\n\n // Initialize reader using the new composite hook\n const { navigatorReady } = useWebPubReaderInit({\n container,\n publication,\n initialPosition,\n listeners,\n preferences,\n cache,\n isFontFamilyUsed,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n injectFontResources,\n removeFontResources,\n getFontInjectables,\n contentProtectionConfig: resolveContentProtectionConfig(preferences.contentProtection, t),\n keyboardPeripherals,\n onNavigatorReady: () => {\n dispatch(setLoading(false));\n },\n });\n\n useTocTreeBuilder(publication, navigatorReady, getNavigatorTimeline);\n\n return (\n <>\n <NavigatorProvider visualNavigator={ webPubNavigator }>\n <main className={ readerStyles.main }>\n <StatefulDockingWrapper>\n <div\n ref={ containerRefSetter }\n className={\n classNames(\n getReaderClassNames({\n isScroll: true,\n isImmersive,\n isHovering,\n layoutUI,\n breakpoint,\n containerBreakpoint\n })\n )\n }\n >\n <StatefulReaderHeader \n actionKeys={ preferences.actions.webPubOrder }\n actionsOrder={ preferences.actions.webPubOrder }\n layout={ layoutUI } \n runningHeadFormatPref={ preferences.theming.header?.runningHead?.format?.webPub }\n />\n\n <article className={ readerStyles.wrapper } aria-label={ t(\"reader.app.publicationWrapper\") }>\n <div id=\"thorium-web-container\" className={ readerStyles.iframeContainer } ref={ container }></div>\n </article>\n\n <StatefulReaderFooter\n layout={ layoutUI }\n publication={ publication }\n progressionFormatPref={ preferences.theming.progression?.format?.webPub }\n progressionFormatFallback={ ThProgressionFormat.readingOrderIndex }\n />\n </div>\n </StatefulDockingWrapper>\n </main>\n </NavigatorProvider>\n </>\n)};"]}
@@ -1,4 +1,4 @@
1
- import { useMediaQuery } from './chunk-NQ2ZSGCX.mjs';
1
+ import { useMediaQuery } from './chunk-MFVZ5AEN.mjs';
2
2
  import { useState, useMemo, useEffect } from 'react';
3
3
 
4
4
  var useBreakpoints = (map, onChange) => {
@@ -120,5 +120,5 @@ var useMonochrome = (onChange) => {
120
120
  };
121
121
 
122
122
  export { useBreakpoints, useForcedColors, useMonochrome, useReducedMotion, useReducedTransparency };
123
- //# sourceMappingURL=chunk-GFSLVQIG.mjs.map
124
- //# sourceMappingURL=chunk-GFSLVQIG.mjs.map
123
+ //# sourceMappingURL=chunk-EREFYF5J.mjs.map
124
+ //# sourceMappingURL=chunk-EREFYF5J.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/Hooks/useBreakpoints.ts","../src/core/Hooks/useReducedMotion.ts","../src/core/Hooks/useReducedTransparency.ts","../src/core/Hooks/useForcedColors.ts","../src/core/Hooks/useMonochrome.ts"],"names":["useState","useEffect"],"mappings":"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","file":"chunk-GFSLVQIG.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { ThBreakpoints } from \"@/preferences/models\";\n\nimport { useMediaQuery } from \"./useMediaQuery\";\n\ntype ThBreakpointRange = {\n min: number | null,\n max: number | null\n}\n\ntype ThBreakpointRanges = { [key in ThBreakpoints]: ThBreakpointRange | null; }\n\nexport type BreakpointsMap<T> = {\n [key in ThBreakpoints]?: T\n};\n\nexport type ThBreakpointsObject = { [key in ThBreakpoints]: boolean | null } & { current: string | null } & { ranges: ThBreakpointRanges }\n\nexport const useBreakpoints = (map: BreakpointsMap<number | null>, onChange?: (breakpoint: ThBreakpoints | null) => void): ThBreakpointsObject => {\n const [currentBreakpoint, setCurrentBreakpoint] = useState<ThBreakpoints | null>(null);\n\n const makeMediaString = (range: ThBreakpointRange | null) => {\n if (!range || (!range.min && !range.max)) return null;\n \n let mediaString = \"screen\"\n if (range.min) {\n mediaString += ` and (min-width: ${ range.min }px)`;\n }\n if (range.max) {\n mediaString += ` and (max-width: ${ range.max }px)`\n }\n return mediaString;\n };\n\n const initRanges = (prefs: BreakpointsMap<number | null>) => {\n const breakpointRanges: ThBreakpointRanges = {\n [ThBreakpoints.compact]: null,\n [ThBreakpoints.medium]: null,\n [ThBreakpoints.expanded]: null,\n [ThBreakpoints.large]: null,\n [ThBreakpoints.xLarge]: null\n };\n \n let prev: null | number = null;\n \n Object.entries(prefs).forEach(([ key, value ]) => {\n if (value && !isNaN(value)) {\n const max = value;\n const min = prev ? prev + 1 : null;\n Object.defineProperty(breakpointRanges, key, {\n value: {\n min: min,\n max: max\n }\n });\n prev = value;\n } else if (!value && key === ThBreakpoints.xLarge && prev) {\n Object.defineProperty(breakpointRanges, key, {\n value: {\n min: prev + 1,\n max: null\n }\n });\n }\n });\n\n return breakpointRanges;\n };\n\n const ranges = useMemo(() => initRanges(map), [map]);\n\n const compactMedia = makeMediaString(ranges[ThBreakpoints.compact]);\n const mediumMedia = makeMediaString(ranges[ThBreakpoints.medium]);\n const expandedMedia = makeMediaString(ranges[ThBreakpoints.expanded]);\n const largeMedia = makeMediaString(ranges[ThBreakpoints.large]);\n const xLargeMedia = makeMediaString(ranges[ThBreakpoints.xLarge]);\n\n const compactMatches = useMediaQuery(compactMedia);\n const mediumMatches = useMediaQuery(mediumMedia);\n const expandedMatches = useMediaQuery(expandedMedia);\n const largeMatches = useMediaQuery(largeMedia);\n const xLargeMatches = useMediaQuery(xLargeMedia);\n\n useEffect(() => {\n let newBreakpoint = currentBreakpoint;\n\n if (compactMatches) {\n newBreakpoint = ThBreakpoints.compact;\n } else if (mediumMatches) {\n newBreakpoint = ThBreakpoints.medium;\n } else if (expandedMatches) {\n newBreakpoint = ThBreakpoints.expanded;\n } else if (largeMatches) {\n newBreakpoint = ThBreakpoints.large;\n } else if (xLargeMatches) {\n newBreakpoint = ThBreakpoints.xLarge;\n }\n\n setCurrentBreakpoint(newBreakpoint);\n onChange && onChange(newBreakpoint);\n }, [currentBreakpoint, compactMatches, mediumMatches, expandedMatches, largeMatches, xLargeMatches, onChange]);\n\n return {\n [ThBreakpoints.compact]: compactMatches,\n [ThBreakpoints.medium]: mediumMatches,\n [ThBreakpoints.expanded]: expandedMatches,\n [ThBreakpoints.large]: largeMatches,\n [ThBreakpoints.xLarge]: xLargeMatches,\n current: currentBreakpoint,\n ranges: ranges\n };\n};","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\nexport const useReducedMotion = (onChange?: (reducedMotion: boolean) => void) => {\n const [reducedMotion, setReducedMotion] = useState(false);\n\n const prefersReducedMotion = useMediaQuery(\"(prefers-reduced-motion: reduce)\");\n\n useEffect(() => {\n setReducedMotion(prefersReducedMotion);\n onChange && onChange(prefersReducedMotion);\n }, [prefersReducedMotion, onChange]);\n\n return reducedMotion;\n}","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\nexport const useReducedTransparency = (onChange?: (reducedTransparency: boolean) => void) => {\n const [reducedTransparency, setReducedTransparency] = useState(false);\n\n const prefersReducedTransparency = useMediaQuery(\"(prefers-reduced-transparency: reduce)\");\n\n useEffect(() => {\n setReducedTransparency(prefersReducedTransparency);\n onChange && onChange(prefersReducedTransparency);\n }, [prefersReducedTransparency, onChange]);\n\n return reducedTransparency;\n}","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\nexport const useForcedColors = (onChange?: (forcedColors: boolean) => void) => {\n const [colors, setForcedColors] = useState(false);\n\n const forcedColors = useMediaQuery(\"(forced-colors: active)\");\n\n useEffect(() => {\n setForcedColors(forcedColors);\n onChange && onChange(forcedColors);\n }, [forcedColors, onChange]);\n\n return colors;\n}","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\nexport const useMonochrome = (onChange?: (isMonochrome: boolean) => void) => {\n const [isMonochrome, setMonochrome] = useState(false);\n\n const monochrome = useMediaQuery(\"(monochrome)\");\n\n useEffect(() => {\n setMonochrome(monochrome);\n onChange && onChange(monochrome);\n }, [monochrome, onChange]);\n\n return isMonochrome;\n}"]}
1
+ {"version":3,"sources":["../src/core/Hooks/useBreakpoints.ts","../src/core/Hooks/useReducedMotion.ts","../src/core/Hooks/useReducedTransparency.ts","../src/core/Hooks/useForcedColors.ts","../src/core/Hooks/useMonochrome.ts"],"names":["useState","useEffect"],"mappings":"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","file":"chunk-EREFYF5J.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\n\nimport { ThBreakpoints } from \"@/preferences/models\";\n\nimport { useMediaQuery } from \"./useMediaQuery\";\n\ntype ThBreakpointRange = {\n min: number | null,\n max: number | null\n}\n\ntype ThBreakpointRanges = { [key in ThBreakpoints]: ThBreakpointRange | null; }\n\nexport type BreakpointsMap<T> = {\n [key in ThBreakpoints]?: T\n};\n\nexport type ThBreakpointsObject = { [key in ThBreakpoints]: boolean | null } & { current: string | null } & { ranges: ThBreakpointRanges }\n\nexport const useBreakpoints = (map: BreakpointsMap<number | null>, onChange?: (breakpoint: ThBreakpoints | null) => void): ThBreakpointsObject => {\n const [currentBreakpoint, setCurrentBreakpoint] = useState<ThBreakpoints | null>(null);\n\n const makeMediaString = (range: ThBreakpointRange | null) => {\n if (!range || (!range.min && !range.max)) return null;\n \n let mediaString = \"screen\"\n if (range.min) {\n mediaString += ` and (min-width: ${ range.min }px)`;\n }\n if (range.max) {\n mediaString += ` and (max-width: ${ range.max }px)`\n }\n return mediaString;\n };\n\n const initRanges = (prefs: BreakpointsMap<number | null>) => {\n const breakpointRanges: ThBreakpointRanges = {\n [ThBreakpoints.compact]: null,\n [ThBreakpoints.medium]: null,\n [ThBreakpoints.expanded]: null,\n [ThBreakpoints.large]: null,\n [ThBreakpoints.xLarge]: null\n };\n \n let prev: null | number = null;\n \n Object.entries(prefs).forEach(([ key, value ]) => {\n if (value && !isNaN(value)) {\n const max = value;\n const min = prev ? prev + 1 : null;\n Object.defineProperty(breakpointRanges, key, {\n value: {\n min: min,\n max: max\n }\n });\n prev = value;\n } else if (!value && key === ThBreakpoints.xLarge && prev) {\n Object.defineProperty(breakpointRanges, key, {\n value: {\n min: prev + 1,\n max: null\n }\n });\n }\n });\n\n return breakpointRanges;\n };\n\n const ranges = useMemo(() => initRanges(map), [map]);\n\n const compactMedia = makeMediaString(ranges[ThBreakpoints.compact]);\n const mediumMedia = makeMediaString(ranges[ThBreakpoints.medium]);\n const expandedMedia = makeMediaString(ranges[ThBreakpoints.expanded]);\n const largeMedia = makeMediaString(ranges[ThBreakpoints.large]);\n const xLargeMedia = makeMediaString(ranges[ThBreakpoints.xLarge]);\n\n const compactMatches = useMediaQuery(compactMedia);\n const mediumMatches = useMediaQuery(mediumMedia);\n const expandedMatches = useMediaQuery(expandedMedia);\n const largeMatches = useMediaQuery(largeMedia);\n const xLargeMatches = useMediaQuery(xLargeMedia);\n\n useEffect(() => {\n let newBreakpoint = currentBreakpoint;\n\n if (compactMatches) {\n newBreakpoint = ThBreakpoints.compact;\n } else if (mediumMatches) {\n newBreakpoint = ThBreakpoints.medium;\n } else if (expandedMatches) {\n newBreakpoint = ThBreakpoints.expanded;\n } else if (largeMatches) {\n newBreakpoint = ThBreakpoints.large;\n } else if (xLargeMatches) {\n newBreakpoint = ThBreakpoints.xLarge;\n }\n\n setCurrentBreakpoint(newBreakpoint);\n onChange && onChange(newBreakpoint);\n }, [currentBreakpoint, compactMatches, mediumMatches, expandedMatches, largeMatches, xLargeMatches, onChange]);\n\n return {\n [ThBreakpoints.compact]: compactMatches,\n [ThBreakpoints.medium]: mediumMatches,\n [ThBreakpoints.expanded]: expandedMatches,\n [ThBreakpoints.large]: largeMatches,\n [ThBreakpoints.xLarge]: xLargeMatches,\n current: currentBreakpoint,\n ranges: ranges\n };\n};","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\nexport const useReducedMotion = (onChange?: (reducedMotion: boolean) => void) => {\n const [reducedMotion, setReducedMotion] = useState(false);\n\n const prefersReducedMotion = useMediaQuery(\"(prefers-reduced-motion: reduce)\");\n\n useEffect(() => {\n setReducedMotion(prefersReducedMotion);\n onChange && onChange(prefersReducedMotion);\n }, [prefersReducedMotion, onChange]);\n\n return reducedMotion;\n}","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\nexport const useReducedTransparency = (onChange?: (reducedTransparency: boolean) => void) => {\n const [reducedTransparency, setReducedTransparency] = useState(false);\n\n const prefersReducedTransparency = useMediaQuery(\"(prefers-reduced-transparency: reduce)\");\n\n useEffect(() => {\n setReducedTransparency(prefersReducedTransparency);\n onChange && onChange(prefersReducedTransparency);\n }, [prefersReducedTransparency, onChange]);\n\n return reducedTransparency;\n}","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\nexport const useForcedColors = (onChange?: (forcedColors: boolean) => void) => {\n const [colors, setForcedColors] = useState(false);\n\n const forcedColors = useMediaQuery(\"(forced-colors: active)\");\n\n useEffect(() => {\n setForcedColors(forcedColors);\n onChange && onChange(forcedColors);\n }, [forcedColors, onChange]);\n\n return colors;\n}","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useMediaQuery } from \"./useMediaQuery\";\n\nexport const useMonochrome = (onChange?: (isMonochrome: boolean) => void) => {\n const [isMonochrome, setMonochrome] = useState(false);\n\n const monochrome = useMediaQuery(\"(monochrome)\");\n\n useEffect(() => {\n setMonochrome(monochrome);\n onChange && onChange(monochrome);\n }, [monochrome, onChange]);\n\n return isMonochrome;\n}"]}