{"version":3,"sources":["../src/components/StatefulReaderRunningHead.tsx","../src/components/StatefulReaderHeader.tsx","../src/components/assets/styles/thorium-web.reader.pagination.module.css","../src/components/assets/styles/thorium-web.reader.progression.module.css","../src/core/Components/Reader/ThProgression.tsx","../src/components/StatefulReaderProgression.tsx","../src/components/StatefulReaderPagination.tsx","../src/components/StatefulReaderFooter.tsx","../src/core/Hooks/fonts/androidPatchCss.ts","../src/core/Hooks/fonts/useFonts.ts","../src/components/Settings/hooks/useZoomCallbacks.ts","../src/components/Helpers/getReaderClassNames.ts"],"names":["Fragment","jsx","wrapper","listItem","leftButton","progression","rightButton","label","useMemo","classNames","useRef","jsxs","useCallback","useEffect"],"mappings":"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","file":"chunk-I572ZFCT.mjs","sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThRunningHead } from \"@/core/Components\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\n\nexport const StatefulReaderRunningHead = ({ \n  formatPref\n}: {\n  formatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n  const { t } = useI18n();\n  \n  const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n  const isImmersive = useAppSelector(state => state.reader.isImmersive);\n  const isHovering = useAppSelector(state => state.reader.isHovering);\n  const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n  const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n\n  // Get the fallback format based on isFXL\n  const fallbackFormat = useMemo<ThFormatPrefValue<ThRunningHeadFormat>>(() => ({\n    variants: ThRunningHeadFormat.title,\n    displayInImmersive: true,\n    displayInFullscreen: true\n  }), []);\n\n  const breakpointsMap = useMemo(() => {\n    return makeBreakpointsMap<ThFormatPrefValue<ThRunningHeadFormat>>({\n      defaultValue: formatPref?.default || fallbackFormat,\n      fromEnum: ThRunningHeadFormat,\n      pref: formatPref?.breakpoints,\n      validateKey: \"variants\"\n    });\n  }, [formatPref, fallbackFormat]);\n  \n  // Get current preferences with proper fallback\n  const currentPrefs = useMemo(() => {\n    if (!breakpoint) return formatPref?.default || fallbackFormat;\n    return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n  }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n  const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n\n  const displayFormat = useMemo(() => {\n    if (!variants) return ThRunningHeadFormat.title;\n    \n    // Check if we should hide in immersive mode\n    if (isImmersive && displayInImmersive === false && !isHovering) {\n      return ThRunningHeadFormat.none;\n    }\n    \n    // Check if we should hide in fullscreen mode\n    if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n      return ThRunningHeadFormat.none;\n    }\n    \n    return variants;\n  }, [variants, isImmersive, displayInImmersive, isHovering, isFullscreen, displayInFullscreen]);\n\n  const runningHead = useMemo(() => {\n    if (displayFormat === ThRunningHeadFormat.title) {\n      return unstableTimeline?.title || \"\";\n    } else if (displayFormat === ThRunningHeadFormat.chapter) {\n      return unstableTimeline?.progression?.currentChapter || unstableTimeline?.title || \"\";\n    }\n    return \"\";\n  }, [displayFormat, unstableTimeline]);\n\n  if (!runningHead || displayFormat === ThRunningHeadFormat.none) return null;\n  \n  return (\n    <>\n    <ThRunningHead \n      label={ runningHead } \n      aria-label={ t(\"reader.app.header.runningHead\") }\n    />\n    </>\n  );\n}","\"use client\";\n\nimport React from \"react\";\n\nimport { ActionKeyType } from \"@/preferences\";\nimport { ThLayoutUI, ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref } from \"@/preferences\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerHeaderStyles from \"./assets/styles/thorium-web.reader.header.module.css\";\nimport overflowMenuStyles from \"./Actions/assets/styles/thorium-web.overflow.module.css\";\n\nimport { ThHeader } from \"@/core/Components/Reader/ThHeader\";\nimport { StatefulBackLink } from \"./StatefulBackLink\";\nimport { StatefulReaderRunningHead } from \"./StatefulReaderRunningHead\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulCollapsibleActionsBar } from \"./Actions/StatefulCollapsibleActionsBar\";\n\nimport { useReaderHeaderBase } from \"./hooks/useReaderHeaderBase\";\nimport { usePreferences } from \"@/preferences/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderHeader = ({\n  actionKeys,\n  actionsOrder,\n  layout,\n  runningHeadFormatPref\n}: {\n  actionKeys: ActionKeyType[];\n  actionsOrder: ActionKeyType[];\n  layout: ThLayoutUI;\n  runningHeadFormatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n  const {\n    headerRef, focusWithinProps, setHover, removeHover,\n    listActionItems, isImmersive, isHovering, isScroll, t,\n  } = useReaderHeaderBase(actionKeys);\n\n  const { preferences } = usePreferences();\n\n  return (\n    <>\n      <ThInteractiveOverlay\n        className={ classNames(readerStyles.barOverlay, readerStyles.headerOverlay) }\n        isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n        onMouseEnter={ setHover }\n        onMouseLeave={ removeHover }\n      />\n\n      <ThHeader\n        ref={ headerRef }\n        className={ classNames(readerStyles.topBar, readerHeaderStyles.header) }\n        aria-label={ t(\"reader.app.header.label\") }\n        onMouseEnter={ setHover }\n        onMouseLeave={ removeHover }\n        { ...focusWithinProps }\n      >\n        { preferences.theming.header?.backLink && <StatefulBackLink className={ readerHeaderStyles.backlinkWrapper } /> }\n\n        <StatefulReaderRunningHead formatPref={ runningHeadFormatPref } />\n\n        <StatefulCollapsibleActionsBar\n          id=\"reader-header-overflowMenu\"\n          items={ listActionItems() }\n          prefs={{ ...preferences.actions, displayOrder: actionsOrder }}\n          className={ readerHeaderStyles.actionsWrapper }\n          aria-label={ t(\"reader.app.header.actions\") }\n          overflowMenuClassName={\n            (!isScroll || preferences.affordances.scroll.hintInImmersive)\n              ? overflowMenuStyles.hint\n              : undefined\n          }\n        />\n      </ThHeader>\n    </>\n  );\n};\n",".wrapper {\n  box-sizing: border-box;\n  display: grid;\n  gap: calc(var(--th-layout-spacing) / 2);\n  grid-template-areas: \"pagination-start pagination-center pagination-end\";\n  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n  background-color: var(--th-theme-background);\n  color: var(--th-theme-text);\n  align-items: center;\n  width: 100%;\n  max-width: var(--th-layout-constraints-pagination, 100%);\n}\n\n.listItem {\n  box-sizing: border-box;\n  list-style: none;\n}\n\n.listItem:has(.leftButton) {\n  grid-area: pagination-start;\n  justify-self: start;\n}\n\n.listItem:has(.progression) {\n  grid-area: pagination-center;\n  justify-self: center;\n}\n\n.listItem:has(.rightButton) {\n  grid-area: pagination-end;\n  justify-self: end;\n}\n\n\n.listItem button {\n  box-sizing: border-box;\n  padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n  gap: calc(var(--th-layout-spacing) / 2);\n  max-height: calc(var(--th-icon-size, 24px) * 2);\n  max-width: 100%;\n  border-radius: var(--th-layout-radius);\n  display: flex;\n  align-items: center;\n}\n\n.rightButton {\n  margin-inline-start: auto;\n  text-align: end;\n}\n\n.listItem button[data-hovered] {\n  background-color: var(--th-theme-hover);\n  color: var(--th-theme-onHover);\n}\n\n.listItem button[data-focus-visible] {\n  outline: 2px solid var(--th-theme-focus);\n}\n\n.listItem button[data-disabled] {\n  color: var(--th-theme-disable);\n}\n\n.listItem button .label {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n  white-space: normal;\n  -webkit-line-clamp: 1;\n  line-clamp: 1;\n}\n\n.listItem button svg {\n  flex: none;\n  width: var(--th-icon-size, 24px);\n  height: var(--th-icon-size, 24px);\n  fill: currentColor;\n}",".wrapper {\n  color: var(--th-theme-text);\n  font-variant-numeric: lining-nums tabular-nums;\n  text-align: center;\n}","\"use client\";\n\nimport React from \"react\";\n\nexport interface ThProgressionProps extends React.HTMLAttributes<HTMLDivElement> {\n  ref?: React.RefObject<HTMLDivElement>\n}\n\nexport const ThProgression = ({ \n  ref,\n  children, \n  ...props\n}: ThProgressionProps) => {\n  return (\n    <>\n    <div \n      ref={ ref } \n      {...props }\n    >\n      { children }\n    </div>\n    </>\n  )\n}","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport progressionStyles from \"./assets/styles/thorium-web.reader.progression.module.css\";\n\nimport { ThProgressionFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThProgression } from \"@/core/Components/Reader/ThProgression\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport { getBestMatchingProgressionFormat } from \"@/core/Helpers/progressionFormat\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderProgression = ({ \n  className,\n  formatPref,\n  fallbackVariant\n}: { \n  className?: string,\n  formatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>,\n  fallbackVariant: ThProgressionFormat | Array<ThProgressionFormat>\n}) => {\n  const { t } = useI18n();\n  \n  const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n  const isImmersive = useAppSelector(state => state.reader.isImmersive);\n  const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n  const isHovering = useAppSelector(state => state.reader.isHovering);\n  const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n  \n  const fallbackFormat = useMemo(() => {\n    return {\n      variants: fallbackVariant,\n      displayInImmersive: true,\n      displayInFullscreen: true\n    };\n  }, [fallbackVariant]);\n  \n  const breakpointsMap = useMemo(() => {\n    return makeBreakpointsMap<ThFormatPrefValue<ThProgressionFormat | ThProgressionFormat[]>>({\n      defaultValue: formatPref?.default || fallbackFormat,\n      fromEnum: ThProgressionFormat,\n      pref: formatPref?.breakpoints,\n      validateKey: \"variants\"\n    });\n  }, [formatPref, fallbackFormat]);\n  \n  // Get current preferences with proper fallback\n  const currentPrefs = useMemo(() => {\n    if (!breakpoint) return formatPref?.default || fallbackFormat;\n    return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n  }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n  const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n  \n  // Get the display format, handling both single format and array of formats\n  const displayFormat = useMemo(() => {\n    if (!variants) return fallbackFormat.variants;\n    \n    // Check if we should hide in immersive mode\n    if (isImmersive && displayInImmersive === false && !isHovering) {\n      return ThProgressionFormat.none;\n    }\n    \n    // Check if we should hide in fullscreen mode\n    if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n      return ThProgressionFormat.none;\n    }\n    \n    if (Array.isArray(variants)) {\n      return getBestMatchingProgressionFormat(variants, unstableTimeline?.progression) || \n        fallbackFormat.variants;\n    }\n    \n    return variants;\n  }, [variants, unstableTimeline?.progression, fallbackFormat, isImmersive, isHovering, isFullscreen, displayInImmersive, displayInFullscreen]);\n\n  // Compute display text based on current position and timeline\n  const displayText = useMemo(() => {\n    if (displayFormat === ThProgressionFormat.none || !unstableTimeline?.progression) {\n      return \"\";\n    }\n\n    const { \n      currentPositions = [],\n      totalPositions,\n      relativeProgression,\n      totalProgression,\n      currentChapter,\n      positionsLeft,\n      totalItems,\n      currentIndex\n    } = unstableTimeline.progression;\n    \n    let text = \"\";\n    \n    // Format positions for display (handle array of two positions with a dash)\n    const formatPositions = (positions: number[]) => {\n      if (positions.length === 2) {\n        return positions.join(\"–\");\n      }\n      return positions[0]?.toString() || \"\";\n    };\n        \n    switch (displayFormat) {\n      case ThProgressionFormat.positions:\n        if (currentPositions.length > 0) {\n          text = formatPositions(currentPositions);\n        }\n        break;\n        \n      case ThProgressionFormat.positionsOfTotal:\n        if (currentPositions.length > 0 && totalPositions) {\n          text = t(\"reader.progression.xOfY.compact\", { \n            x: formatPositions(currentPositions),\n            y: totalPositions\n          });\n        }\n        break;\n\n      case ThProgressionFormat.positionsPercentOfTotal:\n        if (currentPositions.length > 0 && totalPositions) {\n          const percentage = Math.round((totalProgression || 0) * 100);\n          text = t(\"reader.progression.xOfY.descriptive\", { \n            x: formatPositions(currentPositions),\n            y: totalPositions,\n            z: `${ percentage }%`\n          });\n        }\n        break;\n        \n      case ThProgressionFormat.positionsLeft:\n        if (positionsLeft !== undefined) {\n          text = t(`reader.progression.positionsLeftInChapter.descriptive`, { \n            count: positionsLeft\n          });\n        }\n        break;\n        \n      case ThProgressionFormat.overallProgression:\n        if (totalProgression !== undefined) {\n          const percentage = Math.round(totalProgression * 100);\n          text = `${ percentage }%`;\n        }\n        break;\n        \n      case ThProgressionFormat.resourceProgression:\n        if (relativeProgression !== undefined) {\n          const percentage = Math.round(relativeProgression * 100);\n          text = `${ percentage }%`;\n        }\n        break;\n        \n      case ThProgressionFormat.progressionOfResource:\n        if (relativeProgression !== undefined) {\n          const percentage = Math.round(relativeProgression * 100);\n          text = t(\"reader.progression.xOfY.compact\", {\n            x: `${ percentage }%`,\n            y: currentChapter || t(\"reader.app.progression.referenceFallback\")\n          });\n        }\n        break;\n\n      case ThProgressionFormat.readingOrderIndex:\n        if (currentIndex !== undefined && totalItems !== undefined) {\n          text = t(\"reader.progression.xOfY.compact\", {\n            x: currentIndex,\n            y: totalItems\n          });\n        }\n        break;\n    }\n    \n    return text;\n  }, [displayFormat, unstableTimeline, t]);\n\n  if (!displayText || displayFormat === ThProgressionFormat.none) {\n    return null;\n  }\n\n  return (\n    <ThProgression \n      id=\"current-progression\" \n      className={ classNames(progressionStyles.wrapper, className) }\n      aria-label={ t(\"reader.app.progression.wrapper\") }\n    >\n      { displayText }\n    </ThProgression>\n  );\n};","\"use client\";\n\nimport { useRef, KeyboardEvent } from \"react\";\n\nimport { ThPagination, ThPaginationProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nexport const StatefulReaderPagination = ({\n  ref,\n  links,\n  compounds,\n  children,\n  ...props\n}: ThPaginationProps) => {\n  const leftButtonRef = useRef<HTMLButtonElement>(null);\n  const rightButtonRef = useRef<HTMLButtonElement>(null);\n\n  const updatedCompounds = {\n    ...compounds,\n    leftButton: {\n      ...compounds?.leftButton,\n      ref: leftButtonRef,\n      onKeyDown: (e: KeyboardEvent) => {\n        if (e.key === \"Escape\") {\n          leftButtonRef.current?.blur();\n        }\n      }\n    },\n    rightButton: {\n      ...compounds?.rightButton,\n      ref: rightButtonRef,\n      onKeyDown: (e: KeyboardEvent) => {\n        if (e.key === \"Escape\") {\n          rightButtonRef.current?.blur();\n        }\n      }\n    }\n  };\n\n  return (\n    <ThPagination\n      ref={ ref }\n      className={ readerPaginationStyles.wrapper }\n      links={ links }\n      compounds={ updatedCompounds }\n      { ...props }\n    >\n      { children }\n    </ThPagination>\n  )\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nimport { ThBreakpoints, ThLayoutUI, ThFormatPref, ThProgressionFormat } from \"@/preferences/models\";\n\nimport { ThFooter } from \"@/core/Components/Reader/ThFooter\";\nimport { StatefulReaderProgression } from \"./StatefulReaderProgression\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulReaderPagination } from \"./StatefulReaderPagination\";\nimport { ThPaginationLinkProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useFocusWithin, useLocale } from \"react-aria\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { useIsScroll } from \"@/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderFooter = ({\n  layout,\n  progressionFormatPref,\n  progressionFormatFallback\n}: {\n  layout: ThLayoutUI;\n  progressionFormatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>;\n  progressionFormatFallback: ThProgressionFormat | ThProgressionFormat[];\n}) => {\n  const { t } = useI18n();\n  const { direction } = useLocale();\n  const footerRef = useRef<HTMLDivElement>(null);\n  const isImmersive = useAppSelector(state => state.reader.isImmersive);\n  const isHovering = useAppSelector(state => state.reader.isHovering);\n  const hasScrollAffordance = useAppSelector(state => state.reader.hasScrollAffordance);\n  const isRTL = useAppSelector(state => state.publication.isRTL);\n  const isFXL = useAppSelector(state => state.publication.isFXL);\n  const isScroll = useIsScroll();\n  const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n  const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n  const timeline = useAppSelector(state => state.publication.unstableTimeline);\n\n  const dispatch = useAppDispatch();\n\n  const { focusWithinProps } = useFocusWithin({\n    onFocusWithin() {\n      dispatch(setHovering(true));\n    },\n    onBlurWithin() {\n      dispatch(setHovering(false));\n    }\n  });\n\n  const setHover = () => {\n    if (!hasScrollAffordance) {\n      dispatch(setHovering(true));\n    }\n  };\n\n  const removeHover = () => {\n    if (!hasScrollAffordance) {\n      dispatch(setHovering(false));\n    }\n  };\n\n  const { previousLocator, nextLocator, go } = useNavigator().unified;\n\n  const buildNode = useCallback((\n    locator: ReturnType<typeof previousLocator>,\n    title: string | undefined,\n    compactKey: string,\n    descriptiveKey: string\n  ) => {\n    if (!locator) return undefined;\n\n    return breakpoint !== ThBreakpoints.compact && breakpoint !== ThBreakpoints.medium ? (\n      <>\n        <span className={ readerStyles.srOnly }>{ t(descriptiveKey) }</span>\n        <span className={ readerPaginationStyles.label }>{ title || locator.title || t(compactKey) }</span>\n      </>\n    ) : (\n      <span className={ readerPaginationStyles.label }>{ t(compactKey) }</span>\n    );\n  }, [t, breakpoint]);\n\n  const updateLinks = useCallback(() => {\n    const previous = previousLocator();\n    const next = nextLocator();\n\n    const previousLink: ThPaginationLinkProps | undefined = previous ? {\n      node: buildNode(\n        previous,\n        timeline?.previousItem?.title,\n        isFXL ? \"reader.actions.goToPreviousPage.compact\" : \"reader.actions.goToPreviousChapter.compact\",\n        isFXL ? \"reader.actions.goToPreviousPage.descriptive\" : \"reader.actions.goToPreviousChapter.descriptive\"\n      ),\n      onPress: () => go(previous, !reducedMotion, () => {})\n    } : undefined;\n\n    const nextLink: ThPaginationLinkProps | undefined = next ? {\n      node: buildNode(\n        next,\n        timeline?.nextItem?.title,\n        isFXL ? \"reader.actions.goToNextPage.compact\" : \"reader.actions.goToNextChapter.compact\",\n        isFXL ? \"reader.actions.goToNextPage.descriptive\" : \"reader.actions.goToNextChapter.descriptive\"\n      ),\n      onPress: () => go(next, !reducedMotion, () => {})\n    } : undefined;\n\n    return isRTL\n      ? { left: nextLink, right: previousLink }\n      : { left: previousLink, right: nextLink };\n  }, [go, previousLocator, nextLocator, buildNode, timeline, reducedMotion, isFXL, isRTL]);\n\n  useEffect(() => {\n    updateLinks();\n  }, [timeline, updateLinks]);\n\n  useEffect(() => {\n    // Blur any focused element when entering immersive mode\n    if (isImmersive) {\n      const focusElement = document.activeElement;\n      if (focusElement && footerRef.current?.contains(focusElement)) {\n        (focusElement as HTMLElement).blur();\n      }\n    }\n  }, [isImmersive]);\n\n  return(\n    <>\n    <ThInteractiveOverlay\n      className={ classNames(readerStyles.barOverlay, readerStyles.footerOverlay) }\n      isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n      onMouseEnter={ setHover }\n      onMouseLeave={ removeHover }\n    />\n\n    <ThFooter\n      ref={ footerRef }\n      className={ readerStyles.bottomBar }\n      aria-label={ t(\"reader.app.footer.label\") }\n      onMouseEnter={ setHover }\n      onMouseLeave={ removeHover }\n      { ...focusWithinProps }\n    >\n      { (isScroll)\n        ? <StatefulReaderPagination\n            aria-label={ t(\"reader.navigation.scroll.wrapper\") }\n            links={ updateLinks() }\n            dir={ direction }\n            compounds={ {\n              listItem: {\n                className: readerPaginationStyles.listItem\n              },\n              leftButton: {\n                className: readerPaginationStyles.leftButton,\n                preventFocusOnPress: true\n              },\n              rightButton: {\n                className: readerPaginationStyles.rightButton,\n                preventFocusOnPress: true\n              }\n            } }\n          >\n            <StatefulReaderProgression\n              className={ readerPaginationStyles.progression }\n              formatPref={ progressionFormatPref }\n              fallbackVariant={ progressionFormatFallback }\n            />\n          </StatefulReaderPagination>\n        : <StatefulReaderProgression\n            formatPref={ progressionFormatPref }\n            fallbackVariant={ progressionFormatFallback }\n          /> }\n    </ThFooter>\n    </>\n  )\n}\n","export const getAndroidPatchCss = () => {\n  if (typeof window === \"undefined\") {\n    return \"\";\n  }\n  \n  const origin = window.location.origin;\n  \n  return `/* Readium CSS\n   Android Fonts Patch module\n\n   A stylesheet aligning Android generic serif and sans-serif fonts on other platforms\n\n   Repo: https://github.com/readium/css */\n\n/* Android resolves sans-serif to Roboto, and serif to Droid Serif \n   This created issues for FXL EPUBs relying on Times (New Roman),\n   Helvetica or Arial while not embedding the font files in the package.\n\n   See https://github.com/readium/css/issues/149\n\n   Unfortunately it is no possible to target generic family using @font-face,\n   we have to target specific font-family names e.g. Times, Arial, etc.\n\n   This stylesheet/patch should be loaded only for this case i.e.\n   a Fixed-Layout EPUB with text but no embedded font on an Android device.\n   The logic for checking these conditions are up to implementers.\n*/\n\n/* Serif (Times + Times New Roman) */\n\n@font-face {\n  font-family: Times;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"Times New Roman\";\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: Times;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: normal;\n  font-style: italic;\n}\n\n@font-face {\n  font-family: \"Times New Roman\";\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: normal;\n  font-style: italic;\n}\n\n@font-face {\n  font-family: Times;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: bold;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"Times New Roman\";\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: bold;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: Times;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: bold;\n  font-style: italic;\n}\n\n@font-face {\n  font-family: \"Times New Roman\";\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: bold;\n  font-style: italic;\n}\n\n/* Sans-serif (Helvetica + Arial) */\n\n@font-face {\n  font-family: Helvetica;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: Arial;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: Helvetica;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: normal;\n  font-style: italic;\n}\n\n@font-face {\n  font-family: Arial;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: normal;\n  font-style: italic;\n}\n\n@font-face {\n  font-family: Helvetica;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: bold;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: Arial;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: bold;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: Helvetica;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: bold;\n  font-style: italic;\n}\n\n@font-face {\n  font-family: Arial;\n  src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n  font-weight: bold;\n  font-style: italic;\n}`;\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { InjectableFontResources } from \"@/preferences/services/fonts\";\nimport { ILinkInjectable, IUrlInjectable, IBlobInjectable } from \"@readium/navigator\";\n\nimport { getPlatform } from \"@/core/Helpers/getPlatform\";\nimport { getAndroidPatchCss } from \"./androidPatchCss\";\n\ntype FontResource = (ILinkInjectable & IUrlInjectable) | (ILinkInjectable & IBlobInjectable);\n\nexport const useFonts = (fontResources?: InjectableFontResources | null) => {\n  const injectedElementsRef = useRef<{\n    prepend: HTMLElement[];\n    append: HTMLElement[];\n  }>({\n    prepend: [],\n    append: []\n  });\n\n  const createLinkElement = useCallback((resource: FontResource): HTMLLinkElement => {\n    const link = document.createElement(\"link\");\n    \n    // Set all custom attributes first to make sure they are\n    // overridden by the core attributes\n    if (\"attributes\" in resource && resource.attributes) {\n      Object.entries(resource.attributes).forEach(([key, value]) => {\n        link.setAttribute(key, value as string);\n      });\n    }\n    \n    link.rel = resource.rel;\n    link.as = resource.as;\n    \n    if (\"url\" in resource) {\n      link.href = resource.url;\n    } else if (\"blob\" in resource && resource.blob) {\n      link.href = URL.createObjectURL(resource.blob);\n    }\n    \n    return link;\n  }, []);\n\n  const removeInjectedElements = useCallback(() => {\n    const { prepend, append } = injectedElementsRef.current;\n    \n    [...prepend, ...append].forEach(element => {\n      if (element.parentNode) {\n        element.parentNode.removeChild(element);\n      }\n      // Revoke blob URLs to prevent memory leaks\n      if (element instanceof HTMLLinkElement && element.href.startsWith(\"blob:\")) {\n        URL.revokeObjectURL(element.href);\n      }\n    });\n    \n    injectedElementsRef.current = {\n      prepend: [],\n      append: []\n    };\n  }, []);\n\n  const injectFontResources = useCallback((resources: InjectableFontResources | null) => {\n    if (typeof document === \"undefined\") return;\n    \n    removeInjectedElements();\n    \n    if (!resources) return;\n    \n    const { prepend, append } = resources;\n    const injectedElements = injectedElementsRef.current;\n    \n    prepend.forEach(resource => {\n      const element = createLinkElement(resource);\n      document.head.insertBefore(element, document.head.firstChild);\n      injectedElements.prepend.push(element);\n    });\n    \n    append.forEach(resource => {\n      const element = createLinkElement(resource);\n      document.head.appendChild(element);\n      injectedElements.append.push(element);\n    });\n  }, [createLinkElement, removeInjectedElements]);\n\n  const getAndroidFXLPatch = useCallback((): (ILinkInjectable & IBlobInjectable) | null => {\n    const platform = getPlatform();\n    const isAndroid = platform === \"android\";\n    \n    if (!isAndroid) {\n      return null;\n    }\n    \n    const cssContent = getAndroidPatchCss();\n    const blob = new Blob([cssContent], { type: \"text/css\" });\n    \n    return {\n      as: \"link\",\n      rel: \"stylesheet\",\n      blob\n    };\n  }, []);\n\n  useEffect(() => {\n    injectFontResources(fontResources || null);\n    \n    return () => {\n      removeInjectedElements();\n    };\n  }, [fontResources, injectFontResources, removeInjectedElements]);\n\n  return {\n    injectFontResources,\n    removeFontResources: removeInjectedElements,\n    getAndroidFXLPatch\n  };\n};","import { useCallback } from \"react\";\n\nimport { ThSettingsKeys } from \"@/preferences/models\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontSize } from \"@/lib/settingsReducer\";\nimport { setWebPubZoom } from \"@/lib/webPubSettingsReducer\";\nimport { useEffectiveRange } from \"./useEffectiveRange\";\nimport { EpubPreferencesEditor, IEpubPreferences, IWebPubPreferences, WebPubPreferencesEditor } from \"@readium/navigator\";\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useWebPubNavigator } from \"@/core/Hooks/WebPub/useWebPubNavigator\";\n\ntype ZoomNavigator = ReturnType<typeof useEpubNavigator> | ReturnType<typeof useWebPubNavigator>;\n\nexport const useZoomCallbacks = (navigator: ZoomNavigator) => {\n  const { preferences } = usePreferences();\n  const readerProfile = useAppSelector(state => state.reader.profile);\n  const isFXL = useAppSelector(state => state.publication.isFXL);\n  const dispatch = useAppDispatch();\n\n  const isWebPub = readerProfile === \"webPub\";\n\n  const getSetting = navigator.getSetting as (key: string) => number | null | undefined;\n  const submitPreferences = navigator.submitPreferences as (prefs: IEpubPreferences | IWebPubPreferences) => Promise<void>;\n  const { preferencesEditor } = navigator;\n\n  const supportedRange = isWebPub\n    ? (preferencesEditor as WebPubPreferencesEditor)?.zoom?.supportedRange\n    : isFXL\n      ? (preferencesEditor as unknown as WebPubPreferencesEditor)?.zoom?.supportedRange\n      : (preferencesEditor as EpubPreferencesEditor)?.fontSize?.supportedRange;\n\n  const zoomConfig = preferences.settings.keys[ThSettingsKeys.zoom];\n  const { range } = useEffectiveRange(zoomConfig.range, supportedRange);\n  const [min, max] = range;\n  const step = zoomConfig.step ?? 0.05;\n\n  const zoomIn = useCallback(async () => {\n    if (isWebPub) {\n      const next = Math.min(max, (getSetting(\"zoom\") ?? 1) + step);\n      await submitPreferences({ zoom: next });\n      dispatch(setWebPubZoom(getSetting(\"zoom\")));\n    } else {\n      const next = Math.min(max, (getSetting(\"fontSize\") ?? 1) + step);\n      await submitPreferences({ fontSize: next });\n      dispatch(setFontSize(getSetting(\"fontSize\")));\n    }\n  }, [isWebPub, getSetting, max, step, submitPreferences, dispatch]);\n\n  const zoomOut = useCallback(async () => {\n    if (isWebPub) {\n      const next = Math.max(min, (getSetting(\"zoom\") ?? 1) - step);\n      await submitPreferences({ zoom: next });\n      dispatch(setWebPubZoom(getSetting(\"zoom\")));\n    } else {\n      const next = Math.max(min, (getSetting(\"fontSize\") ?? 1) - step);\n      await submitPreferences({ fontSize: next });\n      dispatch(setFontSize(getSetting(\"fontSize\")));\n    }\n  }, [isWebPub, getSetting, min, step, submitPreferences, dispatch]);\n\n  return { zoomIn, zoomOut };\n};\n","import { ThLayoutUI } from \"@/preferences\";\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport classNames from \"classnames\";\n\ninterface ReaderStyleOptions {\n  layoutUI: ThLayoutUI;\n  isScroll: boolean;\n  isImmersive?: boolean;\n  isHovering?: boolean;\n  isFXL?: boolean;\n  breakpoint?: string;\n  containerBreakpoint?: string;\n}\n\nconst LAYOUT_CLASSES = {\n  [ThLayoutUI.stacked]: \"thorium_web_stackedUI\",\n  [ThLayoutUI.layered]: \"thorium_web_layeredUI\",\n} as const;\n\nconst toBreakpointClass = (prefix: string, bp: string) =>\n  `${ prefix }${ bp.charAt(0).toUpperCase() + bp.slice(1) }`;\n\nexport function getReaderClassNames(options: ReaderStyleOptions): string {\n  const {\n    layoutUI,\n    isScroll,\n    isImmersive = false,\n    isHovering = false,\n    isFXL = false,\n    breakpoint,\n    containerBreakpoint,\n  } = options;\n\n  return classNames(\n    readerStyles.shell,\n    isScroll ? \"thorium_web_isScroll\" : \"thorium_web_isPaged\",\n    isImmersive && \"thorium_web_isImmersive\",\n    isHovering && \"thorium_web_isHovering\",\n    isFXL ? \"thorium_web_isFXL\" : \"thorium_web_isReflow\",\n    LAYOUT_CLASSES[layoutUI],\n    breakpoint ? toBreakpointClass(\"thorium_web_is\", breakpoint) : undefined,\n    containerBreakpoint ? toBreakpointClass(\"thorium_web_container_is\", containerBreakpoint) : undefined\n  );\n}"]}