{"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","timeline","actionKey"],"mappings":"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","file":"chunk-7AHUCM7Z.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 ? new Locator(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} 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 { useTimeline } from \"@/core/Hooks/useTimeline\";\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  setTimeline,\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  } = webPubNavigator;\n\n  const { setLocalData, getLocalData, localData } = usePositionStorage(localDataKey, positionStorage);\n\n  const timeline = useTimeline({\n    publication: publication,\n    currentLocation: localData,\n    currentPositions: currentPositions() || [],\n    positionsList: undefined,\n    onChange: (timeline) => {\n      dispatch(setTimeline(timeline));\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    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]);\n\n  const initialPosition = useMemo(() => getLocalData(), [getLocalData]);\n\n  // Initialize reader using the new composite hook\n  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  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            progressionFormatPref={ preferences.theming.progression?.format?.webPub }\n            progressionFormatFallback={ ThProgressionFormat.readingOrderIndex }\n          />\n        </div>\n      </StatefulDockingWrapper>\n    </main>\n  </NavigatorProvider>\n  </>\n)};"]}