@edrlab/thorium-web 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/{ThPreferencesAdapter-D0rzsGRl.d.mts → ThPreferencesAdapter-_5AePKHa.d.mts} +26 -7
  2. package/dist/{ThSettingsWrapper-BXuRgdqp.d.mts → ThSettingsWrapper-B_9klYXH.d.mts} +1 -1
  3. package/dist/{actions-BLAr0oaM.d.mts → actions-CuRRM3rp.d.mts} +5 -2
  4. package/dist/{actionsReducer-XWTGGNUd.d.mts → actionsReducer-VFR42qgL.d.mts} +1 -1
  5. package/dist/{chunk-6EHFW43Y.mjs → chunk-2NCN2AG2.mjs} +5 -4
  6. package/dist/chunk-2NCN2AG2.mjs.map +1 -0
  7. package/dist/{chunk-L4XGZAZ5.mjs → chunk-2YRT7RNW.mjs} +20 -3
  8. package/dist/chunk-2YRT7RNW.mjs.map +1 -0
  9. package/dist/{chunk-5LUMM7FW.mjs → chunk-44PEO3DS.mjs} +2 -2
  10. package/dist/{chunk-5LUMM7FW.mjs.map → chunk-44PEO3DS.mjs.map} +1 -1
  11. package/dist/chunk-A575ZW4A.mjs +10 -0
  12. package/dist/chunk-A575ZW4A.mjs.map +1 -0
  13. package/dist/chunk-AE6P4KJB.mjs +13 -0
  14. package/dist/chunk-AE6P4KJB.mjs.map +1 -0
  15. package/dist/chunk-AQSJDL63.mjs +193 -0
  16. package/dist/chunk-AQSJDL63.mjs.map +1 -0
  17. package/dist/{chunk-NKO3K3QS.mjs → chunk-DQDOOTCE.mjs} +5 -5
  18. package/dist/chunk-DQDOOTCE.mjs.map +1 -0
  19. package/dist/{chunk-SAUOY37Q.mjs → chunk-E2JEGVVE.mjs} +15 -15
  20. package/dist/chunk-E2JEGVVE.mjs.map +1 -0
  21. package/dist/{chunk-DETZMFZ7.mjs → chunk-ETLIGONP.mjs} +39 -33
  22. package/dist/chunk-ETLIGONP.mjs.map +1 -0
  23. package/dist/chunk-GNROODJB.mjs +9 -0
  24. package/dist/chunk-GNROODJB.mjs.map +1 -0
  25. package/dist/{chunk-6BUN7DEA.mjs → chunk-KGSFTRCH.mjs} +69 -84
  26. package/dist/chunk-KGSFTRCH.mjs.map +1 -0
  27. package/dist/{chunk-LP3JFZ4A.mjs → chunk-MSHUPSBI.mjs} +718 -466
  28. package/dist/chunk-MSHUPSBI.mjs.map +1 -0
  29. package/dist/chunk-OD75GC5N.mjs +3953 -0
  30. package/dist/chunk-OD75GC5N.mjs.map +1 -0
  31. package/dist/{chunk-I4BKU5NN.mjs → chunk-RBEPH5E5.mjs} +100 -30
  32. package/dist/chunk-RBEPH5E5.mjs.map +1 -0
  33. package/dist/{chunk-DMZFSOHK.mjs → chunk-SI4FBFHM.mjs} +135 -46
  34. package/dist/chunk-SI4FBFHM.mjs.map +1 -0
  35. package/dist/{chunk-A3FZBEUL.mjs → chunk-SZAVAQ6S.mjs} +30 -6
  36. package/dist/chunk-SZAVAQ6S.mjs.map +1 -0
  37. package/dist/{chunk-ITDBOMY5.mjs → chunk-VENFFPK2.mjs} +3 -3
  38. package/dist/{chunk-ITDBOMY5.mjs.map → chunk-VENFFPK2.mjs.map} +1 -1
  39. package/dist/{chunk-2ORXUOH3.mjs → chunk-WF2UOYO7.mjs} +4 -4
  40. package/dist/{chunk-2ORXUOH3.mjs.map → chunk-WF2UOYO7.mjs.map} +1 -1
  41. package/dist/{chunk-EZG6SBSO.mjs → chunk-YEVLT3AV.mjs} +104 -29
  42. package/dist/chunk-YEVLT3AV.mjs.map +1 -0
  43. package/dist/components/Audio/index.css +2 -1
  44. package/dist/components/Audio/index.css.map +1 -1
  45. package/dist/components/Audio/index.d.mts +16 -15
  46. package/dist/components/Audio/index.mjs +16 -16
  47. package/dist/components/Epub/index.css +5 -4
  48. package/dist/components/Epub/index.css.map +1 -1
  49. package/dist/components/Epub/index.d.mts +13 -13
  50. package/dist/components/Epub/index.mjs +17 -17
  51. package/dist/components/Misc/index.mjs +5 -5
  52. package/dist/components/Reader/index.css +5 -4
  53. package/dist/components/Reader/index.css.map +1 -1
  54. package/dist/components/Reader/index.d.mts +11 -11
  55. package/dist/components/Reader/index.mjs +34 -30
  56. package/dist/components/Reader/index.mjs.map +1 -1
  57. package/dist/components/WebPub/index.css +5 -4
  58. package/dist/components/WebPub/index.css.map +1 -1
  59. package/dist/components/WebPub/index.d.mts +13 -13
  60. package/dist/components/WebPub/index.mjs +17 -17
  61. package/dist/core/Components/index.d.mts +12 -22
  62. package/dist/core/Components/index.mjs +2 -2
  63. package/dist/core/Helpers/index.d.mts +1 -1
  64. package/dist/core/Helpers/index.mjs +3 -4
  65. package/dist/core/Hooks/index.d.mts +12 -8
  66. package/dist/core/Hooks/index.mjs +1 -1
  67. package/dist/i18n/index.mjs +4 -7
  68. package/dist/lib/index.d.mts +56 -20
  69. package/dist/lib/index.mjs +3 -2
  70. package/dist/locales/da/thorium-shared.json +3 -0
  71. package/dist/locales/da/thorium-web.json +37 -2
  72. package/dist/locales/en/thorium-shared.json +24 -2
  73. package/dist/locales/en/thorium-web.json +2 -2
  74. package/dist/locales/es/thorium-shared.json +364 -0
  75. package/dist/locales/es/thorium-web.json +130 -0
  76. package/dist/locales/et/thorium-shared.json +121 -9
  77. package/dist/locales/et/thorium-web.json +32 -1
  78. package/dist/locales/fi/thorium-shared.json +42 -4
  79. package/dist/locales/fi/thorium-web.json +36 -2
  80. package/dist/locales/fr/thorium-shared.json +108 -1
  81. package/dist/locales/fr/thorium-web.json +121 -86
  82. package/dist/locales/it/thorium-shared.json +108 -1
  83. package/dist/locales/it/thorium-web.json +15 -2
  84. package/dist/locales/lt/thorium-web.json +36 -2
  85. package/dist/locales/pl/thorium-web.json +1 -1
  86. package/dist/locales/pt-BR/thorium-shared.json +6 -0
  87. package/dist/locales/pt-BR/thorium-web.json +88 -88
  88. package/dist/locales/pt-PT/thorium-shared.json +91 -0
  89. package/dist/locales/pt-PT/thorium-web.json +15 -3
  90. package/dist/locales/sv/thorium-shared.json +108 -2
  91. package/dist/locales/sv/thorium-web.json +15 -3
  92. package/dist/locales/tr/thorium-shared.json +42 -0
  93. package/dist/next-lib/index.mjs +1 -1
  94. package/dist/next-lib/index.mjs.map +1 -1
  95. package/dist/preferences/index.d.mts +59 -13
  96. package/dist/preferences/index.mjs +7 -7
  97. package/dist/{settingsReducer-Bu1zeveu.d.mts → settingsReducer-VqBhLq50.d.mts} +14 -2
  98. package/dist/{ui-nBv8gfr0.d.mts → ui-DnZZhozX.d.mts} +1 -1
  99. package/dist/{useAudioNavigator-C5aW4-eT.d.mts → useAudioNavigator-CWXyNWq1.d.mts} +3 -1
  100. package/dist/{useContrast-2t429O9O.d.mts → useContrast-Cbso7N1l.d.mts} +5 -1
  101. package/dist/{usePreferences-VaBf46eP.d.mts → usePreferences-9ZvbcbLW.d.mts} +6 -8
  102. package/dist/{useReaderTransitions-IBGdE7qi.d.mts → useReaderTransitions-0hKGCvMm.d.mts} +64 -12
  103. package/package.json +10 -9
  104. package/dist/chunk-6BUN7DEA.mjs.map +0 -1
  105. package/dist/chunk-6EHFW43Y.mjs.map +0 -1
  106. package/dist/chunk-7CGMWOZN.mjs +0 -20
  107. package/dist/chunk-7CGMWOZN.mjs.map +0 -1
  108. package/dist/chunk-A3FZBEUL.mjs.map +0 -1
  109. package/dist/chunk-B3WDMWCT.mjs +0 -9
  110. package/dist/chunk-B3WDMWCT.mjs.map +0 -1
  111. package/dist/chunk-DETZMFZ7.mjs.map +0 -1
  112. package/dist/chunk-DMZFSOHK.mjs.map +0 -1
  113. package/dist/chunk-DTPO3J2C.mjs +0 -1732
  114. package/dist/chunk-DTPO3J2C.mjs.map +0 -1
  115. package/dist/chunk-EZG6SBSO.mjs.map +0 -1
  116. package/dist/chunk-GPWW5OML.mjs +0 -1955
  117. package/dist/chunk-GPWW5OML.mjs.map +0 -1
  118. package/dist/chunk-I4BKU5NN.mjs.map +0 -1
  119. package/dist/chunk-L4XGZAZ5.mjs.map +0 -1
  120. package/dist/chunk-LP3JFZ4A.mjs.map +0 -1
  121. package/dist/chunk-MLEYTQGK.mjs +0 -60
  122. package/dist/chunk-MLEYTQGK.mjs.map +0 -1
  123. package/dist/chunk-NKO3K3QS.mjs.map +0 -1
  124. package/dist/chunk-SAUOY37Q.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"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/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","theme"],"mappings":"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","file":"chunk-SI4FBFHM.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 } 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 if ((isDisabled || (!hasArrows && !isHovering)) && isActiveElement(buttonRef.current)) {\n buttonRef.current!.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 preventFocusOnPress={ true }\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","\"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\";\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 lineHeightOptions: Record<ThLineHeightOptions, number | null>;\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 lineHeightOptions,\n fxlThemeKeys,\n reflowThemeKeys,\n}: UseEpubPreferencesConfigProps) => {\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],\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 lineHeightOptions,\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 ]);\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 { ThLineHeightOptions } from \"@/preferences/models\";\nimport { EpubNavigatorListeners, IContentProtectionConfig, ILinkInjectable, IBlobInjectable } from \"@readium/navigator\";\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 lineHeightOptions: Record<ThLineHeightOptions, number | null>;\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 fxlProgressionCallback?: (locator: Locator) => 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 lineHeightOptions,\n arrowsOccupySpace,\n arrowsWidth,\n colorScheme,\n isFXL,\n contentProtectionConfig,\n onNavigatorReady,\n onNavigatorLoaded,\n onCleanup,\n fxlProgressionCallback,\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 lineHeightOptions,\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 { 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 };\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 }, fxlProgressionCallback);\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 ThActionsKeys,\n ThLayoutDirection,\n ThLayoutUI,\n ThDocumentTitleFormat,\n ThSpacingSettingsKeys,\n ThProgressionFormat,\n ThSettingsKeys\n} from \"../../preferences/models\";\n\nimport { ThPluginRegistry } from \"../Plugins/PluginRegistry\";\n\nimport { useLocale } from \"react-aria\";\nimport { ThPluginProvider } from \"../Plugins/PluginProvider\";\nimport { NavigatorProvider } from \"@/core/Navigator\";\n\nimport {\n BasicTextSelection,\n ContextMenuEvent,\n FrameClickEvent,\n KeyboardEventData,\n SuspiciousActivityEvent\n} from \"@readium/navigator-html-injectables\";\nimport { \n EpubNavigatorListeners, \n FrameManager, \n FXLFrameManager\n} from \"@readium/navigator\";\nimport { \n Locator, \n Publication, \n Layout\n} from \"@readium/shared\";\n\nimport { StatefulDockingWrapper } from \"../Docking/StatefulDockingWrapper\";\nimport { StatefulReaderHeader } from \"../StatefulReaderHeader\";\nimport { StatefulReaderArrowButton } from \"../StatefulReaderArrowButton\";\nimport { StatefulReaderFooter } from \"../StatefulReaderFooter\";\nimport { PositionStorage, StatefulReaderProps } from \"../Reader/StatefulReaderWrapper\";\n\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 { useLineHeight } from \"../Settings/Spacing/hooks/useLineHeight\";\nimport { usePaginatedArrows } from \"@/hooks/usePaginatedArrows\";\nimport { useFonts } from \"@/core/Hooks/fonts/useFonts\";\n\nimport { toggleActionOpen } from \"@/lib/actionsReducer\";\nimport { useAppSelector, useAppDispatch, useAppStore } 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\";\n\nimport classNames from \"classnames\";\nimport debounce from \"debounce\";\nimport { buildThemeObject } from \"@/preferences/helpers/buildThemeObject\";\nimport { createDefaultPlugin } from \"../Plugins/helpers/createDefaultPlugin\";\nimport Peripherals 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 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\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 const fs = useFullscreen(onFsChange);\n\n const epubNavigator = useEpubNavigator();\n const { \n goLeft, \n goRight, \n goBackward, \n goForward, \n navLayout,\n currentLocator,\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 lineHeightOptions = useLineHeight();\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 // We need this as a workaround due to positionChanged being unreliable\n // in FXL – if the frame is in the pool hidden and is shown again,\n // positionChanged won’t fire.\n const handleFXLProgression = useCallback((locator: Locator) => {\n setLocalData(locator);\n updatePublicationNavigationState();\n }, [setLocalData, updatePublicationNavigationState]);\n\n const initReadingEnv = useCallback(async () => {\n if (navLayout() === Layout.fixed) {\n // [TMP] Working around positionChanged not firing consistently for FXL\n // Init'ing so that progression can be populated on first spread loaded\n const cLoc = currentLocator();\n if (cLoc) {\n handleFXLProgression(cLoc);\n };\n }\n }, [navLayout, currentLocator, handleFXLProgression]);\n\n const appStore = useAppStore();\n\n const p = useMemo(() => new Peripherals(appStore, preferences.actions, {\n moveTo: (direction) => {\n const navigationCallback = () => {\n dispatch(setUserNavigated(true));\n activateImmersiveOnAction();\n };\n\n switch(direction) {\n case \"right\":\n if (!cache.current.settings.scroll) {\n goRight(!cache.current.reducedMotion, navigationCallback);\n }\n break;\n case \"left\":\n if (!cache.current.settings.scroll) {\n goLeft(!cache.current.reducedMotion, navigationCallback);\n }\n break;\n case \"up\":\n case \"home\":\n // Home should probably go to first column/page of chapter in reflow?\n break;\n case \"down\":\n case \"end\":\n // End should probably go to last column/page of chapter in reflow?\n break;\n default:\n break;\n }\n },\n goProgression: (shiftKey) => {\n if (!cache.current.settings?.scroll) {\n const callback = () => {\n dispatch(setUserNavigated(true));\n activateImmersiveOnAction();\n };\n shiftKey \n ? goBackward(!cache.current.reducedMotion, callback)\n : goForward(!cache.current.reducedMotion, callback);\n }\n },\n toggleAction: (actionKey) => {\n switch (actionKey) {\n case ThActionsKeys.fullscreen:\n fs.handleFullscreen();\n break;\n case ThActionsKeys.settings:\n case ThActionsKeys.toc:\n dispatch(toggleActionOpen({\n key: actionKey,\n profile: \"epub\"\n }))\n break;\n // case ThActionsKeys.jumpToPosition:\n default:\n break\n }\n }\n }), [appStore, preferences.actions, dispatch, activateImmersiveOnAction, cache, goRight, goLeft, goBackward, goForward, fs]);\n\n const listeners: EpubNavigatorListeners = useMemo(() => ({\n frameLoaded: async function (_wnd: Window): Promise<void> {\n await initReadingEnv();\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 _cframes = getCframes();\n _cframes?.forEach(\n (frameManager: FrameManager | FXLFrameManager | undefined) => {\n if (frameManager) p.observe(frameManager.window);\n }\n );\n p.observe(window);\n },\n positionChanged: async function (locator: Locator): Promise<void> {\n if (navLayout() !== Layout.fixed) {\n const debouncedHandleProgression = debounce(\n async () => {\n setLocalData(locator);\n updatePublicationNavigationState();\n }, 250);\n debouncedHandleProgression();\n }\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: KeyboardEventData): void {},\n }), [p, initReadingEnv, getCframes, navLayout, setLocalData, dispatch, handleTap, handleClick, cache, preferences.affordances.scroll, isScrollStart, isScrollEnd, updatePublicationNavigationState]);\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 lineHeightOptions,\n arrowsOccupySpace,\n arrowsWidth,\n colorScheme,\n isFXL,\n contentProtectionConfig: resolveContentProtectionConfig(preferences.contentProtection, t),\n onNavigatorReady: () => {\n dispatch(setLoading(false));\n },\n onNavigatorLoaded: () => {\n p.observe(window);\n },\n onCleanup: () => {\n p.destroy();\n },\n fxlProgressionCallback: handleFXLProgression\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)};"]}
@@ -1,7 +1,7 @@
1
1
  import { toEntryRef, buildTocTree } from './chunk-TEZB4ULX.mjs';
2
2
  import { useEffect, useState, useLayoutEffect, useCallback, useRef, useMemo } from 'react';
3
3
  import { Layout, Link, Locator } from '@readium/shared';
4
- import { AudioPreferences, AudioNavigator, EpubPreferences, EpubNavigator, WebPubPreferences, ExperimentalWebPubNavigator } from '@readium/navigator';
4
+ import { AudioPreferences, AudioNavigator, EpubPreferences, EpubNavigator, getScriptMode, WebPubPreferences, ExperimentalWebPubNavigator } from '@readium/navigator';
5
5
 
6
6
  var useDocumentTitle = (title) => {
7
7
  useEffect(() => {
@@ -579,6 +579,11 @@ var useEpubNavigator = () => {
579
579
  const getCframes = useCallback(() => {
580
580
  return navigatorInstance2?._cframes;
581
581
  }, []);
582
+ const currentScriptMode = useCallback(() => {
583
+ const metadata = navigatorInstance2?.publication?.metadata;
584
+ if (!metadata) return void 0;
585
+ return getScriptMode(metadata);
586
+ }, []);
582
587
  return {
583
588
  EpubNavigatorLoad,
584
589
  EpubNavigatorDestroy,
@@ -601,12 +606,13 @@ var useEpubNavigator = () => {
601
606
  getSetting,
602
607
  submitPreferences,
603
608
  getCframes,
609
+ getScriptMode: currentScriptMode,
604
610
  onFXLPositionChange: (cb) => {
605
611
  FXLPositionChangedCallbackRef.current = cb;
606
612
  }
607
613
  };
608
614
  };
609
- var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWeight, hyphens, letterSpacing, lineLength, lineHeight, paragraphIndent, paragraphSpacing, publisherStyles, scroll, textNormalization, wordSpacing, theme) => {
615
+ var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWeight, hyphens, letterSpacing, ligatures, lineLength, lineHeight, noRuby, paragraphIndent, paragraphSpacing, publisherStyles, scroll, textNormalization, wordSpacing, theme) => {
610
616
  const cache = useRef({
611
617
  settings: {
612
618
  columnCount,
@@ -615,8 +621,10 @@ var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWe
615
621
  fontWeight,
616
622
  hyphens,
617
623
  letterSpacing,
624
+ ligatures,
618
625
  lineHeight,
619
626
  lineLength,
627
+ noRuby,
620
628
  paragraphIndent,
621
629
  paragraphSpacing,
622
630
  publisherStyles,
@@ -635,8 +643,10 @@ var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWe
635
643
  fontWeight,
636
644
  hyphens,
637
645
  letterSpacing,
646
+ ligatures,
638
647
  lineHeight,
639
648
  lineLength,
649
+ noRuby,
640
650
  paragraphIndent,
641
651
  paragraphSpacing,
642
652
  publisherStyles,
@@ -653,8 +663,10 @@ var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWe
653
663
  fontWeight,
654
664
  hyphens,
655
665
  letterSpacing,
666
+ ligatures,
656
667
  lineHeight,
657
668
  lineLength,
669
+ noRuby,
658
670
  paragraphIndent,
659
671
  paragraphSpacing,
660
672
  publisherStyles,
@@ -766,6 +778,11 @@ var useWebPubNavigator = () => {
766
778
  const getCframes = useCallback(() => {
767
779
  return navigatorInstance3?._cframes;
768
780
  }, []);
781
+ const currentScriptMode = useCallback(() => {
782
+ const metadata = navigatorInstance3?.publication?.metadata;
783
+ if (!metadata) return void 0;
784
+ return getScriptMode(metadata);
785
+ }, []);
769
786
  return {
770
787
  WebPubNavigatorLoad,
771
788
  WebPubNavigatorDestroy,
@@ -786,17 +803,20 @@ var useWebPubNavigator = () => {
786
803
  preferencesEditor: navigatorInstance3?.preferencesEditor,
787
804
  getSetting,
788
805
  submitPreferences,
789
- getCframes
806
+ getCframes,
807
+ getScriptMode: currentScriptMode
790
808
  };
791
809
  };
792
- var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, lineHeight, paragraphIndent, paragraphSpacing, publisherStyles, textAlign, textNormalization, wordSpacing, zoom) => {
810
+ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, ligatures, lineHeight, noRuby, paragraphIndent, paragraphSpacing, publisherStyles, textAlign, textNormalization, wordSpacing, zoom) => {
793
811
  const cache = useRef({
794
812
  settings: {
795
813
  fontFamily,
796
814
  fontWeight,
797
815
  hyphens,
798
816
  letterSpacing,
817
+ ligatures,
799
818
  lineHeight,
819
+ noRuby,
800
820
  paragraphIndent,
801
821
  paragraphSpacing,
802
822
  publisherStyles,
@@ -812,7 +832,9 @@ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, li
812
832
  fontWeight,
813
833
  hyphens,
814
834
  letterSpacing,
835
+ ligatures,
815
836
  lineHeight,
837
+ noRuby,
816
838
  paragraphIndent,
817
839
  paragraphSpacing,
818
840
  publisherStyles,
@@ -826,7 +848,9 @@ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, li
826
848
  fontWeight,
827
849
  hyphens,
828
850
  letterSpacing,
851
+ ligatures,
829
852
  lineHeight,
853
+ noRuby,
830
854
  paragraphIndent,
831
855
  paragraphSpacing,
832
856
  publisherStyles,
@@ -840,5 +864,5 @@ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, li
840
864
  };
841
865
 
842
866
  export { timelineInstance, useAudioNavigator, useAudioSettingsCache, useDocumentTitle, useEpubNavigator, useEpubSettingsCache, useFullscreen, useIsClient, useLocalStorage, useTimeline, useWebPubNavigator, useWebPubSettingsCache };
843
- //# sourceMappingURL=chunk-A3FZBEUL.mjs.map
844
- //# sourceMappingURL=chunk-A3FZBEUL.mjs.map
867
+ //# sourceMappingURL=chunk-SZAVAQ6S.mjs.map
868
+ //# sourceMappingURL=chunk-SZAVAQ6S.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/Hooks/useDocumentTitle.ts","../src/core/Hooks/useIsClient.ts","../src/core/Hooks/useFullscreen.ts","../src/core/Hooks/useLocalStorage.ts","../src/core/Hooks/useTimeline.ts","../src/core/Hooks/Audio/useAudioNavigator.ts","../src/core/Hooks/Audio/useAudioSettingsCache.ts","../src/core/Hooks/Epub/useEpubNavigator.ts","../src/core/Hooks/Epub/useEpubSettingsCache.ts","../src/core/Hooks/WebPub/useWebPubNavigator.ts","../src/core/Hooks/WebPub/useWebPubSettingsCache.ts"],"names":["useState","useEffect","useCallback","useRef","timelineItems","currentItem","useMemo","navigatorInstance","Layout","currentLocator","getScriptMode"],"mappings":"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","file":"chunk-SZAVAQ6S.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\n\nexport const useDocumentTitle = (title?: string) => {\n useEffect(() => {\n if (title) document.title = title;\n }, [title]);\n};","\"use client\";\n\nimport { useLayoutEffect, useState } from \"react\";\n\nexport const useIsClient = () => {\n const [isClient, setIsClient] = useState(false);\n\n useLayoutEffect(() => {\n if (typeof window !== \"undefined\") setIsClient(true);\n }, []);\n\n return isClient;\n}","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useIsClient } from \"./useIsClient\";\n\nexport const useFullscreen = (onChange?: (isFullscreen: boolean) => void) => {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const isClient = useIsClient();\n\n const handleFullscreen = useCallback(() => {\n if (!isClient) return;\n\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen();\n } else if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n }, [isClient]);\n\n useEffect(() => {\n const onFSchange = () => {\n const isFs = Boolean(document.fullscreenElement);\n setIsFullscreen(isFs);\n onChange && onChange(isFs);\n }\n document.addEventListener(\"fullscreenchange\", onFSchange);\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFSchange);\n }\n }, [onChange]);\n\n return {\n isFullscreen,\n handleFullscreen\n }\n}","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const useLocalStorage = (key: string | null) => {\n const [localData, setLocalData] = useState<any>(null);\n const cachedLocalData = useRef<any>(null);\n\n const setValue = useCallback((newValue: any) => {\n if (!key) return;\n setLocalData(newValue);\n localStorage.setItem(key, JSON.stringify(newValue));\n }, [key]);\n\n const getValue = useCallback(() => {\n if (!key) return null;\n if (localData !== null) return localData;\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n }, [key, localData]);\n\n const clearValue = useCallback(() => {\n if (!key) return;\n setLocalData(null);\n localStorage.removeItem(key);\n }, [key]);\n\n useEffect(() => {\n if (!key) return;\n cachedLocalData.current = localData;\n }, [localData, key]);\n\n return {\n setLocalData: setValue,\n getLocalData: getValue,\n clearLocalData: clearValue,\n localData: key ? localData : null,\n cachedLocalData\n };\n};","import { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\n\nimport { Layout, Link, Locator, Publication } from \"@readium/shared\";\nimport { TocItem, TocEntryRef, buildTocTree, toEntryRef } from \"@/helpers/buildTocTree\";\n\nexport type { TocItem, TocEntryRef } from \"@/helpers/buildTocTree\";\n\nexport interface TimelineItem {\n href: string;\n readingOrderIndex?: number;\n title?: string;\n fragments?: string[];\n positionRange?: [number, number?];\n progressionRange?: [number, number?];\n totalProgressionRange?: [number, number?];\n children?: TimelineItem[];\n}\n\nexport interface TimelineProgression {\n totalItems?: number;\n currentIndex?: number;\n totalPositions?: number;\n currentPositions?: number[];\n relativeProgression?: number;\n totalProgression?: number;\n currentChapter?: string;\n positionsLeft?: number;\n}\n\nexport interface UnstableTimeline {\n title?: string;\n items?: {\n [href: string]: TimelineItem;\n };\n toc?: {\n tree?: TocItem[];\n currentEntry?: TocEntryRef | null;\n };\n currentItem?: TimelineItem | null;\n previousItem?: TimelineItem | null;\n nextItem?: TimelineItem | null;\n progression?: TimelineProgression;\n}\n\nexport let timelineInstance: UnstableTimeline | undefined;\n\nexport const useTimeline = ({\n publication, \n currentLocation, \n currentPositions,\n positionsList,\n onChange\n}: {\n publication: Publication | null, \n currentLocation?: Locator, \n currentPositions?: number[],\n positionsList?: Locator[],\n onChange?: (timeline: UnstableTimeline) => void\n}): UnstableTimeline => {\n const layout = publication?.metadata.effectiveLayout || Layout.reflowable;\n\n const [timelineItems, setTimelineItems] = useState<{ [href: string]: TimelineItem }>({});\n const [tocTree, setTocTree] = useState<TocItem[]>([]);\n const [currentTocEntry, setCurrentTocEntry] = useState<TocEntryRef | null>(null);\n const [currentItem, setCurrentItem] = useState<TimelineItem | null>(null);\n const [previousItem, setPreviousItem] = useState<TimelineItem | null>(null);\n const [nextItem, setNextItem] = useState<TimelineItem | null>(null);\n\n const [relativeProgression, setRelativeProgression] = useState<number | undefined>(undefined);\n const [totalProgression, setTotalProgression] = useState<number | undefined>(undefined);\n\n const idCounterRef = useRef(0);\n\n // Create the timeline object\n const timeline = useMemo(() => ({\n title: publication?.metadata.title.getTranslation(\"en\"),\n items: timelineItems,\n toc: {\n tree: tocTree,\n currentEntry: currentTocEntry\n },\n currentItem,\n previousItem,\n nextItem,\n progression: {\n totalItems: publication?.readingOrder.items.length,\n currentIndex: currentItem?.readingOrderIndex !== undefined ? currentItem.readingOrderIndex + 1 : undefined,\n totalPositions: positionsList?.length,\n currentPositions: currentPositions || [],\n relativeProgression: relativeProgression,\n totalProgression: totalProgression,\n currentChapter: currentItem?.title,\n positionsLeft: (() => {\n const endPosition = currentItem?.positionRange?.[1];\n const currentPosition = currentPositions?.[0];\n \n // Only calculate positionsLeft if we have all required position data\n if (!positionsList?.length || endPosition === undefined || currentPosition === undefined) {\n return undefined;\n }\n \n return Math.max(0, endPosition - currentPosition);\n })()\n }\n }), [\n publication?.metadata.title,\n publication?.readingOrder.items,\n timelineItems,\n tocTree,\n currentTocEntry,\n currentItem,\n previousItem,\n nextItem,\n positionsList,\n currentPositions,\n relativeProgression,\n totalProgression\n ]);\n\n\n const handleTocEntryOnNav = useCallback((locator?: Locator, currentPos?: number[]) => {\n if (!locator || !tocTree.length) return;\n\n const findMatch = (items: TocItem[], link?: Link): TocItem | undefined => {\n for (const item of items) {\n if (item.href === link?.href) {\n return item;\n }\n if (item.children) {\n const match = findMatch(item.children, link);\n if (match) return match;\n }\n }\n return undefined;\n };\n\n const currentMatch = findMatch(tocTree, new Link(locator));\n if (currentMatch) {\n setCurrentTocEntry(prev => prev?.id === currentMatch.id ? prev : toEntryRef(currentMatch));\n return;\n }\n\n // If we're in FXL and didn't find a match, try to find a match for the other position in the spread\n if (layout === Layout.fixed) {\n if (currentPos && currentPos.length === 2) {\n const otherPosition = currentPos[0] === locator.locations.position ? currentPos[1] : currentPos[0];\n const otherPositionInList = positionsList?.find((pos: Locator) => pos.locations.position === otherPosition);\n if (otherPositionInList) {\n const match = findMatch(tocTree, new Link(otherPositionInList));\n if (match) {\n setCurrentTocEntry(prev => prev?.id === match.id ? prev : toEntryRef(match));\n return;\n }\n }\n }\n }\n\n // If no match, try to find a match for other positions\n const otherPositions = currentPos?.filter(pos => pos !== locator.locations.position) || [];\n for (const otherPosition of otherPositions) {\n const otherPositionInList = positionsList?.find((pos: Locator) => pos.locations.position === otherPosition);\n if (otherPositionInList) {\n const match = findMatch(tocTree, new Link(otherPositionInList));\n if (match) {\n setCurrentTocEntry(prev => prev?.id === match.id ? prev : toEntryRef(match));\n return;\n }\n }\n }\n }, [tocTree, layout, positionsList]);\n\n const buildTimelineItems = useCallback(() => {\n const timelineItems: { [href: string]: TimelineItem } = {};\n const readingOrder = publication?.readingOrder?.items || [];\n const toc = publication?.toc?.items && publication?.toc?.items.length > 0\n ? publication.toc.items\n : publication?.readingOrder?.items || [];\n const flatToc = toc.flatMap(t => [t, ...(t.children?.items || [])]);\n \n // Helper function to get URL base (without params and fragment)\n const getBaseUrl = (url: string): string => {\n const [base] = url.split(\"#\");\n const [path] = base.split(\"?\");\n return path;\n };\n\n // Function to find the first non-empty title by searching backward \n // in flatToc from the current item\"s position\n // The issue with this fallback is that for progressionOfResource\n // the progression is effectively scoped to the reading order item\n // so we have to differentiate using the index \n const findNearestTitle = (currentHref: string): string => {\n const currentIndex = readingOrder.findIndex(item => getBaseUrl(item.href) === getBaseUrl(currentHref));\n \n if (currentIndex === -1) return \"\";\n \n for (let i = currentIndex; i >= 0; i--) {\n const item = readingOrder[i];\n // Find matching TOC items for this reading order item\n const matchingTocItems = flatToc.filter(t => \n getBaseUrl(t.href) === getBaseUrl(item.href)\n );\n \n // If we have a matching TOC item with a title, return it with the difference in indices\n const title = matchingTocItems[0]?.title?.trim();\n if (title) {\n const diff = currentIndex - i;\n return diff > 0 ? `${ title } (${ diff + 1 })` : title;\n }\n }\n \n return \"\";\n };\n\n // Process reading order items\n readingOrder.forEach((item, index) => {\n // Find all matching TOC items (with or without fragment)\n const matchingTocItems = flatToc.filter(t => {\n const baseHref = getBaseUrl(t.href);\n const baseItemHref = getBaseUrl(item.href);\n return baseHref === baseItemHref;\n });\n\n // Create timeline item with all matching titles\n const timelineItem: TimelineItem = {\n href: item.href,\n readingOrderIndex: index,\n title: item.title || matchingTocItems[0]?.title || findNearestTitle(item.href),\n fragments: matchingTocItems\n .map(t => t.href.split(\"#\")[1])\n .filter(Boolean),\n children: matchingTocItems[0]?.children?.items?.map(child => ({\n // We do not care about index for children\n // since currentLocation is guaranteed to be in the reading order\n title: child.title,\n href: child.href\n })) || []\n };\n\n timelineItems[item.href] = timelineItem;\n });\n \n // Then add position and progression information from positionsList\n for (const item of readingOrder) {\n const timelineItem = timelineItems[item.href];\n if (!timelineItem) continue;\n\n const positions = positionsList\n ? positionsList\n .filter(p => p.href === item.href)\n .sort((a, b) => (a.locations.position || 0) - (b.locations.position || 0))\n : [];\n \n if (positions.length > 0) {\n const start = positions[0].locations;\n // For single position, use the same location for start and end\n const end = positions.length > 1 \n ? positions[positions.length - 1].locations \n : start; // Use start as end for single position\n \n timelineItem.positionRange = start.position !== undefined \n ? [start.position, end.position]\n : undefined;\n \n timelineItem.progressionRange = start.progression !== undefined \n ? [start.progression, end.progression]\n : undefined;\n \n timelineItem.totalProgressionRange = start.totalProgression !== undefined \n ? [start.totalProgression, end.totalProgression]\n : undefined;\n }\n }\n\n return timelineItems;\n }, [publication, positionsList]);\n\n const updateTimelineItems = useCallback((currentLoc?: Locator) => {\n if (!currentLoc || !timelineItems) {\n setPreviousItem(null);\n setNextItem(null);\n setCurrentItem(null);\n return;\n }\n\n const currentItem = timelineItems[currentLoc.href];\n if (!currentItem) {\n setPreviousItem(null);\n setNextItem(null);\n setCurrentItem(null);\n return;\n }\n\n setCurrentItem(currentItem);\n\n const timelineItemsArray = Object.values(timelineItems);\n const currentIndex = timelineItemsArray.findIndex(item => item.href === currentLoc.href);\n\n if (currentIndex === -1) {\n setPreviousItem(null);\n setNextItem(null);\n } else {\n setPreviousItem(currentIndex > 0 ? timelineItemsArray[currentIndex - 1] : null);\n setNextItem(currentIndex < timelineItemsArray.length - 1 ? timelineItemsArray[currentIndex + 1] : null);\n }\n }, [timelineItems]);\n\n useEffect(() => {\n if (!publication) return;\n\n const idGenerator = () => `toc-${ ++idCounterRef.current }`;\n const tocItems = publication.toc?.items && publication.toc.items.length > 0\n ? publication.toc.items\n : publication.readingOrder?.items || [];\n const publicationTitle = publication?.metadata.title.getTranslation(\"en\");\n setTocTree(buildTocTree(tocItems, idGenerator, positionsList, publicationTitle));\n setTimelineItems(buildTimelineItems());\n }, [publication, positionsList, buildTimelineItems]);\n\n useEffect(() => {\n if (!tocTree.length || !timelineItems) return;\n\n // If we have a current location, use it\n if (currentLocation) {\n handleTocEntryOnNav(currentLocation, currentPositions);\n }\n // Otherwise, use the first TOC entry\n else if (tocTree.length > 0) {\n handleTocEntryOnNav(new Locator({ href: tocTree[0].href, type: \"\" }), currentPositions);\n }\n\n updateTimelineItems(currentLocation);\n\n // Update progression state when location changes\n setRelativeProgression(currentLocation?.locations.progression);\n setTotalProgression(currentLocation?.locations.totalProgression);\n }, [currentLocation, currentPositions, tocTree, timelineItems, handleTocEntryOnNav, updateTimelineItems]);\n\n // Update the singleton and call onChange\n useEffect(() => {\n timelineInstance = timeline;\n if (onChange) {\n onChange(timeline);\n }\n }, [timeline, onChange]);\n\n return timeline;\n};","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication,\n Timeline\n} from \"@readium/shared\";\nimport {\n AudioNavigator,\n AudioNavigatorListeners,\n AudioPreferences,\n IAudioPreferences,\n IAudioDefaults,\n IContentProtectionConfig\n} from \"@readium/navigator\";\nimport { AudioSettings } from \"./useAudioSettingsCache\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: AudioNavigator | null = null;\n\nexport interface AudioNavigatorLoadProps {\n publication: Publication;\n listeners: AudioNavigatorListeners;\n initialPosition?: Locator;\n preferences?: IAudioPreferences;\n defaults?: IAudioDefaults;\n contentProtection?: IContentProtectionConfig;\n audioContext?: AudioContext;\n}\n\nexport const useAudioNavigator = () => {\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IAudioPreferences) => {\n await navigatorInstance?.submitPreferences(new AudioPreferences(preferences));\n }, []);\n\n const getSetting = useCallback(<K extends keyof AudioSettings>(settingKey: K) => {\n return navigatorInstance?.settings?.[settingKey as keyof typeof navigatorInstance.settings];\n }, []);\n\n const AudioNavigatorLoad = useCallback((config: AudioNavigatorLoadProps, cb: Function) => {\n publication.current = config.publication;\n\n navigatorInstance = new AudioNavigator(\n config.publication,\n config.listeners,\n config.initialPosition,\n {\n preferences: config.preferences || {},\n defaults: config.defaults || {},\n contentProtection: config.contentProtection,\n }\n );\n\n cb();\n }, []);\n\n const AudioNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n navigatorInstance?.destroy();\n navigatorInstance = null;\n }, []);\n\n const play = useCallback(() => {\n navigatorInstance?.play();\n }, []);\n\n const pause = useCallback(() => {\n navigatorInstance?.pause();\n }, []);\n\n const stop = useCallback(() => {\n navigatorInstance?.stop();\n }, []);\n\n const seek = useCallback((time: number) => {\n navigatorInstance?.seek(time);\n }, []);\n\n const jump = useCallback((seconds: number) => {\n navigatorInstance?.jump(seconds);\n }, []);\n\n const skipForward = useCallback(() => {\n navigatorInstance?.skipForward();\n }, []);\n\n const skipBackward = useCallback(() => {\n navigatorInstance?.skipBackward();\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward || false;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward || false;\n }, []);\n\n const isTrackStart = useCallback(() => {\n return navigatorInstance?.isTrackStart || false;\n }, []);\n\n const isTrackEnd = useCallback(() => {\n return navigatorInstance?.isTrackEnd || false;\n }, []);\n\n const isPlaying = useCallback(() => {\n return navigatorInstance?.isPlaying || false;\n }, []);\n\n const isPaused = useCallback(() => {\n return navigatorInstance?.isPaused || false;\n }, []);\n\n const duration = useCallback(() => {\n return navigatorInstance?.duration || 0;\n }, []);\n\n const currentTime = useCallback(() => {\n return navigatorInstance?.currentTime || 0;\n }, []);\n\n return {\n AudioNavigatorLoad, \n AudioNavigatorDestroy, \n play,\n pause,\n stop,\n seek,\n jump,\n skipForward,\n skipBackward,\n go, \n goLink, \n goForward,\n goBackward,\n currentLocator,\n canGoBackward,\n canGoForward,\n isTrackStart,\n isTrackEnd,\n isPlaying,\n isPaused,\n duration,\n currentTime,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n remotePlayback: (navigatorInstance as any)?.remotePlayback as RemotePlayback | undefined,\n getSetting,\n submitPreferences,\n timeline: useCallback((): Timeline | undefined => navigatorInstance?.timeline, []),\n }\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\n\nexport interface AudioSettings {\n volume: number;\n playbackRate: number;\n preservePitch: boolean;\n skipBackwardInterval: number;\n skipForwardInterval: number;\n skipInterval: number;\n pollInterval: number;\n autoPlay: boolean;\n enableMediaSession: boolean;\n}\n\nexport interface AudioSettingsCache {\n settings: AudioSettings;\n}\n\nexport const useAudioSettingsCache = (\n volume: number,\n playbackRate: number,\n preservePitch: boolean,\n skipBackwardInterval: number,\n skipForwardInterval: number,\n skipInterval: number,\n pollInterval: number,\n autoPlay: boolean,\n enableMediaSession: boolean\n) => {\n const cache = useRef<AudioSettingsCache>({\n settings: {\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n },\n }), [\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n ]);\n\n cache.current = memoizedCache;\n\n return cache;\n};\n","\"use client\";\n\nimport { useCallback, useMemo, useRef } from \"react\";\n\nimport { \n Layout, \n Link, \n Locator, \n Publication \n} from \"@readium/shared\";\nimport {\n EpubNavigator,\n EpubNavigatorListeners,\n EpubPreferences,\n EpubSettings,\n IContentProtectionConfig,\n IEpubDefaults,\n IEpubPreferences,\n IInjectablesConfig,\n getScriptMode,\n ScriptMode\n} from \"@readium/navigator\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: EpubNavigator | null = null;\n\nexport interface EpubNavigatorLoadProps {\n container: HTMLDivElement | null;\n publication: Publication;\n listeners: EpubNavigatorListeners;\n positionsList?: Locator[];\n initialPosition?: Locator;\n preferences?: IEpubPreferences;\n defaults?: IEpubDefaults;\n injectables?: IInjectablesConfig;\n contentProtection?: IContentProtectionConfig;\n}\n\nexport const useEpubNavigator = () => {\n const container = useRef<HTMLDivElement | null>(null);\n const containerParent = useRef<HTMLElement | null>(null);\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IEpubPreferences) => {\n await navigatorInstance?.submitPreferences(new EpubPreferences(preferences));\n }, []);\n\n const getSetting = useCallback(<K extends keyof EpubSettings>(settingKey: K) => {\n return navigatorInstance?.settings[settingKey] as EpubSettings[K];\n }, []);\n\n // [TMP] Working around positionChanged not firing consistently for FXL\n // We’re observing the FXLFramePoolManager spine div element’s style\n // and checking whether its translate3d has changed.\n // Sure IntersectionObserver should be the obvious one to use here,\n // observing iframes instead of the style attribute on the spine element\n // but there’s additional complexity to handle as a spread = 2 iframes\n // And keeping in sync while the FramePool is re-aligning on resize can be suboptimal\n const FXLPositionChangedCallbackRef = useRef<((locator: Locator) => void) | undefined>(undefined);\n const FXLPositionChanged = useMemo(() => { \n return new MutationObserver((mutationsList: MutationRecord[]) => {\n for (const mutation of mutationsList) {\n const re = /translate3d\\(([^)]+)\\)/;\n const newVal = (mutation.target as HTMLElement).getAttribute(mutation.attributeName as string);\n const oldVal = mutation.oldValue;\n if (newVal?.split(re)[1] !== oldVal?.split(re)[1]) {\n const locator = navigatorInstance?.currentLocator;\n if (locator && FXLPositionChangedCallbackRef.current) {\n FXLPositionChangedCallbackRef.current(locator);\n }\n }\n }\n });\n }, []);\n\n const EpubNavigatorLoad = useCallback((config: EpubNavigatorLoadProps, cb: Function, fxlCallback?: (locator: Locator) => void) => {\n if (config.container) {\n container.current = config.container;\n containerParent.current = container.current? container.current.parentElement : null;\n \n publication.current = config.publication;\n\n // Register FXL callback immediately if provided\n if (fxlCallback) {\n FXLPositionChangedCallbackRef.current = fxlCallback;\n }\n\n navigatorInstance = new EpubNavigator(\n config.container, \n config.publication, \n config.listeners, \n config.positionsList, \n config.initialPosition, \n { \n preferences: config.preferences || {}, \n defaults: config.defaults || {}, \n injectables: config.injectables || undefined,\n contentProtection: config.contentProtection || undefined\n }\n );\n\n navigatorInstance.load().then(() => {\n cb();\n\n if (navigatorInstance?.layout === Layout.fixed) {\n // @ts-ignore\n FXLPositionChanged.observe((navigatorInstance?.pool.spineElement as HTMLElement), {\n attributeFilter: [\"style\"], \n attributeOldValue: true\n });\n }\n });\n }\n }, [FXLPositionChanged]);\n\n const EpubNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n\n if (navigatorInstance?.layout === Layout.fixed) {\n FXLPositionChanged.disconnect();\n }\n navigatorInstance?.destroy().then(() => {\n navigatorInstance = null; // Clear the singleton reference\n });\n }, [FXLPositionChanged]);\n\n const goRight = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goRight(animated, callback);\n }, []);\n\n const goLeft = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goLeft(animated, callback)\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const navLayout = useCallback(() => {\n return navigatorInstance?.layout;\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const getLocatorAtOffset = useCallback((offset: number) => {\n const readingOrder = navigatorInstance?.publication?.readingOrder;\n if (!readingOrder) return null;\n\n const currentLocator = navigatorInstance?.currentLocator;\n if (!currentLocator) return null;\n\n const currentLocatorIndex = readingOrder.findIndexWithHref(currentLocator.href);\n if (currentLocatorIndex === -1) return null;\n \n const newIndex = currentLocatorIndex + offset;\n if (newIndex < 0 || newIndex >= readingOrder.items.length) return null;\n \n return readingOrder.items[newIndex];\n }, []);\n\n const previousLocator = useCallback(() => {\n const link = getLocatorAtOffset(-1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const nextLocator = useCallback(() => {\n const link = getLocatorAtOffset(1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const currentPositions = useCallback(() => {\n return navigatorInstance?.viewport?.positions;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward;\n }, []);\n\n const isScrollStart = useCallback(() => {\n return navigatorInstance?.isScrollStart;\n }, []);\n\n const isScrollEnd = useCallback(() => {\n return navigatorInstance?.isScrollEnd;\n }, []);\n\n // Warning: this is an internal member that will become private, do not rely on it\n // See https://github.com/edrlab/thorium-web/issues/25\n const getCframes = useCallback(() => {\n return navigatorInstance?._cframes;\n }, []);\n\n const currentScriptMode = useCallback((): ScriptMode | undefined => {\n const metadata = navigatorInstance?.publication?.metadata;\n if (!metadata) return undefined;\n return getScriptMode(metadata);\n }, []);\n\n return { \n EpubNavigatorLoad, \n EpubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n navLayout, \n currentLocator,\n previousLocator,\n nextLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode,\n onFXLPositionChange: (cb: (locator: Locator) => void) => {\n FXLPositionChangedCallbackRef.current = cb;\n }\n }\n}","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { LineLengthStateObject, FontFamilyStateObject } from \"@/lib/settingsReducer\";\n\nexport interface ReadiumCSSSettings {\n columnCount: string;\n fontFamily: FontFamilyStateObject;\n fontSize: number;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineLength: LineLengthStateObject | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n scroll: boolean;\n textAlign: ThTextAlignOptions | null;\n textNormalization: boolean;\n theme?: string;\n wordSpacing: number | null;\n}\n\nexport interface EPubSettingsCache {\n settings: ReadiumCSSSettings;\n}\n\nexport const useEpubSettingsCache = (\n textAlign: ThTextAlignOptions | null,\n columnCount: string,\n fontFamily: FontFamilyStateObject,\n fontSize: number,\n fontWeight: number,\n hyphens: boolean | null,\n letterSpacing: number | null,\n ligatures: boolean | null,\n lineLength: LineLengthStateObject | null,\n lineHeight: ThLineHeightOptions | null,\n noRuby: boolean | null,\n paragraphIndent: number | null,\n paragraphSpacing: number | null,\n publisherStyles: boolean,\n scroll: boolean,\n textNormalization: boolean,\n wordSpacing: number | null,\n theme: string | undefined\n) => {\n const cache = useRef<EPubSettingsCache>({\n settings: {\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll: scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll: scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n },\n }), [\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\n\n return cache;\n};\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication\n} from \"@readium/shared\";\nimport {\n ExperimentalWebPubNavigator,\n WebPubNavigatorListeners,\n WebPubPreferences,\n WebPubSettings,\n IWebPubDefaults,\n IWebPubPreferences,\n IInjectablesConfig,\n IContentProtectionConfig,\n getScriptMode,\n ScriptMode\n} from \"@readium/navigator\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: InstanceType<typeof ExperimentalWebPubNavigator> | null = null;\n\nexport interface WebPubNavigatorLoadProps {\n container: HTMLDivElement | null;\n publication: Publication;\n listeners: WebPubNavigatorListeners;\n initialPosition?: Locator;\n preferences?: IWebPubPreferences;\n defaults?: IWebPubDefaults;\n injectables?: IInjectablesConfig;\n contentProtection?: IContentProtectionConfig;\n}\n\nexport const useWebPubNavigator = () => {\n const container = useRef<HTMLDivElement | null>(null);\n const containerParent = useRef<HTMLElement | null>(null);\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IWebPubPreferences) => {\n await navigatorInstance?.submitPreferences(new WebPubPreferences(preferences));\n }, []);\n \n const getSetting = useCallback(<K extends keyof WebPubSettings>(settingKey: K) => {\n return navigatorInstance?.settings[settingKey] as WebPubSettings[K];\n }, []);\n\n const WebPubNavigatorLoad = useCallback((config: WebPubNavigatorLoadProps, cb: Function) => {\n if (config.container) {\n container.current = config.container;\n containerParent.current = container.current?.parentElement || null;\n\n publication.current = config.publication;\n\n navigatorInstance = new ExperimentalWebPubNavigator(\n config.container, \n config.publication, \n config.listeners, \n config.initialPosition, \n { \n preferences: config.preferences || {}, \n defaults: config.defaults || {}, \n injectables: config.injectables || undefined,\n contentProtection: config.contentProtection || undefined\n }\n );\n\n navigatorInstance.load().then(() => {\n cb();\n });\n }\n }, []);\n\n const WebPubNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n navigatorInstance?.destroy().then(() => {\n navigatorInstance = null; // Clear the singleton reference\n });\n }, []);\n\n const goRight = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goRight(animated, callback);\n }, []);\n\n const goLeft = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goLeft(animated, callback);\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const getLocatorAtOffset = useCallback((offset: number) => {\n const readingOrder = navigatorInstance?.publication?.readingOrder;\n if (!readingOrder) return null;\n\n const currentLocator = navigatorInstance?.currentLocator;\n if (!currentLocator) return null;\n\n const currentLocatorIndex = readingOrder.findIndexWithHref(currentLocator.href);\n if (currentLocatorIndex === -1) return null;\n\n const newIndex = currentLocatorIndex + offset;\n if (newIndex < 0 || newIndex >= readingOrder.items.length) return null;\n\n return readingOrder.items[newIndex];\n }, []);\n\n const previousLocator = useCallback(() => {\n const link = getLocatorAtOffset(-1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const nextLocator = useCallback(() => {\n const link = getLocatorAtOffset(1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const currentPositions = useCallback(() => {\n return navigatorInstance?.viewport?.positions;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward;\n }, []);\n\n const isScrollStart = useCallback(() => {\n return navigatorInstance?.isScrollStart;\n }, []);\n\n const isScrollEnd = useCallback(() => {\n return navigatorInstance?.isScrollEnd;\n }, []);\n\n const getCframes = useCallback(() => {\n return navigatorInstance?._cframes;\n }, []);\n\n const currentScriptMode = useCallback((): ScriptMode | undefined => {\n const metadata = navigatorInstance?.publication?.metadata;\n if (!metadata) return undefined;\n return getScriptMode(metadata);\n }, []);\n\n return {\n WebPubNavigatorLoad, \n WebPubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n currentLocator,\n previousLocator,\n nextLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode\n }\n}","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { FontFamilyStateObject } from \"@/lib/settingsReducer\";\n\nexport interface WebPubCSSSettings {\n fontFamily: FontFamilyStateObject;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n textAlign: ThTextAlignOptions | null;\n textNormalization: boolean;\n wordSpacing: number | null;\n zoom: number;\n}\n\nexport interface WebPubStatelessCache {\n settings: WebPubCSSSettings;\n}\n\nexport const useWebPubSettingsCache = (\n fontFamily: FontFamilyStateObject,\n fontWeight: number,\n hyphens: boolean | null,\n letterSpacing: number | null,\n ligatures: boolean | null,\n lineHeight: ThLineHeightOptions | null,\n noRuby: boolean | null,\n paragraphIndent: number | null,\n paragraphSpacing: number | null,\n publisherStyles: boolean,\n textAlign: ThTextAlignOptions | null,\n textNormalization: boolean,\n wordSpacing: number | null,\n zoom: number\n) => {\n const cache = useRef<WebPubStatelessCache>({\n settings: {\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n },\n }), [\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\n\n return cache;\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { ThBreakpoints } from './chunk-L4XGZAZ5.mjs';
1
+ import { ThBreakpoints } from './chunk-2YRT7RNW.mjs';
2
2
 
3
3
  // src/core/Helpers/breakpointsMap.ts
4
4
  var makeBreakpointsMap = ({
@@ -136,5 +136,5 @@ var getBestMatchingProgressionFormat = (preferredFormats, timeline) => {
136
136
  };
137
137
 
138
138
  export { canRenderProgressionFormat, getBestMatchingProgressionFormat, getSupportedProgressionFormats, isActiveElement, isInteractiveElement, isKeyboardTriggered, makeBreakpointsMap };
139
- //# sourceMappingURL=chunk-ITDBOMY5.mjs.map
140
- //# sourceMappingURL=chunk-ITDBOMY5.mjs.map
139
+ //# sourceMappingURL=chunk-VENFFPK2.mjs.map
140
+ //# sourceMappingURL=chunk-VENFFPK2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/Helpers/breakpointsMap.ts","../src/core/Helpers/focusUtilities.ts","../src/core/Helpers/progressionFormat.ts"],"names":[],"mappings":"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","file":"chunk-ITDBOMY5.mjs","sourcesContent":["\"use client\";\n\nimport { ThBreakpoints } from \"@/preferences/models\";\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\n\nexport const makeBreakpointsMap = <T>({\n defaultValue,\n fromEnum,\n pref,\n disabledValue,\n validateKey\n}: {\n defaultValue: T;\n fromEnum: any;\n pref?: BreakpointsMap<T> | boolean;\n disabledValue?: T;\n validateKey?: string;\n}): Required<BreakpointsMap<T>> => {\n \n const isValidType = (value: any): boolean => {\n if (!validateKey) return true;\n \n // Helper to get nested property\n const getNestedValue = (obj: any, path: string) => \n path.split(\".\").reduce((o, p) => o?.[p], obj);\n \n const valueToCheck = getNestedValue(value, validateKey);\n if (valueToCheck === undefined) return false;\n \n if (Array.isArray(valueToCheck)) {\n return valueToCheck.every(v => Object.values(fromEnum).includes(v));\n }\n return Object.values(fromEnum).includes(valueToCheck);\n };\n\n const breakpointsMap: Required<BreakpointsMap<T>> = {\n [ThBreakpoints.compact]: defaultValue,\n [ThBreakpoints.medium]: defaultValue,\n [ThBreakpoints.expanded]: defaultValue,\n [ThBreakpoints.large]: defaultValue,\n [ThBreakpoints.xLarge]: defaultValue\n };\n\n if (typeof pref === \"boolean\" || pref instanceof Boolean) {\n if (!pref && disabledValue) {\n Object.values(ThBreakpoints).forEach((key) => {\n breakpointsMap[key] = disabledValue;\n });\n }\n } else if (typeof pref === \"string\" && (!validateKey || isValidType(pref))) {\n Object.values(ThBreakpoints).forEach((key) => {\n breakpointsMap[key] = pref as unknown as T;\n });\n } else if (typeof pref === \"object\") {\n Object.entries(pref).forEach(([key, value]) => {\n if (!value) return;\n \n const isValid = !validateKey || isValidType(value);\n \n if (isValid) {\n // Merge the default value with the breakpoint-specific overrides\n if (typeof value === \"object\" && !Array.isArray(value)) {\n breakpointsMap[key as ThBreakpoints] = {\n ...defaultValue,\n ...value\n };\n } else {\n breakpointsMap[key as ThBreakpoints] = value as T;\n }\n }\n });\n }\n\n return breakpointsMap;\n};","\"use client\";\n\nexport const isActiveElement = (el: Element | undefined | null) => {\n if (el) return document.activeElement === el;\n return false;\n}\n\nexport const isKeyboardTriggered = (el: Element | undefined | null) => {\n if (el) return el.matches(\":focus-visible\");\n return false;\n}\n\nexport const isInteractiveElement = (element: Element | null) => {\n const iElements = [\"A\", \"AREA\", \"BUTTON\", \"DETAILS\", \"INPUT\", \"SELECT\", \"TEXTAREA\"];\n const iRoles = [\"dialog\", \"radiogroup\", \"radio\", \"menu\", \"menuitem\"]\n\n if (element && (element instanceof HTMLElement || element instanceof SVGElement)) {\n if (element.closest(\"[inert]\")) return false;\n if (element.hasAttribute(\"disabled\")) return false;\n if (element.role && iRoles.includes(element.role)) return true;\n\n // Panel Resize Handler cos’ of typo on tabIndex/tabindex\n if (element.hasAttribute(\"tabindex\")) {\n const attr = element.getAttribute(\"tabindex\");\n return attr && parseInt(attr, 10) >= 0;\n }\n\n if (element.tabIndex) return element.tabIndex >= 0;\n if (iElements.includes(element.tagName)) return true;\n }\n\n return false;\n}","import { ThProgressionFormat } from \"@/preferences/models\";\nimport { TimelineProgression } from \"@/core/Hooks/useTimeline\";\n\nexport const getSupportedProgressionFormats = (timeline?: TimelineProgression): ThProgressionFormat[] => {\n if (!timeline) {\n return [ThProgressionFormat.none];\n }\n\n const {\n currentPositions = [],\n totalPositions,\n relativeProgression,\n totalProgression,\n currentIndex,\n totalItems,\n positionsLeft\n } = timeline;\n\n const supported: ThProgressionFormat[] = [ThProgressionFormat.none];\n\n if (currentPositions.length > 0) {\n supported.push(ThProgressionFormat.positions);\n }\n \n if (currentPositions.length > 0 && totalPositions) {\n supported.push(\n ThProgressionFormat.positionsOfTotal,\n ThProgressionFormat.positionsPercentOfTotal\n );\n }\n \n if (positionsLeft !== undefined) {\n supported.push(ThProgressionFormat.positionsLeft);\n }\n \n if (relativeProgression !== undefined) {\n supported.push(\n ThProgressionFormat.resourceProgression,\n ThProgressionFormat.progressionOfResource\n );\n }\n \n if (totalProgression !== undefined) {\n supported.push(ThProgressionFormat.overallProgression);\n }\n \n if (currentIndex !== undefined && totalItems !== undefined) {\n supported.push(ThProgressionFormat.readingOrderIndex);\n }\n\n return supported;\n};\n\nexport const canRenderProgressionFormat = (\n format: ThProgressionFormat,\n supportedFormats: ThProgressionFormat[]\n): boolean => {\n return supportedFormats.includes(format);\n};\n\nexport const getBestMatchingProgressionFormat = (\n preferredFormats: ThProgressionFormat[],\n timeline?: TimelineProgression\n): ThProgressionFormat | null => {\n if (!timeline) {\n return null;\n }\n\n const supportedFormats = getSupportedProgressionFormats(timeline);\n \n // Find the first preferred format that's supported\n const firstSupported = preferredFormats.find(format => \n canRenderProgressionFormat(format, supportedFormats)\n );\n \n return firstSupported || null;\n};\n"]}
1
+ {"version":3,"sources":["../src/core/Helpers/breakpointsMap.ts","../src/core/Helpers/focusUtilities.ts","../src/core/Helpers/progressionFormat.ts"],"names":[],"mappings":"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","file":"chunk-VENFFPK2.mjs","sourcesContent":["\"use client\";\n\nimport { ThBreakpoints } from \"@/preferences/models\";\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\n\nexport const makeBreakpointsMap = <T>({\n defaultValue,\n fromEnum,\n pref,\n disabledValue,\n validateKey\n}: {\n defaultValue: T;\n fromEnum: any;\n pref?: BreakpointsMap<T> | boolean;\n disabledValue?: T;\n validateKey?: string;\n}): Required<BreakpointsMap<T>> => {\n \n const isValidType = (value: any): boolean => {\n if (!validateKey) return true;\n \n // Helper to get nested property\n const getNestedValue = (obj: any, path: string) => \n path.split(\".\").reduce((o, p) => o?.[p], obj);\n \n const valueToCheck = getNestedValue(value, validateKey);\n if (valueToCheck === undefined) return false;\n \n if (Array.isArray(valueToCheck)) {\n return valueToCheck.every(v => Object.values(fromEnum).includes(v));\n }\n return Object.values(fromEnum).includes(valueToCheck);\n };\n\n const breakpointsMap: Required<BreakpointsMap<T>> = {\n [ThBreakpoints.compact]: defaultValue,\n [ThBreakpoints.medium]: defaultValue,\n [ThBreakpoints.expanded]: defaultValue,\n [ThBreakpoints.large]: defaultValue,\n [ThBreakpoints.xLarge]: defaultValue\n };\n\n if (typeof pref === \"boolean\" || pref instanceof Boolean) {\n if (!pref && disabledValue) {\n Object.values(ThBreakpoints).forEach((key) => {\n breakpointsMap[key] = disabledValue;\n });\n }\n } else if (typeof pref === \"string\" && (!validateKey || isValidType(pref))) {\n Object.values(ThBreakpoints).forEach((key) => {\n breakpointsMap[key] = pref as unknown as T;\n });\n } else if (typeof pref === \"object\") {\n Object.entries(pref).forEach(([key, value]) => {\n if (!value) return;\n \n const isValid = !validateKey || isValidType(value);\n \n if (isValid) {\n // Merge the default value with the breakpoint-specific overrides\n if (typeof value === \"object\" && !Array.isArray(value)) {\n breakpointsMap[key as ThBreakpoints] = {\n ...defaultValue,\n ...value\n };\n } else {\n breakpointsMap[key as ThBreakpoints] = value as T;\n }\n }\n });\n }\n\n return breakpointsMap;\n};","\"use client\";\n\nexport const isActiveElement = (el: Element | undefined | null) => {\n if (el) return document.activeElement === el;\n return false;\n}\n\nexport const isKeyboardTriggered = (el: Element | undefined | null) => {\n if (el) return el.matches(\":focus-visible\");\n return false;\n}\n\nexport const isInteractiveElement = (element: Element | null) => {\n const iElements = [\"A\", \"AREA\", \"BUTTON\", \"DETAILS\", \"INPUT\", \"SELECT\", \"TEXTAREA\"];\n const iRoles = [\"dialog\", \"radiogroup\", \"radio\", \"menu\", \"menuitem\"]\n\n if (element && (element instanceof HTMLElement || element instanceof SVGElement)) {\n if (element.closest(\"[inert]\")) return false;\n if (element.hasAttribute(\"disabled\")) return false;\n if (element.role && iRoles.includes(element.role)) return true;\n\n // Panel Resize Handler cos’ of typo on tabIndex/tabindex\n if (element.hasAttribute(\"tabindex\")) {\n const attr = element.getAttribute(\"tabindex\");\n return attr && parseInt(attr, 10) >= 0;\n }\n\n if (element.tabIndex) return element.tabIndex >= 0;\n if (iElements.includes(element.tagName)) return true;\n }\n\n return false;\n}","import { ThProgressionFormat } from \"@/preferences/models\";\nimport { TimelineProgression } from \"@/core/Hooks/useTimeline\";\n\nexport const getSupportedProgressionFormats = (timeline?: TimelineProgression): ThProgressionFormat[] => {\n if (!timeline) {\n return [ThProgressionFormat.none];\n }\n\n const {\n currentPositions = [],\n totalPositions,\n relativeProgression,\n totalProgression,\n currentIndex,\n totalItems,\n positionsLeft\n } = timeline;\n\n const supported: ThProgressionFormat[] = [ThProgressionFormat.none];\n\n if (currentPositions.length > 0) {\n supported.push(ThProgressionFormat.positions);\n }\n \n if (currentPositions.length > 0 && totalPositions) {\n supported.push(\n ThProgressionFormat.positionsOfTotal,\n ThProgressionFormat.positionsPercentOfTotal\n );\n }\n \n if (positionsLeft !== undefined) {\n supported.push(ThProgressionFormat.positionsLeft);\n }\n \n if (relativeProgression !== undefined) {\n supported.push(\n ThProgressionFormat.resourceProgression,\n ThProgressionFormat.progressionOfResource\n );\n }\n \n if (totalProgression !== undefined) {\n supported.push(ThProgressionFormat.overallProgression);\n }\n \n if (currentIndex !== undefined && totalItems !== undefined) {\n supported.push(ThProgressionFormat.readingOrderIndex);\n }\n\n return supported;\n};\n\nexport const canRenderProgressionFormat = (\n format: ThProgressionFormat,\n supportedFormats: ThProgressionFormat[]\n): boolean => {\n return supportedFormats.includes(format);\n};\n\nexport const getBestMatchingProgressionFormat = (\n preferredFormats: ThProgressionFormat[],\n timeline?: TimelineProgression\n): ThProgressionFormat | null => {\n if (!timeline) {\n return null;\n }\n\n const supportedFormats = getSupportedProgressionFormats(timeline);\n \n // Find the first preferred format that's supported\n const firstSupported = preferredFormats.find(format => \n canRenderProgressionFormat(format, supportedFormats)\n );\n \n return firstSupported || null;\n};\n"]}
@@ -1,5 +1,5 @@
1
- import { useI18n } from './chunk-6EHFW43Y.mjs';
2
- import { ThGrid, ThLoader } from './chunk-DETZMFZ7.mjs';
1
+ import { ThGrid, ThLoader } from './chunk-ETLIGONP.mjs';
2
+ import { useI18n } from './chunk-2NCN2AG2.mjs';
3
3
  import { isValidElement, cloneElement } from 'react';
4
4
  import { Link } from 'react-aria-components';
5
5
  import classNames from 'classnames';
@@ -130,5 +130,5 @@ var ErrorDisplay = ({
130
130
  };
131
131
 
132
132
  export { DefaultImage, ErrorDisplay, PublicationGrid, StatefulLoader };
133
- //# sourceMappingURL=chunk-2ORXUOH3.mjs.map
134
- //# sourceMappingURL=chunk-2ORXUOH3.mjs.map
133
+ //# sourceMappingURL=chunk-WF2UOYO7.mjs.map
134
+ //# sourceMappingURL=chunk-WF2UOYO7.mjs.map