@edrlab/thorium-web 1.3.0 → 1.4.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-D0rzsGRl.d.mts → ThPreferencesAdapter-L1H6gzmu.d.mts} +23 -6
- package/dist/{ThSettingsWrapper-BXuRgdqp.d.mts → ThSettingsWrapper-DWEA4hYF.d.mts} +1 -1
- package/dist/{actions-BLAr0oaM.d.mts → actions-BjeRjaJU.d.mts} +1 -1
- package/dist/{actionsReducer-BhG1wicI.d.mts → actionsReducer-B32cq2mB.d.mts} +11 -4
- package/dist/{chunk-L4XGZAZ5.mjs → chunk-2YRT7RNW.mjs} +20 -3
- package/dist/chunk-2YRT7RNW.mjs.map +1 -0
- package/dist/{chunk-UCTMVCW7.mjs → chunk-6MONB2DN.mjs} +91 -63
- package/dist/chunk-6MONB2DN.mjs.map +1 -0
- package/dist/chunk-A575ZW4A.mjs +10 -0
- package/dist/chunk-A575ZW4A.mjs.map +1 -0
- package/dist/chunk-AE6P4KJB.mjs +13 -0
- package/dist/chunk-AE6P4KJB.mjs.map +1 -0
- package/dist/{chunk-OWHP7ONM.mjs → chunk-IVXRCKWR.mjs} +4 -4
- package/dist/{chunk-OWHP7ONM.mjs.map → chunk-IVXRCKWR.mjs.map} +1 -1
- package/dist/{chunk-RRVLWDT3.mjs → chunk-KVUG6BNI.mjs} +92 -27
- package/dist/chunk-KVUG6BNI.mjs.map +1 -0
- package/dist/{chunk-IYAFKTPL.mjs → chunk-NUXGQWED.mjs} +7 -5
- package/dist/chunk-NUXGQWED.mjs.map +1 -0
- package/dist/{chunk-4ODYHZKD.mjs → chunk-P6ILEQ5P.mjs} +49 -51
- package/dist/chunk-P6ILEQ5P.mjs.map +1 -0
- package/dist/{chunk-D7MFLHXV.mjs → chunk-PXXWEMNL.mjs} +951 -592
- package/dist/chunk-PXXWEMNL.mjs.map +1 -0
- package/dist/{chunk-T2E6MRVP.mjs → chunk-QUSGPT5M.mjs} +11 -12
- package/dist/chunk-QUSGPT5M.mjs.map +1 -0
- package/dist/{chunk-XBZWGRDM.mjs → chunk-SZAVAQ6S.mjs} +30 -6
- package/dist/chunk-SZAVAQ6S.mjs.map +1 -0
- package/dist/{chunk-3LDWKC5N.mjs → chunk-T5ENYSDJ.mjs} +5 -5
- package/dist/chunk-T5ENYSDJ.mjs.map +1 -0
- package/dist/{chunk-4TVEDX7L.mjs → chunk-TSLTLQ6O.mjs} +127 -41
- package/dist/chunk-TSLTLQ6O.mjs.map +1 -0
- package/dist/{chunk-ITDBOMY5.mjs → chunk-VENFFPK2.mjs} +3 -3
- package/dist/{chunk-ITDBOMY5.mjs.map → chunk-VENFFPK2.mjs.map} +1 -1
- package/dist/{chunk-YZ3KCMKY.mjs → chunk-WLVE3WNW.mjs} +238 -58
- package/dist/chunk-WLVE3WNW.mjs.map +1 -0
- package/dist/chunk-XRFLDNAY.mjs +3913 -0
- package/dist/chunk-XRFLDNAY.mjs.map +1 -0
- package/dist/components/Audio/index.d.mts +12 -12
- package/dist/components/Audio/index.mjs +14 -14
- package/dist/components/Epub/index.css +3 -3
- package/dist/components/Epub/index.css.map +1 -1
- package/dist/components/Epub/index.d.mts +12 -12
- package/dist/components/Epub/index.mjs +15 -15
- package/dist/components/Misc/index.css +2 -2
- package/dist/components/Misc/index.css.map +1 -1
- package/dist/components/Misc/index.mjs +4 -4
- package/dist/components/Reader/index.css +5 -5
- package/dist/components/Reader/index.css.map +1 -1
- package/dist/components/Reader/index.d.mts +11 -11
- package/dist/components/Reader/index.mjs +26 -24
- package/dist/components/Reader/index.mjs.map +1 -1
- package/dist/components/WebPub/index.css +3 -3
- package/dist/components/WebPub/index.css.map +1 -1
- package/dist/components/WebPub/index.d.mts +12 -12
- package/dist/components/WebPub/index.mjs +15 -15
- package/dist/core/Components/index.d.mts +11 -21
- package/dist/core/Components/index.mjs +1 -1
- package/dist/core/Helpers/index.d.mts +1 -1
- package/dist/core/Helpers/index.mjs +2 -3
- package/dist/core/Hooks/index.d.mts +12 -8
- package/dist/core/Hooks/index.mjs +1 -1
- package/dist/i18n/index.mjs +3 -6
- package/dist/lib/index.d.mts +49 -20
- package/dist/lib/index.mjs +3 -2
- package/dist/locales/da/thorium-shared.json +3 -0
- package/dist/locales/en/thorium-shared.json +24 -2
- package/dist/locales/en/thorium-web.json +2 -2
- package/dist/locales/es/thorium-shared.json +364 -0
- package/dist/locales/es/thorium-web.json +130 -0
- package/dist/locales/et/thorium-shared.json +121 -9
- package/dist/locales/et/thorium-web.json +32 -1
- package/dist/locales/fi/thorium-shared.json +42 -4
- package/dist/locales/fi/thorium-web.json +36 -2
- package/dist/locales/fr/thorium-shared.json +108 -1
- package/dist/locales/fr/thorium-web.json +121 -86
- package/dist/locales/it/thorium-shared.json +108 -1
- package/dist/locales/it/thorium-web.json +15 -2
- package/dist/locales/lt/thorium-web.json +10 -1
- package/dist/locales/pl/thorium-web.json +1 -1
- package/dist/locales/pt-BR/thorium-shared.json +6 -0
- package/dist/locales/pt-BR/thorium-web.json +88 -88
- package/dist/locales/pt-PT/thorium-shared.json +91 -0
- package/dist/locales/pt-PT/thorium-web.json +15 -3
- package/dist/locales/sv/thorium-shared.json +108 -2
- package/dist/locales/sv/thorium-web.json +15 -3
- package/dist/locales/tr/thorium-shared.json +42 -0
- package/dist/preferences/index.d.mts +59 -13
- package/dist/preferences/index.mjs +6 -6
- package/dist/{settingsReducer-Bu1zeveu.d.mts → settingsReducer-DLaT2wUB.d.mts} +14 -2
- package/dist/{ui-nBv8gfr0.d.mts → ui-DnZZhozX.d.mts} +1 -1
- package/dist/{useAudioNavigator-C5aW4-eT.d.mts → useAudioNavigator-CWXyNWq1.d.mts} +3 -1
- package/dist/{useContrast-2t429O9O.d.mts → useContrast-Bo7cDw_X.d.mts} +5 -1
- package/dist/{usePreferences-VaBf46eP.d.mts → usePreferences-D8NU1yhP.d.mts} +6 -8
- package/dist/{useReaderTransitions-JDzlBFsu.d.mts → useReaderTransitions-BQGzKeY2.d.mts} +61 -10
- package/package.json +12 -11
- package/dist/chunk-3LDWKC5N.mjs.map +0 -1
- package/dist/chunk-4ODYHZKD.mjs.map +0 -1
- package/dist/chunk-4TVEDX7L.mjs.map +0 -1
- package/dist/chunk-7CGMWOZN.mjs +0 -20
- package/dist/chunk-7CGMWOZN.mjs.map +0 -1
- package/dist/chunk-C236BQQB.mjs +0 -1725
- package/dist/chunk-C236BQQB.mjs.map +0 -1
- package/dist/chunk-D7MFLHXV.mjs.map +0 -1
- package/dist/chunk-IYAFKTPL.mjs.map +0 -1
- package/dist/chunk-L4XGZAZ5.mjs.map +0 -1
- package/dist/chunk-RRVLWDT3.mjs.map +0 -1
- package/dist/chunk-T2E6MRVP.mjs.map +0 -1
- package/dist/chunk-UCTMVCW7.mjs.map +0 -1
- package/dist/chunk-WECWPYZB.mjs +0 -1950
- package/dist/chunk-WECWPYZB.mjs.map +0 -1
- package/dist/chunk-XBZWGRDM.mjs.map +0 -1
- package/dist/chunk-YZ3KCMKY.mjs.map +0 -1
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { useNavigator, StatefulActionIcon, createAudioDefaultPlugin, usePositionStorage, NavigatorProvider, StatefulDockingWrapper, useReaderHeaderBase, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default } from './chunk-
|
|
2
|
-
import { useAudioNavigator, useDocumentTitle, useAudioSettingsCache } from './chunk-
|
|
3
|
-
import {
|
|
1
|
+
import { useNavigator, StatefulActionIcon, createAudioDefaultPlugin, usePositionStorage, NavigatorProvider, StatefulDockingWrapper, useReaderHeaderBase, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default } from './chunk-PXXWEMNL.mjs';
|
|
2
|
+
import { useAudioNavigator, useDocumentTitle, useAudioSettingsCache } from './chunk-SZAVAQ6S.mjs';
|
|
3
|
+
import { setTocEntry, setAdjacentTimelineItems, setSleepTimerOnFragmentEnd, setRemotePlaybackState, setStatus, setSeekableRanges, setSeeking, setStalled, setSleepTimerOnTrackEnd, setTrackReady, setPublicationStart, setPublicationEnd, debounce, setLoading } from './chunk-WLVE3WNW.mjs';
|
|
4
4
|
import { findTocItemByHref } from './chunk-TEZB4ULX.mjs';
|
|
5
|
-
import { useAudioPreferences, proxyUrl } from './chunk-
|
|
6
|
-
import {
|
|
7
|
-
import { ThActionsBar, ThAudioProgress, usePlugins, ThPluginRegistry, ThPluginProvider } from './chunk-
|
|
8
|
-
import { useI18n } from './chunk-
|
|
5
|
+
import { useAudioPreferences, resolveAudioContentProtectionConfig, proxyUrl } from './chunk-XRFLDNAY.mjs';
|
|
6
|
+
import { useAppSelector, useAppDispatch } from './chunk-A575ZW4A.mjs';
|
|
7
|
+
import { ThActionsBar, ThAudioProgress, usePlugins, ThPluginRegistry, ThPluginProvider } from './chunk-P6ILEQ5P.mjs';
|
|
8
|
+
import { useI18n } from './chunk-NUXGQWED.mjs';
|
|
9
9
|
import { useCallback, useState, useMemo, useLayoutEffect, useRef, useEffect, Fragment as Fragment$1 } from 'react';
|
|
10
10
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
11
11
|
import { Link, Locator, LocatorLocations } from '@readium/shared';
|
|
12
|
-
import { I18nProvider } from 'react-aria';
|
|
13
12
|
import classNames from 'classnames';
|
|
14
13
|
|
|
15
14
|
var SvgPause = (props) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24px", viewBox: "0 -960 960 960", width: "24px", fill: "inherit", ...props, children: /* @__PURE__ */ jsx("path", { d: "M560-200v-560h160v560H560Zm-320 0v-560h160v560H240Z" }) });
|
|
@@ -834,7 +833,7 @@ var StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUr
|
|
|
834
833
|
observer.disconnect();
|
|
835
834
|
};
|
|
836
835
|
}, [isExpanded]);
|
|
837
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
836
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(NavigatorProvider, { mediaNavigator: audioNavigator, children: /* @__PURE__ */ jsx("main", { className: thorium_web_audio_app_default.main, children: /* @__PURE__ */ jsx(StatefulDockingWrapper, { children: /* @__PURE__ */ jsxs("div", { className: thorium_web_audio_app_default.shell, children: [
|
|
838
837
|
/* @__PURE__ */ jsx(
|
|
839
838
|
StatefulPlayerHeader,
|
|
840
839
|
{
|
|
@@ -854,9 +853,9 @@ var StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUr
|
|
|
854
853
|
] }) : renderCompactComponents()
|
|
855
854
|
}
|
|
856
855
|
)
|
|
857
|
-
] }) }) }) }) })
|
|
856
|
+
] }) }) }) }) });
|
|
858
857
|
};
|
|
859
858
|
|
|
860
859
|
export { StatefulAudioMediaActions, StatefulAudioPlaybackControls, StatefulAudioProgressBar, StatefulNextButton, StatefulPlayPauseButton, StatefulPlayer, StatefulPreviousButton, StatefulSkipBackwardButton, StatefulSkipForwardButton };
|
|
861
|
-
//# sourceMappingURL=chunk-
|
|
862
|
-
//# sourceMappingURL=chunk-
|
|
860
|
+
//# sourceMappingURL=chunk-QUSGPT5M.mjs.map
|
|
861
|
+
//# sourceMappingURL=chunk-QUSGPT5M.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Audio/controls/assets/icons/pause.svg","../src/components/Audio/controls/assets/icons/play_arrow.svg","../src/components/Audio/controls/assets/styles/thorium-web.audioPlayback.module.css","../src/components/Audio/controls/StatefulPlayPauseButton.tsx","../src/components/Audio/controls/assets/icons/skip_previous.svg","../src/components/Audio/controls/hooks/useAdjacentTocItems.ts","../src/components/Audio/controls/StatefulPreviousButton.tsx","../src/components/Audio/controls/assets/icons/skip_next.svg","../src/components/Audio/controls/StatefulNextButton.tsx","../src/components/Audio/controls/assets/icons/replay.svg","../src/components/Audio/controls/assets/icons/replay_5.svg","../src/components/Audio/controls/assets/icons/replay_10.svg","../src/components/Audio/controls/assets/icons/replay_30.svg","../src/components/Audio/controls/StatefulSkipBackwardButton.tsx","../src/components/Audio/controls/assets/icons/forward_media.svg","../src/components/Audio/controls/assets/icons/forward_5.svg","../src/components/Audio/controls/assets/icons/forward_10.svg","../src/components/Audio/controls/assets/icons/forward_30.svg","../src/components/Audio/controls/StatefulSkipForwardButton.tsx","../src/components/Audio/controls/StatefulAudioPlaybackControls.tsx","../src/components/Audio/controls/assets/styles/thorium-web.audioProgressBar.module.css","../src/components/Audio/controls/StatefulAudioProgressBar.tsx","../src/components/Audio/actions/assets/styles/thorium-web.audioActions.module.css","../src/components/Audio/actions/StatefulAudioMediaActions.tsx","../src/components/Audio/assets/styles/thorium-web.audio.app.module.css","../src/components/Audio/assets/styles/thorium-web.audioPlayer.module.css","../src/components/Audio/StatefulPlayerHeader.tsx","../src/components/Audio/assets/styles/thorium-web.audioCover.module.css","../src/components/Audio/assets/icons/music_note.svg","../src/components/Audio/assets/icons/sync.svg","../src/components/Audio/StatefulAudioCover.tsx","../src/components/Audio/assets/styles/thorium-web.audioMetadata.module.css","../src/components/Audio/StatefulAudioMetadata.tsx","../src/components/Audio/Hooks/useAudioStatelessCache.ts","../src/components/Audio/Hooks/useAudioPreferencesConfig.ts","../src/components/Audio/Hooks/useAudioPlayerInit.ts","../src/helpers/browser.ts","../src/components/Audio/StatefulPlayer.tsx"],"names":["jsx","audioControls","audioPreviousButton","audioNextButton","audioSkipBackwardButton","audioSkipForwardButton","audioPlayPauseButton","Link","wrapper","current","slider","track","thumb","seekableRange","elapsed","remaining","tick","tooltip","useCallback","segments","jsxs","Fragment","main","shell","topBar","audioPlayerWrapper","audioPlayerWrapperExpanded","audioPlayerExpandedStart","audioPlayerExpandedEnd","coverMetadataGroup","audioCoverSection","audioCoverImage","audioCoverPlaceholder","audioCoverSyncOverlay","audioCoverSyncIcon","audioMetadata","audioMetadataTitle","audioMetadataSubtitle","audioMetadataAuthors","useRef","useMemo","useState","useEffect"],"mappings":"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","file":"chunk-QUSGPT5M.mjs","sourcesContent":["import * as React from \"react\";\nconst SvgPause = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M560-200v-560h160v560H560Zm-320 0v-560h160v560H240Z\" /></svg>;\nexport default SvgPause;","import * as React from \"react\";\nconst SvgPlayArrow = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M320-200v-560l440 280-440 280Z\" /></svg>;\nexport default SvgPlayArrow;",".audioControls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n --audio-icon-base: var(--th-icon-size, 24px);\n}\n\n@container (max-width: 300px) {\n .audioControls {\n --th-icon-size: 18px;\n }\n}\n\n.audioPreviousButton,\n.audioNextButton {\n --th-icon-size: calc(var(--audio-icon-base) * (5/4));\n padding: calc(var(--th-icon-size) * (1/5));\n}\n\n.audioSkipBackwardButton,\n.audioSkipForwardButton {\n --th-icon-size: calc(var(--audio-icon-base) * (3/2));\n padding: calc(var(--th-icon-size) * (1/6));\n}\n\n.audioPlayPauseButton {\n --th-icon-size: calc(var(--audio-icon-base) * 2);\n padding: calc(var(--th-icon-size) * (1/8));\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport PauseIcon from \"./assets/icons/pause.svg\";\nimport PlayIcon from \"./assets/icons/play_arrow.svg\";\n\nimport { StatefulActionIcon } from \"../../Actions/Triggers/StatefulActionIcon\";\nimport audioStyles from \"./assets/styles/thorium-web.audioPlayback.module.css\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nexport const StatefulPlayPauseButton = ({ isDisabled }: { isDisabled?: boolean }) => {\n const { t } = useI18n();\n const { play, pause } = useNavigator().media;\n const isPlaying = useAppSelector(state => state.player.status === \"playing\");\n\n const handlePress = useCallback(() => {\n if (isPlaying) {\n pause();\n } else {\n play();\n }\n }, [isPlaying, play, pause]);\n\n return (\n <StatefulActionIcon\n onPress={ handlePress }\n isDisabled={ isDisabled }\n aria-label={ isPlaying ? t(\"reader.playback.actions.pause\") : t(\"reader.playback.actions.play\") }\n tooltipLabel={ isPlaying ? t(\"reader.playback.actions.pause\") : t(\"reader.playback.actions.play\") }\n className={ audioStyles.audioPlayPauseButton }\n >\n {isPlaying ? (\n <PauseIcon aria-hidden=\"true\" focusable=\"false\" />\n ) : (\n <PlayIcon aria-hidden=\"true\" focusable=\"false\" />\n )}\n </StatefulActionIcon>\n );\n};\n","import * as React from \"react\";\nconst SvgSkipPrevious = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M220-240v-480h80v480h-80Zm520 0L380-480l360-240v480Zm-80-240Zm0 90v-180l-136 90 136 90Z\" /></svg>;\nexport default SvgSkipPrevious;","import { TocItem } from \"@/helpers/buildTocTree\";\nimport { useAppSelector } from \"@/lib/hooks\";\n\nconst flattenTocTree = (items: TocItem[]): TocItem[] => {\n const result: TocItem[] = [];\n for (const item of items) {\n result.push(item);\n if (item.children) result.push(...flattenTocTree(item.children));\n }\n return result;\n};\n\nexport const useAdjacentTocItems = (): { previous: TocItem | null; next: TocItem | null } => {\n const tocTree = useAppSelector(state => state.publication.unstableTimeline?.toc?.tree);\n const tocCurrentEntry = useAppSelector(state => state.publication.unstableTimeline?.toc?.currentEntry);\n\n if (!tocTree || !tocCurrentEntry) return { previous: null, next: null };\n\n const flat = flattenTocTree(tocTree);\n const index = flat.findIndex(item => item.href === tocCurrentEntry.href);\n\n if (index < 0) return { previous: null, next: null };\n\n return {\n previous: index > 0 ? flat[index - 1] : null,\n next: index < flat.length - 1 ? flat[index + 1] : null,\n };\n};\n","\"use client\";\n\nimport SkipPreviousIcon from \"./assets/icons/skip_previous.svg\";\n\nimport { StatefulActionIcon } from \"../../Actions/Triggers/StatefulActionIcon\";\nimport audioStyles from \"./assets/styles/thorium-web.audioPlayback.module.css\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { ThAudioAffordance } from \"@/preferences/audioPreferences\";\nimport { useAdjacentTocItems } from \"./hooks/useAdjacentTocItems\";\nimport { Link } from \"@readium/shared\";\n\nexport const StatefulPreviousButton = ({ isDisabled }: { isDisabled?: boolean }) => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n const { goBackward, goLink } = useNavigator().media;\n const atStart = useAppSelector(state => state.publication.atPublicationStart);\n const previousTimelineItem = useAppSelector(state => state.publication.adjacentTimelineItems.previous);\n const { previous: previousTocItem } = useAdjacentTocItems();\n\n const affordance = preferences.affordances.previous;\n const isTimeline = affordance === ThAudioAffordance.timeline;\n const isToc = affordance === ThAudioAffordance.toc;\n\n const previousItem = isToc ? previousTocItem : previousTimelineItem;\n\n const label = (isTimeline || isToc) && previousItem?.title\n ? previousItem.title\n : t(\"reader.actions.goToPreviousResource.descriptive\");\n\n const handlePress = () => (isTimeline || isToc)\n ? previousItem && goLink(new Link({ href: previousItem.href }), false, () => {})\n : goBackward(false, () => {});\n\n return (\n <StatefulActionIcon\n onPress={ handlePress }\n isDisabled={ isDisabled || ((isTimeline || isToc) ? !previousItem : atStart) }\n aria-label={ label }\n tooltipLabel={ label }\n className={ audioStyles.audioPreviousButton }\n >\n <SkipPreviousIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n );\n};\n","import * as React from \"react\";\nconst SvgSkipNext = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M660-240v-480h80v480h-80Zm-440 0v-480l360 240-360 240Zm80-240Zm0 90 136-90-136-90v180Z\" /></svg>;\nexport default SvgSkipNext;","\"use client\";\n\nimport SkipNextIcon from \"./assets/icons/skip_next.svg\";\n\nimport { StatefulActionIcon } from \"../../Actions/Triggers/StatefulActionIcon\";\nimport audioStyles from \"./assets/styles/thorium-web.audioPlayback.module.css\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useAudioPreferences } from \"@/preferences\";\nimport { ThAudioAffordance } from \"@/preferences/audioPreferences\";\nimport { useAdjacentTocItems } from \"./hooks/useAdjacentTocItems\";\nimport { Link } from \"@readium/shared\";\n\nexport const StatefulNextButton = ({ isDisabled }: { isDisabled?: boolean }) => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n const { goForward, goLink } = useNavigator().media;\n const atEnd = useAppSelector(state => state.publication.atPublicationEnd);\n const nextTimelineItem = useAppSelector(state => state.publication.adjacentTimelineItems.next);\n const { next: nextTocItem } = useAdjacentTocItems();\n\n const affordance = preferences.affordances.next;\n const isTimeline = affordance === ThAudioAffordance.timeline;\n const isToc = affordance === ThAudioAffordance.toc;\n\n const nextItem = isToc ? nextTocItem : nextTimelineItem;\n\n const label = (isTimeline || isToc) && nextItem?.title\n ? nextItem.title\n : t(\"reader.actions.goToNextResource.descriptive\");\n\n const handlePress = () => (isTimeline || isToc)\n ? nextItem && goLink(new Link({ href: nextItem.href }), false, () => {})\n : goForward(false, () => {});\n\n return (\n <StatefulActionIcon\n onPress={ handlePress }\n isDisabled={ isDisabled || ((isTimeline || isToc) ? !nextItem : atEnd) }\n aria-label={ label }\n tooltipLabel={ label }\n className={ audioStyles.audioNextButton }\n >\n <SkipNextIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n );\n};\n","import * as React from \"react\";\nconst SvgReplay = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M347.39-126.77q-61.85-26.77-107.85-72.77-46-46-72.77-107.85Q140-369.23 140-440h60q0 117 81.5 198.5T480-160q117 0 198.5-81.5T760-440q0-117-81.5-198.5T480-720h-10.62l63.54 63.54-42.15 43.38-136.92-137.3 137.69-137.31 42.15 43.38L469.38-780H480q70.77 0 132.61 26.77 61.85 26.77 107.85 72.77 46 46 72.77 107.85Q820-510.77 820-440q0 70.77-26.77 132.61-26.77 61.85-72.77 107.85-46 46-107.85 72.77Q550.77-100 480-100q-70.77 0-132.61-26.77Z\" /></svg>;\nexport default SvgReplay;","import * as React from \"react\";\nconst SvgReplay5 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M347.39-126.77q-61.85-26.77-107.85-72.77-46-46-72.77-107.83Q140-369.2 140-440h60q0 117 81.5 198.5T480-160q117 0 198.5-81.5T760-440q0-117-81.5-198.5T480-720h-10.62l63.54 63.54-42.15 43.38-136.92-137.3 137.69-137.31 42.15 43.38L469.38-780H480q70.8 0 132.63 26.77t107.83 72.77q46 46 72.77 107.82Q820-510.81 820-440.02t-26.77 132.63q-26.77 61.85-72.77 107.85-46 46-107.82 72.77Q550.81-100 480.02-100t-132.63-26.77Zm38.76-199.38v-47.7h120v-48.46h-120v-131.54h167.7v47.7h-120v48.46H520q14.38 0 24.12 9.73 9.73 9.73 9.73 24.11V-360q0 14.38-9.73 24.12-9.74 9.73-24.12 9.73H386.15Z\" /></svg>;\nexport default SvgReplay5;","import * as React from \"react\";\nconst SvgReplay10 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M347.39-126.77q-61.85-26.77-107.85-72.77-46-46-72.77-107.85Q140-369.23 140-440h60q0 117 81.5 198.5T480-160q117 0 198.5-81.5T760-440q0-117-81.5-198.5T480-720h-10.62l63.54 63.54-42.15 43.38-136.92-137.3 137.69-137.31 42.15 43.38L469.38-780H480q70.77 0 132.61 26.77 61.85 26.77 107.85 72.77 46 46 72.77 107.85Q820-510.77 820-440q0 70.77-26.77 132.61-26.77 61.85-72.77 107.85-46 46-107.85 72.77Q550.77-100 480-100q-70.77 0-132.61-26.77Zm21.07-199.38v-180h-57.69v-47.7h105.38v227.7h-47.69Zm135.39 0q-17 0-28.5-11.5t-11.5-28.5v-147.7q0-17 11.5-28.5t28.5-11.5h75.38q17 0 28.5 11.5t11.5 28.5v147.7q0 17-11.5 28.5t-28.5 11.5h-75.38Zm12.3-47.7h50.77q2.31 0 3.47-1.15 1.15-1.15 1.15-3.46v-123.08q0-2.31-1.15-3.46-1.16-1.15-3.47-1.15h-50.77q-2.3 0-3.46 1.15-1.15 1.15-1.15 3.46v123.08q0 2.31 1.15 3.46 1.16 1.15 3.46 1.15Z\" /></svg>;\nexport default SvgReplay10;","import * as React from \"react\";\nconst SvgReplay30 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M347.39-126.77q-61.85-26.77-107.85-72.77-46-46-72.77-107.85Q140-369.23 140-440h60q0 117 81.5 198.5T480-160q117 0 198.5-81.5T760-440q0-117-81.5-198.5T480-720h-10.62l63.54 63.54-42.15 43.38-136.92-137.3 137.69-137.31 42.15 43.38L469.38-780H480q70.77 0 132.61 26.77 61.85 26.77 107.85 72.77 46 46 72.77 107.85Q820-510.77 820-440q0 70.77-26.77 132.61-26.77 61.85-72.77 107.85-46 46-107.85 72.77Q550.77-100 480-100q-70.77 0-132.61-26.77Zm-46.62-199.38v-47.7h107.69v-48.46h-71.54v-35.38h71.54v-48.46H300.77v-47.7h121.54q14.69 0 24.27 9.58 9.57 9.58 9.57 24.27v160q0 14.69-9.57 24.27-9.58 9.58-24.27 9.58H300.77Zm243.08 0q-17 0-28.5-11.5t-11.5-28.5v-147.7q0-17 11.5-28.5t28.5-11.5h75.38q17 0 28.5 11.5t11.5 28.5v147.7q0 17-11.5 28.5t-28.5 11.5h-75.38Zm12.3-47.7h50.77q2.31 0 3.47-1.15 1.15-1.15 1.15-3.46v-123.08q0-2.31-1.15-3.46-1.16-1.15-3.47-1.15h-50.77q-2.3 0-3.46 1.15-1.15 1.15-1.15 3.46v123.08q0 2.31 1.15 3.46 1.16 1.15 3.46 1.15Z\" /></svg>;\nexport default SvgReplay30;","\"use client\";\n\nimport ReplayIcon from \"./assets/icons/replay.svg\";\nimport Replay5Icon from \"./assets/icons/replay_5.svg\";\nimport Replay10Icon from \"./assets/icons/replay_10.svg\";\nimport Replay30Icon from \"./assets/icons/replay_30.svg\";\n\nimport { StatefulActionIcon } from \"../../Actions/Triggers/StatefulActionIcon\";\nimport audioStyles from \"./assets/styles/thorium-web.audioPlayback.module.css\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nconst replayIconMap: Record<number, React.ElementType> = {\n 5: Replay5Icon,\n 10: Replay10Icon,\n 30: Replay30Icon,\n};\n\nexport const StatefulSkipBackwardButton = ({ isDisabled }: { isDisabled?: boolean }) => {\n const { t } = useI18n();\n const { skipBackward } = useNavigator().media;\n const skipBackwardInterval = useAppSelector(state => state.audioSettings.skipBackwardInterval);\n\n const Icon = replayIconMap[skipBackwardInterval] ?? ReplayIcon;\n\n return (\n <StatefulActionIcon\n onPress={ skipBackward }\n isDisabled={ isDisabled }\n aria-label={ t(\"reader.playback.actions.skipBackward.descriptive\") }\n tooltipLabel={ t(\"reader.playback.actions.skipBackward.descriptive\") }\n className={ audioStyles.audioSkipBackwardButton }\n >\n <Icon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n );\n};\n","import * as React from \"react\";\nconst SvgForwardMedia = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M347.39-126.77q-61.85-26.77-107.85-72.77-46-46-72.77-107.85Q140-369.23 140-440q0-70.77 26.77-132.61 26.77-61.85 72.77-107.85 46-46 107.85-72.77Q409.23-780 480-780h10.62l-64.31-64.31 42.15-43.38 137.69 137.31-136.92 137.3-42.15-43.38L490.62-720H480q-117 0-198.5 81.5T200-440q0 117 81.5 198.5T480-160q117 0 198.5-81.5T760-440h60q0 70.77-26.77 132.61-26.77 61.85-72.77 107.85-46 46-107.85 72.77Q550.77-100 480-100q-70.77 0-132.61-26.77Z\" /></svg>;\nexport default SvgForwardMedia;","import * as React from \"react\";\nconst SvgForward5 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M347.39-126.77q-61.85-26.77-107.85-72.77-46-46-72.77-107.82Q140-369.19 140-439.98t26.77-132.63q26.77-61.85 72.77-107.85 46-46 107.83-72.77Q409.2-780 480-780h10.62l-64.31-64.31 42.15-43.38 137.69 137.31-136.92 137.3-42.15-43.38L490.62-720H480q-117 0-198.5 81.5T200-440q0 117 81.5 198.5T480-160q117 0 198.5-81.5T760-440h60q0 70.8-26.77 132.63t-72.77 107.83q-46 46-107.82 72.77Q550.81-100 480.02-100t-132.63-26.77Zm38.76-199.38v-47.7h120v-48.46h-120v-131.54h167.7v47.7h-120v48.46H520q14.38 0 24.12 9.73 9.73 9.73 9.73 24.11V-360q0 14.38-9.73 24.12-9.74 9.73-24.12 9.73H386.15Z\" /></svg>;\nexport default SvgForward5;","import * as React from \"react\";\nconst SvgForward10 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M368.46-326.15v-180h-57.69v-47.7h105.38v227.7h-47.69Zm135.39 0q-17 0-28.5-11.5t-11.5-28.5v-147.7q0-17 11.5-28.5t28.5-11.5h75.38q17 0 28.5 11.5t11.5 28.5v147.7q0 17-11.5 28.5t-28.5 11.5h-75.38Zm12.3-47.7h50.77q2.31 0 3.47-1.15 1.15-1.15 1.15-3.46v-123.08q0-2.31-1.15-3.46-1.16-1.15-3.47-1.15h-50.77q-2.3 0-3.46 1.15-1.15 1.15-1.15 3.46v123.08q0 2.31 1.15 3.46 1.16 1.15 3.46 1.15ZM347.39-126.77q-61.85-26.77-107.85-72.77-46-46-72.77-107.85Q140-369.23 140-440q0-70.77 26.77-132.61 26.77-61.85 72.77-107.85 46-46 107.85-72.77Q409.23-780 480-780h10.62l-64.31-64.31 42.15-43.38 137.69 137.31-136.92 137.3-42.15-43.38L490.62-720H480q-117 0-198.5 81.5T200-440q0 117 81.5 198.5T480-160q117 0 198.5-81.5T760-440h60q0 70.77-26.77 132.61-26.77 61.85-72.77 107.85-46 46-107.85 72.77Q550.77-100 480-100q-70.77 0-132.61-26.77Z\" /></svg>;\nexport default SvgForward10;","import * as React from \"react\";\nconst SvgForward30 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M300.77-326.15v-47.7h107.69v-48.46h-71.54v-35.38h71.54v-48.46H300.77v-47.7h121.54q14.69 0 24.27 9.58 9.57 9.58 9.57 24.27v160q0 14.69-9.57 24.27-9.58 9.58-24.27 9.58H300.77Zm243.08 0q-17 0-28.5-11.5t-11.5-28.5v-147.7q0-17 11.5-28.5t28.5-11.5h75.38q17 0 28.5 11.5t11.5 28.5v147.7q0 17-11.5 28.5t-28.5 11.5h-75.38Zm12.3-47.7h50.77q2.31 0 3.47-1.15 1.15-1.15 1.15-3.46v-123.08q0-2.31-1.15-3.46-1.16-1.15-3.47-1.15h-50.77q-2.3 0-3.46 1.15-1.15 1.15-1.15 3.46v123.08q0 2.31 1.15 3.46 1.16 1.15 3.46 1.15ZM347.39-126.77q-61.85-26.77-107.85-72.77-46-46-72.77-107.85Q140-369.23 140-440q0-70.77 26.77-132.61 26.77-61.85 72.77-107.85 46-46 107.85-72.77Q409.23-780 480-780h10.62l-64.31-64.31 42.15-43.38 137.69 137.31-136.92 137.3-42.15-43.38L490.62-720H480q-117 0-198.5 81.5T200-440q0 117 81.5 198.5T480-160q117 0 198.5-81.5T760-440h60q0 70.77-26.77 132.61-26.77 61.85-72.77 107.85-46 46-107.85 72.77Q550.77-100 480-100q-70.77 0-132.61-26.77Z\" /></svg>;\nexport default SvgForward30;","\"use client\";\n\nimport ForwardIcon from \"./assets/icons/forward_media.svg\";\nimport Forward5Icon from \"./assets/icons/forward_5.svg\";\nimport Forward10Icon from \"./assets/icons/forward_10.svg\";\nimport Forward30Icon from \"./assets/icons/forward_30.svg\";\n\nimport { StatefulActionIcon } from \"../../Actions/Triggers/StatefulActionIcon\";\nimport audioStyles from \"./assets/styles/thorium-web.audioPlayback.module.css\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nconst forwardIconMap: Record<number, React.ElementType> = {\n 5: Forward5Icon,\n 10: Forward10Icon,\n 30: Forward30Icon,\n};\n\nexport const StatefulSkipForwardButton = ({ isDisabled }: { isDisabled?: boolean }) => {\n const { t } = useI18n();\n const { skipForward } = useNavigator().media;\n const skipForwardInterval = useAppSelector(state => state.audioSettings.skipForwardInterval);\n\n const Icon = forwardIconMap[skipForwardInterval] ?? ForwardIcon;\n\n return (\n <StatefulActionIcon\n onPress={ skipForward }\n isDisabled={ isDisabled }\n aria-label={ t(\"reader.playback.actions.skipForward.descriptive\") }\n tooltipLabel={ t(\"reader.playback.actions.skipForward.descriptive\") }\n className={ audioStyles.audioSkipForwardButton }\n >\n <Icon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n );\n};\n","\"use client\";\n\nimport audioStyles from \"./assets/styles/thorium-web.audioPlayback.module.css\";\n\nimport { StatefulPreviousButton } from \"./StatefulPreviousButton\";\nimport { StatefulSkipBackwardButton } from \"./StatefulSkipBackwardButton\";\nimport { StatefulPlayPauseButton } from \"./StatefulPlayPauseButton\";\nimport { StatefulSkipForwardButton } from \"./StatefulSkipForwardButton\";\nimport { StatefulNextButton } from \"./StatefulNextButton\";\n\nimport { ThActionsBar } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useAppSelector } from \"@/lib/hooks\";\n\nexport const StatefulAudioPlaybackControls = () => {\n const { t } = useI18n();\n const isTrackReady = useAppSelector(state => state.player.isTrackReady);\n const isStalled = useAppSelector(state => state.player.isStalled);\n\n return (\n <ThActionsBar className={ audioStyles.audioControls } aria-label={ t(\"audio.player.controls\") } dir=\"ltr\">\n <StatefulPreviousButton isDisabled={ !isTrackReady || isStalled } />\n <StatefulSkipBackwardButton isDisabled={ !isTrackReady || isStalled } />\n <StatefulPlayPauseButton isDisabled={ !isTrackReady || isStalled } />\n <StatefulSkipForwardButton isDisabled={ !isTrackReady || isStalled } />\n <StatefulNextButton isDisabled={ !isTrackReady || isStalled } />\n </ThActionsBar>\n );\n};\n",".wrapper {\n width: 100%;\n max-width: 600px;\n display: grid;\n grid-template-areas:\n \"chapter chapter chapter\"\n \"progress progress progress\"\n \"elapsed . remaining\";\n grid-template-columns: 1fr 1fr 1fr;\n align-items: center;\n gap: 0.5rem;\n container-type: inline-size;\n}\n\n.current {\n grid-area: chapter;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.slider {\n grid-area: progress;\n}\n\n.track {\n grid-area: progress;\n position: relative;\n height: 30px;\n width: auto;\n box-sizing: border-box;\n margin-inline: calc(var(--th-layout-spacing) / 2);\n}\n\n.track::before {\n content: \"\";\n display: block;\n position: absolute;\n background: var(--th-theme-subdue);\n height: 3px;\n width: 100%;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.thumb {\n z-index: 2;\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background: var(--th-theme-text);\n border: none;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.slider[data-disabled] .track::before {\n background: var(--th-theme-disable);\n}\n\n.slider[data-disabled] .thumb {\n background: var(--th-theme-disable);\n}\n\n.slider[data-disabled] .seekableRange {\n background: var(--th-theme-disable);\n}\n\n.slider[data-disabled] .current,\n.slider[data-disabled] .elapsed,\n.slider[data-disabled] .remaining {\n color: var(--th-theme-disable);\n}\n\n.thumb[data-dragging] {\n background: var(--th-theme-subdue);\n}\n\n.thumb[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.seekableRange {\n position: absolute;\n height: 3px;\n top: 50%;\n transform: translateY(-50%);\n background: color-mix(in srgb, var(--th-theme-text) 55%, var(--th-theme-subdue));\n pointer-events: none;\n border-radius: 1px;\n z-index: 1;\n}\n\n.tick {\n position: absolute;\n width: 1px;\n height: 15px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--th-theme-text);\n pointer-events: none;\n z-index: 1;\n}\n\n.tooltip {\n background-color: var(--th-theme-text);\n color: var(--th-theme-background);\n border-radius: var(--th-layout-radius);\n padding: calc(var(--th-layout-spacing) / 2);\n font-size: 0.75rem;\n pointer-events: none;\n max-width: 320px;\n text-wrap: pretty;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n}\n\n.elapsed {\n grid-area: elapsed;\n justify-self: start;\n font-size: 0.875rem;\n color: var(--th-theme-text);\n}\n\n.remaining {\n grid-area: remaining;\n justify-self: end;\n font-size: 0.875rem;\n color: var(--th-theme-text);\n}\n\n@container (max-width: 300px) {\n .current {\n font-size: 0.875rem;\n }\n}\n","\"use client\";\n\nimport React, { useCallback, useState, useMemo } from \"react\";\n\nimport audioStyles from \"./assets/styles/thorium-web.audioProgressBar.module.css\";\n\nimport { ThAudioProgress } from \"@/core/Components/Audio/ThAudioProgress\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAppSelector } from \"@/lib\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { ThAudioProgressBarVariant } from \"@/preferences/models/ui\";\n\nexport const StatefulAudioProgressBar = () => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n\n const tocEntry = useAppSelector(state => state.publication.unstableTimeline?.toc?.currentEntry);\n const currentChapter = tocEntry?.title;\n\n const isStalled = useAppSelector(state => state.player.isStalled);\n const isTrackReady = useAppSelector(state => state.player.isTrackReady);\n const seekableRanges = useAppSelector(state => state.player.seekableRanges);\n const playbackRate = useAppSelector(state => state.audioSettings.playbackRate);\n\n const { currentTime, duration, seek, currentLocator, timeline } = useNavigator().media;\n\n const current = currentTime();\n const total = duration();\n\n const [hoverLabel, setHoverLabel] = useState<string | undefined>(undefined);\n\n const handleSeek = useCallback((time: number) => {\n seek(time);\n }, [seek]);\n\n const handleHoverProgression = useCallback((progression: number | null) => {\n if (progression === null) {\n setHoverLabel(undefined);\n return;\n }\n const locator = currentLocator();\n const tl = timeline();\n if (!locator || !tl) return;\n const item = tl.itemAtProgression(locator.href, progression, total);\n setHoverLabel(item?.title);\n }, [currentLocator, timeline, total]);\n\n // Parse timestamp from fragment href (e.g., \"file.mp3#t=123.45\")\n const parseTimestamp = (href: string): number => {\n const match = href.match(/#t=(\\d+(?:\\.\\d+)?)$/);\n return match ? parseFloat(match[1]) : 0;\n };\n\n // Get timeline segments for fragmented progress bar\n const segments = useMemo(() => {\n const locator = currentLocator();\n const tl = timeline();\n if (!locator || !tl || preferences.theming.layout.progressBar?.variant !== ThAudioProgressBarVariant.segmented) return [];\n \n const segments = tl.segmentsForHref(locator.href);\n if (!segments || !Array.isArray(segments)) return [];\n \n return segments.map((segment) => {\n // Parse timestamp from first reference href (e.g., \"track1.mp3#t=60\")\n const referenceHref = segment.references?.[0] || \"\";\n const timestamp = parseTimestamp(referenceHref);\n \n // Calculate percentage based on timestamp and total duration\n const percentage = total > 0 ? (timestamp / total) * 100 : 0;\n \n return {\n title: segment.title,\n timestamp,\n percentage\n };\n });\n }, [currentLocator, timeline, total, preferences.theming.layout.progressBar?.variant]);\n\n return (\n <ThAudioProgress\n currentTime={ current }\n duration={ total }\n playbackRate={ playbackRate }\n onSeek={ handleSeek }\n currentChapter={ currentChapter || \"\" } // Zero-width space to prevent shift\n isDisabled={ !isTrackReady || isStalled }\n seekableRanges={ seekableRanges }\n hoverLabel={ hoverLabel }\n onHoverProgression={ handleHoverProgression }\n segments={ segments }\n compounds={{\n wrapper: {\n className: audioStyles.wrapper,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") (document.activeElement as HTMLElement)?.blur();\n }\n },\n current: {\n className: audioStyles.current\n },\n slider: {\n className: audioStyles.slider,\n \"aria-label\": t(\"audio.player.progress\")\n },\n track: {\n className: audioStyles.track\n },\n thumb: {\n className: audioStyles.thumb\n },\n elapsedTime: {\n className: audioStyles.elapsed\n },\n remainingTime: {\n className: audioStyles.remaining\n },\n seekableRange: {\n className: audioStyles.seekableRange\n },\n fragmentTick: {\n className: audioStyles.tick\n },\n tooltip: {\n className: audioStyles.tooltip,\n offset: preferences.theming.icon.tooltipOffset\n }\n }}\n />\n );\n};\n",".wrapper {\n display: flex;\n align-items: flex-start;\n justify-content: center;\n gap: 1rem;\n --audio-icon-base: var(--th-icon-size, 24px);\n}\n\n@container (max-width: 300px) {\n .wrapper {\n --th-icon-size: 18px;\n }\n}\n\n.popover {\n /* Override the default popover width — audio controls are more compact */\n width: auto;\n max-width: 95%;\n}","\"use client\";\n\nimport { Fragment, useRef } from \"react\";\n\nimport audioStyles from \"./assets/styles/thorium-web.audioActions.module.css\";\n\nimport { ThActionsBar, ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { usePlugins } from \"@/components/Plugins/PluginProvider\";\nimport { ActionComponent } from \"@/components/Plugins/PluginRegistry\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\n\nconst AudioActionPair = ({ action }: { action: ActionComponent }) => {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { Trigger, Target } = action;\n return (\n <Fragment>\n <Trigger ref={ triggerRef } variant={ ThActionsTriggerVariant.button } />\n { Target && <Target triggerRef={ triggerRef } placement=\"top\" /> }\n </Fragment>\n );\n};\n\nexport const StatefulAudioMediaActions = () => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n const { primaryAudioActionsMap } = usePlugins();\n\n const displayOrder = preferences.actions.primary.displayOrder;\n\n return (\n <ThActionsBar className={ audioStyles.wrapper } aria-label={ t(\"audio.player.mediaActions\") }>\n { displayOrder.map(key => {\n const action = primaryAudioActionsMap[key];\n if (!action) return null;\n return <AudioActionPair key={ key } action={ action } />;\n }) }\n </ThActionsBar>\n );\n};\n",".main {\n width: 100%;\n height: 100%;\n margin: 0;\n}\n\n.shell {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 0;\n height: 100vh;\n height: 100dvh;\n max-height: 100%;\n background-color: var(--th-theme-background);\n}\n\n.topBar {\n flex: 0 0 calc(var(--th-icon-size, 24px) * 2.5);\n height: calc(var(--th-icon-size, 24px) * 2.5);\n box-sizing: border-box;\n gap: 2px;\n touch-action: manipulation;\n background-color: var(--th-theme-background);\n}\n",".audioPlayerWrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n gap: var(--th-layout-spacing);\n padding: var(--th-layout-spacing);\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.audioPlayerWrapperExpanded {\n display: flex;\n flex-direction: row;\n align-items: stretch;\n box-sizing: border-box;\n gap: var(--th-layout-spacing);\n padding: var(--th-layout-spacing);\n height: 100%;\n width: 100%;\n max-width: 960px;\n margin-inline: auto;\n container-type: inline-size;\n}\n\n.audioPlayerExpandedStart {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1 1 0;\n min-width: 0;\n gap: var(--th-layout-spacing);\n container-type: inline-size;\n}\n\n.audioPlayerExpandedEnd {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1 1 0;\n min-width: 0;\n gap: var(--th-layout-spacing);\n container-type: inline-size;\n}\n\n.coverMetadataGroup {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--th-layout-spacing);\n flex: 0 1 auto;\n width: 100%;\n}\n","\"use client\";\n\nimport audioLayoutStyles from \"./assets/styles/thorium-web.audio.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 { StatefulBackLink } from \"../StatefulBackLink\";\nimport { StatefulCollapsibleActionsBar } from \"../Actions/StatefulCollapsibleActionsBar\";\n\nimport { useReaderHeaderBase } from \"../hooks/useReaderHeaderBase\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulPlayerHeader = ({\n actionKeys,\n actionsOrder,\n}: {\n actionKeys: string[];\n actionsOrder: string[];\n}) => {\n const {\n headerRef, listActionItems, t,\n } = useReaderHeaderBase(actionKeys);\n\n const { preferences } = useAudioPreferences();\n\n return (\n <>\n <div\n ref={ headerRef }\n className={ classNames(audioLayoutStyles.topBar, readerHeaderStyles.header) }\n >\n { preferences.theming.header?.backLink && <StatefulBackLink className={ readerHeaderStyles.backlinkWrapper } /> }\n\n <StatefulCollapsibleActionsBar\n id=\"reader-header-overflowMenu\"\n items={ listActionItems() }\n prefs={{ ...preferences.actions.secondary, displayOrder: actionsOrder }}\n className={ readerHeaderStyles.actionsWrapper }\n aria-label={ t(\"reader.app.header.actions\") }\n overflowMenuClassName={ overflowMenuStyles.hint }\n />\n </div>\n </>\n );\n};\n",".audioCoverSection {\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n flex: 1 1 auto;\n min-height: 100px;\n max-height: var(--th-layout-constraints-cover, 300px);\n width: 100%;\n margin: 0;\n}\n\n.audioCoverImage {\n height: 100%;\n width: auto;\n max-width: 100%;\n object-fit: contain;\n border-radius: var(--th-layout-radius);\n filter: drop-shadow(var(--th-theme-elevate));\n}\n\n.audioCoverPlaceholder {\n max-height: var(--th-layout-constraints-cover, 300px);\n width: auto;\n max-width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--th-theme-background);\n border-radius: var(--th-layout-radius);\n border: 1px solid var(--th-theme-subdue);\n filter: drop-shadow(var(--th-theme-elevate));\n}\n\n.audioCoverPlaceholder svg {\n width: 50%;\n height: 50%;\n fill: var(--th-theme-text);\n}\n\n.audioCoverSyncOverlay {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n max-height: var(--th-layout-constraints-cover, 300px);\n width: auto;\n max-width: 100%;\n aspect-ratio: 1 / 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--th-layout-radius);\n background-color: color-mix(in srgb, var(--th-theme-background) 60%, transparent);\n}\n\n.audioCoverSyncIcon {\n width: calc(var(--th-icon-size, 24px) * 2);\n height: calc(var(--th-icon-size, 24px) * 2);\n fill: var(--th-theme-text);\n animation: audioCoverSpin 1.2s linear infinite;\n}\n\n@keyframes audioCoverSpin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n","import * as React from \"react\";\nconst SvgMusicNote = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M287-167q-47-47-47-113t47-113q47-47 113-47 23 0 42.5 5.5T480-418v-422h240v160H560v400q0 66-47 113t-113 47q-66 0-113-47Z\" /></svg>;\nexport default SvgMusicNote;","import * as React from \"react\";\nconst SvgSync = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M160-160v-80h110l-16-14q-52-46-73-105t-21-119q0-111 66.5-197.5T400-790v84q-72 26-116 88.5T240-478q0 45 17 87.5t53 78.5l10 10v-98h80v240H160Zm400-10v-84q72-26 116-88.5T720-482q0-45-17-87.5T650-648l-10-10v98h-80v-240h240v80H690l16 14q49 49 71.5 106.5T800-482q0 111-66.5 197.5T560-170Z\" /></svg>;\nexport default SvgSync;","import { Ref } from \"react\";\n\nimport styles from \"./assets/styles/thorium-web.audioCover.module.css\";\n\nimport MusicNoteIcon from \"./assets/icons/music_note.svg\";\nimport SyncIcon from \"./assets/icons/sync.svg\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { proxyUrl } from \"@/helpers/proxyUrl\";\n\ninterface StatefulAudioCoverProps {\n ref?: Ref<HTMLElement>;\n coverUrl?: string;\n title?: string;\n}\n\nexport function StatefulAudioCover({ ref, coverUrl, title }: StatefulAudioCoverProps) {\n const { t } = useI18n();\n const isTrackReady = useAppSelector(state => state.player.isTrackReady);\n const isStalled = useAppSelector(state => state.player.isStalled);\n\n const showSyncOverlay = !isTrackReady || isStalled;\n\n return (\n <figure ref={ ref } className={ styles.audioCoverSection }>\n { coverUrl ? (\n <img\n src={ proxyUrl(coverUrl) }\n alt={ title || t(\"audio.player.coverAlt\") }\n className={ styles.audioCoverImage }\n crossOrigin=\"anonymous\"\n />\n ) : (\n <div className={ styles.audioCoverPlaceholder }>\n { showSyncOverlay ? (\n <SyncIcon className={ styles.audioCoverSyncIcon } aria-hidden=\"true\" />\n ) : (\n <MusicNoteIcon />\n ) }\n </div>\n ) }\n { coverUrl && showSyncOverlay && (\n <div className={ styles.audioCoverSyncOverlay } aria-hidden=\"true\">\n <SyncIcon className={ styles.audioCoverSyncIcon } />\n </div>\n ) }\n </figure>\n );\n}\n",".audioMetadata {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: 0;\n gap: var(--th-layout-spacing);\n text-align: center;\n}\n\n.audioMetadata hgroup {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0;\n margin: 0;\n}\n\n.audioMetadataTitle {\n margin: 0;\n font-size: 1em;\n font-weight: bold;\n color: var(--th-theme-text);\n}\n\n.audioMetadataSubtitle {\n display: block;\n margin: 0;\n margin-top: calc(var(--th-layout-spacing) / 4);\n font-weight: normal;\n color: var(--th-theme-text);\n}\n\n.audioMetadataAuthors {\n margin: 0;\n color: var(--th-theme-subdue-text);\n}\n\n@container (max-width: 300px) {\n .audioMetadata {\n font-size: 0.875rem;\n }\n}\n","import styles from \"./assets/styles/thorium-web.audioMetadata.module.css\";\n\nimport { Publication } from \"@readium/shared\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { ThAudioPublicationMetadataComponent } from \"@/preferences/models\";\n\ninterface StatefulAudioMetadataProps {\n publication: Publication;\n}\n\nexport function StatefulAudioMetadata({ publication }: StatefulAudioMetadataProps) {\n const { preferences } = useAudioPreferences();\n const { metadata } = publication;\n\n const title = metadata.title.getTranslation(\"en\");\n const subtitle = metadata.subtitle?.getTranslation(\"en\");\n const authors = metadata.authors?.items.map(a => a.name.getTranslation(\"en\"));\n\n const metadataOrder = preferences.theming.layout.publicationMetadata.order;\n\n const renderMetadataComponents = () => {\n return metadataOrder.map((component: ThAudioPublicationMetadataComponent) => {\n switch (component) {\n case ThAudioPublicationMetadataComponent.title:\n return <h1 key=\"title\" className={ styles.audioMetadataTitle }>{ title }</h1>;\n\n case ThAudioPublicationMetadataComponent.titleWithSubtitle:\n return (\n <hgroup key=\"title-with-subtitle\">\n <h1 className={ styles.audioMetadataTitle }>{ title }</h1>\n { subtitle && <p className={ styles.audioMetadataSubtitle }>{ subtitle }</p> }\n </hgroup>\n );\n\n case ThAudioPublicationMetadataComponent.subtitleWithTitle:\n return (\n <hgroup key=\"subtitle-with-title\">\n { subtitle && <p className={ styles.audioMetadataSubtitle }>{ subtitle }</p> }\n <h1 className={ styles.audioMetadataTitle }>{ title }</h1>\n </hgroup>\n );\n\n case ThAudioPublicationMetadataComponent.authors:\n return authors && authors.length > 0 ? (\n <p key=\"authors\" className={ styles.audioMetadataAuthors }>{ authors.join(\", \") }</p>\n ) : null;\n \n default:\n return null;\n }\n }).filter(Boolean);\n };\n\n return (\n <header className={ styles.audioMetadata }>\n { renderMetadataComponents() }\n </header>\n );\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { AudioSettings, useAudioSettingsCache } from \"@/core/Hooks/Audio/useAudioSettingsCache\";\nimport { AdjacentTimelineItem } from \"@/lib/publicationReducer\";\n\nexport interface AudioStatelessCache {\n settings: AudioSettings;\n sleepTimerOnTrackEnd: boolean;\n sleepTimerOnFragmentEnd: boolean;\n adjacentTimelineItems: {\n previous: AdjacentTimelineItem | null;\n next: AdjacentTimelineItem | null;\n };\n}\n\nexport const useAudioStatelessCache = (\n volume: number,\n playbackRate: number,\n preservePitch: boolean,\n skipBackwardInterval: number,\n skipForwardInterval: number,\n skipInterval: number,\n pollInterval: number,\n autoPlay: boolean,\n enableMediaSession: boolean,\n sleepTimerOnTrackEnd: boolean,\n sleepTimerOnFragmentEnd: boolean,\n adjacentTimelineItems: {\n previous: AdjacentTimelineItem | null;\n next: AdjacentTimelineItem | null;\n }\n) => {\n const settingsCache = useAudioSettingsCache(\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession\n );\n\n const cache = useRef<AudioStatelessCache>({\n settings: settingsCache.current.settings,\n sleepTimerOnTrackEnd,\n sleepTimerOnFragmentEnd,\n adjacentTimelineItems,\n });\n\n // Update cache synchronously on every render to ensure fresh values\n cache.current.settings = settingsCache.current.settings;\n cache.current.sleepTimerOnTrackEnd = sleepTimerOnTrackEnd;\n cache.current.sleepTimerOnFragmentEnd = sleepTimerOnFragmentEnd;\n cache.current.adjacentTimelineItems = adjacentTimelineItems;\n\n return cache;\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { ThAudioPreferences } from \"@/preferences/audioPreferences\";\nimport { ThAudioKeys } from \"@/preferences/models/audio\";\nimport { AudioSettings } from \"@/core/Hooks/Audio/useAudioSettingsCache\";\n\ninterface UseAudioPreferencesConfigProps {\n settings: AudioSettings;\n preferences: ThAudioPreferences;\n}\n\nexport const useAudioPreferencesConfig = ({\n settings,\n preferences,\n}: UseAudioPreferencesConfigProps) => {\n const audioPreferences = useMemo(() => {\n const isSkipIntervalMode = ThAudioKeys.skipInterval in preferences.settings.keys;\n return {\n volume: settings.volume,\n playbackRate: settings.playbackRate,\n preservePitch: settings.preservePitch,\n skipBackwardInterval: isSkipIntervalMode ? settings.skipInterval : settings.skipBackwardInterval,\n skipForwardInterval: isSkipIntervalMode ? settings.skipInterval : settings.skipForwardInterval,\n pollInterval: settings.pollInterval,\n autoPlay: settings.autoPlay,\n enableMediaSession: settings.enableMediaSession,\n };\n }, [settings, preferences.settings.keys]);\n\n const audioDefaults = useMemo(() => {\n return {\n volume: 1.0,\n playbackRate: 1.0,\n preservePitch: true,\n skipBackwardInterval: 10,\n skipForwardInterval: 10,\n pollInterval: 1000,\n autoPlay: false,\n enableMediaSession: true,\n };\n }, []);\n\n return { audioPreferences, audioDefaults };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useState, useRef } from \"react\";\n\nimport { Locator, LocatorLocations, Publication } from \"@readium/shared\";\nimport { AudioNavigatorListeners, IAudioContentProtectionConfig } from \"@readium/navigator\";\nimport { ThAudioPreferences } from \"@/preferences/audioPreferences\";\n\nimport { AudioStatelessCache } from \"./useAudioStatelessCache\";\nimport { useAudioPreferencesConfig } from \"./useAudioPreferencesConfig\";\nimport { useAudioNavigator, AudioNavigatorLoadProps } from \"@/core/Hooks/Audio/useAudioNavigator\";\n\ninterface UseAudioPlayerInitProps {\n publication: Publication | null;\n initialPosition: Locator | null;\n listeners: AudioNavigatorListeners;\n preferences: ThAudioPreferences;\n cache: React.RefObject<AudioStatelessCache>;\n contentProtectionConfig?: IAudioContentProtectionConfig;\n onNavigatorReady?: () => void;\n onNavigatorLoaded?: () => void;\n onCleanup?: () => void;\n}\n\nexport const useAudioPlayerInit = ({\n publication,\n initialPosition,\n listeners,\n preferences,\n cache,\n contentProtectionConfig,\n onNavigatorReady,\n onNavigatorLoaded,\n onCleanup,\n}: UseAudioPlayerInitProps) => {\n const [navigatorReady, setNavigatorReady] = useState(false);\n\n const { audioPreferences, audioDefaults } = useAudioPreferencesConfig({\n settings: cache.current.settings,\n preferences,\n });\n\n const handleCleanup = useCallback(() => {\n onCleanup?.();\n }, [onCleanup]);\n\n const { AudioNavigatorLoad, AudioNavigatorDestroy } = useAudioNavigator();\n const isNavigatorLoadedAudio = useRef(false);\n\n useEffect(() => {\n // Only initialize once, never re-render\n if (!publication || isNavigatorLoadedAudio.current) return;\n\n // Initialize navigator for Audio\n\n const config: AudioNavigatorLoadProps = {\n publication,\n listeners,\n initialPosition: initialPosition ? new Locator({\n ...initialPosition,\n locations: initialPosition.locations ? new LocatorLocations(initialPosition.locations) : undefined\n }) : undefined,\n preferences: audioPreferences,\n defaults: audioDefaults,\n contentProtection: contentProtectionConfig,\n };\n\n isNavigatorLoadedAudio.current = true;\n\n // Call onNavigatorReady outside of navigator load\n onNavigatorReady?.();\n\n // Pass onNavigatorLoaded as the callback to AudioNavigatorLoad\n AudioNavigatorLoad(config, () => {\n // Set navigatorReady to true only after navigator actually loads\n setNavigatorReady(true);\n onNavigatorLoaded?.();\n });\n\n return () => {\n if (isNavigatorLoadedAudio.current) {\n setNavigatorReady(false);\n AudioNavigatorDestroy(() => {\n isNavigatorLoadedAudio.current = false;\n handleCleanup();\n });\n }\n };\n }, []);\n\n return {\n navigatorReady,\n };\n};\n","/**\n * True for any browser running on the WebKit engine without Chrome's Blink layer\n * (Safari on macOS/iOS, and all iOS browsers which are forced onto WebKit).\n * Used to gate around WebKit-specific platform quirks.\n */\nexport const isWebKit = typeof navigator !== \"undefined\"\n && /webkit/i.test(navigator.userAgent)\n && !/chrome/i.test(navigator.userAgent);\n","\"use client\";\n\nimport { useLayoutEffect, useState, useMemo, useCallback, useRef, useEffect } from \"react\";\n\nimport audioLayoutStyles from \"./assets/styles/thorium-web.audio.app.module.css\";\nimport audioStyles from \"./assets/styles/thorium-web.audioPlayer.module.css\";\n\nimport { ThPluginRegistry } from \"../Plugins/PluginRegistry\";\n\nimport { ThPluginProvider } from \"../Plugins/PluginProvider\";\nimport { NavigatorProvider } from \"@/core/Navigator\";\n\nimport { Publication } from \"@readium/shared\";\nimport { ContextMenuEvent, KeyboardEventData, SuspiciousActivityEvent } from \"@readium/navigator-html-injectables\";\nimport { AudioNavigatorListeners } from \"@readium/navigator\";\nimport { PositionStorage } from \"../Reader/StatefulReaderWrapper\";\nimport { ThAudioPlayerComponent } from \"@/preferences/models\";\n\nimport { StatefulDockingWrapper } from \"../Docking/StatefulDockingWrapper\";\nimport { StatefulPlayerHeader } from \"./StatefulPlayerHeader\";\n\nimport { StatefulAudioCover } from \"./StatefulAudioCover\";\nimport { StatefulAudioMetadata } from \"./StatefulAudioMetadata\";\nimport { StatefulAudioPlaybackControls } from \"./controls/StatefulAudioPlaybackControls\";\nimport { StatefulAudioMediaActions } from \"./actions/StatefulAudioMediaActions\";\nimport { StatefulAudioProgressBar } from \"./controls/StatefulAudioProgressBar\";\n\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useAudioNavigator } from \"@/core/Hooks/Audio/useAudioNavigator\";\nimport { useAudioStatelessCache } from \"./Hooks/useAudioStatelessCache\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { resolveAudioContentProtectionConfig } from \"@/preferences/models/protection\";\nimport { usePositionStorage } from \"@/hooks/usePositionStorage\";\nimport { useDocumentTitle } from \"@/core/Hooks/useDocumentTitle\";\nimport { useAudioPlayerInit } from \"./Hooks/useAudioPlayerInit\";\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport {\n setLoading\n} from \"@/lib/readerReducer\";\nimport {\n setPublicationStart,\n setPublicationEnd,\n setTocEntry,\n setAdjacentTimelineItems,\n} from \"@/lib/publicationReducer\";\nimport { findTocItemByHref, TocItem } from \"@/helpers/buildTocTree\";\nimport { isWebKit } from \"@/helpers/browser\";\nimport { TimelineItem } from \"@readium/shared\";\nimport { \n setStatus,\n setSeeking,\n setStalled,\n setTrackReady,\n setSleepTimerOnTrackEnd,\n setSleepTimerOnFragmentEnd,\n setRemotePlaybackState,\n setSeekableRanges\n} from \"@/lib/playerReducer\";\n\nimport { createAudioDefaultPlugin } from \"../Plugins/helpers/createAudioDefaultPlugin\";\nimport debounce from \"debounce\";\n\nexport interface StatefulPlayerProps {\n publication: Publication;\n localDataKey: string | null;\n plugins?: any[];\n positionStorage?: PositionStorage;\n coverUrl?: string;\n}\n\nexport const StatefulPlayer = ({\n publication,\n localDataKey,\n plugins,\n positionStorage,\n coverUrl\n}: StatefulPlayerProps) => {\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(createAudioDefaultPlugin());\n }\n setPluginsRegistered(true);\n }, [plugins]);\n\n if (!pluginsRegistered) {\n return null;\n }\n\n return (\n <ThPluginProvider>\n <StatefulPlayerInner publication={ publication } localDataKey={ localDataKey } positionStorage={ positionStorage } coverUrl={ coverUrl } />\n </ThPluginProvider>\n );\n};\n\nconst StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUrl }: { publication: Publication; localDataKey: string | null; positionStorage?: PositionStorage; coverUrl?: string }) => {\n const { preferences } = useAudioPreferences();\n const { t } = useI18n();\n\n const wrapperRef = useRef<HTMLElement>(null);\n const coverSectionRef = useRef<HTMLElement>(null);\n const compactMinHeight = useRef<number>(0);\n const [isExpanded, setIsExpanded] = useState(false);\n\n const sleepOnTrackEnd = useAppSelector(state => state.player.sleepTimer.onTrackEnd);\n const sleepOnFragmentEnd = useAppSelector(state => state.player.sleepTimer.onFragmentEnd);\n const adjacentTimelineItems = useAppSelector(state => state.publication.adjacentTimelineItems);\n const volume = useAppSelector(state => state.audioSettings.volume);\n const playbackRate = useAppSelector(state => state.audioSettings.playbackRate);\n const preservePitch = useAppSelector(state => state.audioSettings.preservePitch);\n const skipBackwardInterval = useAppSelector(state => state.audioSettings.skipBackwardInterval);\n const skipForwardInterval = useAppSelector(state => state.audioSettings.skipForwardInterval);\n const skipInterval = useAppSelector(state => state.audioSettings.skipInterval);\n const pollInterval = useAppSelector(state => state.audioSettings.pollInterval);\n const autoPlay = useAppSelector(state => state.audioSettings.autoPlay);\n const enableMediaSession = useAppSelector(state => state.audioSettings.enableMediaSession);\n\n const cache = useAudioStatelessCache(\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n sleepOnTrackEnd,\n sleepOnFragmentEnd,\n adjacentTimelineItems\n );\n\n const dispatch = useAppDispatch();\n\n const audioNavigator = useAudioNavigator();\n const { canGoBackward, canGoForward, submitPreferences, pause, isPlaying } = audioNavigator;\n\n const { setLocalData, getLocalData } = usePositionStorage(localDataKey, positionStorage);\n\n const documentTitle = publication?.metadata?.title?.getTranslation(\"en\");\n useDocumentTitle(documentTitle);\n\n const tocTree = useAppSelector(state => state.publication.unstableTimeline?.toc?.tree);\n const tocTreeRef = useRef<TocItem[] | undefined>(undefined);\n useEffect(() => {\n tocTreeRef.current = tocTree;\n }, [tocTree]);\n\n // Callback to handle timeline navigation state updates\n const handleTimelineNavigation = useCallback((item: TimelineItem) => {\n const tl = publication.timeline;\n const link = tl.linkFor(item);\n if (link) {\n const matched = findTocItemByHref(tocTreeRef.current || [], link.href);\n dispatch(setTocEntry(matched || null));\n }\n const { previous, next } = tl.adjacentTo(item);\n dispatch(setAdjacentTimelineItems({\n previous: previous ? { title: previous.title, href: tl.linkFor(previous)?.href ?? \"\" } : null,\n next: next ? { title: next.title, href: tl.linkFor(next)?.href ?? \"\" } : null,\n }));\n return { previous, next };\n }, [dispatch, publication]);\n\n // Callback to check if affordance is timeline or toc (fragment-based)\n const isFragmentAffordance = useCallback((affordance: string) => {\n return affordance === \"timeline\" || affordance === \"toc\";\n }, []);\n\n // Callback to handle sleep timer endOfFragment logic\n const handleSleepTimerEndOfFragment = useCallback((isTransitionToNext: boolean) => {\n if (!cache.current.sleepTimerOnFragmentEnd || !isTransitionToNext) return;\n \n const nextAffordance = preferences.affordances.next;\n if (isFragmentAffordance(nextAffordance)) {\n pause();\n dispatch(setSleepTimerOnFragmentEnd(false));\n }\n }, [cache, preferences.affordances.next, isFragmentAffordance, pause, dispatch]);\n\n // Callback to handle continuous play logic\n const handleContinuousPlay = useCallback((isTransitionToNext: boolean) => {\n if (!cache.current.settings.autoPlay && isTransitionToNext) {\n if (isFragmentAffordance(preferences.affordances.next)) {\n pause();\n }\n }\n }, [cache, preferences.affordances.next, isFragmentAffordance, pause]);\n\n const listeners: AudioNavigatorListeners = useMemo(() => ({\n timelineItemChanged: (item: TimelineItem | undefined) => {\n if (!item) {\n dispatch(setTocEntry(null));\n dispatch(setAdjacentTimelineItems({ previous: null, next: null }));\n return;\n }\n\n // Capture the previous \"next\" item from cache BEFORE handleTimelineNavigation updates Redux state\n const previousNextItem = cache.current.adjacentTimelineItems.next;\n const currentItemHref = publication.timeline.linkFor(item)?.href ?? \"\";\n\n // Update TOC entry and adjacent items (this updates Redux state)\n handleTimelineNavigation(item);\n\n // Check if we're transitioning to the next fragment by comparing current item href with previous next item href\n const isTransitionToNext = previousNextItem !== null &&\n previousNextItem.href === currentItemHref;\n\n handleSleepTimerEndOfFragment(isTransitionToNext);\n handleContinuousPlay(isTransitionToNext);\n },\n positionChanged: (locator) => {\n setLocalData(locator);\n\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 },\n trackLoaded: () => {\n dispatch(setTrackReady(true));\n dispatch(setStalled(false));\n dispatch(setStatus(isPlaying() ? \"playing\" : \"paused\"));\n },\n trackEnded: () => {\n if (cache.current.sleepTimerOnTrackEnd) {\n submitPreferences({ autoPlay: false });\n }\n if (cache.current.sleepTimerOnFragmentEnd) {\n submitPreferences({ autoPlay: false });\n dispatch(setSleepTimerOnFragmentEnd(false));\n }\n },\n metadataLoaded: () => {},\n play: () => {\n if (cache.current.sleepTimerOnTrackEnd) {\n submitPreferences({ autoPlay: cache.current.settings.autoPlay });\n dispatch(setSleepTimerOnTrackEnd(false));\n }\n dispatch(setStatus(\"playing\"));\n },\n pause: () => {\n dispatch(setStatus(\"paused\"));\n },\n stalled: (isStalled) => {\n dispatch(setStalled(isStalled));\n },\n seeking: (isSeeking) => {\n dispatch(setSeeking(isSeeking));\n },\n seekable: (timeRanges) => {\n const ranges = [];\n for (let i = 0; i < timeRanges.length; i++) {\n ranges.push({ start: timeRanges.start(i), end: timeRanges.end(i) });\n }\n dispatch(setSeekableRanges(ranges));\n },\n error: (error, locator) => {\n console.error(\"[AudioNavigator] playback error\", error, locator);\n dispatch(setStatus(\"paused\"));\n },\n remotePlaybackStateChanged: (state) => {\n if (isWebKit) return;\n dispatch(setRemotePlaybackState(state));\n },\n contentProtection: (_type: string, _detail: SuspiciousActivityEvent) => {},\n peripheral: (_data: KeyboardEventData) => {},\n contextMenu: (_data: ContextMenuEvent) => {}\n }), [setLocalData, canGoBackward, canGoForward, isPlaying, dispatch, cache, submitPreferences, publication, handleTimelineNavigation, handleSleepTimerEndOfFragment, handleContinuousPlay]);\n\n const initialPosition = useMemo(() => getLocalData(), [getLocalData]);\n\n const { navigatorReady } = useAudioPlayerInit({\n publication,\n initialPosition,\n listeners,\n preferences,\n cache,\n contentProtectionConfig: resolveAudioContentProtectionConfig(preferences.contentProtection, t),\n onNavigatorLoaded: () => dispatch(setLoading(false)),\n });\n\n const { compact, expanded } = preferences.theming.layout;\n\n const renderPlayerComponent = useCallback((component: ThAudioPlayerComponent) => {\n switch (component) {\n case ThAudioPlayerComponent.cover:\n return <StatefulAudioCover key={ component } ref={ coverSectionRef } coverUrl={ coverUrl } title={ publication?.metadata?.title?.getTranslation(\"en\") } />;\n case ThAudioPlayerComponent.metadata:\n return publication ? <StatefulAudioMetadata key={ component } publication={ publication } /> : null;\n case ThAudioPlayerComponent.playbackControls:\n return <StatefulAudioPlaybackControls key={ component } />;\n case ThAudioPlayerComponent.progressBar:\n return <StatefulAudioProgressBar key={ component } />;\n case ThAudioPlayerComponent.mediaActions:\n return <StatefulAudioMediaActions key={ component } />;\n }\n }, [coverUrl, publication]);\n\n const renderCompactComponents = useCallback(() => {\n const coverIdx = compact.order.indexOf(ThAudioPlayerComponent.cover);\n const metaIdx = compact.order.indexOf(ThAudioPlayerComponent.metadata);\n const adjacent = coverIdx !== -1 && metaIdx !== -1 && Math.abs(coverIdx - metaIdx) === 1;\n\n if (!adjacent) {\n return compact.order.map(renderPlayerComponent);\n }\n\n const groupStart = Math.min(coverIdx, metaIdx);\n const nodes: React.ReactNode[] = [];\n for (let i = 0; i < compact.order.length; i++) {\n if (i === groupStart) {\n nodes.push(\n <div key=\"cover-metadata-group\" className={ audioStyles.coverMetadataGroup }>\n { renderPlayerComponent(compact.order[i]) }\n { renderPlayerComponent(compact.order[i + 1]) }\n </div>\n );\n i++;\n } else {\n nodes.push(renderPlayerComponent(compact.order[i]));\n }\n }\n return nodes;\n }, [compact.order, renderPlayerComponent]);\n\n useEffect(() => {\n const el = wrapperRef.current;\n if (!el) return;\n\n const check = debounce(() => {\n if (!isExpanded) {\n const overflow = el.scrollHeight - el.clientHeight;\n if (overflow > 0) {\n const coverEl = coverSectionRef.current;\n if (coverEl) {\n const minHeight = parseFloat(getComputedStyle(coverEl).minHeight) || 0;\n const newMaxHeight = coverEl.clientHeight - overflow;\n if (newMaxHeight >= minHeight) {\n el.style.setProperty(\"--th-layout-constraints-cover\", `${ newMaxHeight }px`);\n return;\n }\n }\n el.style.removeProperty(\"--th-layout-constraints-cover\");\n compactMinHeight.current = el.scrollHeight;\n setIsExpanded(true);\n } else {\n el.style.removeProperty(\"--th-layout-constraints-cover\");\n }\n } else {\n if (el.clientHeight > compactMinHeight.current) {\n setIsExpanded(false);\n }\n }\n }, 100);\n\n const observer = new ResizeObserver(check);\n\n observer.observe(el);\n return () => {\n check.clear();\n observer.disconnect();\n };\n }, [isExpanded]);\n\n return (\n <>\n <NavigatorProvider mediaNavigator={ audioNavigator }>\n <main className={ audioLayoutStyles.main }>\n <StatefulDockingWrapper>\n <div className={ audioLayoutStyles.shell }>\n <StatefulPlayerHeader\n actionKeys={ preferences.actions.secondary.displayOrder as string[] }\n actionsOrder={ preferences.actions.secondary.displayOrder as string[] }\n />\n\n <article\n ref={ wrapperRef }\n className={ isExpanded ? audioStyles.audioPlayerWrapperExpanded : audioStyles.audioPlayerWrapper }\n aria-label={ t(\"reader.app.publicationWrapper\") }\n >\n { isExpanded ? (\n <>\n <div className={ audioStyles.audioPlayerExpandedStart }>\n { expanded.start.map(renderPlayerComponent) }\n </div>\n <div className={ audioStyles.audioPlayerExpandedEnd }>\n { expanded.end.map(renderPlayerComponent) }\n </div>\n </>\n ) : renderCompactComponents() }\n </article>\n </div>\n </StatefulDockingWrapper>\n </main>\n </NavigatorProvider>\n </>\n );\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { toEntryRef, buildTocTree } from './chunk-TEZB4ULX.mjs';
|
|
2
2
|
import { useEffect, useState, useLayoutEffect, useCallback, useRef, useMemo } from 'react';
|
|
3
3
|
import { Layout, Link, Locator } from '@readium/shared';
|
|
4
|
-
import { AudioPreferences, AudioNavigator, EpubPreferences, EpubNavigator, WebPubPreferences, ExperimentalWebPubNavigator } from '@readium/navigator';
|
|
4
|
+
import { AudioPreferences, AudioNavigator, EpubPreferences, EpubNavigator, getScriptMode, WebPubPreferences, ExperimentalWebPubNavigator } from '@readium/navigator';
|
|
5
5
|
|
|
6
6
|
var useDocumentTitle = (title) => {
|
|
7
7
|
useEffect(() => {
|
|
@@ -579,6 +579,11 @@ var useEpubNavigator = () => {
|
|
|
579
579
|
const getCframes = useCallback(() => {
|
|
580
580
|
return navigatorInstance2?._cframes;
|
|
581
581
|
}, []);
|
|
582
|
+
const currentScriptMode = useCallback(() => {
|
|
583
|
+
const metadata = navigatorInstance2?.publication?.metadata;
|
|
584
|
+
if (!metadata) return void 0;
|
|
585
|
+
return getScriptMode(metadata);
|
|
586
|
+
}, []);
|
|
582
587
|
return {
|
|
583
588
|
EpubNavigatorLoad,
|
|
584
589
|
EpubNavigatorDestroy,
|
|
@@ -601,12 +606,13 @@ var useEpubNavigator = () => {
|
|
|
601
606
|
getSetting,
|
|
602
607
|
submitPreferences,
|
|
603
608
|
getCframes,
|
|
609
|
+
getScriptMode: currentScriptMode,
|
|
604
610
|
onFXLPositionChange: (cb) => {
|
|
605
611
|
FXLPositionChangedCallbackRef.current = cb;
|
|
606
612
|
}
|
|
607
613
|
};
|
|
608
614
|
};
|
|
609
|
-
var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWeight, hyphens, letterSpacing, lineLength, lineHeight, paragraphIndent, paragraphSpacing, publisherStyles, scroll, textNormalization, wordSpacing, theme) => {
|
|
615
|
+
var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWeight, hyphens, letterSpacing, ligatures, lineLength, lineHeight, noRuby, paragraphIndent, paragraphSpacing, publisherStyles, scroll, textNormalization, wordSpacing, theme) => {
|
|
610
616
|
const cache = useRef({
|
|
611
617
|
settings: {
|
|
612
618
|
columnCount,
|
|
@@ -615,8 +621,10 @@ var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWe
|
|
|
615
621
|
fontWeight,
|
|
616
622
|
hyphens,
|
|
617
623
|
letterSpacing,
|
|
624
|
+
ligatures,
|
|
618
625
|
lineHeight,
|
|
619
626
|
lineLength,
|
|
627
|
+
noRuby,
|
|
620
628
|
paragraphIndent,
|
|
621
629
|
paragraphSpacing,
|
|
622
630
|
publisherStyles,
|
|
@@ -635,8 +643,10 @@ var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWe
|
|
|
635
643
|
fontWeight,
|
|
636
644
|
hyphens,
|
|
637
645
|
letterSpacing,
|
|
646
|
+
ligatures,
|
|
638
647
|
lineHeight,
|
|
639
648
|
lineLength,
|
|
649
|
+
noRuby,
|
|
640
650
|
paragraphIndent,
|
|
641
651
|
paragraphSpacing,
|
|
642
652
|
publisherStyles,
|
|
@@ -653,8 +663,10 @@ var useEpubSettingsCache = (textAlign, columnCount, fontFamily, fontSize, fontWe
|
|
|
653
663
|
fontWeight,
|
|
654
664
|
hyphens,
|
|
655
665
|
letterSpacing,
|
|
666
|
+
ligatures,
|
|
656
667
|
lineHeight,
|
|
657
668
|
lineLength,
|
|
669
|
+
noRuby,
|
|
658
670
|
paragraphIndent,
|
|
659
671
|
paragraphSpacing,
|
|
660
672
|
publisherStyles,
|
|
@@ -766,6 +778,11 @@ var useWebPubNavigator = () => {
|
|
|
766
778
|
const getCframes = useCallback(() => {
|
|
767
779
|
return navigatorInstance3?._cframes;
|
|
768
780
|
}, []);
|
|
781
|
+
const currentScriptMode = useCallback(() => {
|
|
782
|
+
const metadata = navigatorInstance3?.publication?.metadata;
|
|
783
|
+
if (!metadata) return void 0;
|
|
784
|
+
return getScriptMode(metadata);
|
|
785
|
+
}, []);
|
|
769
786
|
return {
|
|
770
787
|
WebPubNavigatorLoad,
|
|
771
788
|
WebPubNavigatorDestroy,
|
|
@@ -786,17 +803,20 @@ var useWebPubNavigator = () => {
|
|
|
786
803
|
preferencesEditor: navigatorInstance3?.preferencesEditor,
|
|
787
804
|
getSetting,
|
|
788
805
|
submitPreferences,
|
|
789
|
-
getCframes
|
|
806
|
+
getCframes,
|
|
807
|
+
getScriptMode: currentScriptMode
|
|
790
808
|
};
|
|
791
809
|
};
|
|
792
|
-
var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, lineHeight, paragraphIndent, paragraphSpacing, publisherStyles, textAlign, textNormalization, wordSpacing, zoom) => {
|
|
810
|
+
var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, ligatures, lineHeight, noRuby, paragraphIndent, paragraphSpacing, publisherStyles, textAlign, textNormalization, wordSpacing, zoom) => {
|
|
793
811
|
const cache = useRef({
|
|
794
812
|
settings: {
|
|
795
813
|
fontFamily,
|
|
796
814
|
fontWeight,
|
|
797
815
|
hyphens,
|
|
798
816
|
letterSpacing,
|
|
817
|
+
ligatures,
|
|
799
818
|
lineHeight,
|
|
819
|
+
noRuby,
|
|
800
820
|
paragraphIndent,
|
|
801
821
|
paragraphSpacing,
|
|
802
822
|
publisherStyles,
|
|
@@ -812,7 +832,9 @@ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, li
|
|
|
812
832
|
fontWeight,
|
|
813
833
|
hyphens,
|
|
814
834
|
letterSpacing,
|
|
835
|
+
ligatures,
|
|
815
836
|
lineHeight,
|
|
837
|
+
noRuby,
|
|
816
838
|
paragraphIndent,
|
|
817
839
|
paragraphSpacing,
|
|
818
840
|
publisherStyles,
|
|
@@ -826,7 +848,9 @@ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, li
|
|
|
826
848
|
fontWeight,
|
|
827
849
|
hyphens,
|
|
828
850
|
letterSpacing,
|
|
851
|
+
ligatures,
|
|
829
852
|
lineHeight,
|
|
853
|
+
noRuby,
|
|
830
854
|
paragraphIndent,
|
|
831
855
|
paragraphSpacing,
|
|
832
856
|
publisherStyles,
|
|
@@ -840,5 +864,5 @@ var useWebPubSettingsCache = (fontFamily, fontWeight, hyphens, letterSpacing, li
|
|
|
840
864
|
};
|
|
841
865
|
|
|
842
866
|
export { timelineInstance, useAudioNavigator, useAudioSettingsCache, useDocumentTitle, useEpubNavigator, useEpubSettingsCache, useFullscreen, useIsClient, useLocalStorage, useTimeline, useWebPubNavigator, useWebPubSettingsCache };
|
|
843
|
-
//# sourceMappingURL=chunk-
|
|
844
|
-
//# sourceMappingURL=chunk-
|
|
867
|
+
//# sourceMappingURL=chunk-SZAVAQ6S.mjs.map
|
|
868
|
+
//# sourceMappingURL=chunk-SZAVAQ6S.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/Hooks/useDocumentTitle.ts","../src/core/Hooks/useIsClient.ts","../src/core/Hooks/useFullscreen.ts","../src/core/Hooks/useLocalStorage.ts","../src/core/Hooks/useTimeline.ts","../src/core/Hooks/Audio/useAudioNavigator.ts","../src/core/Hooks/Audio/useAudioSettingsCache.ts","../src/core/Hooks/Epub/useEpubNavigator.ts","../src/core/Hooks/Epub/useEpubSettingsCache.ts","../src/core/Hooks/WebPub/useWebPubNavigator.ts","../src/core/Hooks/WebPub/useWebPubSettingsCache.ts"],"names":["useState","useEffect","useCallback","useRef","timelineItems","currentItem","useMemo","navigatorInstance","Layout","currentLocator","getScriptMode"],"mappings":"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","file":"chunk-SZAVAQ6S.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\n\nexport const useDocumentTitle = (title?: string) => {\n useEffect(() => {\n if (title) document.title = title;\n }, [title]);\n};","\"use client\";\n\nimport { useLayoutEffect, useState } from \"react\";\n\nexport const useIsClient = () => {\n const [isClient, setIsClient] = useState(false);\n\n useLayoutEffect(() => {\n if (typeof window !== \"undefined\") setIsClient(true);\n }, []);\n\n return isClient;\n}","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useIsClient } from \"./useIsClient\";\n\nexport const useFullscreen = (onChange?: (isFullscreen: boolean) => void) => {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const isClient = useIsClient();\n\n const handleFullscreen = useCallback(() => {\n if (!isClient) return;\n\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen();\n } else if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n }, [isClient]);\n\n useEffect(() => {\n const onFSchange = () => {\n const isFs = Boolean(document.fullscreenElement);\n setIsFullscreen(isFs);\n onChange && onChange(isFs);\n }\n document.addEventListener(\"fullscreenchange\", onFSchange);\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", onFSchange);\n }\n }, [onChange]);\n\n return {\n isFullscreen,\n handleFullscreen\n }\n}","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const useLocalStorage = (key: string | null) => {\n const [localData, setLocalData] = useState<any>(null);\n const cachedLocalData = useRef<any>(null);\n\n const setValue = useCallback((newValue: any) => {\n if (!key) return;\n setLocalData(newValue);\n localStorage.setItem(key, JSON.stringify(newValue));\n }, [key]);\n\n const getValue = useCallback(() => {\n if (!key) return null;\n if (localData !== null) return localData;\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n }, [key, localData]);\n\n const clearValue = useCallback(() => {\n if (!key) return;\n setLocalData(null);\n localStorage.removeItem(key);\n }, [key]);\n\n useEffect(() => {\n if (!key) return;\n cachedLocalData.current = localData;\n }, [localData, key]);\n\n return {\n setLocalData: setValue,\n getLocalData: getValue,\n clearLocalData: clearValue,\n localData: key ? localData : null,\n cachedLocalData\n };\n};","import { useCallback, useEffect, useRef, useState, useMemo } from \"react\";\n\nimport { Layout, Link, Locator, Publication } from \"@readium/shared\";\nimport { TocItem, TocEntryRef, buildTocTree, toEntryRef } from \"@/helpers/buildTocTree\";\n\nexport type { TocItem, TocEntryRef } from \"@/helpers/buildTocTree\";\n\nexport interface TimelineItem {\n href: string;\n readingOrderIndex?: number;\n title?: string;\n fragments?: string[];\n positionRange?: [number, number?];\n progressionRange?: [number, number?];\n totalProgressionRange?: [number, number?];\n children?: TimelineItem[];\n}\n\nexport interface TimelineProgression {\n totalItems?: number;\n currentIndex?: number;\n totalPositions?: number;\n currentPositions?: number[];\n relativeProgression?: number;\n totalProgression?: number;\n currentChapter?: string;\n positionsLeft?: number;\n}\n\nexport interface UnstableTimeline {\n title?: string;\n items?: {\n [href: string]: TimelineItem;\n };\n toc?: {\n tree?: TocItem[];\n currentEntry?: TocEntryRef | null;\n };\n currentItem?: TimelineItem | null;\n previousItem?: TimelineItem | null;\n nextItem?: TimelineItem | null;\n progression?: TimelineProgression;\n}\n\nexport let timelineInstance: UnstableTimeline | undefined;\n\nexport const useTimeline = ({\n publication, \n currentLocation, \n currentPositions,\n positionsList,\n onChange\n}: {\n publication: Publication | null, \n currentLocation?: Locator, \n currentPositions?: number[],\n positionsList?: Locator[],\n onChange?: (timeline: UnstableTimeline) => void\n}): UnstableTimeline => {\n const layout = publication?.metadata.effectiveLayout || Layout.reflowable;\n\n const [timelineItems, setTimelineItems] = useState<{ [href: string]: TimelineItem }>({});\n const [tocTree, setTocTree] = useState<TocItem[]>([]);\n const [currentTocEntry, setCurrentTocEntry] = useState<TocEntryRef | null>(null);\n const [currentItem, setCurrentItem] = useState<TimelineItem | null>(null);\n const [previousItem, setPreviousItem] = useState<TimelineItem | null>(null);\n const [nextItem, setNextItem] = useState<TimelineItem | null>(null);\n\n const [relativeProgression, setRelativeProgression] = useState<number | undefined>(undefined);\n const [totalProgression, setTotalProgression] = useState<number | undefined>(undefined);\n\n const idCounterRef = useRef(0);\n\n // Create the timeline object\n const timeline = useMemo(() => ({\n title: publication?.metadata.title.getTranslation(\"en\"),\n items: timelineItems,\n toc: {\n tree: tocTree,\n currentEntry: currentTocEntry\n },\n currentItem,\n previousItem,\n nextItem,\n progression: {\n totalItems: publication?.readingOrder.items.length,\n currentIndex: currentItem?.readingOrderIndex !== undefined ? currentItem.readingOrderIndex + 1 : undefined,\n totalPositions: positionsList?.length,\n currentPositions: currentPositions || [],\n relativeProgression: relativeProgression,\n totalProgression: totalProgression,\n currentChapter: currentItem?.title,\n positionsLeft: (() => {\n const endPosition = currentItem?.positionRange?.[1];\n const currentPosition = currentPositions?.[0];\n \n // Only calculate positionsLeft if we have all required position data\n if (!positionsList?.length || endPosition === undefined || currentPosition === undefined) {\n return undefined;\n }\n \n return Math.max(0, endPosition - currentPosition);\n })()\n }\n }), [\n publication?.metadata.title,\n publication?.readingOrder.items,\n timelineItems,\n tocTree,\n currentTocEntry,\n currentItem,\n previousItem,\n nextItem,\n positionsList,\n currentPositions,\n relativeProgression,\n totalProgression\n ]);\n\n\n const handleTocEntryOnNav = useCallback((locator?: Locator, currentPos?: number[]) => {\n if (!locator || !tocTree.length) return;\n\n const findMatch = (items: TocItem[], link?: Link): TocItem | undefined => {\n for (const item of items) {\n if (item.href === link?.href) {\n return item;\n }\n if (item.children) {\n const match = findMatch(item.children, link);\n if (match) return match;\n }\n }\n return undefined;\n };\n\n const currentMatch = findMatch(tocTree, new Link(locator));\n if (currentMatch) {\n setCurrentTocEntry(prev => prev?.id === currentMatch.id ? prev : toEntryRef(currentMatch));\n return;\n }\n\n // If we're in FXL and didn't find a match, try to find a match for the other position in the spread\n if (layout === Layout.fixed) {\n if (currentPos && currentPos.length === 2) {\n const otherPosition = currentPos[0] === locator.locations.position ? currentPos[1] : currentPos[0];\n const otherPositionInList = positionsList?.find((pos: Locator) => pos.locations.position === otherPosition);\n if (otherPositionInList) {\n const match = findMatch(tocTree, new Link(otherPositionInList));\n if (match) {\n setCurrentTocEntry(prev => prev?.id === match.id ? prev : toEntryRef(match));\n return;\n }\n }\n }\n }\n\n // If no match, try to find a match for other positions\n const otherPositions = currentPos?.filter(pos => pos !== locator.locations.position) || [];\n for (const otherPosition of otherPositions) {\n const otherPositionInList = positionsList?.find((pos: Locator) => pos.locations.position === otherPosition);\n if (otherPositionInList) {\n const match = findMatch(tocTree, new Link(otherPositionInList));\n if (match) {\n setCurrentTocEntry(prev => prev?.id === match.id ? prev : toEntryRef(match));\n return;\n }\n }\n }\n }, [tocTree, layout, positionsList]);\n\n const buildTimelineItems = useCallback(() => {\n const timelineItems: { [href: string]: TimelineItem } = {};\n const readingOrder = publication?.readingOrder?.items || [];\n const toc = publication?.toc?.items && publication?.toc?.items.length > 0\n ? publication.toc.items\n : publication?.readingOrder?.items || [];\n const flatToc = toc.flatMap(t => [t, ...(t.children?.items || [])]);\n \n // Helper function to get URL base (without params and fragment)\n const getBaseUrl = (url: string): string => {\n const [base] = url.split(\"#\");\n const [path] = base.split(\"?\");\n return path;\n };\n\n // Function to find the first non-empty title by searching backward \n // in flatToc from the current item\"s position\n // The issue with this fallback is that for progressionOfResource\n // the progression is effectively scoped to the reading order item\n // so we have to differentiate using the index \n const findNearestTitle = (currentHref: string): string => {\n const currentIndex = readingOrder.findIndex(item => getBaseUrl(item.href) === getBaseUrl(currentHref));\n \n if (currentIndex === -1) return \"\";\n \n for (let i = currentIndex; i >= 0; i--) {\n const item = readingOrder[i];\n // Find matching TOC items for this reading order item\n const matchingTocItems = flatToc.filter(t => \n getBaseUrl(t.href) === getBaseUrl(item.href)\n );\n \n // If we have a matching TOC item with a title, return it with the difference in indices\n const title = matchingTocItems[0]?.title?.trim();\n if (title) {\n const diff = currentIndex - i;\n return diff > 0 ? `${ title } (${ diff + 1 })` : title;\n }\n }\n \n return \"\";\n };\n\n // Process reading order items\n readingOrder.forEach((item, index) => {\n // Find all matching TOC items (with or without fragment)\n const matchingTocItems = flatToc.filter(t => {\n const baseHref = getBaseUrl(t.href);\n const baseItemHref = getBaseUrl(item.href);\n return baseHref === baseItemHref;\n });\n\n // Create timeline item with all matching titles\n const timelineItem: TimelineItem = {\n href: item.href,\n readingOrderIndex: index,\n title: item.title || matchingTocItems[0]?.title || findNearestTitle(item.href),\n fragments: matchingTocItems\n .map(t => t.href.split(\"#\")[1])\n .filter(Boolean),\n children: matchingTocItems[0]?.children?.items?.map(child => ({\n // We do not care about index for children\n // since currentLocation is guaranteed to be in the reading order\n title: child.title,\n href: child.href\n })) || []\n };\n\n timelineItems[item.href] = timelineItem;\n });\n \n // Then add position and progression information from positionsList\n for (const item of readingOrder) {\n const timelineItem = timelineItems[item.href];\n if (!timelineItem) continue;\n\n const positions = positionsList\n ? positionsList\n .filter(p => p.href === item.href)\n .sort((a, b) => (a.locations.position || 0) - (b.locations.position || 0))\n : [];\n \n if (positions.length > 0) {\n const start = positions[0].locations;\n // For single position, use the same location for start and end\n const end = positions.length > 1 \n ? positions[positions.length - 1].locations \n : start; // Use start as end for single position\n \n timelineItem.positionRange = start.position !== undefined \n ? [start.position, end.position]\n : undefined;\n \n timelineItem.progressionRange = start.progression !== undefined \n ? [start.progression, end.progression]\n : undefined;\n \n timelineItem.totalProgressionRange = start.totalProgression !== undefined \n ? [start.totalProgression, end.totalProgression]\n : undefined;\n }\n }\n\n return timelineItems;\n }, [publication, positionsList]);\n\n const updateTimelineItems = useCallback((currentLoc?: Locator) => {\n if (!currentLoc || !timelineItems) {\n setPreviousItem(null);\n setNextItem(null);\n setCurrentItem(null);\n return;\n }\n\n const currentItem = timelineItems[currentLoc.href];\n if (!currentItem) {\n setPreviousItem(null);\n setNextItem(null);\n setCurrentItem(null);\n return;\n }\n\n setCurrentItem(currentItem);\n\n const timelineItemsArray = Object.values(timelineItems);\n const currentIndex = timelineItemsArray.findIndex(item => item.href === currentLoc.href);\n\n if (currentIndex === -1) {\n setPreviousItem(null);\n setNextItem(null);\n } else {\n setPreviousItem(currentIndex > 0 ? timelineItemsArray[currentIndex - 1] : null);\n setNextItem(currentIndex < timelineItemsArray.length - 1 ? timelineItemsArray[currentIndex + 1] : null);\n }\n }, [timelineItems]);\n\n useEffect(() => {\n if (!publication) return;\n\n const idGenerator = () => `toc-${ ++idCounterRef.current }`;\n const tocItems = publication.toc?.items && publication.toc.items.length > 0\n ? publication.toc.items\n : publication.readingOrder?.items || [];\n const publicationTitle = publication?.metadata.title.getTranslation(\"en\");\n setTocTree(buildTocTree(tocItems, idGenerator, positionsList, publicationTitle));\n setTimelineItems(buildTimelineItems());\n }, [publication, positionsList, buildTimelineItems]);\n\n useEffect(() => {\n if (!tocTree.length || !timelineItems) return;\n\n // If we have a current location, use it\n if (currentLocation) {\n handleTocEntryOnNav(currentLocation, currentPositions);\n }\n // Otherwise, use the first TOC entry\n else if (tocTree.length > 0) {\n handleTocEntryOnNav(new Locator({ href: tocTree[0].href, type: \"\" }), currentPositions);\n }\n\n updateTimelineItems(currentLocation);\n\n // Update progression state when location changes\n setRelativeProgression(currentLocation?.locations.progression);\n setTotalProgression(currentLocation?.locations.totalProgression);\n }, [currentLocation, currentPositions, tocTree, timelineItems, handleTocEntryOnNav, updateTimelineItems]);\n\n // Update the singleton and call onChange\n useEffect(() => {\n timelineInstance = timeline;\n if (onChange) {\n onChange(timeline);\n }\n }, [timeline, onChange]);\n\n return timeline;\n};","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication,\n Timeline\n} from \"@readium/shared\";\nimport {\n AudioNavigator,\n AudioNavigatorListeners,\n AudioPreferences,\n IAudioPreferences,\n IAudioDefaults,\n IContentProtectionConfig\n} from \"@readium/navigator\";\nimport { AudioSettings } from \"./useAudioSettingsCache\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: AudioNavigator | null = null;\n\nexport interface AudioNavigatorLoadProps {\n publication: Publication;\n listeners: AudioNavigatorListeners;\n initialPosition?: Locator;\n preferences?: IAudioPreferences;\n defaults?: IAudioDefaults;\n contentProtection?: IContentProtectionConfig;\n audioContext?: AudioContext;\n}\n\nexport const useAudioNavigator = () => {\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IAudioPreferences) => {\n await navigatorInstance?.submitPreferences(new AudioPreferences(preferences));\n }, []);\n\n const getSetting = useCallback(<K extends keyof AudioSettings>(settingKey: K) => {\n return navigatorInstance?.settings?.[settingKey as keyof typeof navigatorInstance.settings];\n }, []);\n\n const AudioNavigatorLoad = useCallback((config: AudioNavigatorLoadProps, cb: Function) => {\n publication.current = config.publication;\n\n navigatorInstance = new AudioNavigator(\n config.publication,\n config.listeners,\n config.initialPosition,\n {\n preferences: config.preferences || {},\n defaults: config.defaults || {},\n contentProtection: config.contentProtection,\n }\n );\n\n cb();\n }, []);\n\n const AudioNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n navigatorInstance?.destroy();\n navigatorInstance = null;\n }, []);\n\n const play = useCallback(() => {\n navigatorInstance?.play();\n }, []);\n\n const pause = useCallback(() => {\n navigatorInstance?.pause();\n }, []);\n\n const stop = useCallback(() => {\n navigatorInstance?.stop();\n }, []);\n\n const seek = useCallback((time: number) => {\n navigatorInstance?.seek(time);\n }, []);\n\n const jump = useCallback((seconds: number) => {\n navigatorInstance?.jump(seconds);\n }, []);\n\n const skipForward = useCallback(() => {\n navigatorInstance?.skipForward();\n }, []);\n\n const skipBackward = useCallback(() => {\n navigatorInstance?.skipBackward();\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward || false;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward || false;\n }, []);\n\n const isTrackStart = useCallback(() => {\n return navigatorInstance?.isTrackStart || false;\n }, []);\n\n const isTrackEnd = useCallback(() => {\n return navigatorInstance?.isTrackEnd || false;\n }, []);\n\n const isPlaying = useCallback(() => {\n return navigatorInstance?.isPlaying || false;\n }, []);\n\n const isPaused = useCallback(() => {\n return navigatorInstance?.isPaused || false;\n }, []);\n\n const duration = useCallback(() => {\n return navigatorInstance?.duration || 0;\n }, []);\n\n const currentTime = useCallback(() => {\n return navigatorInstance?.currentTime || 0;\n }, []);\n\n return {\n AudioNavigatorLoad, \n AudioNavigatorDestroy, \n play,\n pause,\n stop,\n seek,\n jump,\n skipForward,\n skipBackward,\n go, \n goLink, \n goForward,\n goBackward,\n currentLocator,\n canGoBackward,\n canGoForward,\n isTrackStart,\n isTrackEnd,\n isPlaying,\n isPaused,\n duration,\n currentTime,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n remotePlayback: (navigatorInstance as any)?.remotePlayback as RemotePlayback | undefined,\n getSetting,\n submitPreferences,\n timeline: useCallback((): Timeline | undefined => navigatorInstance?.timeline, []),\n }\n}\n","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\n\nexport interface AudioSettings {\n volume: number;\n playbackRate: number;\n preservePitch: boolean;\n skipBackwardInterval: number;\n skipForwardInterval: number;\n skipInterval: number;\n pollInterval: number;\n autoPlay: boolean;\n enableMediaSession: boolean;\n}\n\nexport interface AudioSettingsCache {\n settings: AudioSettings;\n}\n\nexport const useAudioSettingsCache = (\n volume: number,\n playbackRate: number,\n preservePitch: boolean,\n skipBackwardInterval: number,\n skipForwardInterval: number,\n skipInterval: number,\n pollInterval: number,\n autoPlay: boolean,\n enableMediaSession: boolean\n) => {\n const cache = useRef<AudioSettingsCache>({\n settings: {\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n },\n }), [\n volume,\n playbackRate,\n preservePitch,\n skipBackwardInterval,\n skipForwardInterval,\n skipInterval,\n pollInterval,\n autoPlay,\n enableMediaSession,\n ]);\n\n cache.current = memoizedCache;\n\n return cache;\n};\n","\"use client\";\n\nimport { useCallback, useMemo, useRef } from \"react\";\n\nimport { \n Layout, \n Link, \n Locator, \n Publication \n} from \"@readium/shared\";\nimport {\n EpubNavigator,\n EpubNavigatorListeners,\n EpubPreferences,\n EpubSettings,\n IContentProtectionConfig,\n IEpubDefaults,\n IEpubPreferences,\n IInjectablesConfig,\n getScriptMode,\n ScriptMode\n} from \"@readium/navigator\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: EpubNavigator | null = null;\n\nexport interface EpubNavigatorLoadProps {\n container: HTMLDivElement | null;\n publication: Publication;\n listeners: EpubNavigatorListeners;\n positionsList?: Locator[];\n initialPosition?: Locator;\n preferences?: IEpubPreferences;\n defaults?: IEpubDefaults;\n injectables?: IInjectablesConfig;\n contentProtection?: IContentProtectionConfig;\n}\n\nexport const useEpubNavigator = () => {\n const container = useRef<HTMLDivElement | null>(null);\n const containerParent = useRef<HTMLElement | null>(null);\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IEpubPreferences) => {\n await navigatorInstance?.submitPreferences(new EpubPreferences(preferences));\n }, []);\n\n const getSetting = useCallback(<K extends keyof EpubSettings>(settingKey: K) => {\n return navigatorInstance?.settings[settingKey] as EpubSettings[K];\n }, []);\n\n // [TMP] Working around positionChanged not firing consistently for FXL\n // We’re observing the FXLFramePoolManager spine div element’s style\n // and checking whether its translate3d has changed.\n // Sure IntersectionObserver should be the obvious one to use here,\n // observing iframes instead of the style attribute on the spine element\n // but there’s additional complexity to handle as a spread = 2 iframes\n // And keeping in sync while the FramePool is re-aligning on resize can be suboptimal\n const FXLPositionChangedCallbackRef = useRef<((locator: Locator) => void) | undefined>(undefined);\n const FXLPositionChanged = useMemo(() => { \n return new MutationObserver((mutationsList: MutationRecord[]) => {\n for (const mutation of mutationsList) {\n const re = /translate3d\\(([^)]+)\\)/;\n const newVal = (mutation.target as HTMLElement).getAttribute(mutation.attributeName as string);\n const oldVal = mutation.oldValue;\n if (newVal?.split(re)[1] !== oldVal?.split(re)[1]) {\n const locator = navigatorInstance?.currentLocator;\n if (locator && FXLPositionChangedCallbackRef.current) {\n FXLPositionChangedCallbackRef.current(locator);\n }\n }\n }\n });\n }, []);\n\n const EpubNavigatorLoad = useCallback((config: EpubNavigatorLoadProps, cb: Function, fxlCallback?: (locator: Locator) => void) => {\n if (config.container) {\n container.current = config.container;\n containerParent.current = container.current? container.current.parentElement : null;\n \n publication.current = config.publication;\n\n // Register FXL callback immediately if provided\n if (fxlCallback) {\n FXLPositionChangedCallbackRef.current = fxlCallback;\n }\n\n navigatorInstance = new EpubNavigator(\n config.container, \n config.publication, \n config.listeners, \n config.positionsList, \n config.initialPosition, \n { \n preferences: config.preferences || {}, \n defaults: config.defaults || {}, \n injectables: config.injectables || undefined,\n contentProtection: config.contentProtection || undefined\n }\n );\n\n navigatorInstance.load().then(() => {\n cb();\n\n if (navigatorInstance?.layout === Layout.fixed) {\n // @ts-ignore\n FXLPositionChanged.observe((navigatorInstance?.pool.spineElement as HTMLElement), {\n attributeFilter: [\"style\"], \n attributeOldValue: true\n });\n }\n });\n }\n }, [FXLPositionChanged]);\n\n const EpubNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n\n if (navigatorInstance?.layout === Layout.fixed) {\n FXLPositionChanged.disconnect();\n }\n navigatorInstance?.destroy().then(() => {\n navigatorInstance = null; // Clear the singleton reference\n });\n }, [FXLPositionChanged]);\n\n const goRight = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goRight(animated, callback);\n }, []);\n\n const goLeft = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goLeft(animated, callback)\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const navLayout = useCallback(() => {\n return navigatorInstance?.layout;\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const getLocatorAtOffset = useCallback((offset: number) => {\n const readingOrder = navigatorInstance?.publication?.readingOrder;\n if (!readingOrder) return null;\n\n const currentLocator = navigatorInstance?.currentLocator;\n if (!currentLocator) return null;\n\n const currentLocatorIndex = readingOrder.findIndexWithHref(currentLocator.href);\n if (currentLocatorIndex === -1) return null;\n \n const newIndex = currentLocatorIndex + offset;\n if (newIndex < 0 || newIndex >= readingOrder.items.length) return null;\n \n return readingOrder.items[newIndex];\n }, []);\n\n const previousLocator = useCallback(() => {\n const link = getLocatorAtOffset(-1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const nextLocator = useCallback(() => {\n const link = getLocatorAtOffset(1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const currentPositions = useCallback(() => {\n return navigatorInstance?.viewport?.positions;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward;\n }, []);\n\n const isScrollStart = useCallback(() => {\n return navigatorInstance?.isScrollStart;\n }, []);\n\n const isScrollEnd = useCallback(() => {\n return navigatorInstance?.isScrollEnd;\n }, []);\n\n // Warning: this is an internal member that will become private, do not rely on it\n // See https://github.com/edrlab/thorium-web/issues/25\n const getCframes = useCallback(() => {\n return navigatorInstance?._cframes;\n }, []);\n\n const currentScriptMode = useCallback((): ScriptMode | undefined => {\n const metadata = navigatorInstance?.publication?.metadata;\n if (!metadata) return undefined;\n return getScriptMode(metadata);\n }, []);\n\n return { \n EpubNavigatorLoad, \n EpubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n navLayout, \n currentLocator,\n previousLocator,\n nextLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode,\n onFXLPositionChange: (cb: (locator: Locator) => void) => {\n FXLPositionChangedCallbackRef.current = cb;\n }\n }\n}","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { LineLengthStateObject, FontFamilyStateObject } from \"@/lib/settingsReducer\";\n\nexport interface ReadiumCSSSettings {\n columnCount: string;\n fontFamily: FontFamilyStateObject;\n fontSize: number;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineLength: LineLengthStateObject | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n scroll: boolean;\n textAlign: ThTextAlignOptions | null;\n textNormalization: boolean;\n theme?: string;\n wordSpacing: number | null;\n}\n\nexport interface EPubSettingsCache {\n settings: ReadiumCSSSettings;\n}\n\nexport const useEpubSettingsCache = (\n textAlign: ThTextAlignOptions | null,\n columnCount: string,\n fontFamily: FontFamilyStateObject,\n fontSize: number,\n fontWeight: number,\n hyphens: boolean | null,\n letterSpacing: number | null,\n ligatures: boolean | null,\n lineLength: LineLengthStateObject | null,\n lineHeight: ThLineHeightOptions | null,\n noRuby: boolean | null,\n paragraphIndent: number | null,\n paragraphSpacing: number | null,\n publisherStyles: boolean,\n scroll: boolean,\n textNormalization: boolean,\n wordSpacing: number | null,\n theme: string | undefined\n) => {\n const cache = useRef<EPubSettingsCache>({\n settings: {\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll: scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll: scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n },\n }), [\n columnCount,\n fontFamily,\n fontSize,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n lineLength,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n scroll,\n textAlign,\n textNormalization,\n theme,\n wordSpacing,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\n\n return cache;\n};\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport {\n Link,\n Locator,\n Publication\n} from \"@readium/shared\";\nimport {\n ExperimentalWebPubNavigator,\n WebPubNavigatorListeners,\n WebPubPreferences,\n WebPubSettings,\n IWebPubDefaults,\n IWebPubPreferences,\n IInjectablesConfig,\n IContentProtectionConfig,\n getScriptMode,\n ScriptMode\n} from \"@readium/navigator\";\n\ntype cbb = (ok: boolean) => void;\n\n// Module scoped, singleton instance of navigator\nlet navigatorInstance: InstanceType<typeof ExperimentalWebPubNavigator> | null = null;\n\nexport interface WebPubNavigatorLoadProps {\n container: HTMLDivElement | null;\n publication: Publication;\n listeners: WebPubNavigatorListeners;\n initialPosition?: Locator;\n preferences?: IWebPubPreferences;\n defaults?: IWebPubDefaults;\n injectables?: IInjectablesConfig;\n contentProtection?: IContentProtectionConfig;\n}\n\nexport const useWebPubNavigator = () => {\n const container = useRef<HTMLDivElement | null>(null);\n const containerParent = useRef<HTMLElement | null>(null);\n const publication = useRef<Publication | null>(null);\n\n const submitPreferences = useCallback(async (preferences: IWebPubPreferences) => {\n await navigatorInstance?.submitPreferences(new WebPubPreferences(preferences));\n }, []);\n \n const getSetting = useCallback(<K extends keyof WebPubSettings>(settingKey: K) => {\n return navigatorInstance?.settings[settingKey] as WebPubSettings[K];\n }, []);\n\n const WebPubNavigatorLoad = useCallback((config: WebPubNavigatorLoadProps, cb: Function) => {\n if (config.container) {\n container.current = config.container;\n containerParent.current = container.current?.parentElement || null;\n\n publication.current = config.publication;\n\n navigatorInstance = new ExperimentalWebPubNavigator(\n config.container, \n config.publication, \n config.listeners, \n config.initialPosition, \n { \n preferences: config.preferences || {}, \n defaults: config.defaults || {}, \n injectables: config.injectables || undefined,\n contentProtection: config.contentProtection || undefined\n }\n );\n\n navigatorInstance.load().then(() => {\n cb();\n });\n }\n }, []);\n\n const WebPubNavigatorDestroy = useCallback((cb: Function) => {\n cb();\n navigatorInstance?.destroy().then(() => {\n navigatorInstance = null; // Clear the singleton reference\n });\n }, []);\n\n const goRight = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goRight(animated, callback);\n }, []);\n\n const goLeft = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goLeft(animated, callback);\n }, []);\n\n const goBackward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goBackward(animated, callback);\n }, []);\n\n const goForward = useCallback((animated: boolean, callback: cbb) => {\n navigatorInstance?.goForward(animated, callback);\n }, []);\n\n const goLink = useCallback((link: Link, animated: boolean, callback: cbb) => {\n navigatorInstance?.goLink(link, animated, callback);\n }, []);\n\n const go = useCallback((locator: Locator, animated: boolean, callback: cbb) => {\n navigatorInstance?.go(locator, animated, callback);\n }, []);\n\n const currentLocator = useCallback(() => {\n return navigatorInstance?.currentLocator;\n }, []);\n\n const getLocatorAtOffset = useCallback((offset: number) => {\n const readingOrder = navigatorInstance?.publication?.readingOrder;\n if (!readingOrder) return null;\n\n const currentLocator = navigatorInstance?.currentLocator;\n if (!currentLocator) return null;\n\n const currentLocatorIndex = readingOrder.findIndexWithHref(currentLocator.href);\n if (currentLocatorIndex === -1) return null;\n\n const newIndex = currentLocatorIndex + offset;\n if (newIndex < 0 || newIndex >= readingOrder.items.length) return null;\n\n return readingOrder.items[newIndex];\n }, []);\n\n const previousLocator = useCallback(() => {\n const link = getLocatorAtOffset(-1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const nextLocator = useCallback(() => {\n const link = getLocatorAtOffset(1);\n if (!link) return null;\n return navigatorInstance?.publication?.manifest?.locatorFromLink(link);\n }, [getLocatorAtOffset]);\n\n const currentPositions = useCallback(() => {\n return navigatorInstance?.viewport?.positions;\n }, []);\n\n const canGoBackward = useCallback(() => {\n return navigatorInstance?.canGoBackward;\n }, []);\n\n const canGoForward = useCallback(() => {\n return navigatorInstance?.canGoForward;\n }, []);\n\n const isScrollStart = useCallback(() => {\n return navigatorInstance?.isScrollStart;\n }, []);\n\n const isScrollEnd = useCallback(() => {\n return navigatorInstance?.isScrollEnd;\n }, []);\n\n const getCframes = useCallback(() => {\n return navigatorInstance?._cframes;\n }, []);\n\n const currentScriptMode = useCallback((): ScriptMode | undefined => {\n const metadata = navigatorInstance?.publication?.metadata;\n if (!metadata) return undefined;\n return getScriptMode(metadata);\n }, []);\n\n return {\n WebPubNavigatorLoad, \n WebPubNavigatorDestroy, \n goRight, \n goLeft, \n goBackward, \n goForward,\n goLink, \n go, \n currentLocator,\n previousLocator,\n nextLocator,\n currentPositions,\n canGoBackward,\n canGoForward,\n isScrollStart,\n isScrollEnd,\n preferencesEditor: navigatorInstance?.preferencesEditor,\n getSetting,\n submitPreferences,\n getCframes,\n getScriptMode: currentScriptMode\n }\n}","\"use client\";\n\nimport { useRef, useMemo } from \"react\";\nimport { ThTextAlignOptions, ThLineHeightOptions } from \"@/preferences/models\";\nimport { FontFamilyStateObject } from \"@/lib/settingsReducer\";\n\nexport interface WebPubCSSSettings {\n fontFamily: FontFamilyStateObject;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n textAlign: ThTextAlignOptions | null;\n textNormalization: boolean;\n wordSpacing: number | null;\n zoom: number;\n}\n\nexport interface WebPubStatelessCache {\n settings: WebPubCSSSettings;\n}\n\nexport const useWebPubSettingsCache = (\n fontFamily: FontFamilyStateObject,\n fontWeight: number,\n hyphens: boolean | null,\n letterSpacing: number | null,\n ligatures: boolean | null,\n lineHeight: ThLineHeightOptions | null,\n noRuby: boolean | null,\n paragraphIndent: number | null,\n paragraphSpacing: number | null,\n publisherStyles: boolean,\n textAlign: ThTextAlignOptions | null,\n textNormalization: boolean,\n wordSpacing: number | null,\n zoom: number\n) => {\n const cache = useRef<WebPubStatelessCache>({\n settings: {\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n },\n });\n\n const memoizedCache = useMemo(() => ({\n settings: {\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n },\n }), [\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom,\n ]);\n\n // Update synchronously to match original behavior\n cache.current = memoizedCache;\n\n return cache;\n};\n"]}
|