@edrlab/thorium-web 1.1.7 → 1.2.0
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.
- package/dist/{ThPreferencesAdapter-B8AYujCA.d.mts → ThPreferencesAdapter-DrZ5_6Dv.d.mts} +4 -139
- package/dist/{ThSettingsWrapper-BlmAxcWF.d.mts → ThSettingsWrapper-8Kx0SnH4.d.mts} +1 -1
- package/dist/{actions-BRtHsxpm.d.mts → actions-D2CHvCHu.d.mts} +2 -2
- package/dist/{actionsReducer-bT0pfxLJ.d.mts → actionsReducer-kc-S130w.d.mts} +3 -24
- package/dist/chunk-34MVY33F.mjs +913 -0
- package/dist/chunk-34MVY33F.mjs.map +1 -0
- package/dist/{chunk-KJXHAJYK.mjs → chunk-4VHEHMJN.mjs} +128 -11
- package/dist/chunk-4VHEHMJN.mjs.map +1 -0
- package/dist/{chunk-6V3O7FCS.mjs → chunk-72XCX5TD.mjs} +3 -3
- package/dist/{chunk-6V3O7FCS.mjs.map → chunk-72XCX5TD.mjs.map} +1 -1
- package/dist/{chunk-YIW2OOMW.mjs → chunk-7NEQAW7J.mjs} +2 -2
- package/dist/chunk-7NEQAW7J.mjs.map +1 -0
- package/dist/{chunk-4C3UOTX4.mjs → chunk-H4J2VY7Z.mjs} +172 -27
- package/dist/chunk-H4J2VY7Z.mjs.map +1 -0
- package/dist/{chunk-COQXDRKD.mjs → chunk-K3K7TUWM.mjs} +2 -2
- package/dist/chunk-K3K7TUWM.mjs.map +1 -0
- package/dist/chunk-RRDEPGBK.mjs +75 -0
- package/dist/chunk-RRDEPGBK.mjs.map +1 -0
- package/dist/chunk-S4M7ED5Q.mjs +407 -0
- package/dist/chunk-S4M7ED5Q.mjs.map +1 -0
- package/dist/components/Epub/index.d.mts +17 -11
- package/dist/components/Epub/index.mjs +9 -828
- package/dist/components/Epub/index.mjs.map +1 -1
- package/dist/components/Misc/index.css +23 -0
- package/dist/components/Misc/index.css.map +1 -1
- package/dist/components/Misc/index.d.mts +10 -1
- package/dist/components/Misc/index.mjs +31 -3
- package/dist/components/Misc/index.mjs.map +1 -1
- package/dist/components/Reader/index.css +1283 -0
- package/dist/components/Reader/index.css.map +1 -0
- package/dist/components/Reader/index.d.mts +30 -0
- package/dist/components/Reader/index.mjs +79 -0
- package/dist/components/Reader/index.mjs.map +1 -0
- package/dist/components/WebPub/index.d.mts +15 -31
- package/dist/components/WebPub/index.mjs +9 -372
- package/dist/components/WebPub/index.mjs.map +1 -1
- package/dist/core/Components/index.d.mts +7 -6
- package/dist/core/Helpers/index.d.mts +1 -1
- package/dist/core/Hooks/index.d.mts +54 -5
- package/dist/core/Hooks/index.mjs +1 -1
- package/dist/errorHandler-CL2YIfQY.d.mts +26 -0
- package/dist/i18n/index.mjs +2 -2
- package/dist/immer.d-CoRThNOF.d.mts +23 -0
- package/dist/lib/index.d.mts +12 -162
- package/dist/lib/index.mjs +1 -1
- package/dist/locales/el/thorium-web.json +31 -0
- package/dist/locales/en/thorium-web.json +10 -1
- package/dist/locales/et/thorium-web.json +6 -2
- package/dist/locales/fi/thorium-shared.json +14 -8
- package/dist/locales/fi/thorium-web.json +2 -1
- package/dist/locales/fr/thorium-shared.json +100 -0
- package/dist/locales/it/thorium-shared.json +9 -0
- package/dist/locales/lt/thorium-shared.json +22 -13
- package/dist/locales/lt/thorium-web.json +2 -1
- package/dist/locales/pt-PT/thorium-shared.json +64 -1
- package/dist/locales/pt-PT/thorium-web.json +4 -3
- package/dist/locales/sv/thorium-shared.json +61 -3
- package/dist/locales/sv/thorium-web.json +4 -3
- package/dist/preferences/index.d.mts +8 -7
- package/dist/preferences/index.mjs +1 -1
- package/dist/settingsReducer-C1wwCAMv.d.mts +159 -0
- package/dist/{ui-BVlJcPL_.d.mts → ui-CamWuqOo.d.mts} +1 -1
- package/dist/useContrast-D6sjPjxy.d.mts +152 -0
- package/dist/{useEpubNavigator-CsraD65e.d.mts → useEpubNavigator-CwHJfoiV.d.mts} +1 -1
- package/dist/{usePreferences-rfT368__.d.mts → usePreferences-BXFJbval.d.mts} +1 -1
- package/dist/{StatefulReader-CjgFzHoO.d.mts → useReaderTransitions-guT-eA-Q.d.mts} +50 -50
- package/package.json +5 -3
- package/dist/chunk-4C3UOTX4.mjs.map +0 -1
- package/dist/chunk-COQXDRKD.mjs.map +0 -1
- package/dist/chunk-KJXHAJYK.mjs.map +0 -1
- package/dist/chunk-YIW2OOMW.mjs.map +0 -1
- package/dist/useContrast-Cgsrl7GS.d.mts +0 -15
|
@@ -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-34MVY33F.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.breakpoint);\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 { useMemo, 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 lineLength: LineLengthStateObject | null,\n lineHeight: ThLineHeightOptions | 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 lineLength,\n lineHeight,\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 const memoizedCache = useMemo(() => ({\n layoutUI,\n isImmersive,\n isHovering,\n arrowsOccupySpace: arrowsOccupySpace || false,\n settings: settingsCache.current.settings,\n positionsList: positionsList,\n colorScheme,\n reducedMotion,\n }), [\n layoutUI,\n isImmersive,\n isHovering,\n arrowsOccupySpace,\n settingsCache,\n positionsList,\n colorScheme,\n reducedMotion,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\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 } from \"@/preferences/models\";\nimport { FontMetadata } from \"@/preferences/services/fonts\";\nimport { ThColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ReadiumCSSSettings } from \"@/core/Hooks/Epub/useEpubSettingsCache\";\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 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: settings.columnCount === \"auto\" ? null : Number(settings.columnCount),\n constraint: initialConstraint,\n fontFamily: getFontMetadata(settings.fontFamily[fontLanguage] ?? \"\")?.fontStack || null,\n fontSize: settings.fontSize,\n fontWeight: settings.fontWeight,\n hyphens: settings.hyphens,\n letterSpacing: settings.publisherStyles ? undefined : settings.letterSpacing,\n lineHeight: 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: settings.publisherStyles ? undefined : settings.paragraphIndent,\n paragraphSpacing: settings.publisherStyles ? undefined : settings.paragraphSpacing,\n scroll: settings.scroll,\n textAlign: settings.textAlign as unknown as TextAlignment | null | undefined,\n textNormalization: settings.textNormalization,\n wordSpacing: 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 ]);\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) * 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]);\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 usePreferenceKeys\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 ThLayoutUI,\n ThDocumentTitleFormat,\n ThSpacingSettingsKeys,\n ThProgressionFormat,\n ThSettingsKeys\n} from \"../../preferences/models\";\n\nimport { ThPlugin, ThPluginRegistry } from \"../Plugins/PluginRegistry\";\n\nimport { I18nProvider } from \"react-aria\";\nimport { ThPluginProvider } from \"../Plugins/PluginProvider\";\nimport { NavigatorProvider } from \"@/core/Navigator\";\n\nimport {\n BasicTextSelection,\n FrameClickEvent,\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 { usePositionStorage } from \"@/hooks/usePositionStorage\";\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}: 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 } />\n </ThPluginProvider>\n </>\n );\n};\n\nconst StatefulReaderInner = ({ publication, localDataKey, positionStorage }: { publication: Publication; localDataKey: string | null; positionStorage?: PositionStorage }) => {\n const { fxlActionKeys, fxlThemeKeys, reflowActionKeys, reflowThemeKeys } = usePreferenceKeys();\n const { preferences, getFontMetadata, getFontInjectables } = usePreferences();\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 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 componentType: \"text\"\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 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 scroll = useAppSelector(state => state.settings.scroll);\n const isScroll = scroll && !isFXL;\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 \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 lineLength,\n lineHeight,\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 }))\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: unknown): void {},\n contextMenu: function (_data: unknown): void {},\n peripheral: function (_data: unknown): 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 : themeObject.reflow;\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 preferences.direction && dispatch(setDirection(preferences.direction));\n dispatch(setPlatformModifier(getPlatformModifier()));\n }, [preferences.direction, dispatch]);\n\n return (\n <>\n <I18nProvider locale={ preferences.locale }>\n <NavigatorProvider navigator={ epubNavigator }>\n <main className={ readerStyles.main }>\n <StatefulDockingWrapper>\n <div \n className={ \n getReaderClassNames({\n isScroll,\n isImmersive,\n isHovering,\n isFXL,\n layoutUI,\n breakpoint\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={ 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={ 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 </I18nProvider>\n </>\n)};"]}
|
|
@@ -48,26 +48,30 @@ var useLocalStorage = (key) => {
|
|
|
48
48
|
const [localData, setLocalData] = useState(null);
|
|
49
49
|
const cachedLocalData = useRef(null);
|
|
50
50
|
const setValue = (newValue) => {
|
|
51
|
+
if (!key) return;
|
|
51
52
|
setLocalData(newValue);
|
|
52
53
|
localStorage.setItem(key, JSON.stringify(newValue));
|
|
53
54
|
};
|
|
54
55
|
const getValue = () => {
|
|
56
|
+
if (!key) return null;
|
|
55
57
|
if (localData !== null) return localData;
|
|
56
58
|
const value = localStorage.getItem(key);
|
|
57
59
|
return value ? JSON.parse(value) : null;
|
|
58
60
|
};
|
|
59
61
|
const clearValue = () => {
|
|
62
|
+
if (!key) return;
|
|
60
63
|
setLocalData(null);
|
|
61
64
|
localStorage.removeItem(key);
|
|
62
65
|
};
|
|
63
66
|
useEffect(() => {
|
|
67
|
+
if (!key) return;
|
|
64
68
|
cachedLocalData.current = localData;
|
|
65
|
-
}, [localData]);
|
|
69
|
+
}, [localData, key]);
|
|
66
70
|
return {
|
|
67
71
|
setLocalData: setValue,
|
|
68
72
|
getLocalData: getValue,
|
|
69
73
|
clearLocalData: clearValue,
|
|
70
|
-
localData,
|
|
74
|
+
localData: key ? localData : null,
|
|
71
75
|
cachedLocalData
|
|
72
76
|
};
|
|
73
77
|
};
|
|
@@ -321,7 +325,7 @@ var useEpubNavigator = () => {
|
|
|
321
325
|
const getSetting = useCallback((settingKey) => {
|
|
322
326
|
return navigatorInstance?.settings[settingKey];
|
|
323
327
|
}, []);
|
|
324
|
-
|
|
328
|
+
const FXLPositionChangedCallbackRef = useRef(void 0);
|
|
325
329
|
const FXLPositionChanged = useMemo(() => {
|
|
326
330
|
return new MutationObserver((mutationsList) => {
|
|
327
331
|
for (const mutation of mutationsList) {
|
|
@@ -330,18 +334,21 @@ var useEpubNavigator = () => {
|
|
|
330
334
|
const oldVal = mutation.oldValue;
|
|
331
335
|
if (newVal?.split(re)[1] !== oldVal?.split(re)[1]) {
|
|
332
336
|
const locator = navigatorInstance?.currentLocator;
|
|
333
|
-
if (locator) {
|
|
334
|
-
|
|
337
|
+
if (locator && FXLPositionChangedCallbackRef.current) {
|
|
338
|
+
FXLPositionChangedCallbackRef.current(locator);
|
|
335
339
|
}
|
|
336
340
|
}
|
|
337
341
|
}
|
|
338
342
|
});
|
|
339
|
-
}, [
|
|
340
|
-
const EpubNavigatorLoad = useCallback((config, cb) => {
|
|
343
|
+
}, []);
|
|
344
|
+
const EpubNavigatorLoad = useCallback((config, cb, fxlCallback) => {
|
|
341
345
|
if (config.container) {
|
|
342
346
|
container.current = config.container;
|
|
343
347
|
containerParent.current = container.current ? container.current.parentElement : null;
|
|
344
348
|
publication.current = config.publication;
|
|
349
|
+
if (fxlCallback) {
|
|
350
|
+
FXLPositionChangedCallbackRef.current = fxlCallback;
|
|
351
|
+
}
|
|
345
352
|
navigatorInstance = new EpubNavigator(
|
|
346
353
|
config.container,
|
|
347
354
|
config.publication,
|
|
@@ -461,10 +468,71 @@ var useEpubNavigator = () => {
|
|
|
461
468
|
submitPreferences,
|
|
462
469
|
getCframes,
|
|
463
470
|
onFXLPositionChange: (cb) => {
|
|
464
|
-
|
|
471
|
+
FXLPositionChangedCallbackRef.current = cb;
|
|
465
472
|
}
|
|
466
473
|
};
|
|
467
474
|
};
|
|
475
|
+
var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWeight, hyphens, letterSpacing, lineLength, lineHeight, paragraphIndent, paragraphSpacing, publisherStyles, scroll, textNormalization, wordSpacing, theme) => {
|
|
476
|
+
const cache = useRef({
|
|
477
|
+
settings: {
|
|
478
|
+
columnCount,
|
|
479
|
+
fontFamily,
|
|
480
|
+
fontSize,
|
|
481
|
+
fontWeight,
|
|
482
|
+
hyphens,
|
|
483
|
+
letterSpacing,
|
|
484
|
+
lineHeight,
|
|
485
|
+
lineLength,
|
|
486
|
+
paragraphIndent,
|
|
487
|
+
paragraphSpacing,
|
|
488
|
+
publisherStyles,
|
|
489
|
+
scroll,
|
|
490
|
+
textAlign,
|
|
491
|
+
textNormalization,
|
|
492
|
+
theme,
|
|
493
|
+
wordSpacing
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
const memoizedCache = useMemo(() => ({
|
|
497
|
+
settings: {
|
|
498
|
+
columnCount,
|
|
499
|
+
fontFamily,
|
|
500
|
+
fontSize,
|
|
501
|
+
fontWeight,
|
|
502
|
+
hyphens,
|
|
503
|
+
letterSpacing,
|
|
504
|
+
lineHeight,
|
|
505
|
+
lineLength,
|
|
506
|
+
paragraphIndent,
|
|
507
|
+
paragraphSpacing,
|
|
508
|
+
publisherStyles,
|
|
509
|
+
scroll,
|
|
510
|
+
textAlign,
|
|
511
|
+
textNormalization,
|
|
512
|
+
theme,
|
|
513
|
+
wordSpacing
|
|
514
|
+
}
|
|
515
|
+
}), [
|
|
516
|
+
columnCount,
|
|
517
|
+
fontFamily,
|
|
518
|
+
fontSize,
|
|
519
|
+
fontWeight,
|
|
520
|
+
hyphens,
|
|
521
|
+
letterSpacing,
|
|
522
|
+
lineHeight,
|
|
523
|
+
lineLength,
|
|
524
|
+
paragraphIndent,
|
|
525
|
+
paragraphSpacing,
|
|
526
|
+
publisherStyles,
|
|
527
|
+
scroll,
|
|
528
|
+
textAlign,
|
|
529
|
+
textNormalization,
|
|
530
|
+
theme,
|
|
531
|
+
wordSpacing
|
|
532
|
+
]);
|
|
533
|
+
cache.current = memoizedCache;
|
|
534
|
+
return cache;
|
|
535
|
+
};
|
|
468
536
|
var navigatorInstance2 = null;
|
|
469
537
|
var useWebPubNavigator = () => {
|
|
470
538
|
const container = useRef(null);
|
|
@@ -587,7 +655,56 @@ var useWebPubNavigator = () => {
|
|
|
587
655
|
getCframes
|
|
588
656
|
};
|
|
589
657
|
};
|
|
658
|
+
var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, lineHeight, paragraphIndent, paragraphSpacing, publisherStyles, textAlign, textNormalization, wordSpacing, zoom) => {
|
|
659
|
+
const cache = useRef({
|
|
660
|
+
settings: {
|
|
661
|
+
fontFamily,
|
|
662
|
+
fontWeight,
|
|
663
|
+
hyphens,
|
|
664
|
+
letterSpacing,
|
|
665
|
+
lineHeight,
|
|
666
|
+
paragraphIndent,
|
|
667
|
+
paragraphSpacing,
|
|
668
|
+
publisherStyles,
|
|
669
|
+
textAlign,
|
|
670
|
+
textNormalization,
|
|
671
|
+
wordSpacing,
|
|
672
|
+
zoom
|
|
673
|
+
}
|
|
674
|
+
});
|
|
675
|
+
const memoizedCache = useMemo(() => ({
|
|
676
|
+
settings: {
|
|
677
|
+
fontFamily,
|
|
678
|
+
fontWeight,
|
|
679
|
+
hyphens,
|
|
680
|
+
letterSpacing,
|
|
681
|
+
lineHeight,
|
|
682
|
+
paragraphIndent,
|
|
683
|
+
paragraphSpacing,
|
|
684
|
+
publisherStyles,
|
|
685
|
+
textAlign,
|
|
686
|
+
textNormalization,
|
|
687
|
+
wordSpacing,
|
|
688
|
+
zoom
|
|
689
|
+
}
|
|
690
|
+
}), [
|
|
691
|
+
fontFamily,
|
|
692
|
+
fontWeight,
|
|
693
|
+
hyphens,
|
|
694
|
+
letterSpacing,
|
|
695
|
+
lineHeight,
|
|
696
|
+
paragraphIndent,
|
|
697
|
+
paragraphSpacing,
|
|
698
|
+
publisherStyles,
|
|
699
|
+
textAlign,
|
|
700
|
+
textNormalization,
|
|
701
|
+
wordSpacing,
|
|
702
|
+
zoom
|
|
703
|
+
]);
|
|
704
|
+
cache.current = memoizedCache;
|
|
705
|
+
return cache;
|
|
706
|
+
};
|
|
590
707
|
|
|
591
|
-
export { timelineInstance, useDocumentTitle, useEpubNavigator, useFullscreen, useIsClient, useLocalStorage, useTimeline, useWebPubNavigator };
|
|
592
|
-
//# sourceMappingURL=chunk-
|
|
593
|
-
//# sourceMappingURL=chunk-
|
|
708
|
+
export { timelineInstance, useDocumentTitle, useEpubNavigator, useEpubSettingsCache, useFullscreen, useIsClient, useLocalStorage, useTimeline, useWebPubNavigator, useWebPubSettingsCache };
|
|
709
|
+
//# sourceMappingURL=chunk-4VHEHMJN.mjs.map
|
|
710
|
+
//# sourceMappingURL=chunk-4VHEHMJN.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/Epub/useEpubNavigator.ts","../src/core/Hooks/Epub/useEpubSettingsCache.ts","../src/core/Hooks/WebPub/useWebPubNavigator.ts","../src/core/Hooks/WebPub/useWebPubSettingsCache.ts"],"names":["useState","useEffect","useRef","useCallback","positionsList","timelineItems","currentItem","useMemo","Layout","currentLocator","navigatorInstance"],"mappings":"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","file":"chunk-4VHEHMJN.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 { 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 = (newValue: any) => {\n if (!key) return;\n setLocalData(newValue);\n localStorage.setItem(key, JSON.stringify(newValue));\n };\n\n const getValue = () => {\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 };\n\n const clearValue = () => {\n if (!key) return;\n setLocalData(null);\n localStorage.removeItem(key);\n };\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\";\n\nexport interface TocItem {\n id: string;\n href: string;\n title?: string;\n children?: TocItem[];\n position?: number;\n}\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?: string | 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<string | 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 const buildTocTree = useCallback((\n links: Link[],\n idGenerator: () => string,\n positionsList?: Locator[],\n publicationTitle?: string\n ): TocItem[] => {\n return links.map((link) => {\n // Generate a new ID for the current Link\n const newId = idGenerator();\n \n // Create a plain object for compatibility with Tree components\n let href = link.href;\n const fragmentIndex = href.indexOf(\"#\");\n if (fragmentIndex !== -1) {\n const baseHref = href.substring(0, fragmentIndex);\n const duplicateLink = links.find((l) => l.href.startsWith(baseHref) && l.href !== href);\n if (!duplicateLink) {\n href = baseHref;\n }\n }\n \n const treeNode: TocItem = {\n id: newId,\n href: href,\n title: link.title || (\n publicationTitle \n ? `${ publicationTitle } ${ idCounterRef.current }` \n : newId\n ),\n position: positionsList?.find((position) => position.href === href)?.locations.position\n };\n \n // Recursively process children if they exist\n if (link.children) {\n treeNode.children = buildTocTree(link.children.items, idGenerator, positionsList, publicationTitle);\n }\n \n return treeNode;\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(currentMatch.id);\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(match.id);\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(match.id);\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?.readingOrder?.items, publication?.toc?.items, 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, buildTocTree, 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, 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} 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 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 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 lineLength: LineLengthStateObject | null;\n lineHeight: ThLineHeightOptions | 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 lineLength: LineLengthStateObject | null,\n lineHeight: ThLineHeightOptions | 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 lineHeight,\n lineLength,\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 lineHeight,\n lineLength,\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 lineHeight,\n lineLength,\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} 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 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 }\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 lineHeight: ThLineHeightOptions | 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 lineHeight: ThLineHeightOptions | 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 lineHeight,\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 lineHeight,\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 lineHeight,\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 { usePreferences } from './chunk-
|
|
1
|
+
import { usePreferences } from './chunk-7NEQAW7J.mjs';
|
|
2
2
|
import { i18n, initI18n } from './chunk-IYAFKTPL.mjs';
|
|
3
3
|
import { I18nextProvider } from 'react-i18next';
|
|
4
4
|
export { Trans } from 'react-i18next';
|
|
@@ -31,5 +31,5 @@ var ThI18nProvider = ({
|
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
export { ThI18nProvider };
|
|
34
|
-
//# sourceMappingURL=chunk-
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
34
|
+
//# sourceMappingURL=chunk-72XCX5TD.mjs.map
|
|
35
|
+
//# sourceMappingURL=chunk-72XCX5TD.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n/ThI18nProvider.tsx"],"names":[],"mappings":";;;;;;;AAYO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAS,KAAK,aAAa,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,GAAA,EAAK,WAAA,EAAa,MAAA,IAAU,OAAA,CAAQ;AAAA,OACrC,CAAA,CAAE,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,aAAA,IAAiB,aAAa,MAAA,EAAQ;AACxC,MAAA,IAAA,CAAK,cAAA,CAAe,YAAY,MAAM,CAAA;AAAA,IACxC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,EAAQ,aAAa,CAAC,CAAA;AAEvC,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAgB,QAAA,EAAU,CAAA;AACpD","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/i18n/ThI18nProvider.tsx"],"names":[],"mappings":";;;;;;;AAYO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAS,KAAK,aAAa,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,GAAA,EAAK,WAAA,EAAa,MAAA,IAAU,OAAA,CAAQ;AAAA,OACrC,CAAA,CAAE,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,aAAA,IAAiB,aAAa,MAAA,EAAQ;AACxC,MAAA,IAAA,CAAK,cAAA,CAAe,YAAY,MAAM,CAAA;AAAA,IACxC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,EAAQ,aAAa,CAAC,CAAA;AAEvC,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAgB,QAAA,EAAU,CAAA;AACpD","file":"chunk-72XCX5TD.mjs","sourcesContent":["\"use client\";\n\nimport React, { ReactNode, useEffect, useState } from \"react\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { i18n, initI18n } from \"./config\";\nimport { InitOptions } from \"i18next\";\nimport { usePreferences } from \"@/preferences\";\n\nexport type ThI18nProviderProps = {\n children: ReactNode;\n} & Partial<InitOptions>;\n\nexport const ThI18nProvider = ({\n children,\n ...options\n}: ThI18nProviderProps) => {\n const { preferences } = usePreferences();\n const [isInitialized, setIsInitialized] = useState(i18n.isInitialized);\n \n useEffect(() => {\n if (!i18n.isInitialized) { \n initI18n({\n ...options,\n lng: preferences?.locale || options.lng,\n }).then(() => setIsInitialized(true));\n }\n });\n\n useEffect(() => {\n if (isInitialized && preferences?.locale) {\n i18n.changeLanguage(preferences.locale);\n }\n }, [preferences?.locale, isInitialized]);\n\n if (!isInitialized) {\n return null;\n }\n\n return <I18nextProvider i18n={ i18n }>{ children }</I18nextProvider>;\n};\n\nexport default ThI18nProvider;\n"]}
|
|
@@ -1982,5 +1982,5 @@ var useTheming = ({
|
|
|
1982
1982
|
};
|
|
1983
1983
|
|
|
1984
1984
|
export { ThActionsKeys, ThDockingKeys, ThDockingTypes, ThLayoutOptions, ThLineHeightOptions, ThMemoryPreferencesAdapter, ThPreferencesContext, ThPreferencesProvider, ThSettingsContainerKeys, ThSettingsKeys, ThSettingsRangePlaceholder, ThSettingsRangeVariant, ThSheetHeaderVariant, ThSheetTypes, ThSpacingPresetKeys, ThSpacingSettingsKeys, ThTextAlignOptions, ThTextSettingsKeys, ThThemeKeys, buildThemeObject, contrast1Theme, contrast2Theme, contrast3Theme, createDefinitionFromStaticFonts, createDefinitionsFromBunnyFonts, createDefinitionsFromGoogleFonts, createPreferences, darkTheme, defaultActionKeysObject, defaultContentProtectionConfig, defaultFontCollection, defaultFullscreenAction, defaultJumpToPositionAction, defaultLetterSpacing, defaultLineHeights, defaultParagraphIndent, defaultParagraphSpacing, defaultPreferences, defaultPreferencesContextValue, defaultSettingsAction, defaultSpacingPresets, defaultSpacingPresetsOrder, defaultSpacingSettingsMain, defaultSpacingSettingsSubpanel, defaultTextSettingsMain, defaultTextSettingsSubpanel, defaultTocAction, defaultWordSpacing, defaultZoom, devContentProtectionConfig, lightTheme, paperTheme, prefixString, readiumCSSFontCollection, resolveContentProtectionConfig, sepiaTheme, tamilCollection, usePreferenceKeys, usePreferences, useTheming };
|
|
1985
|
-
//# sourceMappingURL=chunk-
|
|
1986
|
-
//# sourceMappingURL=chunk-
|
|
1985
|
+
//# sourceMappingURL=chunk-7NEQAW7J.mjs.map
|
|
1986
|
+
//# sourceMappingURL=chunk-7NEQAW7J.mjs.map
|