{"version":3,"sources":["../src/components/assets/styles/thorium-web.reader.paginatedArrow.module.css","../src/hooks/usePaginatedArrows.ts","../src/components/StatefulReaderArrowButton.tsx","../src/components/Epub/Hooks/useEpubStatelessCache.ts","../src/components/Epub/Hooks/useEpubKeyboardPeripherals.ts","../src/components/Epub/Hooks/usePreferencesConfig.ts","../src/components/Epub/Hooks/useInjectablesConfig.ts","../src/components/Epub/Hooks/useReaderInit.ts","../src/components/Epub/StatefulReader.tsx"],"names":["container","leftContainer","rightContainer","occupiesSpace","visuallyHidden","className","useEffect","isHovering","classNames","useRef","useMemo","useState","jsx","Fragment","useCallback","timeline","actionKey","theme"],"mappings":"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","file":"chunk-N6MQQMTM.mjs","sourcesContent":[".container {\n  position: absolute;\n  z-index: 2;\n}\n\n.leftContainer {\n  top: 50vh;\n  top: 50dvh;\n  transform: translateY(-50%);\n  left: 0;\n}\n\n.leftContainer button {\n  margin-left: var(--th-arrow-offset, 0);\n}\n\n.rightContainer {\n  top: 50vh;\n  top: 50dvh;\n  transform: translateY(-50%);\n  right: 0;\n}\n\n.rightContainer button {\n  margin-right: var(--th-arrow-offset, 0);\n}\n\n.container button {\n  width: var(--th-arrow-size, 40px);\n  /* height: var(--th-arrow-size, 40px); */\n  height: 40vh;\n  height: 40dvh;\n  border-radius: var(--th-layout-radius);\n  pointer-events: auto;\n  box-sizing: border-box;\n  padding: 5px;\n\n  background-color: var(--th-theme-background);\n  border: 1px solid var(--th-theme-text);\n}\n\n.container .occupiesSpace {\n  background-color: transparent;\n  border: none;\n}\n\n.container button[data-disabled] {\n  pointer-events: none;\n}\n\n.container button[data-hovered] {\n  opacity: 1;\n  transition: all 200ms;\n}\n\n.container .visuallyHidden {\n  opacity: 0;\n}\n\n.container button[data-focused] {\n  outline: 2px solid var(--th-theme-focus);\n  opacity: 1;\n}\n\n.container button[data-disabled] {\n  opacity: 0;\n}\n\n/* Exclude taps as they will eventually apply hover state */\n@media (hover: hover) and (pointer: fine) {\n  .container button:not([data-disabled])[data-hovered] {\n    opacity: 1;\n    transition: all 200ms;\n  }\n}\n\n.container button svg {\n  fill: var(--th-theme-text);\n  stroke: var(--th-theme-text);\n  width: 100%;\n  height: 100%;\n}","import { useEffect, useMemo } from \"react\";\n\nimport { ThArrowVariant, ThPaginatedAffordancePrefValue } from \"@/preferences/models\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useReaderTransitions } from \"./useReaderTransitions\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setHasArrows, setUserNavigated } from \"@/lib/readerReducer\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\n\nexport interface UsePaginatedArrowsReturn {\n  isVisible: boolean;\n  occupySpace: boolean;\n  shouldTrackNavigation: boolean;\n  supportsVariant: boolean;\n}\n\nexport const usePaginatedArrows = (): UsePaginatedArrowsReturn => {\n  const { preferences } = usePreferences();\n  const hasArrows = useAppSelector(state => state.reader.hasArrows);\n  const isFXL = useAppSelector(state => state.publication.isFXL);\n  const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n  \n  // Get reader state transitions\n  const {\n    isScroll,\n    fromImmersive,\n    toImmersive,\n    fromFullscreen,\n    toFullscreen,\n    fromScroll,\n    toUserNavigation\n  } = useReaderTransitions();\n\n  const dispatch = useAppDispatch();\n\n  // Memoize the prefs object to avoid recreating it on every render\n  const prefs = useMemo(() => \n    isFXL \n      ? preferences.affordances.paginated.fxl \n      : preferences.affordances.paginated.reflow,\n    [isFXL, preferences.affordances.paginated.fxl, preferences.affordances.paginated.reflow]\n  );\n\n  // Memoize the breakpoints map to avoid recreating it on every breakpoint change\n  const prefsMap = useMemo(() => \n    makeBreakpointsMap<ThPaginatedAffordancePrefValue>({\n      defaultValue: prefs.default,\n      fromEnum: ThArrowVariant,\n      pref: prefs.breakpoints,\n      validateKey: \"variant\"\n    }),\n    [prefs.default, prefs.breakpoints]\n  );\n\n  // Get the current preferences based on breakpoint\n  const { variant, discard, hint } = useMemo(() => {\n    // Get the current prefs for the breakpoint or fallback to default\n    const result = prefsMap[breakpoint as keyof typeof prefsMap] || prefs.default;\n    \n    // Force layered variant for FXL to prevent layout issues\n    // FXL navigator is using the window width to calculate the layout\n    // so we need to force the layered variant to prevent layout issues\n    if (isFXL) {\n      return {\n        ...result,\n        variant: ThArrowVariant.layered\n      };\n    }\n    \n    return result;\n  }, [breakpoint, prefsMap, isFXL, prefs.default]);\n\n  // Track previous prefs\n  const prevVariant = usePrevious(variant);\n  const prevDiscard = usePrevious(discard);\n\n  // Handle state transitions\n  useEffect(() => {\n    // If navigation was just added to discard, reset navigation state\n    if (!prevDiscard?.includes(\"navigation\") && discard?.includes(\"navigation\")) {\n      dispatch(setUserNavigated(false));\n      return;\n    }\n    \n    // If discard changed to \"none\", show the arrows and reset navigation state\n    if (discard === \"none\" && prevDiscard !== \"none\") {\n      dispatch(setHasArrows(true));\n      dispatch(setUserNavigated(false));\n      return;\n    }\n    // Reset when changing from \"none\" to \"stacked\" or \"layered\"\n    if (prevVariant === ThArrowVariant.none && variant !== ThArrowVariant.none) {\n      dispatch(setHasArrows(true));\n      dispatch(setUserNavigated(false));\n      return;\n    }\n\n    // Check for discard transitions (false -> true)\n    const shouldHide = \n      (discard?.includes(\"immersive\") && toImmersive) ||\n      (discard?.includes(\"fullscreen\") && toFullscreen) ||\n      (discard?.includes(\"navigation\") && toUserNavigation);\n\n    // Check for hint transitions (true -> false)\n    const shouldShow = \n      (hint?.includes(\"immersiveChange\") && fromImmersive) ||\n      (hint?.includes(\"fullscreenChange\") && fromFullscreen) ||\n      (hint?.includes(\"layoutChange\") && fromScroll);\n\n    if (shouldHide) {\n      dispatch(setHasArrows(false));\n      // Reset the navigation flag after handling the transition\n      if (discard?.includes(\"navigation\") && toUserNavigation) {\n        dispatch(setUserNavigated(false));\n      }\n    } else if (shouldShow) {\n      dispatch(setHasArrows(true));\n    }\n  }, [toImmersive, toFullscreen, toUserNavigation, fromImmersive, fromFullscreen, fromScroll, discard, hint, prevVariant, variant, prevDiscard, dispatch]);\n\n  // Early return for special cases\n  if (variant === ThArrowVariant.none || isScroll) {\n    return {\n      isVisible: false,\n      occupySpace: false,\n      shouldTrackNavigation: false,\n      supportsVariant: !isFXL\n    };\n  }\n\n  return {\n    isVisible: hasArrows,\n    occupySpace: variant === ThArrowVariant.stacked,\n    shouldTrackNavigation: Array.isArray(discard) && discard.includes(\"navigation\"),\n    supportsVariant: !isFXL\n  };\n};","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\n\nimport arrowStyles from \"./assets/styles/thorium-web.reader.paginatedArrow.module.css\";\nimport readerSharedUI from \"./assets/styles/thorium-web.button.module.css\";\n\nimport { ThNavigationButton, ThNavigationButtonProps } from \"@/core/Components/Buttons/ThNavigationButton\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePaginatedArrows } from \"@/hooks/usePaginatedArrows\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { isActiveElement, isKeyboardTriggered } from \"@/core/Helpers/focusUtilities\";\n\n\nimport classNames from \"classnames\";\n\nexport interface StatefulReaderArrowButtonProps extends ThNavigationButtonProps {\n  direction: \"left\" | \"right\";\n}\n\nexport const StatefulReaderArrowButton = ({\n  direction,\n  className,\n  isDisabled,\n  onPress,\n  ...props\n}: StatefulReaderArrowButtonProps) => {\n  const { preferences } = usePreferences();\n  const { t } = useI18n();\n  \n  const buttonRef = useRef<HTMLButtonElement>(null);\n  const isRTL = useAppSelector(state => state.publication.isRTL);\n  const hasArrows = useAppSelector(state => state.reader.hasArrows);\n\n  const { \n    isVisible, \n    occupySpace \n  } = usePaginatedArrows();\n  \n  const [isHovering, setIsHovering] = useState(false);\n\n  const label = (\n    direction === \"right\" && !isRTL || \n    direction === \"left\" && isRTL\n  ) \n    ? t(\"reader.actions.goForward\") \n    : t(\"reader.actions.goBackward\");\n\n  const handleClassNameFromState = () => {\n    let className = \"\";\n    if (!isVisible) {\n      className = arrowStyles.visuallyHidden;\n    }\n    return className;\n  };\n\n  const handleClassNameFromSpaceProp = () => {\n    let className = \"\";\n    if (occupySpace) {\n      className = arrowStyles.occupiesSpace;\n    }\n    return className;\n  };\n\n  useEffect(() => {\n    const el = buttonRef.current;\n    if (!el || !isActiveElement(el)) return;\n    if (isDisabled || (!hasArrows && !isHovering && !isKeyboardTriggered(el))) {\n      el.blur();\n    }\n  });\n\n  const blurOnEsc = (event: React.KeyboardEvent) => {    \n    if (isActiveElement(buttonRef.current) && event.code === \"Escape\") {\n      buttonRef.current!.blur();\n    }\n  };\n\n  return (\n    <>\n    <ThNavigationButton \n      direction={ direction }\n      ref= { buttonRef }\n      aria-label={ label }\n      onPress={ onPress }\n      onHoverChange={ (isHovering: boolean) => setIsHovering(isHovering) } \n      onKeyDown={ blurOnEsc }\n      className={ classNames(className, handleClassNameFromSpaceProp(), handleClassNameFromState()) }\n      isDisabled={ isDisabled }\n      { ...props }\n      compounds={ {\n        tooltipTrigger: {\n          delay: preferences.theming.arrow.tooltipDelay,\n          closeDelay: preferences.theming.arrow.tooltipDelay\n        },\n        tooltip: {\n          placement: direction === \"left\" ? \"right\" : \"left\",\n          className: readerSharedUI.tooltip\n        },\n        label: label\n      } }\n    />\n    </>\n  )\n}","\"use client\";\n\nimport { useRef } from \"react\";\nimport { ThLayoutUI, ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { ThColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { LineLengthStateObject, FontFamilyStateObject } from \"@/lib/settingsReducer\";\nimport { Locator } from \"@readium/shared\";\nimport { useEpubSettingsCache, ReadiumCSSSettings } from \"@/core/Hooks/Epub/useEpubSettingsCache\";\n\nexport interface EPubStatelessCache {\n  layoutUI: ThLayoutUI;\n  isImmersive: boolean;\n  isHovering: boolean;\n  arrowsOccupySpace: boolean;\n  settings: ReadiumCSSSettings;\n  positionsList: Locator[];\n  colorScheme?: ThColorScheme;\n  reducedMotion?: boolean;\n}\n\nexport const useEpubStatelessCache = (\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  positionsList: Locator[],\n  colorScheme: ThColorScheme,\n  reducedMotion: boolean,\n  layoutUI: ThLayoutUI,\n  isImmersive: boolean,\n  isHovering: boolean,\n  arrowsOccupySpace: boolean\n) => {\n  const settingsCache = useEpubSettingsCache(\n    textAlign,\n    columnCount,\n    fontFamily,\n    fontSize,\n    fontWeight,\n    hyphens,\n    letterSpacing,\n    ligatures,\n    lineLength,\n    lineHeight,\n    noRuby,\n    paragraphIndent,\n    paragraphSpacing,\n    publisherStyles,\n    scroll,\n    textNormalization,\n    wordSpacing,\n    theme\n  );\n\n  const cache = useRef<EPubStatelessCache>({\n    layoutUI,\n    isImmersive,\n    isHovering,\n    arrowsOccupySpace: arrowsOccupySpace || false,\n    settings: settingsCache.current.settings,\n    positionsList: positionsList,\n    colorScheme,\n    reducedMotion,\n  });\n\n  // Update cache synchronously on every render to ensure fresh values\n  cache.current.layoutUI = layoutUI;\n  cache.current.isImmersive = isImmersive;\n  cache.current.isHovering = isHovering;\n  cache.current.arrowsOccupySpace = arrowsOccupySpace || false;\n  cache.current.settings = settingsCache.current.settings;\n  cache.current.positionsList = positionsList;\n  cache.current.colorScheme = colorScheme;\n  cache.current.reducedMotion = reducedMotion;\n\n  return cache;\n};\n","import { useMemo } from \"react\";\n\nimport { IKeyboardPeripheralsConfig } from \"@readium/navigator\";\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport { useIsScroll } from \"@/hooks\";\nimport { useObservableCondition } from \"@/core/Hooks/useObservableCondition\";\nimport { useFullscreen } from \"@/core/Hooks/useFullscreen\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useFilteredPreferenceKeys } from \"@/preferences/hooks/useFilteredPreferenceKeys\";\nimport { useActionComponentStatus } from \"../../Actions/hooks/useActionComponentStatus\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { NavPeripheralType, toActionPeripheralType, toDockingPeripheralType, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS } from \"@/helpers/peripherals\";\n\nexport const useEpubKeyboardPeripherals = (): IKeyboardPeripheralsConfig => {\n  const isScroll = useIsScroll();\n  const isFXL = useAppSelector(state => state.publication.isFXL);\n  const noScroll = useObservableCondition(!isScroll);\n  const zoomActive = useObservableCondition(!isFXL);\n  const { actionsKeys, docking } = useActionsPreferences();\n  const { isSupported: isFullscreenSupported } = useFullscreen();\n  const { reflowActionKeys, fxlActionKeys } = useFilteredPreferenceKeys();\n\n  const orderArray = isFXL ? fxlActionKeys : reflowActionKeys;\n\n  const { isComponentAvailable: isFullscreenAvailable }     = useActionComponentStatus({ actionKey: ThActionsKeys.fullscreen,      orderArray, additionalCondition: isFullscreenSupported });\n  const { isComponentAvailable: isTocAvailable }            = useActionComponentStatus({ actionKey: ThActionsKeys.toc,             orderArray });\n  const { isComponentAvailable: isSettingsAvailable }       = useActionComponentStatus({ actionKey: ThActionsKeys.settings,        orderArray });\n  const { isComponentAvailable: isJumpToPositionAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.jumpToPosition,  orderArray });\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.progressForward,  keyCombos: [{ keyCode: 32,              suppressOnInteractiveElement: true, condition: noScroll }] },\n      { type: NavPeripheralType.progressBackward, keyCombos: [{ keyCode: 32, shift: true, suppressOnInteractiveElement: true, condition: noScroll }] },\n      { type: NavPeripheralType.moveRight,        keyCombos: [{ keyCode: 39,              suppressOnInteractiveElement: true, condition: noScroll }] },\n      { type: NavPeripheralType.moveLeft,         keyCombos: [{ keyCode: 37,              suppressOnInteractiveElement: true, condition: noScroll }] },\n      { type: NavPeripheralType.moveUp,           keyCombos: [{ keyCode: 38,              suppressOnInteractiveElement: true, condition: noScroll },\n                                                              { keyCode: 33,              suppressOnInteractiveElement: true, condition: noScroll }] },\n      { type: NavPeripheralType.moveDown,         keyCombos: [{ keyCode: 40,              suppressOnInteractiveElement: true, condition: noScroll },\n                                                              { keyCode: 34,              suppressOnInteractiveElement: true, condition: noScroll }] },\n      { type: NavPeripheralType.moveHome,         keyCombos: [{ keyCode: 36,              suppressOnInteractiveElement: true, condition: noScroll }] },\n      { type: NavPeripheralType.moveEnd,          keyCombos: [{ keyCode: 35,              suppressOnInteractiveElement: true, condition: noScroll }] },\n      { type: NavPeripheralType.zoomIn,           keyCombos: ZOOM_IN_KEY_COMBOS.map(c => ({ ...c, condition: zoomActive }))  },\n      { type: NavPeripheralType.zoomOut,          keyCombos: ZOOM_OUT_KEY_COMBOS.map(c => ({ ...c, condition: zoomActive })) },\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  }, [noScroll, zoomActive, actionsKeys, docking.keys, isFullscreenAvailable, isTocAvailable, isSettingsAvailable, isJumpToPositionAvailable]);\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { IEpubPreferences, TextAlignment } from \"@readium/navigator\";\nimport { ThPreferences } from \"@/preferences\";\nimport { ThLineHeightOptions, ThLayoutUI, ThSettingsKeys } from \"@/preferences/models\";\nimport { FontMetadata } from \"@/preferences/services/fonts\";\nimport { ThColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ReadiumCSSSettings } from \"@/core/Hooks/Epub/useEpubSettingsCache\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\nimport { useLineHeight } from \"@/components/Settings/Spacing/hooks/useLineHeight\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { buildThemeObject } from \"@/preferences/helpers/buildThemeObject\";\n\ninterface UseEpubPreferencesConfigProps {\n  isFXL: boolean;\n  settings: ReadiumCSSSettings;\n  colorScheme: ThColorScheme;\n  fontLanguage: string;\n  arrowsOccupySpace: boolean;\n  arrowsWidth: React.RefObject<number>;\n  preferences: ThPreferences;\n  getFontMetadata: (fontFamily: string) => FontMetadata;\n  fxlThemeKeys: string[];\n  reflowThemeKeys: string[];\n}\n\nexport const useEpubPreferencesConfig = ({\n  isFXL,\n  settings,\n  colorScheme,\n  fontLanguage,\n  arrowsOccupySpace,\n  arrowsWidth,\n  preferences,\n  getFontMetadata,\n  fxlThemeKeys,\n  reflowThemeKeys,\n}: UseEpubPreferencesConfigProps) => {\n  const { processedValues: lineHeightOptions } = useLineHeight();\n  const scriptMode = useAppSelector(state => state.publication.scriptMode);\n  const isVerticalScript = scriptMode === \"cjk-vertical\" || scriptMode === \"mongolian-vertical\";\n\n  const { isComponentUsed: isFontFamilyUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.fontFamily,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isFontSizeUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.zoom,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isFontWeightUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.fontWeight,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isColumnsUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.columns,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isLayoutUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.layout,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isHyphensUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.hyphens,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isLigaturesUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.ligatures,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isNoRubyUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.noRuby,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isLetterSpacingUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.letterSpacing,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isLineHeightUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.lineHeight,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isParagraphIndentUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.paragraphIndent,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isParagraphSpacingUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.paragraphSpacing,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isTextAlignUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.textAlign,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isTextNormalizeUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.textNormalize,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const { isComponentUsed: isWordSpacingUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.wordSpacing,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const epubPreferences = useMemo(() => {\n    if (isFXL) return {};\n\n    const initialConstraint = arrowsOccupySpace ? arrowsWidth.current : 0;\n    const themeKeys = isFXL ? fxlThemeKeys : reflowThemeKeys;\n    const theme = settings.theme && themeKeys.includes(settings.theme) ? settings.theme : \"auto\";\n    const themeProps = buildThemeObject<string>({\n      theme: theme,\n      themeKeys: preferences.theming.themes.keys,\n      systemThemes: preferences.theming.themes.systemThemes,\n      colorScheme: colorScheme\n    });\n\n    return {\n      columnCount: !isColumnsUsed ? undefined : (settings.columnCount === \"auto\" ? null : Number(settings.columnCount)),\n      constraint: initialConstraint,\n      fontFamily: isFontFamilyUsed ? getFontMetadata(settings.fontFamily[fontLanguage] ?? \"\")?.fontStack || null : undefined,\n      fontSize: isFontSizeUsed ? settings.fontSize : undefined,\n      fontWeight: isFontWeightUsed ? settings.fontWeight : undefined,\n      ligatures: isLigaturesUsed ? settings.ligatures : undefined,\n      noRuby: isNoRubyUsed ? settings.noRuby : undefined,\n      letterSpacing: (!isLetterSpacingUsed || settings.publisherStyles) ? undefined : settings.letterSpacing,\n      lineHeight: (!isLineHeightUsed || settings.publisherStyles)\n        ? undefined\n        : settings.lineHeight === null\n          ? null\n          : lineHeightOptions[settings.lineHeight as ThLineHeightOptions.small | ThLineHeightOptions.medium | ThLineHeightOptions.large],\n      optimalLineLength: settings.lineLength?.optimal != null\n        ? settings.lineLength.optimal\n        : undefined,\n      maximalLineLength: settings.lineLength?.max?.isDisabled\n        ? null\n        : (settings.lineLength?.max?.chars != null)\n          ? settings.lineLength.max.chars\n          : undefined,\n      minimalLineLength: settings.lineLength?.min?.isDisabled\n        ? null\n        : (settings.lineLength?.min?.chars != null)\n          ? settings.lineLength.min.chars\n          : undefined,\n      paragraphIndent: (!isParagraphIndentUsed || settings.publisherStyles) ? undefined : settings.paragraphIndent,\n      paragraphSpacing: (!isParagraphSpacingUsed || settings.publisherStyles) ? undefined : settings.paragraphSpacing,\n      scroll: isVerticalScript ? true : (!isLayoutUsed ? undefined : settings.scroll),\n      textAlign: isTextAlignUsed ? settings.textAlign as unknown as TextAlignment | null | undefined : undefined,\n      hyphens: isHyphensUsed && settings.textAlign !== \"publisher\" ? settings.hyphens : undefined,\n      textNormalization: isTextNormalizeUsed ? settings.textNormalization : undefined,\n      wordSpacing: (!isWordSpacingUsed || settings.publisherStyles) ? undefined : settings.wordSpacing,\n      ...themeProps\n    } as IEpubPreferences;\n  }, [\n    isFXL,\n    arrowsOccupySpace,\n    arrowsWidth,\n    settings,\n    colorScheme,\n    fontLanguage,\n    preferences.theming.themes.keys,\n    preferences.theming.themes.systemThemes,\n    getFontMetadata,\n    fxlThemeKeys,\n    reflowThemeKeys,\n    isVerticalScript,\n    isFontFamilyUsed,\n    isFontSizeUsed,\n    isFontWeightUsed,\n    isColumnsUsed,\n    isLayoutUsed,\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  const epubDefaults = useMemo(() => {\n    if (isFXL) return {};\n\n    return {\n      maximalLineLength: preferences.typography.maximalLineLength,\n      minimalLineLength: preferences.typography.minimalLineLength,\n      optimalLineLength: preferences.typography.optimalLineLength,\n      pageGutter: preferences.typography.pageGutter,\n      scrollPaddingTop: preferences.theming.layout.ui?.reflow === ThLayoutUI.layered \n        ? (preferences.theming.icon.size || 24) * 3 \n        : (preferences.theming.icon.size || 24),\n      scrollPaddingBottom: preferences.theming.layout.ui?.reflow === ThLayoutUI.layered\n        ? (preferences.theming.icon.size || 24) * (isVerticalScript ? 3 : 5)\n        : (preferences.theming.icon.size || 24),\n      scrollPaddingLeft: preferences.typography.pageGutter,\n      scrollPaddingRight: preferences.typography.pageGutter,\n      experiments: preferences.experiments?.reflow || null\n    };\n  }, [isFXL, preferences, isVerticalScript]);\n\n  return { epubPreferences, epubDefaults };\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { IInjectablesConfig, ILinkInjectable, IBlobInjectable } from \"@readium/navigator\";\nimport { InjectableFontResources } from \"@/preferences/services/fonts\";\n\ninterface UseEpubInjectablesConfigProps {\n  isFXL: boolean;\n  isFontFamilyUsed: boolean;\n  fontLanguage: string;\n  getFontInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => InjectableFontResources | null;\n  getAndroidFXLPatch: () => (ILinkInjectable & IBlobInjectable) | null;\n}\n\nexport const useEpubInjectablesConfig = ({\n  isFXL,\n  isFontFamilyUsed,\n  fontLanguage,\n  getFontInjectables,\n  getAndroidFXLPatch,\n}: UseEpubInjectablesConfigProps) => {\n  const injectables = useMemo(() => {\n    let injectablesConfig: IInjectablesConfig | undefined;\n\n    if (isFXL) {\n      const androidPatch = getAndroidFXLPatch();\n      if (androidPatch) {\n        injectablesConfig = {\n          allowedDomains: [window.location.origin],\n          rules: [{\n            resources: [/\\.xhtml$/, /\\.html$/],\n            prepend: [androidPatch]\n          }]\n        };\n      }\n    }\n\n    if (!isFXL && 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  }, [isFXL, isFontFamilyUsed, fontLanguage, getFontInjectables, getAndroidFXLPatch]);\n\n  return { injectables };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useState, useRef } from \"react\";\n\nimport { Locator, Publication } from \"@readium/shared\";\nimport { EpubNavigatorListeners, IContentProtectionConfig, ILinkInjectable, IBlobInjectable } from \"@readium/navigator\";\nimport { useEpubKeyboardPeripherals } from \"./useEpubKeyboardPeripherals\";\nimport { ThPreferences } from \"@/preferences\";\nimport { FontMetadata, InjectableFontResources } from \"@/preferences/services/fonts\";\n\nimport { EPubStatelessCache } from \"./useEpubStatelessCache\";\nimport { useEpubPreferencesConfig } from \"./usePreferencesConfig\";\nimport { useEpubInjectablesConfig } from \"./useInjectablesConfig\";\nimport { useEpubNavigator, EpubNavigatorLoadProps } from \"@/core/Hooks/Epub/useEpubNavigator\";\n\ninterface UseEpubReaderInitProps {\n  container: React.RefObject<HTMLDivElement | null>;\n  publication: Publication | null;\n  positionsList?: Locator[];\n  initialPosition: Locator | null;\n  listeners: EpubNavigatorListeners;\n  preferences: ThPreferences;\n  cache: React.RefObject<EPubStatelessCache>;\n  isFontFamilyUsed: boolean;\n  fontLanguage: string;\n  getFontMetadata: (fontId: string) => FontMetadata;\n  injectFontResources: (resources: InjectableFontResources | null) => void;\n  removeFontResources: () => void;\n  getAndroidFXLPatch: () => (ILinkInjectable & IBlobInjectable) | null;\n  getFontInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => InjectableFontResources | null;\n  fxlThemeKeys: string[];\n  reflowThemeKeys: string[];\n  arrowsOccupySpace: boolean;\n  arrowsWidth: React.RefObject<number>;\n  colorScheme: any;\n  isFXL: boolean;\n  contentProtectionConfig?: IContentProtectionConfig;\n  onNavigatorReady?: () => void;\n  onNavigatorLoaded?: () => void;\n  onCleanup?: () => void;\n}\n\nexport const useEpubReaderInit = ({\n  container,\n  publication,\n  positionsList,\n  initialPosition,\n  listeners,\n  preferences,\n  cache,\n  isFontFamilyUsed,\n  fontLanguage,\n  getFontMetadata,\n  injectFontResources,\n  removeFontResources,\n  getAndroidFXLPatch,\n  getFontInjectables,\n  fxlThemeKeys,\n  reflowThemeKeys,\n  arrowsOccupySpace,\n  arrowsWidth,\n  colorScheme,\n  isFXL,\n  contentProtectionConfig,\n  onNavigatorReady,\n  onNavigatorLoaded,\n  onCleanup,\n}: UseEpubReaderInitProps) => {\n  const [navigatorReady, setNavigatorReady] = useState(false);\n\n  const { epubPreferences, epubDefaults } = useEpubPreferencesConfig({\n    isFXL,\n    settings: cache.current.settings,\n    colorScheme,\n    fontLanguage,\n    arrowsOccupySpace,\n    arrowsWidth,\n    preferences,\n    getFontMetadata,\n    fxlThemeKeys,\n    reflowThemeKeys,\n  });\n\n  const { injectables } = useEpubInjectablesConfig({\n    isFXL,\n    isFontFamilyUsed,\n    fontLanguage,\n    getFontInjectables,\n    getAndroidFXLPatch,\n  });\n\n  const handleCleanup = useCallback(() => {\n    if (!isFXL) removeFontResources();\n    onCleanup?.();\n  }, [isFXL, removeFontResources, onCleanup]);\n\n  const keyboardPeripherals = useEpubKeyboardPeripherals();\n  const { EpubNavigatorLoad, EpubNavigatorDestroy } = useEpubNavigator();\n  const isNavigatorLoadedEpub = useRef(false);\n  \n  useEffect(() => {\n    // Only initialize once, never re-render\n    if (!publication || isNavigatorLoadedEpub.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    // Initialize navigator for EPUB like WebPub\n    const config: EpubNavigatorLoadProps = {\n      container: container.current,\n      publication,\n      listeners,\n      positionsList: positionsList?.map(loc => new Locator(loc)) || [],\n      initialPosition: initialPosition ? new Locator(initialPosition) : undefined,\n      preferences: epubPreferences,\n      defaults: epubDefaults,\n      injectables: injectables || undefined,\n      contentProtection: contentProtectionConfig,\n      keyboardPeripherals,\n    };\n\n    isNavigatorLoadedEpub.current = true;\n    \n    // Call onNavigatorReady outside of navigator load\n    onNavigatorReady?.();\n    \n    // Pass onNavigatorLoaded as the callback to EpubNavigatorLoad\n    EpubNavigatorLoad(config, () => {\n      // Set navigatorReady to true only after navigator actually loads\n      setNavigatorReady(true);\n      onNavigatorLoaded?.();\n    });\n\n    return () => {\n      if (isNavigatorLoadedEpub.current) {\n        setNavigatorReady(false);\n        EpubNavigatorDestroy(() => {\n          isNavigatorLoadedEpub.current = false;\n          handleCleanup();\n        });\n      }\n    };\n  }, []);\n\n  // Handle font resource injection\n  useEffect(() => {\n    if (!isFXL && isFontFamilyUsed) {\n      const fontResources = getFontInjectables({ language: fontLanguage });\n      if (fontResources) {\n        injectFontResources(fontResources);\n      }\n    }\n  }, [isFXL, isFontFamilyUsed, fontLanguage, injectFontResources, getFontInjectables]);\n\n  return {\n    navigatorReady,\n    isFXL,\n  };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n  ThemeKeyType,\n  useFilteredPreferenceKeys\n} from \"../../preferences\";\n\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport arrowStyles from \"../assets/styles/thorium-web.reader.paginatedArrow.module.css\";\n\nimport {\n  ThLayoutDirection,\n  ThLayoutUI,\n  ThDocumentTitleFormat,\n  ThSpacingSettingsKeys,\n  ThProgressionFormat,\n  ThSettingsKeys,\n  ThDockingKeys,\n  ThActionsKeys\n} from \"../../preferences/models\";\n\nimport { ThPluginRegistry } from \"../Plugins/PluginRegistry\";\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 { EpubNavigatorListeners, KeyboardPeripheralEventData } from \"@readium/navigator\";\nimport { \n  Locator, \n  Publication, \n  Layout\n} from \"@readium/shared\";\nimport { PositionStorage, StatefulReaderProps } from \"../Reader/StatefulReaderWrapper\";\n\nimport { StatefulDockingWrapper } from \"../Docking/StatefulDockingWrapper\";\nimport { StatefulReaderHeader } from \"../StatefulReaderHeader\";\nimport { StatefulReaderArrowButton } from \"../StatefulReaderArrowButton\";\nimport { StatefulReaderFooter } from \"../StatefulReaderFooter\";\n\nimport { useLocale } from \"react-aria\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\nimport { useEpubStatelessCache } from \"./Hooks/useEpubStatelessCache\";\nimport { useEpubReaderInit } from \"./Hooks/useReaderInit\";\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useFullscreen } from \"@/core/Hooks/useFullscreen\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useTimeline } from \"@/core/Hooks/useTimeline\";\nimport { useIsScroll, usePositionStorage } from \"@/hooks\";\nimport { useDocumentTitle } from \"@/core/Hooks/useDocumentTitle\";\nimport { useSpacingPresets } from \"../Settings/Spacing/hooks/useSpacingPresets\";\nimport { usePaginatedArrows } from \"@/hooks/usePaginatedArrows\";\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\";\n\nimport { \n  setTheme \n} from \"@/lib/themeReducer\";\nimport { \n  setImmersive, \n  setLoading,\n  setHovering, \n  toggleImmersive, \n  setPlatformModifier, \n  setDirection, \n  setFullscreen,\n  setScrollAffordance,\n  setUserNavigated\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 debounce from \"debounce\";\nimport { buildThemeObject } from \"@/preferences/helpers/buildThemeObject\";\nimport { createDefaultPlugin } from \"../Plugins/helpers/createDefaultPlugin\";\nimport { NavPeripheralType, fromActionPeripheralType, fromDockingPeripheralType } from \"../../helpers/peripherals\";\nimport { getPlatformModifier } from \"@/core/Helpers/keyboardUtilities\";\nimport { getReaderClassNames } from \"../Helpers/getReaderClassNames\";\nimport { resolveContentProtectionConfig } from \"@/preferences/models/protection\";\n\n// We need to register plugins before hooks run\n// otherwise we can’t access the values of spacing presets\n// when the component is effectively mounted as we check\n// if the component is registered and displayed from prefs\nexport const StatefulReader = ({\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 { fxlActionKeys, fxlThemeKeys, reflowActionKeys, reflowThemeKeys } = useFilteredPreferenceKeys();\n  const { preferences, getFontMetadata, getFontInjectables } = usePreferences();\n  const { direction: uiDirection } = useLocale();\n  const { t } = useI18n();\n  const { getEffectiveSpacingValue } = useSpacingPresets();\n  const { occupySpace: arrowsOccupySpace } = usePaginatedArrows();\n  const { injectFontResources, removeFontResources, getAndroidFXLPatch } = useFonts();\n  \n  const container = useRef<HTMLDivElement>(null);\n  const arrowsWidth = useRef(2 * ((preferences.theming.arrow.size || 40) + (preferences.theming.arrow.offset || 0)));\n\n  const profile = useAppSelector(state => state.reader.profile);\n  const isFXL = useAppSelector(state => state.publication.isFXL);\n  const isRTL = useAppSelector(state => state.publication.isRTL);\n  const positionsList = useAppSelector(state => state.publication.positionsList);\n  const fontLanguage = useAppSelector(state => state.publication.fontLanguage);\n\n  // Check if font family component is being used\n  const { isComponentUsed: isFontFamilyUsed } = useSettingsComponentStatus({\n    settingsKey: ThSettingsKeys.fontFamily,\n    publicationType: isFXL ? \"fxl\" : \"reflow\",\n  });\n\n  const textAlign = useAppSelector(state => state.settings.textAlign);\n  const columnCount = useAppSelector(state => state.settings.columnCount);\n  const fontFamily = useAppSelector(state => state.settings.fontFamily);\n  const fontSize = useAppSelector(state => state.settings.fontSize);\n  const fontWeight = useAppSelector(state => state.settings.fontWeight);\n  const hyphens = useAppSelector(state => state.settings.hyphens);\n  const ligatures = useAppSelector(state => state.settings.ligatures);\n  const noRuby = useAppSelector(state => state.settings.noRuby);\n  const letterSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.letterSpacing);\n  const lineLength = useAppSelector(state => state.settings.lineLength);\n  const lineHeight = getEffectiveSpacingValue(ThSpacingSettingsKeys.lineHeight);\n  const paragraphIndent = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphIndent);\n  const paragraphSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphSpacing);\n  const publisherStyles = useAppSelector(state => state.settings.publisherStyles);\n  const isScroll = useIsScroll();\n  const textNormalization = useAppSelector(state => state.settings.textNormalization);\n  const wordSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.wordSpacing);\n  const themeObject = useAppSelector(state => state.theming.theme);\n  const theme = isFXL ? themeObject.fxl : themeObject.reflow;\n  const previousTheme = usePrevious(theme);\n  const colorScheme = useAppSelector(state => state.theming.colorScheme);\n  const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n\n  const breakpoint = useAppSelector(state => state.theming.breakpoint);\n  const containerBreakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n  \n  const isImmersive = useAppSelector(state => state.reader.isImmersive);\n  const isHovering = useAppSelector(state => state.reader.isHovering);\n\n  const layoutUI = isFXL \n    ? preferences.theming.layout.ui?.fxl || ThLayoutUI.layered \n    : isScroll \n      ? preferences.theming.layout.ui?.reflow || ThLayoutUI.layered\n      : ThLayoutUI.stacked;\n\n  const cache = useEpubStatelessCache(\n    textAlign,\n    columnCount,\n    fontFamily,\n    fontSize,\n    fontWeight,\n    hyphens,\n    letterSpacing,\n    ligatures,\n    lineLength,\n    lineHeight,\n    noRuby,\n    paragraphIndent,\n    paragraphSpacing,\n    publisherStyles,\n    isScroll,\n    textNormalization,\n    wordSpacing,\n    theme,\n    positionsList,\n    colorScheme,\n    reducedMotion,\n    layoutUI,\n    isImmersive,\n    isHovering,\n    arrowsOccupySpace\n  );\n\n  const atPublicationStart = useAppSelector(state => state.publication.atPublicationStart);\n  const atPublicationEnd = useAppSelector(state => state.publication.atPublicationEnd);\n\n  const dispatch = useAppDispatch();\n  const getFocusedDockableKey = useFocusedDockableKey();\n\n  useEffect(() => {\n    // Reset top bar visibility and last position\n    dispatch(setImmersive(false));\n  }, [isScroll, dispatch]);\n\n  const onFsChange = useCallback((isFullscreen: boolean) => {\n    dispatch(setFullscreen(isFullscreen));\n  }, [dispatch]);\n  \n  const { handleFullscreen } = useFullscreen(onFsChange);\n\n  const epubNavigator = useEpubNavigator();\n  const {\n    goLeft,\n    goRight,\n    goBackward,\n    goForward,\n    navLayout,\n    currentPositions,\n    canGoBackward,\n    canGoForward,\n    isScrollStart,\n    isScrollEnd,\n    getCframes,\n    submitPreferences\n  } = epubNavigator;\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: positionsList,\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 activateImmersiveOnAction = useCallback(() => {\n    if (!cache.current.isImmersive) dispatch(setImmersive(true));\n  }, [cache, dispatch]);\n\n  const toggleIsImmersive = useCallback(() => {\n    // If tap/click in iframe, then header/footer no longer hovering \n    dispatch(setHovering(false));\n    dispatch(toggleImmersive());\n  }, [dispatch]);\n\n  // Warning: this is using navigator’s internal methods that will become private, do not rely on them\n  // See https://github.com/edrlab/thorium-web/issues/25\n  const handleTap = useCallback((event: FrameClickEvent) => {\n    const _cframes = getCframes();\n    if (_cframes) {\n      if (!cache.current.settings.scroll) {\n        const oneQuarter = ((_cframes.length === 2 ? _cframes[0]!.window.innerWidth + _cframes[1]!.window.innerWidth : _cframes![0]!.window.innerWidth) * window.devicePixelRatio) / 4;\n        \n        const navigationCallback = () => {\n          dispatch(setUserNavigated(true));\n          activateImmersiveOnAction();\n        };\n    \n        if (event.x < oneQuarter) {\n          goLeft(!cache.current.reducedMotion, navigationCallback);\n        } \n        else if (event.x > oneQuarter * 3) {\n          goRight(!cache.current.reducedMotion, navigationCallback);\n        } else if (oneQuarter <= event.x && event.x <= oneQuarter * 3) {\n          toggleIsImmersive();\n        }\n      } else {\n        if (preferences.affordances.scroll.toggleOnMiddlePointer.includes(\"tap\")) {\n          toggleIsImmersive();\n        }\n      }\n    }\n  }, [getCframes, cache, preferences.affordances.scroll, goLeft, goRight, dispatch, activateImmersiveOnAction, toggleIsImmersive]);\n\n  const handleClick = useCallback((_event: FrameClickEvent) => {\n    if (\n      cache.current.layoutUI === ThLayoutUI.layered &&\n      ( !cache.current.settings.scroll ||\n        preferences.affordances.scroll.toggleOnMiddlePointer.includes(\"click\") )\n      ) {\n        toggleIsImmersive();\n      }\n  }, [cache, preferences.affordances.scroll, toggleIsImmersive]);\n\n  // We could use canGoBackward() and canGoForward() directly on arrows\n  // but maybe we will need to sync the state for other features in the future\n  const updatePublicationNavigationState = useCallback(() => {\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  }, [canGoBackward, canGoForward, dispatch]);\n\n  const moveTo = useCallback((direction: \"left\" | \"right\" | \"up\" | \"down\" | \"home\" | \"end\") => {\n    const navigationCallback = () => {\n      dispatch(setUserNavigated(true));\n      activateImmersiveOnAction();\n    };\n    switch (direction) {\n      case \"right\":\n        !cache.current.settings.scroll && goRight(!cache.current.reducedMotion, navigationCallback);\n        break;\n      case \"left\":\n        !cache.current.settings.scroll && goLeft(!cache.current.reducedMotion, navigationCallback);\n        break;\n      default:\n        break;\n    }\n  }, [dispatch, activateImmersiveOnAction, cache, goRight, goLeft]);\n\n  const { zoomIn, zoomOut } = useZoomCallbacks(epubNavigator);\n\n  const goProgression = useCallback((shiftKey?: boolean) => {\n    if (!cache.current.settings?.scroll) {\n      const cb = () => {\n        dispatch(setUserNavigated(true));\n        activateImmersiveOnAction();\n      };\n      shiftKey\n        ? goBackward(!cache.current.reducedMotion, cb)\n        : goForward(!cache.current.reducedMotion, cb);\n    }\n  }, [dispatch, activateImmersiveOnAction, cache, goBackward, goForward]);\n\n  const listeners: EpubNavigatorListeners = useMemo(() => ({\n    frameLoaded: async function (_wnd: Window): Promise<void> {},\n    positionChanged: async function (locator: Locator): Promise<void> {\n      const debouncedHandleProgression = debounce(\n        async () => {\n          setLocalData(locator);\n          updatePublicationNavigationState();\n        }, 250);\n      debouncedHandleProgression();\n    },\n    tap: function (_e: FrameClickEvent): boolean {\n      handleTap(_e);\n      return true;\n    },\n    click: function (_e: FrameClickEvent): boolean {\n      handleClick(_e);\n      return true;\n    },\n    zoom: function (_scale: number): void {},\n    miscPointer: function (_amount: number): void {},\n    scroll: function (_delta: number): void {\n      if (\n        cache.current.settings.scroll && \n        navLayout() !== Layout.fixed\n      ) {        \n        if (isScrollStart() || isScrollEnd()) {\n          if (\n            // Keep consistent with pagination behavior\n            cache.current.layoutUI === ThLayoutUI.layered\n          ) {\n            dispatch(setScrollAffordance(true));\n          }\n        } else if (!cache.current.isImmersive && _delta > 20) {\n          if (preferences.affordances.scroll.hideOnForwardScroll) {\n            dispatch(setImmersive(true));\n          }\n        } else if (cache.current.isImmersive && _delta < -20) {\n          if (\n            // Keep consistent with pagination behavior\n            cache.current.layoutUI === ThLayoutUI.layered && \n            preferences.affordances.scroll.showOnBackwardScroll\n          ) {\n            dispatch(setImmersive(false));\n          }\n        }\n      }\n    },\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: KeyboardPeripheralEventData): void {\n      switch (data.type) {\n        case NavPeripheralType.progressForward:  goProgression(false); break;\n        case NavPeripheralType.progressBackward: goProgression(true);  break;\n        case NavPeripheralType.moveRight:        moveTo(\"right\");      break;\n        case NavPeripheralType.moveLeft:         moveTo(\"left\");       break;\n        case NavPeripheralType.moveUp:           moveTo(\"up\");         break;\n        case NavPeripheralType.moveDown:         moveTo(\"down\");       break;\n        case NavPeripheralType.moveHome:         moveTo(\"home\");       break;\n        case NavPeripheralType.moveEnd:          moveTo(\"end\");        break;\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  }), [navLayout, setLocalData, dispatch, handleTap, handleClick, cache, preferences.affordances.scroll, isScrollStart, isScrollEnd, updatePublicationNavigationState, moveTo, goProgression, zoomIn, zoomOut, profile, handleFullscreen, getFocusedDockableKey]);\n  \n  const initialPosition = useMemo(() => getLocalData(), [getLocalData]);\n\n  // Initialize reader using the new composite hook\n  const { navigatorReady } = useEpubReaderInit({\n    container,\n    publication,\n    positionsList,\n    initialPosition,\n    listeners,\n    preferences,\n    cache,\n    isFontFamilyUsed,\n    fontLanguage,\n    getFontMetadata,\n    injectFontResources,\n    removeFontResources,\n    getAndroidFXLPatch,\n    getFontInjectables,\n    fxlThemeKeys,\n    reflowThemeKeys,\n    arrowsOccupySpace,\n    arrowsWidth,\n    colorScheme,\n    isFXL,\n    contentProtectionConfig: resolveContentProtectionConfig(preferences.contentProtection, t),\n\n    onNavigatorReady: () => {\n      dispatch(setLoading(false));\n    }\n  });\n\n  const applyConstraint = useCallback(async (value: number) => {\n    await submitPreferences({\n      constraint: value\n    })\n  }, [submitPreferences]);\n\n  useLayoutEffect(() => {\n    if (!navigatorReady) return;\n\n    applyConstraint(arrowsOccupySpace ? arrowsWidth.current : 0)\n      .catch(console.error);\n  }, [arrowsOccupySpace, applyConstraint, navigatorReady]);\n\n  // Theme can also change on colorScheme change so\n  // we have to handle this side-effect but we can’t\n  // from the ReadingDisplayTheme component since it\n  // would have to be mounted for this to work\n  useLayoutEffect(() => {\n    if (!navigatorReady) return;\n\n    if (cache.current.colorScheme !== colorScheme) {\n      cache.current.colorScheme = colorScheme;\n    }\n\n    const theme = isFXL ? (themeObject.fxl ?? \"auto\") : (themeObject.reflow ?? \"auto\");\n\n    // Protecting against re-applying on theme change\n    if (theme !== \"auto\" && previousTheme !== theme) return;\n\n    const applyCurrentTheme = async () => {\n      const themeKeys = isFXL ? fxlThemeKeys : reflowThemeKeys;\n      const themeKey = themeKeys.includes(theme as any) ? theme : \"auto\";\n      const themeProps = buildThemeObject<ThemeKeyType>({\n        theme: themeKey,\n        themeKeys: preferences.theming.themes.keys,\n        systemThemes: preferences.theming.themes.systemThemes,\n        colorScheme\n      });\n      await submitPreferences(themeProps);\n      dispatch(setTheme({ \n        key: isFXL ? \"fxl\" : \"reflow\", \n        value: themeKey \n      }));\n    };\n\n    applyCurrentTheme()\n      .catch(console.error);\n  }, [cache, themeObject, previousTheme, preferences.theming.themes, fxlThemeKeys, reflowThemeKeys, colorScheme, isFXL, submitPreferences, dispatch, navigatorReady]);\n\n  useLayoutEffect(() => {\n    dispatch(setDirection(uiDirection as ThLayoutDirection));\n    dispatch(setPlatformModifier(getPlatformModifier()));\n  }, [uiDirection, dispatch]);\n\n  return (\n    <>\n    <NavigatorProvider visualNavigator={ epubNavigator }>\n      <main className={ readerStyles.main }>\n        <StatefulDockingWrapper>\n          <div\n            ref={ containerRefSetter }\n            className={\n              getReaderClassNames({\n                isScroll,\n                isImmersive,\n                isHovering,\n                isFXL,\n                layoutUI,\n                breakpoint,\n                containerBreakpoint\n              })\n            }\n          >\n            <StatefulReaderHeader \n              actionKeys={ isFXL ? fxlActionKeys : reflowActionKeys }\n              actionsOrder={ isFXL ? preferences.actions.fxlOrder : preferences.actions.reflowOrder }\n              layout={ layoutUI }\n              runningHeadFormatPref={\n                isFXL \n                  ? preferences.theming.header?.runningHead?.format?.fxl \n                  : preferences.theming.header?.runningHead?.format?.reflow\n              } \n            />\n\n          { !isScroll \n            ? <nav className={ classNames(arrowStyles.container, arrowStyles.leftContainer) }>\n                <StatefulReaderArrowButton \n                  direction=\"left\" \n                  isDisabled={ isRTL ? atPublicationEnd : atPublicationStart } \n                  onPress={ () => {\n                    const navigationCallback = () => {\n                      dispatch(setUserNavigated(true));\n                      activateImmersiveOnAction();\n                    };\n                    goLeft(!reducedMotion, navigationCallback);\n                  }}\n                />\n            </nav> \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          { !isScroll \n            ? <nav className={ classNames(arrowStyles.container, arrowStyles.rightContainer) }>\n                <StatefulReaderArrowButton \n                  direction=\"right\" \n                  isDisabled={ isRTL ? atPublicationStart : atPublicationEnd } \n                  onPress={ () => {\n                    const navigationCallback = () => {\n                      dispatch(setUserNavigated(true));\n                      activateImmersiveOnAction();\n                    };\n                    goRight(!reducedMotion, navigationCallback);\n                  }}\n                />\n              </nav> \n            : <></> }\n\n          <StatefulReaderFooter \n            layout={ layoutUI } \n            progressionFormatPref={\n              isFXL \n                ? preferences.theming.progression?.format?.fxl \n                : preferences.theming.progression?.format?.reflow\n            }\n            progressionFormatFallback={\n              isFXL \n                ? ThProgressionFormat.readingOrderIndex\n                : ThProgressionFormat.resourceProgression\n            }\n          />\n        </div>\n      </StatefulDockingWrapper>\n    </main>\n  </NavigatorProvider>\n  </>\n)};"]}