@edrlab/thorium-web 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/{chunk-BBCSLDQT.mjs → chunk-7O7RI3FX.mjs} +60 -65
  2. package/dist/chunk-7O7RI3FX.mjs.map +1 -0
  3. package/dist/{chunk-GRYEOCGD.mjs → chunk-AEEGHJVM.mjs} +36 -49
  4. package/dist/chunk-AEEGHJVM.mjs.map +1 -0
  5. package/dist/{chunk-BCXKBHU3.mjs → chunk-AV4IJXTM.mjs} +29 -14
  6. package/dist/chunk-AV4IJXTM.mjs.map +1 -0
  7. package/dist/{chunk-ZD4LTF6G.mjs → chunk-AXX4U2FW.mjs} +25 -133
  8. package/dist/chunk-AXX4U2FW.mjs.map +1 -0
  9. package/dist/{chunk-63LKYJFG.mjs → chunk-G4CEFOQK.mjs} +44 -14
  10. package/dist/chunk-G4CEFOQK.mjs.map +1 -0
  11. package/dist/{chunk-Y5X74VW7.mjs → chunk-KD727LNE.mjs} +8 -8
  12. package/dist/{chunk-Y5X74VW7.mjs.map → chunk-KD727LNE.mjs.map} +1 -1
  13. package/dist/chunk-KQ3KS5O5.mjs +37 -0
  14. package/dist/chunk-KQ3KS5O5.mjs.map +1 -0
  15. package/dist/{chunk-PRQBFBJ7.mjs → chunk-MBB6VHEQ.mjs} +19 -8
  16. package/dist/chunk-MBB6VHEQ.mjs.map +1 -0
  17. package/dist/{chunk-KJ55Q63A.mjs → chunk-QKCS2WPM.mjs} +173 -24
  18. package/dist/chunk-QKCS2WPM.mjs.map +1 -0
  19. package/dist/{chunk-2T65MDBR.mjs → chunk-VLMPRICM.mjs} +3 -3
  20. package/dist/{chunk-2T65MDBR.mjs.map → chunk-VLMPRICM.mjs.map} +1 -1
  21. package/dist/{chunk-VENFFPK2.mjs → chunk-VYSDLACR.mjs} +2 -2
  22. package/dist/{chunk-VENFFPK2.mjs.map → chunk-VYSDLACR.mjs.map} +1 -1
  23. package/dist/{chunk-KOR74F6M.mjs → chunk-X63WSMOH.mjs} +4 -36
  24. package/dist/chunk-X63WSMOH.mjs.map +1 -0
  25. package/dist/{chunk-PAFJZH7O.mjs → chunk-YE5QOQUT.mjs} +3 -3
  26. package/dist/{chunk-PAFJZH7O.mjs.map → chunk-YE5QOQUT.mjs.map} +1 -1
  27. package/dist/components/Audio/index.d.mts +3 -3
  28. package/dist/components/Audio/index.mjs +11 -10
  29. package/dist/components/Epub/index.d.mts +3 -3
  30. package/dist/components/Epub/index.mjs +12 -11
  31. package/dist/components/Misc/index.mjs +2 -2
  32. package/dist/components/Reader/index.d.mts +2 -2
  33. package/dist/components/Reader/index.mjs +17 -16
  34. package/dist/components/Reader/index.mjs.map +1 -1
  35. package/dist/components/WebPub/index.d.mts +3 -3
  36. package/dist/components/WebPub/index.mjs +12 -11
  37. package/dist/core/Components/index.d.mts +4 -20
  38. package/dist/core/Components/index.mjs +1 -1
  39. package/dist/core/Helpers/index.mjs +3 -2
  40. package/dist/core/Hooks/index.d.mts +10 -4
  41. package/dist/core/Hooks/index.mjs +2 -1
  42. package/dist/lib/index.mjs +3 -2
  43. package/dist/locales/da/thorium-shared.json +217 -10
  44. package/dist/locales/et/thorium-shared.json +24 -3
  45. package/dist/locales/he/thorium-shared.json +8 -0
  46. package/dist/locales/it/thorium-shared.json +11 -11
  47. package/dist/locales/it/thorium-web.json +4 -4
  48. package/dist/locales/lt/thorium-shared.json +85 -1
  49. package/dist/locales/pl/thorium-shared.json +249 -7
  50. package/dist/locales/pl/thorium-web.json +36 -1
  51. package/dist/locales/sv/thorium-shared.json +5 -5
  52. package/dist/preferences/index.d.mts +2 -0
  53. package/dist/preferences/index.mjs +4 -3
  54. package/dist/{useAudioNavigator-pGwxhXLj.d.mts → useAudioNavigator-9RuOpLGB.d.mts} +4 -4
  55. package/dist/{useReaderTransitions-Zvomj9RQ.d.mts → useReaderTransitions-CpgrXS5g.d.mts} +25 -6
  56. package/package.json +7 -7
  57. package/dist/chunk-63LKYJFG.mjs.map +0 -1
  58. package/dist/chunk-BBCSLDQT.mjs.map +0 -1
  59. package/dist/chunk-BCXKBHU3.mjs.map +0 -1
  60. package/dist/chunk-GRYEOCGD.mjs.map +0 -1
  61. package/dist/chunk-KJ55Q63A.mjs.map +0 -1
  62. package/dist/chunk-KOR74F6M.mjs.map +0 -1
  63. package/dist/chunk-PRQBFBJ7.mjs.map +0 -1
  64. package/dist/chunk-ZD4LTF6G.mjs.map +0 -1
@@ -1,11 +1,11 @@
1
- import { useReaderHeaderBase, thorium_web_reader_app_default, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default, useIsScroll, useNavigator, useEffectiveRange } from './chunk-KJ55Q63A.mjs';
2
- import { makeBreakpointsMap, getBestMatchingProgressionFormat } from './chunk-VENFFPK2.mjs';
3
- import { setHovering, setWebPubZoom, setFontSize } from './chunk-PAFJZH7O.mjs';
4
- import { usePreferences } from './chunk-PRQBFBJ7.mjs';
1
+ import { useReaderHeaderBase, thorium_web_reader_app_default, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default, useIsScroll, useNavigator, useEffectiveRange } from './chunk-QKCS2WPM.mjs';
2
+ import { makeBreakpointsMap, getBestMatchingProgressionFormat } from './chunk-VYSDLACR.mjs';
3
+ import { setHovering, setWebPubZoom, setFontSize } from './chunk-YE5QOQUT.mjs';
4
+ import { usePreferences } from './chunk-MBB6VHEQ.mjs';
5
5
  import { ThRunningHeadFormat, ThProgressionFormat } from './chunk-2YRT7RNW.mjs';
6
6
  import { useAppSelector, useAppDispatch } from './chunk-A575ZW4A.mjs';
7
- import { getPlatform } from './chunk-KOR74F6M.mjs';
8
- import { ThInteractiveOverlay, ThHeader, ThFooter, ThRunningHead, ThPagination } from './chunk-ZD4LTF6G.mjs';
7
+ import { getPlatform } from './chunk-KQ3KS5O5.mjs';
8
+ import { ThInteractiveOverlay, ThHeader, ThFooter, ThRunningHead, ThPagination } from './chunk-AXX4U2FW.mjs';
9
9
  import { useI18n } from './chunk-2NCN2AG2.mjs';
10
10
  import { useRef, useCallback, useEffect, useMemo } from 'react';
11
11
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -763,5 +763,5 @@ function getReaderClassNames(options) {
763
763
  }
764
764
 
765
765
  export { StatefulReaderFooter, StatefulReaderHeader, getReaderClassNames, useFonts, useZoomCallbacks };
766
- //# sourceMappingURL=chunk-Y5X74VW7.mjs.map
767
- //# sourceMappingURL=chunk-Y5X74VW7.mjs.map
766
+ //# sourceMappingURL=chunk-KD727LNE.mjs.map
767
+ //# sourceMappingURL=chunk-KD727LNE.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/StatefulReaderRunningHead.tsx","../src/components/StatefulReaderHeader.tsx","../src/components/assets/styles/thorium-web.reader.pagination.module.css","../src/components/assets/styles/thorium-web.reader.progression.module.css","../src/core/Components/Reader/ThProgression.tsx","../src/components/StatefulReaderProgression.tsx","../src/components/StatefulReaderPagination.tsx","../src/components/StatefulReaderFooter.tsx","../src/core/Hooks/fonts/androidPatchCss.ts","../src/core/Hooks/fonts/useFonts.ts","../src/components/Settings/hooks/useZoomCallbacks.ts","../src/components/Helpers/getReaderClassNames.ts"],"names":["Fragment","jsx","wrapper","listItem","leftButton","progression","rightButton","label","useMemo","classNames","useRef","jsxs","useCallback","useEffect"],"mappings":"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","file":"chunk-Y5X74VW7.mjs","sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThRunningHead } from \"@/core/Components\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\n\nexport const StatefulReaderRunningHead = ({ \n formatPref\n}: {\n formatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n const { t } = useI18n();\n \n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n\n // Get the fallback format based on isFXL\n const fallbackFormat = useMemo<ThFormatPrefValue<ThRunningHeadFormat>>(() => ({\n variants: ThRunningHeadFormat.title,\n displayInImmersive: true,\n displayInFullscreen: true\n }), []);\n\n const breakpointsMap = useMemo(() => {\n return makeBreakpointsMap<ThFormatPrefValue<ThRunningHeadFormat>>({\n defaultValue: formatPref?.default || fallbackFormat,\n fromEnum: ThRunningHeadFormat,\n pref: formatPref?.breakpoints,\n validateKey: \"variants\"\n });\n }, [formatPref, fallbackFormat]);\n \n // Get current preferences with proper fallback\n const currentPrefs = useMemo(() => {\n if (!breakpoint) return formatPref?.default || fallbackFormat;\n return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n\n const displayFormat = useMemo(() => {\n if (!variants) return ThRunningHeadFormat.title;\n \n // Check if we should hide in immersive mode\n if (isImmersive && displayInImmersive === false && !isHovering) {\n return ThRunningHeadFormat.none;\n }\n \n // Check if we should hide in fullscreen mode\n if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n return ThRunningHeadFormat.none;\n }\n \n return variants;\n }, [variants, isImmersive, displayInImmersive, isHovering, isFullscreen, displayInFullscreen]);\n\n const runningHead = useMemo(() => {\n if (displayFormat === ThRunningHeadFormat.title) {\n return unstableTimeline?.title || \"\";\n } else if (displayFormat === ThRunningHeadFormat.chapter) {\n return unstableTimeline?.progression?.currentChapter || unstableTimeline?.title || \"\";\n }\n return \"\";\n }, [displayFormat, unstableTimeline]);\n\n if (!runningHead || displayFormat === ThRunningHeadFormat.none) return null;\n \n return (\n <>\n <ThRunningHead \n label={ runningHead } \n aria-label={ t(\"reader.app.header.runningHead\") }\n />\n </>\n );\n}","\"use client\";\n\nimport React from \"react\";\n\nimport { ActionKeyType } from \"@/preferences\";\nimport { ThLayoutUI, ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref } from \"@/preferences\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerHeaderStyles from \"./assets/styles/thorium-web.reader.header.module.css\";\nimport overflowMenuStyles from \"./Actions/assets/styles/thorium-web.overflow.module.css\";\n\nimport { ThHeader } from \"@/core/Components/Reader/ThHeader\";\nimport { StatefulBackLink } from \"./StatefulBackLink\";\nimport { StatefulReaderRunningHead } from \"./StatefulReaderRunningHead\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulCollapsibleActionsBar } from \"./Actions/StatefulCollapsibleActionsBar\";\n\nimport { useReaderHeaderBase } from \"./hooks/useReaderHeaderBase\";\nimport { usePreferences } from \"@/preferences/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderHeader = ({\n actionKeys,\n actionsOrder,\n layout,\n runningHeadFormatPref\n}: {\n actionKeys: ActionKeyType[];\n actionsOrder: ActionKeyType[];\n layout: ThLayoutUI;\n runningHeadFormatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n const {\n headerRef, focusWithinProps, setHover, removeHover,\n listActionItems, isImmersive, isHovering, isScroll, t,\n } = useReaderHeaderBase(actionKeys);\n\n const { preferences } = usePreferences();\n\n return (\n <>\n <ThInteractiveOverlay\n className={ classNames(readerStyles.barOverlay, readerStyles.headerOverlay) }\n isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n />\n\n <ThHeader\n ref={ headerRef }\n className={ classNames(readerStyles.topBar, readerHeaderStyles.header) }\n aria-label={ t(\"reader.app.header.label\") }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n { ...focusWithinProps }\n >\n { preferences.theming.header?.backLink && <StatefulBackLink className={ readerHeaderStyles.backlinkWrapper } /> }\n\n <StatefulReaderRunningHead formatPref={ runningHeadFormatPref } />\n\n <StatefulCollapsibleActionsBar\n id=\"reader-header-overflowMenu\"\n items={ listActionItems() }\n prefs={{ ...preferences.actions, displayOrder: actionsOrder }}\n className={ readerHeaderStyles.actionsWrapper }\n aria-label={ t(\"reader.app.header.actions\") }\n overflowMenuClassName={\n (!isScroll || preferences.affordances.scroll.hintInImmersive)\n ? overflowMenuStyles.hint\n : undefined\n }\n />\n </ThHeader>\n </>\n );\n};\n",".wrapper {\n box-sizing: border-box;\n display: grid;\n gap: calc(var(--th-layout-spacing) / 2);\n grid-template-areas: \"pagination-start pagination-center pagination-end\";\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n align-items: center;\n width: 100%;\n max-width: var(--th-layout-constraints-pagination, 100%);\n}\n\n.listItem {\n box-sizing: border-box;\n list-style: none;\n}\n\n.listItem:has(.leftButton) {\n grid-area: pagination-start;\n justify-self: start;\n}\n\n.listItem:has(.progression) {\n grid-area: pagination-center;\n justify-self: center;\n}\n\n.listItem:has(.rightButton) {\n grid-area: pagination-end;\n justify-self: end;\n}\n\n\n.listItem button {\n box-sizing: border-box;\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n gap: calc(var(--th-layout-spacing) / 2);\n max-height: calc(var(--th-icon-size, 24px) * 2);\n max-width: 100%;\n border-radius: var(--th-layout-radius);\n display: flex;\n align-items: center;\n}\n\n.rightButton {\n margin-inline-start: auto;\n text-align: end;\n}\n\n.listItem button[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.listItem button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.listItem button[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.listItem button .label {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n white-space: normal;\n -webkit-line-clamp: 1;\n line-clamp: 1;\n}\n\n.listItem button svg {\n flex: none;\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n fill: currentColor;\n}",".wrapper {\n color: var(--th-theme-text);\n font-variant-numeric: lining-nums tabular-nums;\n text-align: center;\n}","\"use client\";\n\nimport React from \"react\";\n\nexport interface ThProgressionProps extends React.HTMLAttributes<HTMLDivElement> {\n ref?: React.RefObject<HTMLDivElement>\n}\n\nexport const ThProgression = ({ \n ref,\n children, \n ...props\n}: ThProgressionProps) => {\n return (\n <>\n <div \n ref={ ref } \n {...props }\n >\n { children }\n </div>\n </>\n )\n}","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport progressionStyles from \"./assets/styles/thorium-web.reader.progression.module.css\";\n\nimport { ThProgressionFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThProgression } from \"@/core/Components/Reader/ThProgression\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport { getBestMatchingProgressionFormat } from \"@/core/Helpers/progressionFormat\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderProgression = ({ \n className,\n formatPref,\n fallbackVariant\n}: { \n className?: string,\n formatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>,\n fallbackVariant: ThProgressionFormat | Array<ThProgressionFormat>\n}) => {\n const { t } = useI18n();\n \n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n \n const fallbackFormat = useMemo(() => {\n return {\n variants: fallbackVariant,\n displayInImmersive: true,\n displayInFullscreen: true\n };\n }, [fallbackVariant]);\n \n const breakpointsMap = useMemo(() => {\n return makeBreakpointsMap<ThFormatPrefValue<ThProgressionFormat | ThProgressionFormat[]>>({\n defaultValue: formatPref?.default || fallbackFormat,\n fromEnum: ThProgressionFormat,\n pref: formatPref?.breakpoints,\n validateKey: \"variants\"\n });\n }, [formatPref, fallbackFormat]);\n \n // Get current preferences with proper fallback\n const currentPrefs = useMemo(() => {\n if (!breakpoint) return formatPref?.default || fallbackFormat;\n return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n \n // Get the display format, handling both single format and array of formats\n const displayFormat = useMemo(() => {\n if (!variants) return fallbackFormat.variants;\n \n // Check if we should hide in immersive mode\n if (isImmersive && displayInImmersive === false && !isHovering) {\n return ThProgressionFormat.none;\n }\n \n // Check if we should hide in fullscreen mode\n if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n return ThProgressionFormat.none;\n }\n \n if (Array.isArray(variants)) {\n return getBestMatchingProgressionFormat(variants, unstableTimeline?.progression) || \n fallbackFormat.variants;\n }\n \n return variants;\n }, [variants, unstableTimeline?.progression, fallbackFormat, isImmersive, isHovering, isFullscreen, displayInImmersive, displayInFullscreen]);\n\n // Compute display text based on current position and timeline\n const displayText = useMemo(() => {\n if (displayFormat === ThProgressionFormat.none || !unstableTimeline?.progression) {\n return \"\";\n }\n\n const { \n currentPositions = [],\n totalPositions,\n relativeProgression,\n totalProgression,\n currentChapter,\n positionsLeft,\n totalItems,\n currentIndex\n } = unstableTimeline.progression;\n \n let text = \"\";\n \n // Format positions for display (handle array of two positions with a dash)\n const formatPositions = (positions: number[]) => {\n if (positions.length === 2) {\n return positions.join(\"–\");\n }\n return positions[0]?.toString() || \"\";\n };\n \n switch (displayFormat) {\n case ThProgressionFormat.positions:\n if (currentPositions.length > 0) {\n text = formatPositions(currentPositions);\n }\n break;\n \n case ThProgressionFormat.positionsOfTotal:\n if (currentPositions.length > 0 && totalPositions) {\n text = t(\"reader.progression.xOfY.compact\", { \n x: formatPositions(currentPositions),\n y: totalPositions\n });\n }\n break;\n\n case ThProgressionFormat.positionsPercentOfTotal:\n if (currentPositions.length > 0 && totalPositions) {\n const percentage = Math.round((totalProgression || 0) * 100);\n text = t(\"reader.progression.xOfY.descriptive\", { \n x: formatPositions(currentPositions),\n y: totalPositions,\n z: `${ percentage }%`\n });\n }\n break;\n \n case ThProgressionFormat.positionsLeft:\n if (positionsLeft !== undefined) {\n text = t(`reader.progression.positionsLeftInChapter.descriptive`, { \n count: positionsLeft\n });\n }\n break;\n \n case ThProgressionFormat.overallProgression:\n if (totalProgression !== undefined) {\n const percentage = Math.round(totalProgression * 100);\n text = `${ percentage }%`;\n }\n break;\n \n case ThProgressionFormat.resourceProgression:\n if (relativeProgression !== undefined) {\n const percentage = Math.round(relativeProgression * 100);\n text = `${ percentage }%`;\n }\n break;\n \n case ThProgressionFormat.progressionOfResource:\n if (relativeProgression !== undefined) {\n const percentage = Math.round(relativeProgression * 100);\n text = t(\"reader.progression.xOfY.compact\", {\n x: `${ percentage }%`,\n y: currentChapter || t(\"reader.app.progression.referenceFallback\")\n });\n }\n break;\n\n case ThProgressionFormat.readingOrderIndex:\n if (currentIndex !== undefined && totalItems !== undefined) {\n text = t(\"reader.progression.xOfY.compact\", {\n x: currentIndex,\n y: totalItems\n });\n }\n break;\n }\n \n return text;\n }, [displayFormat, unstableTimeline, t]);\n\n if (!displayText || displayFormat === ThProgressionFormat.none) {\n return null;\n }\n\n return (\n <ThProgression \n id=\"current-progression\" \n className={ classNames(progressionStyles.wrapper, className) }\n aria-label={ t(\"reader.app.progression.wrapper\") }\n >\n { displayText }\n </ThProgression>\n );\n};","\"use client\";\n\nimport { useRef, KeyboardEvent } from \"react\";\n\nimport { ThPagination, ThPaginationProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nexport const StatefulReaderPagination = ({\n ref,\n links,\n compounds,\n children,\n ...props\n}: ThPaginationProps) => {\n const leftButtonRef = useRef<HTMLButtonElement>(null);\n const rightButtonRef = useRef<HTMLButtonElement>(null);\n\n const updatedCompounds = {\n ...compounds,\n leftButton: {\n ...compounds?.leftButton,\n ref: leftButtonRef,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n leftButtonRef.current?.blur();\n }\n }\n },\n rightButton: {\n ...compounds?.rightButton,\n ref: rightButtonRef,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n rightButtonRef.current?.blur();\n }\n }\n }\n };\n\n return (\n <ThPagination\n ref={ ref }\n className={ readerPaginationStyles.wrapper }\n links={ links }\n compounds={ updatedCompounds }\n { ...props }\n >\n { children }\n </ThPagination>\n )\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nimport { ThBreakpoints, ThLayoutUI, ThFormatPref, ThProgressionFormat } from \"@/preferences/models\";\n\nimport { ThFooter } from \"@/core/Components/Reader/ThFooter\";\nimport { StatefulReaderProgression } from \"./StatefulReaderProgression\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulReaderPagination } from \"./StatefulReaderPagination\";\nimport { ThPaginationLinkProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useFocusWithin, useLocale } from \"react-aria\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { useIsScroll } from \"@/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderFooter = ({\n layout,\n progressionFormatPref,\n progressionFormatFallback\n}: {\n layout: ThLayoutUI;\n progressionFormatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>;\n progressionFormatFallback: ThProgressionFormat | ThProgressionFormat[];\n}) => {\n const { t } = useI18n();\n const { direction } = useLocale();\n const footerRef = useRef<HTMLDivElement>(null);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const hasScrollAffordance = useAppSelector(state => state.reader.hasScrollAffordance);\n const isRTL = useAppSelector(state => state.publication.isRTL);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = useIsScroll();\n const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n const timeline = useAppSelector(state => state.publication.unstableTimeline);\n\n const dispatch = useAppDispatch();\n\n const { focusWithinProps } = useFocusWithin({\n onFocusWithin() {\n dispatch(setHovering(true));\n },\n onBlurWithin() {\n dispatch(setHovering(false));\n }\n });\n\n const setHover = () => {\n if (!hasScrollAffordance) {\n dispatch(setHovering(true));\n }\n };\n\n const removeHover = () => {\n if (!hasScrollAffordance) {\n dispatch(setHovering(false));\n }\n };\n\n const { previousLocator, nextLocator, go } = useNavigator().unified;\n\n const buildNode = useCallback((\n locator: ReturnType<typeof previousLocator>,\n title: string | undefined,\n compactKey: string,\n descriptiveKey: string\n ) => {\n if (!locator) return undefined;\n\n return breakpoint !== ThBreakpoints.compact && breakpoint !== ThBreakpoints.medium ? (\n <>\n <span className={ readerStyles.srOnly }>{ t(descriptiveKey) }</span>\n <span className={ readerPaginationStyles.label }>{ title || locator.title || t(compactKey) }</span>\n </>\n ) : (\n <span className={ readerPaginationStyles.label }>{ t(compactKey) }</span>\n );\n }, [t, breakpoint]);\n\n const updateLinks = useCallback(() => {\n const previous = previousLocator();\n const next = nextLocator();\n\n const previousLink: ThPaginationLinkProps | undefined = previous ? {\n node: buildNode(\n previous,\n timeline?.previousItem?.title,\n isFXL ? \"reader.actions.goToPreviousPage.compact\" : \"reader.actions.goToPreviousChapter.compact\",\n isFXL ? \"reader.actions.goToPreviousPage.descriptive\" : \"reader.actions.goToPreviousChapter.descriptive\"\n ),\n onPress: () => go(previous, !reducedMotion, () => {})\n } : undefined;\n\n const nextLink: ThPaginationLinkProps | undefined = next ? {\n node: buildNode(\n next,\n timeline?.nextItem?.title,\n isFXL ? \"reader.actions.goToNextPage.compact\" : \"reader.actions.goToNextChapter.compact\",\n isFXL ? \"reader.actions.goToNextPage.descriptive\" : \"reader.actions.goToNextChapter.descriptive\"\n ),\n onPress: () => go(next, !reducedMotion, () => {})\n } : undefined;\n\n return isRTL\n ? { left: nextLink, right: previousLink }\n : { left: previousLink, right: nextLink };\n }, [go, previousLocator, nextLocator, buildNode, timeline, reducedMotion, isFXL, isRTL]);\n\n useEffect(() => {\n updateLinks();\n }, [timeline, updateLinks]);\n\n useEffect(() => {\n // Blur any focused element when entering immersive mode\n if (isImmersive) {\n const focusElement = document.activeElement;\n if (focusElement && footerRef.current?.contains(focusElement)) {\n (focusElement as HTMLElement).blur();\n }\n }\n }, [isImmersive]);\n\n return(\n <>\n <ThInteractiveOverlay\n className={ classNames(readerStyles.barOverlay, readerStyles.footerOverlay) }\n isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n />\n\n <ThFooter\n ref={ footerRef }\n className={ readerStyles.bottomBar }\n aria-label={ t(\"reader.app.footer.label\") }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n { ...focusWithinProps }\n >\n { (isScroll)\n ? <StatefulReaderPagination\n aria-label={ t(\"reader.navigation.scroll.wrapper\") }\n links={ updateLinks() }\n dir={ direction }\n compounds={ {\n listItem: {\n className: readerPaginationStyles.listItem\n },\n leftButton: {\n className: readerPaginationStyles.leftButton,\n preventFocusOnPress: true\n },\n rightButton: {\n className: readerPaginationStyles.rightButton,\n preventFocusOnPress: true\n }\n } }\n >\n <StatefulReaderProgression\n className={ readerPaginationStyles.progression }\n formatPref={ progressionFormatPref }\n fallbackVariant={ progressionFormatFallback }\n />\n </StatefulReaderPagination>\n : <StatefulReaderProgression\n formatPref={ progressionFormatPref }\n fallbackVariant={ progressionFormatFallback }\n /> }\n </ThFooter>\n </>\n )\n}\n","export const getAndroidPatchCss = () => {\n if (typeof window === \"undefined\") {\n return \"\";\n }\n \n const origin = window.location.origin;\n \n return `/* Readium CSS\n Android Fonts Patch module\n\n A stylesheet aligning Android generic serif and sans-serif fonts on other platforms\n\n Repo: https://github.com/readium/css */\n\n/* Android resolves sans-serif to Roboto, and serif to Droid Serif \n This created issues for FXL EPUBs relying on Times (New Roman),\n Helvetica or Arial while not embedding the font files in the package.\n\n See https://github.com/readium/css/issues/149\n\n Unfortunately it is no possible to target generic family using @font-face,\n we have to target specific font-family names e.g. Times, Arial, etc.\n\n This stylesheet/patch should be loaded only for this case i.e.\n a Fixed-Layout EPUB with text but no embedded font on an Android device.\n The logic for checking these conditions are up to implementers.\n*/\n\n/* Serif (Times + Times New Roman) */\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n/* Sans-serif (Helvetica + Arial) */\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}`;\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { InjectableFontResources } from \"@/preferences/services/fonts\";\nimport { ILinkInjectable, IUrlInjectable, IBlobInjectable } from \"@readium/navigator\";\n\nimport { getPlatform } from \"@/core/Helpers/getPlatform\";\nimport { getAndroidPatchCss } from \"./androidPatchCss\";\n\ntype FontResource = (ILinkInjectable & IUrlInjectable) | (ILinkInjectable & IBlobInjectable);\n\nexport const useFonts = (fontResources?: InjectableFontResources | null) => {\n const injectedElementsRef = useRef<{\n prepend: HTMLElement[];\n append: HTMLElement[];\n }>({\n prepend: [],\n append: []\n });\n\n const createLinkElement = useCallback((resource: FontResource): HTMLLinkElement => {\n const link = document.createElement(\"link\");\n \n // Set all custom attributes first to make sure they are\n // overridden by the core attributes\n if (\"attributes\" in resource && resource.attributes) {\n Object.entries(resource.attributes).forEach(([key, value]) => {\n link.setAttribute(key, value as string);\n });\n }\n \n link.rel = resource.rel;\n link.as = resource.as;\n \n if (\"url\" in resource) {\n link.href = resource.url;\n } else if (\"blob\" in resource && resource.blob) {\n link.href = URL.createObjectURL(resource.blob);\n }\n \n return link;\n }, []);\n\n const removeInjectedElements = useCallback(() => {\n const { prepend, append } = injectedElementsRef.current;\n \n [...prepend, ...append].forEach(element => {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n // Revoke blob URLs to prevent memory leaks\n if (element instanceof HTMLLinkElement && element.href.startsWith(\"blob:\")) {\n URL.revokeObjectURL(element.href);\n }\n });\n \n injectedElementsRef.current = {\n prepend: [],\n append: []\n };\n }, []);\n\n const injectFontResources = useCallback((resources: InjectableFontResources | null) => {\n if (typeof document === \"undefined\") return;\n \n removeInjectedElements();\n \n if (!resources) return;\n \n const { prepend, append } = resources;\n const injectedElements = injectedElementsRef.current;\n \n prepend.forEach(resource => {\n const element = createLinkElement(resource);\n document.head.insertBefore(element, document.head.firstChild);\n injectedElements.prepend.push(element);\n });\n \n append.forEach(resource => {\n const element = createLinkElement(resource);\n document.head.appendChild(element);\n injectedElements.append.push(element);\n });\n }, [createLinkElement, removeInjectedElements]);\n\n const getAndroidFXLPatch = useCallback((): (ILinkInjectable & IBlobInjectable) | null => {\n const platform = getPlatform();\n const isAndroid = platform === \"android\";\n \n if (!isAndroid) {\n return null;\n }\n \n const cssContent = getAndroidPatchCss();\n const blob = new Blob([cssContent], { type: \"text/css\" });\n \n return {\n as: \"link\",\n rel: \"stylesheet\",\n blob\n };\n }, []);\n\n useEffect(() => {\n injectFontResources(fontResources || null);\n \n return () => {\n removeInjectedElements();\n };\n }, [fontResources, injectFontResources, removeInjectedElements]);\n\n return {\n injectFontResources,\n removeFontResources: removeInjectedElements,\n getAndroidFXLPatch\n };\n};","import { useCallback } from \"react\";\n\nimport { ThSettingsKeys } from \"@/preferences/models\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontSize } from \"@/lib/settingsReducer\";\nimport { setWebPubZoom } from \"@/lib/webPubSettingsReducer\";\nimport { useEffectiveRange } from \"./useEffectiveRange\";\nimport { EpubPreferencesEditor, IEpubPreferences, IWebPubPreferences, WebPubPreferencesEditor } from \"@readium/navigator\";\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useWebPubNavigator } from \"@/core/Hooks/WebPub/useWebPubNavigator\";\n\ntype ZoomNavigator = ReturnType<typeof useEpubNavigator> | ReturnType<typeof useWebPubNavigator>;\n\nexport const useZoomCallbacks = (navigator: ZoomNavigator) => {\n const { preferences } = usePreferences();\n const readerProfile = useAppSelector(state => state.reader.profile);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const dispatch = useAppDispatch();\n\n const isWebPub = readerProfile === \"webPub\";\n\n const getSetting = navigator.getSetting as (key: string) => number | null | undefined;\n const submitPreferences = navigator.submitPreferences as (prefs: IEpubPreferences | IWebPubPreferences) => Promise<void>;\n const { preferencesEditor } = navigator;\n\n const supportedRange = isWebPub\n ? (preferencesEditor as WebPubPreferencesEditor)?.zoom?.supportedRange\n : isFXL\n ? (preferencesEditor as unknown as WebPubPreferencesEditor)?.zoom?.supportedRange\n : (preferencesEditor as EpubPreferencesEditor)?.fontSize?.supportedRange;\n\n const zoomConfig = preferences.settings.keys[ThSettingsKeys.zoom];\n const { range } = useEffectiveRange(zoomConfig.range, supportedRange);\n const [min, max] = range;\n const step = zoomConfig.step ?? 0.05;\n\n const zoomIn = useCallback(async () => {\n if (isWebPub) {\n const next = Math.min(max, (getSetting(\"zoom\") ?? 1) + step);\n await submitPreferences({ zoom: next });\n dispatch(setWebPubZoom(getSetting(\"zoom\")));\n } else {\n const next = Math.min(max, (getSetting(\"fontSize\") ?? 1) + step);\n await submitPreferences({ fontSize: next });\n dispatch(setFontSize(getSetting(\"fontSize\")));\n }\n }, [isWebPub, getSetting, max, step, submitPreferences, dispatch]);\n\n const zoomOut = useCallback(async () => {\n if (isWebPub) {\n const next = Math.max(min, (getSetting(\"zoom\") ?? 1) - step);\n await submitPreferences({ zoom: next });\n dispatch(setWebPubZoom(getSetting(\"zoom\")));\n } else {\n const next = Math.max(min, (getSetting(\"fontSize\") ?? 1) - step);\n await submitPreferences({ fontSize: next });\n dispatch(setFontSize(getSetting(\"fontSize\")));\n }\n }, [isWebPub, getSetting, min, step, submitPreferences, dispatch]);\n\n return { zoomIn, zoomOut };\n};\n","import { ThLayoutUI } from \"@/preferences\";\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport classNames from \"classnames\";\n\ninterface ReaderStyleOptions {\n layoutUI: ThLayoutUI;\n isScroll: boolean;\n isImmersive?: boolean;\n isHovering?: boolean;\n isFXL?: boolean;\n breakpoint?: string;\n containerBreakpoint?: string;\n}\n\nconst LAYOUT_CLASSES = {\n [ThLayoutUI.stacked]: \"thorium_web_stackedUI\",\n [ThLayoutUI.layered]: \"thorium_web_layeredUI\",\n} as const;\n\nconst toBreakpointClass = (prefix: string, bp: string) =>\n `${ prefix }${ bp.charAt(0).toUpperCase() + bp.slice(1) }`;\n\nexport function getReaderClassNames(options: ReaderStyleOptions): string {\n const {\n layoutUI,\n isScroll,\n isImmersive = false,\n isHovering = false,\n isFXL = false,\n breakpoint,\n containerBreakpoint,\n } = options;\n\n return classNames(\n readerStyles.shell,\n isScroll ? \"thorium_web_isScroll\" : \"thorium_web_isPaged\",\n isImmersive && \"thorium_web_isImmersive\",\n isHovering && \"thorium_web_isHovering\",\n isFXL ? \"thorium_web_isFXL\" : \"thorium_web_isReflow\",\n LAYOUT_CLASSES[layoutUI],\n breakpoint ? toBreakpointClass(\"thorium_web_is\", breakpoint) : undefined,\n containerBreakpoint ? toBreakpointClass(\"thorium_web_container_is\", containerBreakpoint) : undefined\n );\n}"]}
1
+ {"version":3,"sources":["../src/components/StatefulReaderRunningHead.tsx","../src/components/StatefulReaderHeader.tsx","../src/components/assets/styles/thorium-web.reader.pagination.module.css","../src/components/assets/styles/thorium-web.reader.progression.module.css","../src/core/Components/Reader/ThProgression.tsx","../src/components/StatefulReaderProgression.tsx","../src/components/StatefulReaderPagination.tsx","../src/components/StatefulReaderFooter.tsx","../src/core/Hooks/fonts/androidPatchCss.ts","../src/core/Hooks/fonts/useFonts.ts","../src/components/Settings/hooks/useZoomCallbacks.ts","../src/components/Helpers/getReaderClassNames.ts"],"names":["Fragment","jsx","wrapper","listItem","leftButton","progression","rightButton","label","useMemo","classNames","useRef","jsxs","useCallback","useEffect"],"mappings":"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","file":"chunk-KD727LNE.mjs","sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThRunningHead } from \"@/core/Components\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\n\nexport const StatefulReaderRunningHead = ({ \n formatPref\n}: {\n formatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n const { t } = useI18n();\n \n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n\n // Get the fallback format based on isFXL\n const fallbackFormat = useMemo<ThFormatPrefValue<ThRunningHeadFormat>>(() => ({\n variants: ThRunningHeadFormat.title,\n displayInImmersive: true,\n displayInFullscreen: true\n }), []);\n\n const breakpointsMap = useMemo(() => {\n return makeBreakpointsMap<ThFormatPrefValue<ThRunningHeadFormat>>({\n defaultValue: formatPref?.default || fallbackFormat,\n fromEnum: ThRunningHeadFormat,\n pref: formatPref?.breakpoints,\n validateKey: \"variants\"\n });\n }, [formatPref, fallbackFormat]);\n \n // Get current preferences with proper fallback\n const currentPrefs = useMemo(() => {\n if (!breakpoint) return formatPref?.default || fallbackFormat;\n return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n\n const displayFormat = useMemo(() => {\n if (!variants) return ThRunningHeadFormat.title;\n \n // Check if we should hide in immersive mode\n if (isImmersive && displayInImmersive === false && !isHovering) {\n return ThRunningHeadFormat.none;\n }\n \n // Check if we should hide in fullscreen mode\n if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n return ThRunningHeadFormat.none;\n }\n \n return variants;\n }, [variants, isImmersive, displayInImmersive, isHovering, isFullscreen, displayInFullscreen]);\n\n const runningHead = useMemo(() => {\n if (displayFormat === ThRunningHeadFormat.title) {\n return unstableTimeline?.title || \"\";\n } else if (displayFormat === ThRunningHeadFormat.chapter) {\n return unstableTimeline?.progression?.currentChapter || unstableTimeline?.title || \"\";\n }\n return \"\";\n }, [displayFormat, unstableTimeline]);\n\n if (!runningHead || displayFormat === ThRunningHeadFormat.none) return null;\n \n return (\n <>\n <ThRunningHead \n label={ runningHead } \n aria-label={ t(\"reader.app.header.runningHead\") }\n />\n </>\n );\n}","\"use client\";\n\nimport React from \"react\";\n\nimport { ActionKeyType } from \"@/preferences\";\nimport { ThLayoutUI, ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref } from \"@/preferences\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerHeaderStyles from \"./assets/styles/thorium-web.reader.header.module.css\";\nimport overflowMenuStyles from \"./Actions/assets/styles/thorium-web.overflow.module.css\";\n\nimport { ThHeader } from \"@/core/Components/Reader/ThHeader\";\nimport { StatefulBackLink } from \"./StatefulBackLink\";\nimport { StatefulReaderRunningHead } from \"./StatefulReaderRunningHead\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulCollapsibleActionsBar } from \"./Actions/StatefulCollapsibleActionsBar\";\n\nimport { useReaderHeaderBase } from \"./hooks/useReaderHeaderBase\";\nimport { usePreferences } from \"@/preferences/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderHeader = ({\n actionKeys,\n actionsOrder,\n layout,\n runningHeadFormatPref\n}: {\n actionKeys: ActionKeyType[];\n actionsOrder: ActionKeyType[];\n layout: ThLayoutUI;\n runningHeadFormatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n const {\n headerRef, focusWithinProps, setHover, removeHover,\n listActionItems, isImmersive, isHovering, isScroll, t,\n } = useReaderHeaderBase(actionKeys);\n\n const { preferences } = usePreferences();\n\n return (\n <>\n <ThInteractiveOverlay\n className={ classNames(readerStyles.barOverlay, readerStyles.headerOverlay) }\n isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n />\n\n <ThHeader\n ref={ headerRef }\n className={ classNames(readerStyles.topBar, readerHeaderStyles.header) }\n aria-label={ t(\"reader.app.header.label\") }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n { ...focusWithinProps }\n >\n { preferences.theming.header?.backLink && <StatefulBackLink className={ readerHeaderStyles.backlinkWrapper } /> }\n\n <StatefulReaderRunningHead formatPref={ runningHeadFormatPref } />\n\n <StatefulCollapsibleActionsBar\n id=\"reader-header-overflowMenu\"\n items={ listActionItems() }\n prefs={{ ...preferences.actions, displayOrder: actionsOrder }}\n className={ readerHeaderStyles.actionsWrapper }\n aria-label={ t(\"reader.app.header.actions\") }\n overflowMenuClassName={\n (!isScroll || preferences.affordances.scroll.hintInImmersive)\n ? overflowMenuStyles.hint\n : undefined\n }\n />\n </ThHeader>\n </>\n );\n};\n",".wrapper {\n box-sizing: border-box;\n display: grid;\n gap: calc(var(--th-layout-spacing) / 2);\n grid-template-areas: \"pagination-start pagination-center pagination-end\";\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n align-items: center;\n width: 100%;\n max-width: var(--th-layout-constraints-pagination, 100%);\n}\n\n.listItem {\n box-sizing: border-box;\n list-style: none;\n}\n\n.listItem:has(.leftButton) {\n grid-area: pagination-start;\n justify-self: start;\n}\n\n.listItem:has(.progression) {\n grid-area: pagination-center;\n justify-self: center;\n}\n\n.listItem:has(.rightButton) {\n grid-area: pagination-end;\n justify-self: end;\n}\n\n\n.listItem button {\n box-sizing: border-box;\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n gap: calc(var(--th-layout-spacing) / 2);\n max-height: calc(var(--th-icon-size, 24px) * 2);\n max-width: 100%;\n border-radius: var(--th-layout-radius);\n display: flex;\n align-items: center;\n}\n\n.rightButton {\n margin-inline-start: auto;\n text-align: end;\n}\n\n.listItem button[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.listItem button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.listItem button[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.listItem button .label {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n white-space: normal;\n -webkit-line-clamp: 1;\n line-clamp: 1;\n}\n\n.listItem button svg {\n flex: none;\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n fill: currentColor;\n}",".wrapper {\n color: var(--th-theme-text);\n font-variant-numeric: lining-nums tabular-nums;\n text-align: center;\n}","\"use client\";\n\nimport React from \"react\";\n\nexport interface ThProgressionProps extends React.HTMLAttributes<HTMLDivElement> {\n ref?: React.RefObject<HTMLDivElement>\n}\n\nexport const ThProgression = ({ \n ref,\n children, \n ...props\n}: ThProgressionProps) => {\n return (\n <>\n <div \n ref={ ref } \n {...props }\n >\n { children }\n </div>\n </>\n )\n}","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport progressionStyles from \"./assets/styles/thorium-web.reader.progression.module.css\";\n\nimport { ThProgressionFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThProgression } from \"@/core/Components/Reader/ThProgression\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport { getBestMatchingProgressionFormat } from \"@/core/Helpers/progressionFormat\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderProgression = ({ \n className,\n formatPref,\n fallbackVariant\n}: { \n className?: string,\n formatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>,\n fallbackVariant: ThProgressionFormat | Array<ThProgressionFormat>\n}) => {\n const { t } = useI18n();\n \n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n \n const fallbackFormat = useMemo(() => {\n return {\n variants: fallbackVariant,\n displayInImmersive: true,\n displayInFullscreen: true\n };\n }, [fallbackVariant]);\n \n const breakpointsMap = useMemo(() => {\n return makeBreakpointsMap<ThFormatPrefValue<ThProgressionFormat | ThProgressionFormat[]>>({\n defaultValue: formatPref?.default || fallbackFormat,\n fromEnum: ThProgressionFormat,\n pref: formatPref?.breakpoints,\n validateKey: \"variants\"\n });\n }, [formatPref, fallbackFormat]);\n \n // Get current preferences with proper fallback\n const currentPrefs = useMemo(() => {\n if (!breakpoint) return formatPref?.default || fallbackFormat;\n return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n \n // Get the display format, handling both single format and array of formats\n const displayFormat = useMemo(() => {\n if (!variants) return fallbackFormat.variants;\n \n // Check if we should hide in immersive mode\n if (isImmersive && displayInImmersive === false && !isHovering) {\n return ThProgressionFormat.none;\n }\n \n // Check if we should hide in fullscreen mode\n if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n return ThProgressionFormat.none;\n }\n \n if (Array.isArray(variants)) {\n return getBestMatchingProgressionFormat(variants, unstableTimeline?.progression) || \n fallbackFormat.variants;\n }\n \n return variants;\n }, [variants, unstableTimeline?.progression, fallbackFormat, isImmersive, isHovering, isFullscreen, displayInImmersive, displayInFullscreen]);\n\n // Compute display text based on current position and timeline\n const displayText = useMemo(() => {\n if (displayFormat === ThProgressionFormat.none || !unstableTimeline?.progression) {\n return \"\";\n }\n\n const { \n currentPositions = [],\n totalPositions,\n relativeProgression,\n totalProgression,\n currentChapter,\n positionsLeft,\n totalItems,\n currentIndex\n } = unstableTimeline.progression;\n \n let text = \"\";\n \n // Format positions for display (handle array of two positions with a dash)\n const formatPositions = (positions: number[]) => {\n if (positions.length === 2) {\n return positions.join(\"–\");\n }\n return positions[0]?.toString() || \"\";\n };\n \n switch (displayFormat) {\n case ThProgressionFormat.positions:\n if (currentPositions.length > 0) {\n text = formatPositions(currentPositions);\n }\n break;\n \n case ThProgressionFormat.positionsOfTotal:\n if (currentPositions.length > 0 && totalPositions) {\n text = t(\"reader.progression.xOfY.compact\", { \n x: formatPositions(currentPositions),\n y: totalPositions\n });\n }\n break;\n\n case ThProgressionFormat.positionsPercentOfTotal:\n if (currentPositions.length > 0 && totalPositions) {\n const percentage = Math.round((totalProgression || 0) * 100);\n text = t(\"reader.progression.xOfY.descriptive\", { \n x: formatPositions(currentPositions),\n y: totalPositions,\n z: `${ percentage }%`\n });\n }\n break;\n \n case ThProgressionFormat.positionsLeft:\n if (positionsLeft !== undefined) {\n text = t(`reader.progression.positionsLeftInChapter.descriptive`, { \n count: positionsLeft\n });\n }\n break;\n \n case ThProgressionFormat.overallProgression:\n if (totalProgression !== undefined) {\n const percentage = Math.round(totalProgression * 100);\n text = `${ percentage }%`;\n }\n break;\n \n case ThProgressionFormat.resourceProgression:\n if (relativeProgression !== undefined) {\n const percentage = Math.round(relativeProgression * 100);\n text = `${ percentage }%`;\n }\n break;\n \n case ThProgressionFormat.progressionOfResource:\n if (relativeProgression !== undefined) {\n const percentage = Math.round(relativeProgression * 100);\n text = t(\"reader.progression.xOfY.compact\", {\n x: `${ percentage }%`,\n y: currentChapter || t(\"reader.app.progression.referenceFallback\")\n });\n }\n break;\n\n case ThProgressionFormat.readingOrderIndex:\n if (currentIndex !== undefined && totalItems !== undefined) {\n text = t(\"reader.progression.xOfY.compact\", {\n x: currentIndex,\n y: totalItems\n });\n }\n break;\n }\n \n return text;\n }, [displayFormat, unstableTimeline, t]);\n\n if (!displayText || displayFormat === ThProgressionFormat.none) {\n return null;\n }\n\n return (\n <ThProgression \n id=\"current-progression\" \n className={ classNames(progressionStyles.wrapper, className) }\n aria-label={ t(\"reader.app.progression.wrapper\") }\n >\n { displayText }\n </ThProgression>\n );\n};","\"use client\";\n\nimport { useRef, KeyboardEvent } from \"react\";\n\nimport { ThPagination, ThPaginationProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nexport const StatefulReaderPagination = ({\n ref,\n links,\n compounds,\n children,\n ...props\n}: ThPaginationProps) => {\n const leftButtonRef = useRef<HTMLButtonElement>(null);\n const rightButtonRef = useRef<HTMLButtonElement>(null);\n\n const updatedCompounds = {\n ...compounds,\n leftButton: {\n ...compounds?.leftButton,\n ref: leftButtonRef,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n leftButtonRef.current?.blur();\n }\n }\n },\n rightButton: {\n ...compounds?.rightButton,\n ref: rightButtonRef,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n rightButtonRef.current?.blur();\n }\n }\n }\n };\n\n return (\n <ThPagination\n ref={ ref }\n className={ readerPaginationStyles.wrapper }\n links={ links }\n compounds={ updatedCompounds }\n { ...props }\n >\n { children }\n </ThPagination>\n )\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nimport { ThBreakpoints, ThLayoutUI, ThFormatPref, ThProgressionFormat } from \"@/preferences/models\";\n\nimport { ThFooter } from \"@/core/Components/Reader/ThFooter\";\nimport { StatefulReaderProgression } from \"./StatefulReaderProgression\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulReaderPagination } from \"./StatefulReaderPagination\";\nimport { ThPaginationLinkProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useFocusWithin, useLocale } from \"react-aria\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { useIsScroll } from \"@/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderFooter = ({\n layout,\n progressionFormatPref,\n progressionFormatFallback\n}: {\n layout: ThLayoutUI;\n progressionFormatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>;\n progressionFormatFallback: ThProgressionFormat | ThProgressionFormat[];\n}) => {\n const { t } = useI18n();\n const { direction } = useLocale();\n const footerRef = useRef<HTMLDivElement>(null);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const hasScrollAffordance = useAppSelector(state => state.reader.hasScrollAffordance);\n const isRTL = useAppSelector(state => state.publication.isRTL);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = useIsScroll();\n const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n const timeline = useAppSelector(state => state.publication.unstableTimeline);\n\n const dispatch = useAppDispatch();\n\n const { focusWithinProps } = useFocusWithin({\n onFocusWithin() {\n dispatch(setHovering(true));\n },\n onBlurWithin() {\n dispatch(setHovering(false));\n }\n });\n\n const setHover = () => {\n if (!hasScrollAffordance) {\n dispatch(setHovering(true));\n }\n };\n\n const removeHover = () => {\n if (!hasScrollAffordance) {\n dispatch(setHovering(false));\n }\n };\n\n const { previousLocator, nextLocator, go } = useNavigator().unified;\n\n const buildNode = useCallback((\n locator: ReturnType<typeof previousLocator>,\n title: string | undefined,\n compactKey: string,\n descriptiveKey: string\n ) => {\n if (!locator) return undefined;\n\n return breakpoint !== ThBreakpoints.compact && breakpoint !== ThBreakpoints.medium ? (\n <>\n <span className={ readerStyles.srOnly }>{ t(descriptiveKey) }</span>\n <span className={ readerPaginationStyles.label }>{ title || locator.title || t(compactKey) }</span>\n </>\n ) : (\n <span className={ readerPaginationStyles.label }>{ t(compactKey) }</span>\n );\n }, [t, breakpoint]);\n\n const updateLinks = useCallback(() => {\n const previous = previousLocator();\n const next = nextLocator();\n\n const previousLink: ThPaginationLinkProps | undefined = previous ? {\n node: buildNode(\n previous,\n timeline?.previousItem?.title,\n isFXL ? \"reader.actions.goToPreviousPage.compact\" : \"reader.actions.goToPreviousChapter.compact\",\n isFXL ? \"reader.actions.goToPreviousPage.descriptive\" : \"reader.actions.goToPreviousChapter.descriptive\"\n ),\n onPress: () => go(previous, !reducedMotion, () => {})\n } : undefined;\n\n const nextLink: ThPaginationLinkProps | undefined = next ? {\n node: buildNode(\n next,\n timeline?.nextItem?.title,\n isFXL ? \"reader.actions.goToNextPage.compact\" : \"reader.actions.goToNextChapter.compact\",\n isFXL ? \"reader.actions.goToNextPage.descriptive\" : \"reader.actions.goToNextChapter.descriptive\"\n ),\n onPress: () => go(next, !reducedMotion, () => {})\n } : undefined;\n\n return isRTL\n ? { left: nextLink, right: previousLink }\n : { left: previousLink, right: nextLink };\n }, [go, previousLocator, nextLocator, buildNode, timeline, reducedMotion, isFXL, isRTL]);\n\n useEffect(() => {\n updateLinks();\n }, [timeline, updateLinks]);\n\n useEffect(() => {\n // Blur any focused element when entering immersive mode\n if (isImmersive) {\n const focusElement = document.activeElement;\n if (focusElement && footerRef.current?.contains(focusElement)) {\n (focusElement as HTMLElement).blur();\n }\n }\n }, [isImmersive]);\n\n return(\n <>\n <ThInteractiveOverlay\n className={ classNames(readerStyles.barOverlay, readerStyles.footerOverlay) }\n isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n />\n\n <ThFooter\n ref={ footerRef }\n className={ readerStyles.bottomBar }\n aria-label={ t(\"reader.app.footer.label\") }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n { ...focusWithinProps }\n >\n { (isScroll)\n ? <StatefulReaderPagination\n aria-label={ t(\"reader.navigation.scroll.wrapper\") }\n links={ updateLinks() }\n dir={ direction }\n compounds={ {\n listItem: {\n className: readerPaginationStyles.listItem\n },\n leftButton: {\n className: readerPaginationStyles.leftButton,\n preventFocusOnPress: true\n },\n rightButton: {\n className: readerPaginationStyles.rightButton,\n preventFocusOnPress: true\n }\n } }\n >\n <StatefulReaderProgression\n className={ readerPaginationStyles.progression }\n formatPref={ progressionFormatPref }\n fallbackVariant={ progressionFormatFallback }\n />\n </StatefulReaderPagination>\n : <StatefulReaderProgression\n formatPref={ progressionFormatPref }\n fallbackVariant={ progressionFormatFallback }\n /> }\n </ThFooter>\n </>\n )\n}\n","export const getAndroidPatchCss = () => {\n if (typeof window === \"undefined\") {\n return \"\";\n }\n \n const origin = window.location.origin;\n \n return `/* Readium CSS\n Android Fonts Patch module\n\n A stylesheet aligning Android generic serif and sans-serif fonts on other platforms\n\n Repo: https://github.com/readium/css */\n\n/* Android resolves sans-serif to Roboto, and serif to Droid Serif \n This created issues for FXL EPUBs relying on Times (New Roman),\n Helvetica or Arial while not embedding the font files in the package.\n\n See https://github.com/readium/css/issues/149\n\n Unfortunately it is no possible to target generic family using @font-face,\n we have to target specific font-family names e.g. Times, Arial, etc.\n\n This stylesheet/patch should be loaded only for this case i.e.\n a Fixed-Layout EPUB with text but no embedded font on an Android device.\n The logic for checking these conditions are up to implementers.\n*/\n\n/* Serif (Times + Times New Roman) */\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n/* Sans-serif (Helvetica + Arial) */\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}`;\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { InjectableFontResources } from \"@/preferences/services/fonts\";\nimport { ILinkInjectable, IUrlInjectable, IBlobInjectable } from \"@readium/navigator\";\n\nimport { getPlatform } from \"@/core/Helpers/getPlatform\";\nimport { getAndroidPatchCss } from \"./androidPatchCss\";\n\ntype FontResource = (ILinkInjectable & IUrlInjectable) | (ILinkInjectable & IBlobInjectable);\n\nexport const useFonts = (fontResources?: InjectableFontResources | null) => {\n const injectedElementsRef = useRef<{\n prepend: HTMLElement[];\n append: HTMLElement[];\n }>({\n prepend: [],\n append: []\n });\n\n const createLinkElement = useCallback((resource: FontResource): HTMLLinkElement => {\n const link = document.createElement(\"link\");\n \n // Set all custom attributes first to make sure they are\n // overridden by the core attributes\n if (\"attributes\" in resource && resource.attributes) {\n Object.entries(resource.attributes).forEach(([key, value]) => {\n link.setAttribute(key, value as string);\n });\n }\n \n link.rel = resource.rel;\n link.as = resource.as;\n \n if (\"url\" in resource) {\n link.href = resource.url;\n } else if (\"blob\" in resource && resource.blob) {\n link.href = URL.createObjectURL(resource.blob);\n }\n \n return link;\n }, []);\n\n const removeInjectedElements = useCallback(() => {\n const { prepend, append } = injectedElementsRef.current;\n \n [...prepend, ...append].forEach(element => {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n // Revoke blob URLs to prevent memory leaks\n if (element instanceof HTMLLinkElement && element.href.startsWith(\"blob:\")) {\n URL.revokeObjectURL(element.href);\n }\n });\n \n injectedElementsRef.current = {\n prepend: [],\n append: []\n };\n }, []);\n\n const injectFontResources = useCallback((resources: InjectableFontResources | null) => {\n if (typeof document === \"undefined\") return;\n \n removeInjectedElements();\n \n if (!resources) return;\n \n const { prepend, append } = resources;\n const injectedElements = injectedElementsRef.current;\n \n prepend.forEach(resource => {\n const element = createLinkElement(resource);\n document.head.insertBefore(element, document.head.firstChild);\n injectedElements.prepend.push(element);\n });\n \n append.forEach(resource => {\n const element = createLinkElement(resource);\n document.head.appendChild(element);\n injectedElements.append.push(element);\n });\n }, [createLinkElement, removeInjectedElements]);\n\n const getAndroidFXLPatch = useCallback((): (ILinkInjectable & IBlobInjectable) | null => {\n const platform = getPlatform();\n const isAndroid = platform === \"android\";\n \n if (!isAndroid) {\n return null;\n }\n \n const cssContent = getAndroidPatchCss();\n const blob = new Blob([cssContent], { type: \"text/css\" });\n \n return {\n as: \"link\",\n rel: \"stylesheet\",\n blob\n };\n }, []);\n\n useEffect(() => {\n injectFontResources(fontResources || null);\n \n return () => {\n removeInjectedElements();\n };\n }, [fontResources, injectFontResources, removeInjectedElements]);\n\n return {\n injectFontResources,\n removeFontResources: removeInjectedElements,\n getAndroidFXLPatch\n };\n};","import { useCallback } from \"react\";\n\nimport { ThSettingsKeys } from \"@/preferences/models\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontSize } from \"@/lib/settingsReducer\";\nimport { setWebPubZoom } from \"@/lib/webPubSettingsReducer\";\nimport { useEffectiveRange } from \"./useEffectiveRange\";\nimport { EpubPreferencesEditor, IEpubPreferences, IWebPubPreferences, WebPubPreferencesEditor } from \"@readium/navigator\";\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useWebPubNavigator } from \"@/core/Hooks/WebPub/useWebPubNavigator\";\n\ntype ZoomNavigator = ReturnType<typeof useEpubNavigator> | ReturnType<typeof useWebPubNavigator>;\n\nexport const useZoomCallbacks = (navigator: ZoomNavigator) => {\n const { preferences } = usePreferences();\n const readerProfile = useAppSelector(state => state.reader.profile);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const dispatch = useAppDispatch();\n\n const isWebPub = readerProfile === \"webPub\";\n\n const getSetting = navigator.getSetting as (key: string) => number | null | undefined;\n const submitPreferences = navigator.submitPreferences as (prefs: IEpubPreferences | IWebPubPreferences) => Promise<void>;\n const { preferencesEditor } = navigator;\n\n const supportedRange = isWebPub\n ? (preferencesEditor as WebPubPreferencesEditor)?.zoom?.supportedRange\n : isFXL\n ? (preferencesEditor as unknown as WebPubPreferencesEditor)?.zoom?.supportedRange\n : (preferencesEditor as EpubPreferencesEditor)?.fontSize?.supportedRange;\n\n const zoomConfig = preferences.settings.keys[ThSettingsKeys.zoom];\n const { range } = useEffectiveRange(zoomConfig.range, supportedRange);\n const [min, max] = range;\n const step = zoomConfig.step ?? 0.05;\n\n const zoomIn = useCallback(async () => {\n if (isWebPub) {\n const next = Math.min(max, (getSetting(\"zoom\") ?? 1) + step);\n await submitPreferences({ zoom: next });\n dispatch(setWebPubZoom(getSetting(\"zoom\")));\n } else {\n const next = Math.min(max, (getSetting(\"fontSize\") ?? 1) + step);\n await submitPreferences({ fontSize: next });\n dispatch(setFontSize(getSetting(\"fontSize\")));\n }\n }, [isWebPub, getSetting, max, step, submitPreferences, dispatch]);\n\n const zoomOut = useCallback(async () => {\n if (isWebPub) {\n const next = Math.max(min, (getSetting(\"zoom\") ?? 1) - step);\n await submitPreferences({ zoom: next });\n dispatch(setWebPubZoom(getSetting(\"zoom\")));\n } else {\n const next = Math.max(min, (getSetting(\"fontSize\") ?? 1) - step);\n await submitPreferences({ fontSize: next });\n dispatch(setFontSize(getSetting(\"fontSize\")));\n }\n }, [isWebPub, getSetting, min, step, submitPreferences, dispatch]);\n\n return { zoomIn, zoomOut };\n};\n","import { ThLayoutUI } from \"@/preferences\";\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport classNames from \"classnames\";\n\ninterface ReaderStyleOptions {\n layoutUI: ThLayoutUI;\n isScroll: boolean;\n isImmersive?: boolean;\n isHovering?: boolean;\n isFXL?: boolean;\n breakpoint?: string;\n containerBreakpoint?: string;\n}\n\nconst LAYOUT_CLASSES = {\n [ThLayoutUI.stacked]: \"thorium_web_stackedUI\",\n [ThLayoutUI.layered]: \"thorium_web_layeredUI\",\n} as const;\n\nconst toBreakpointClass = (prefix: string, bp: string) =>\n `${ prefix }${ bp.charAt(0).toUpperCase() + bp.slice(1) }`;\n\nexport function getReaderClassNames(options: ReaderStyleOptions): string {\n const {\n layoutUI,\n isScroll,\n isImmersive = false,\n isHovering = false,\n isFXL = false,\n breakpoint,\n containerBreakpoint,\n } = options;\n\n return classNames(\n readerStyles.shell,\n isScroll ? \"thorium_web_isScroll\" : \"thorium_web_isPaged\",\n isImmersive && \"thorium_web_isImmersive\",\n isHovering && \"thorium_web_isHovering\",\n isFXL ? \"thorium_web_isFXL\" : \"thorium_web_isReflow\",\n LAYOUT_CLASSES[layoutUI],\n breakpoint ? toBreakpointClass(\"thorium_web_is\", breakpoint) : undefined,\n containerBreakpoint ? toBreakpointClass(\"thorium_web_container_is\", containerBreakpoint) : undefined\n );\n}"]}
@@ -0,0 +1,37 @@
1
+ // src/core/Helpers/getPlatform.ts
2
+ var getPlatform = () => {
3
+ if (typeof window !== "undefined") {
4
+ const nav = window.navigator;
5
+ if (nav.userAgentData) {
6
+ return nav.userAgentData.platform.toLowerCase();
7
+ }
8
+ if (typeof nav.platform !== "undefined") {
9
+ if (typeof nav.userAgent !== "undefined" && /android/.test(nav.userAgent.toLowerCase())) {
10
+ return "android";
11
+ }
12
+ return nav.platform.toLowerCase();
13
+ }
14
+ }
15
+ return "unknown";
16
+ };
17
+ var isMacish = () => {
18
+ const MacOSPattern = /mac|ipod|iphone|ipad/i;
19
+ const platform = getPlatform();
20
+ return MacOSPattern.test(platform);
21
+ };
22
+ var isIpadOS = () => {
23
+ return !!(navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && navigator.userAgent.includes("Intel"));
24
+ };
25
+ var isIOSish = () => {
26
+ const AppleMobilePattern = /ipod|iphone|ipad/i;
27
+ const platform = getPlatform();
28
+ if (AppleMobilePattern.test(platform)) {
29
+ return true;
30
+ } else {
31
+ return isIpadOS();
32
+ }
33
+ };
34
+
35
+ export { getPlatform, isIOSish, isIpadOS, isMacish };
36
+ //# sourceMappingURL=chunk-KQ3KS5O5.mjs.map
37
+ //# sourceMappingURL=chunk-KQ3KS5O5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/Helpers/getPlatform.ts"],"names":[],"mappings":";AAcO,IAAM,cAAc,MAAM;AAC/B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,MAAM,MAAA,CAAO,SAAA;AAEnB,IAAA,IAAI,IAAI,aAAA,EAAe;AACrB,MAAA,OAAO,GAAA,CAAI,aAAA,CAAc,QAAA,CAAS,WAAA,EAAY;AAAA,IAChD;AAGA,IAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,WAAA,EAAa;AAEvC,MAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,KAAK,GAAA,CAAI,SAAA,CAAU,WAAA,EAAa,CAAA,EAAG;AACvF,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA,CAAI,SAAS,WAAA,EAAY;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEO,IAAM,WAAW,MAAM;AAC5B,EAAA,MAAM,YAAA,GAAe,uBAAA;AACrB,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAO,YAAA,CAAa,KAAK,QAAQ,CAAA;AACnC;AAGO,IAAM,WAAW,MAAM;AAC5B,EAAA,OAAO,CAAC,EAAE,SAAA,CAAU,cAAA,IACX,SAAA,CAAU,iBAAiB,CAAA,IAC3B,SAAA,CAAU,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,CAAA;AAC/C;AAGO,IAAM,WAAW,MAAM;AAC5B,EAAA,MAAM,kBAAA,GAAqB,mBAAA;AAC3B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAO,QAAA,EAAS;AAAA,EAClB;AACF","file":"chunk-KQ3KS5O5.mjs","sourcesContent":["\"use client\";\n\n// Extend Navigator interface to include userAgentData\ndeclare global {\n interface Navigator {\n userAgentData?: {\n brands: Array<{brand: string; version: string}>;\n mobile: boolean;\n platform: string;\n };\n }\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData\nexport const getPlatform = () => {\n if (typeof window !== \"undefined\") {\n const nav = window.navigator;\n\n if (nav.userAgentData) {\n return nav.userAgentData.platform.toLowerCase();\n }\n\n // Deprecated but userAgentData still experimental…\n if (typeof nav.platform !== \"undefined\") {\n // android navigator.platform is often set as \"linux\", so we have to check userAgent\n if (typeof nav.userAgent !== \"undefined\" && /android/.test(nav.userAgent.toLowerCase())) {\n return \"android\";\n }\n return nav.platform.toLowerCase();\n }\n }\n\n return \"unknown\";\n};\n\nexport const isMacish = () => {\n const MacOSPattern = /mac|ipod|iphone|ipad/i;\n const platform = getPlatform();\n return MacOSPattern.test(platform);\n}\n\n// “Desktop-class” iPadOS\nexport const isIpadOS = () => {\n return !!(navigator.maxTouchPoints \n && navigator.maxTouchPoints > 2 \n && navigator.userAgent.includes(\"Intel\"));\n}\n\n// Covers all iOS/iPadOS: iPhone/iPod/iPad by platform string + desktop-class iPadOS by UA sniff\nexport const isIOSish = () => {\n const AppleMobilePattern = /ipod|iphone|ipad/i;\n const platform = getPlatform();\n if (AppleMobilePattern.test(platform)) {\n return true;\n } else {\n return isIpadOS();\n }\n}"]}
@@ -1,8 +1,8 @@
1
1
  import { propsToCSSVars } from './chunk-2YRT7RNW.mjs';
2
2
  import { useBreakpoints, useForcedColors, useMonochrome, useReducedMotion, useReducedTransparency } from './chunk-GFSLVQIG.mjs';
3
- import { ThGlobalPreferencesContext } from './chunk-AE6P4KJB.mjs';
4
3
  import { useAppSelector } from './chunk-A575ZW4A.mjs';
5
4
  import { useColorScheme, useContrast } from './chunk-NQ2ZSGCX.mjs';
5
+ import { ThGlobalPreferencesContext } from './chunk-AE6P4KJB.mjs';
6
6
  import { isSupportedLocale, supportedLocales } from './chunk-GNROODJB.mjs';
7
7
  import { createContext, useMemo, useState, useCallback, useEffect, useContext, useRef } from 'react';
8
8
  import { I18nProvider, useLocale } from 'react-aria';
@@ -1508,9 +1508,18 @@ var defaultAudioPreferences = createAudioPreferences({
1508
1508
  },
1509
1509
  collapse: true,
1510
1510
  keys: {
1511
- ["dockingStart" /* start */]: { visibility: "overflow" /* overflow */, shortcut: null },
1512
- ["dockingEnd" /* end */]: { visibility: "overflow" /* overflow */, shortcut: null },
1513
- ["dockingTransient" /* transient */]: { visibility: "overflow" /* overflow */, shortcut: null }
1511
+ ["dockingStart" /* start */]: {
1512
+ visibility: "overflow" /* overflow */,
1513
+ shortcut: null
1514
+ },
1515
+ ["dockingEnd" /* end */]: {
1516
+ visibility: "overflow" /* overflow */,
1517
+ shortcut: null
1518
+ },
1519
+ ["dockingTransient" /* transient */]: {
1520
+ visibility: "overflow" /* overflow */,
1521
+ shortcut: null
1522
+ }
1514
1523
  }
1515
1524
  }
1516
1525
  });
@@ -2207,7 +2216,9 @@ var useAudioActionsPreferences = () => {
2207
2216
  return {
2208
2217
  docking: audioCtx.preferences.docking,
2209
2218
  primaryActionsKeys: audioCtx.preferences.actions.primary.keys,
2210
- secondaryActionsKeys: audioCtx.preferences.actions.secondary.keys
2219
+ secondaryActionsKeys: audioCtx.preferences.actions.secondary.keys,
2220
+ primaryDisplayOrder: audioCtx.preferences.actions.primary.displayOrder,
2221
+ secondaryDisplayOrder: audioCtx.preferences.actions.secondary.displayOrder
2211
2222
  };
2212
2223
  };
2213
2224
  function useAudioPreferences() {
@@ -2670,7 +2681,7 @@ var deriveExcluded = (entry) => {
2670
2681
  };
2671
2682
  var CJK_VERTICAL_EXCLUDED = [...deriveExcluded(ReadiumCSSSettings["cjk-vertical"]), "layout" /* layout */];
2672
2683
  var EXCLUDED_BY_SCRIPT_MODE = {
2673
- "ltr": deriveExcluded(ReadiumCSSSettings["default"]),
2684
+ "ltr": deriveExcluded(ReadiumCSSSettings["ltr"]),
2674
2685
  "rtl": deriveExcluded(ReadiumCSSSettings["rtl"]),
2675
2686
  "cjk-horizontal": deriveExcluded(ReadiumCSSSettings["cjk-horizontal"]),
2676
2687
  "cjk-vertical": CJK_VERTICAL_EXCLUDED,
@@ -3976,5 +3987,5 @@ var useSharedPreferences = () => {
3976
3987
  };
3977
3988
 
3978
3989
  export { TEXT_INPUT_SELECTORS, ThActionsKeys, ThAudioActionKeys, ThAudioAffordance, ThAudioKeys, ThAudioMemoryPreferencesAdapter, ThAudioPreferencesContext, ThAudioPreferencesProvider, ThDockingKeys, ThDockingTypes, ThGlobalMemoryPreferencesAdapter, ThGlobalPreferencesProvider, ThLayoutOptions, ThLineHeightOptions, ThMemoryPreferencesAdapter, ThPreferencesContext, ThPreferencesProvider, ThSettingsContainerKeys, ThSettingsKeys, ThSettingsRangePlaceholder, ThSettingsRangeVariant, ThSettingsTimerVariant, ThSheetHeaderVariant, ThSheetTypes, ThSpacingPresetKeys, ThSpacingSettingsKeys, ThTextAlignOptions, ThTextSettingsKeys, ThThemeKeys, arabicFarsiCollection, buildThemeObject, chineseSimplifiedCollection, chineseTraditionalCollection, contrast1Theme, contrast2Theme, contrast3Theme, createAudioPreferences, createDefinitionFromStaticFonts, createDefinitionsFromBunnyFonts, createDefinitionsFromGoogleFonts, createGlobalPreferences, createPreferences, darkTheme, defaultActionKeysObject, defaultAudioContentProtectionConfig, defaultAudioPlaybackRate, defaultAudioPlaybackRateAction, defaultAudioPreferences, defaultAudioPreferencesContextValue, defaultAudioRemotePlaybackAction, defaultAudioSkipBackwardInterval, defaultAudioSkipForwardInterval, defaultAudioSkipInterval, defaultAudioSleepTimer, defaultAudioSleepTimerAction, defaultAudioSleepTimerPresetList, defaultAudioTocAction, defaultAudioVolume, defaultAudioVolumeAction, defaultContentProtectionConfig, defaultFontCollection, defaultFullscreenAction, defaultJumpToPositionAction, defaultLetterSpacing, defaultLineHeights, defaultParagraphIndent, defaultParagraphSpacing, defaultPreferences, defaultPreferencesContextValue, defaultSettingsAction, defaultSpacingPresets, defaultSpacingPresetsOrder, defaultSpacingSettingsMain, defaultSpacingSettingsSubpanel, defaultTextSettingsMain, defaultTextSettingsSubpanel, defaultTocAction, defaultWordSpacing, defaultZoom, devContentProtectionConfig, hebrewCollection, japaneseCollection, japaneseVerticalCollection, koreanCollection, lightTheme, paperTheme, prefixString, proxyUrl, readiumCSSFontCollection, resolveAudioContentProtectionConfig, resolveContentProtectionConfig, sepiaTheme, tamilCollection, useActionsPreferences, useAudioActionsPreferences, useAudioPreferences, useFilteredPreferenceKeys, usePreferenceKeys, usePreferences, useSharedPreferences, useTheming, validateObjectKeys };
3979
- //# sourceMappingURL=chunk-PRQBFBJ7.mjs.map
3980
- //# sourceMappingURL=chunk-PRQBFBJ7.mjs.map
3990
+ //# sourceMappingURL=chunk-MBB6VHEQ.mjs.map
3991
+ //# sourceMappingURL=chunk-MBB6VHEQ.mjs.map