{"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-AEEGHJVM.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"]}