@edrlab/thorium-web 1.2.1 → 1.3.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-DrZ5_6Dv.d.mts → ThPreferencesAdapter-D0rzsGRl.d.mts} +50 -13
- package/dist/{ThSettingsWrapper-8Kx0SnH4.d.mts → ThSettingsWrapper-BXuRgdqp.d.mts} +42 -4
- package/dist/{actions-D2CHvCHu.d.mts → actions-BLAr0oaM.d.mts} +16 -4
- package/dist/{actionsReducer-kc-S130w.d.mts → actionsReducer-BhG1wicI.d.mts} +37 -12
- package/dist/chunk-3GDQP6AS.mjs +14 -0
- package/dist/chunk-3GDQP6AS.mjs.map +1 -0
- package/dist/{chunk-72XCX5TD.mjs → chunk-3LDWKC5N.mjs} +13 -8
- package/dist/chunk-3LDWKC5N.mjs.map +1 -0
- package/dist/{chunk-NYZBHYW2.mjs → chunk-4ODYHZKD.mjs} +343 -38
- package/dist/chunk-4ODYHZKD.mjs.map +1 -0
- package/dist/{chunk-QPE574OW.mjs → chunk-4TVEDX7L.mjs} +23 -32
- package/dist/chunk-4TVEDX7L.mjs.map +1 -0
- package/dist/chunk-7CGMWOZN.mjs +20 -0
- package/dist/chunk-7CGMWOZN.mjs.map +1 -0
- package/dist/{chunk-7NEQAW7J.mjs → chunk-C236BQQB.mjs} +656 -917
- package/dist/chunk-C236BQQB.mjs.map +1 -0
- package/dist/{chunk-PXAUQJEU.mjs → chunk-D7MFLHXV.mjs} +2267 -1599
- package/dist/chunk-D7MFLHXV.mjs.map +1 -0
- package/dist/{chunk-47AIIJFO.mjs → chunk-ITDBOMY5.mjs} +3 -3
- package/dist/{chunk-47AIIJFO.mjs.map → chunk-ITDBOMY5.mjs.map} +1 -1
- package/dist/{chunk-XVSFXHYB.mjs → chunk-L4XGZAZ5.mjs} +23 -20
- package/dist/chunk-L4XGZAZ5.mjs.map +1 -0
- package/dist/chunk-OWHP7ONM.mjs +134 -0
- package/dist/chunk-OWHP7ONM.mjs.map +1 -0
- package/dist/{chunk-P4V3LA5R.mjs → chunk-RRVLWDT3.mjs} +10 -7
- package/dist/chunk-RRVLWDT3.mjs.map +1 -0
- package/dist/chunk-T2E6MRVP.mjs +862 -0
- package/dist/chunk-T2E6MRVP.mjs.map +1 -0
- package/dist/chunk-TEZB4ULX.mjs +57 -0
- package/dist/chunk-TEZB4ULX.mjs.map +1 -0
- package/dist/chunk-UCTMVCW7.mjs +833 -0
- package/dist/chunk-UCTMVCW7.mjs.map +1 -0
- package/dist/chunk-WECWPYZB.mjs +1950 -0
- package/dist/chunk-WECWPYZB.mjs.map +1 -0
- package/dist/{chunk-4VHEHMJN.mjs → chunk-XBZWGRDM.mjs} +228 -94
- package/dist/chunk-XBZWGRDM.mjs.map +1 -0
- package/dist/{chunk-K3K7TUWM.mjs → chunk-YZ3KCMKY.mjs} +237 -83
- package/dist/chunk-YZ3KCMKY.mjs.map +1 -0
- package/dist/components/Audio/index.css +1858 -0
- package/dist/components/Audio/index.css.map +1 -0
- package/dist/components/Audio/index.d.mts +103 -0
- package/dist/components/Audio/index.mjs +23 -0
- package/dist/components/Audio/index.mjs.map +1 -0
- package/dist/components/Epub/index.css +365 -9
- package/dist/components/Epub/index.css.map +1 -1
- package/dist/components/Epub/index.d.mts +17 -19
- package/dist/components/Epub/index.mjs +15 -10
- package/dist/components/Misc/index.css +5 -2
- package/dist/components/Misc/index.css.map +1 -1
- package/dist/components/Misc/index.mjs +4 -132
- package/dist/components/Misc/index.mjs.map +1 -1
- package/dist/components/Reader/index.css +1022 -183
- package/dist/components/Reader/index.css.map +1 -1
- package/dist/components/Reader/index.d.mts +16 -16
- package/dist/components/Reader/index.mjs +121 -22
- package/dist/components/Reader/index.mjs.map +1 -1
- package/dist/components/WebPub/index.css +365 -9
- package/dist/components/WebPub/index.css.map +1 -1
- package/dist/components/WebPub/index.d.mts +16 -16
- package/dist/components/WebPub/index.mjs +15 -10
- package/dist/core/Components/index.d.mts +64 -15
- package/dist/core/Components/index.mjs +2 -1
- package/dist/core/Helpers/index.d.mts +2 -2
- package/dist/core/Helpers/index.mjs +4 -2
- package/dist/core/Hooks/index.d.mts +7 -8
- package/dist/core/Hooks/index.mjs +3 -1
- package/dist/i18n/index.mjs +4 -5
- package/dist/lib/index.d.mts +159 -15
- package/dist/lib/index.mjs +4 -2
- package/dist/lib-M3PPQDJJ.mjs +6548 -0
- package/dist/lib-M3PPQDJJ.mjs.map +1 -0
- package/dist/locales/en/thorium-web.json +22 -0
- package/dist/next-lib/index.mjs +2 -0
- package/dist/next-lib/index.mjs.map +1 -1
- package/dist/preferences/index.d.mts +111 -13
- package/dist/preferences/index.mjs +6 -3
- package/dist/{settingsReducer-C1wwCAMv.d.mts → settingsReducer-Bu1zeveu.d.mts} +1 -1
- package/dist/{ui-CamWuqOo.d.mts → ui-nBv8gfr0.d.mts} +20 -1
- package/dist/useAudioNavigator-C5aW4-eT.d.mts +133 -0
- package/dist/{useContrast-D6sjPjxy.d.mts → useContrast-2t429O9O.d.mts} +16 -8
- package/dist/usePreferences-VaBf46eP.d.mts +230 -0
- package/dist/useReaderTransitions-JDzlBFsu.d.mts +530 -0
- package/dist/{useTimeline-DyMx_aWY.d.mts → useTimeline-DCZ1qoCO.d.mts} +4 -2
- package/package.json +15 -11
- package/dist/chunk-4VHEHMJN.mjs.map +0 -1
- package/dist/chunk-72XCX5TD.mjs.map +0 -1
- package/dist/chunk-7NEQAW7J.mjs.map +0 -1
- package/dist/chunk-K3K7TUWM.mjs.map +0 -1
- package/dist/chunk-NYZBHYW2.mjs.map +0 -1
- package/dist/chunk-P4V3LA5R.mjs.map +0 -1
- package/dist/chunk-PXAUQJEU.mjs.map +0 -1
- package/dist/chunk-QPE574OW.mjs.map +0 -1
- package/dist/chunk-XVSFXHYB.mjs.map +0 -1
- package/dist/useEpubNavigator-CwHJfoiV.d.mts +0 -42
- package/dist/usePreferences-BXFJbval.d.mts +0 -43
- package/dist/useReaderTransitions-guT-eA-Q.d.mts +0 -365
- package/dist/useWebPubNavigator-CuSNQKMw.d.mts +0 -39
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Actions/assets/styles/thorium-web.overflow.module.css","../src/components/Actions/Triggers/UnstableStatefulShortcut.tsx","../src/components/Actions/Triggers/StatefulOverflowMenuItem.tsx","../src/components/assets/styles/thorium-web.button.module.css","../src/components/Actions/Triggers/StatefulActionIcon.tsx","../src/components/Actions/Fullscreen/assets/icons/fullscreen.svg","../src/components/Actions/Fullscreen/assets/icons/fullscreen_exit.svg","../src/components/Actions/Fullscreen/StatefulFullscreenTrigger.tsx","../src/components/Actions/assets/icons/more_vert.svg","../src/components/Actions/StatefulOverflowMenu.tsx","../src/components/Actions/StatefulCollapsibleActionsBar.tsx","../src/core/Navigator/NavigatorProvider.tsx","../src/core/Navigator/hooks/useNavigatorContext.ts","../src/components/Sheets/assets/styles/thorium-web.sheets.module.css","../src/components/Docking/assets/styles/thorium-web.docking.module.css","../src/components/Docking/assets/icons/dock_to_right.svg","../src/components/Docking/assets/icons/dock_to_left.svg","../src/components/Docking/StatefulDockStart.tsx","../src/components/Docking/StatefulDockEnd.tsx","../src/components/Docking/assets/icons/stack.svg","../src/components/Docking/StatefulDockTransientPopover.tsx","../src/components/Docking/StatefulDocker.tsx","../src/components/Sheets/hooks/useWebkitPatch.ts","../src/components/Sheets/StatefulPopoverSheet.tsx","../src/components/Sheets/StatefulModalBase.tsx","../src/components/Sheets/StatefulModalSheet.tsx","../src/components/Sheets/StatefulBottomSheet.tsx","../src/components/Sheets/StatefulFullScreenSheet.tsx","../src/components/Sheets/StatefulDockedSheet.tsx","../src/components/Sheets/StatefulCompactPopoverSheet.tsx","../src/components/Sheets/StatefulSheetWrapper.tsx","../src/components/Docking/hooks/useDocking.ts","../src/components/Actions/JumpToPosition/assets/styles/thorium-web.jumpToPosition.module.css","../src/components/Actions/JumpToPosition/helpers/utils.ts","../src/components/Actions/JumpToPosition/StatefulJumpToPositionContainer.tsx","../src/components/Actions/JumpToPosition/assets/icons/pin_drop.svg","../src/components/Actions/JumpToPosition/StatefulJumpToPositionTrigger.tsx","../src/components/Settings/assets/styles/thorium-web.reader.settings.module.css","../src/components/Actions/Settings/StatefulSettingsWrapper.tsx","../src/components/Actions/Settings/StatefulAudioSettingsContainer.tsx","../src/components/Settings/StatefulGroupWrapper.tsx","../src/components/Settings/Spacing/StatefulSpacingGroup.tsx","../src/components/Settings/Text/StatefulTextGroup.tsx","../src/components/Actions/Settings/StatefulVisualSettingsContainer.tsx","../src/components/Actions/Settings/assets/icons/match_case.svg","../src/components/Actions/Settings/assets/icons/instant_mix.svg","../src/components/Actions/Settings/StatefulSettingsTrigger.tsx","../src/components/Actions/Toc/assets/styles/thorium-web.toc.module.css","../src/components/Actions/Toc/useTocContent.ts","../src/components/Actions/Toc/assets/icons/chevron_right.svg","../src/components/Actions/Toc/TocContent.tsx","../src/components/Actions/Toc/StatefulTocContainer.tsx","../src/components/Actions/Toc/assets/icons/toc.svg","../src/components/Actions/Toc/StatefulTocTrigger.tsx","../src/components/Settings/hooks/useGridTemplate.ts","../src/components/Settings/hooks/useGridNavigation.ts","../src/components/Settings/StatefulRadioGroup.tsx","../src/components/Epub/Settings/assets/icons/document_scanner.svg","../src/components/Epub/Settings/assets/icons/article.svg","../src/components/Epub/Settings/assets/icons/menu_book.svg","../src/components/Epub/Settings/StatefulColumns.tsx","../src/components/Settings/StatefulDropdown.tsx","../src/components/Settings/Text/StatefulFontFamily.tsx","../src/components/Settings/Text/assets/icons/format_bold_wght200.svg","../src/components/Settings/Text/assets/icons/format_bold_wght500.svg","../src/components/Settings/Text/StatefulFontWeight.tsx","../src/components/Settings/StatefulSwitch.tsx","../src/components/Settings/Text/StatefulHyphens.tsx","../src/components/Epub/Settings/assets/icons/contract.svg","../src/components/Epub/Settings/assets/icons/docs.svg","../src/components/Epub/Settings/StatefulLayout.tsx","../src/components/Settings/StatefulNumberField.tsx","../src/components/Settings/StatefulSlider.tsx","../src/components/Settings/hooks/useSettingsComponentStatus.ts","../src/components/Settings/Spacing/hooks/useSpacingPresets.ts","../src/components/Settings/hooks/useEffectiveRange.ts","../src/components/Settings/hooks/usePlaceholder.ts","../src/components/Settings/Spacing/StatefulLetterSpacing.tsx","../src/components/Settings/Spacing/hooks/useLineHeight.ts","../src/components/Settings/assets/icons/book.svg","../src/components/Settings/Spacing/assets/icons/density_small.svg","../src/components/Settings/Spacing/assets/icons/density_medium.svg","../src/components/Settings/Spacing/assets/icons/density_large.svg","../src/components/Settings/Spacing/StatefulLineHeight.tsx","../src/components/Settings/Spacing/StatefulParagraphIndent.tsx","../src/components/Settings/Spacing/StatefulParagraphSpacing.tsx","../src/components/Settings/StatefulPublisherStyles.tsx","../src/components/Settings/Spacing/assets/icons/accessibility.svg","../src/components/Settings/Spacing/assets/icons/tune.svg","../src/components/Settings/Spacing/helpers/spacingSettings.ts","../src/components/Settings/Spacing/StatefulSpacingPresets.tsx","../src/components/Settings/Text/assets/icons/format_align_left.svg","../src/components/Settings/Text/assets/icons/format_align_right.svg","../src/components/Settings/Text/assets/icons/format_align_justify.svg","../src/components/Settings/Text/StatefulTextAlign.tsx","../src/components/Settings/Text/StatefulTextNormalize.tsx","../src/components/Settings/assets/icons/check.svg","../src/components/Settings/StatefulTheme.tsx","../src/components/Settings/Spacing/StatefulWordSpacing.tsx","../src/components/Settings/assets/icons/text_decrease.svg","../src/components/Settings/assets/icons/text_increase.svg","../src/components/Settings/assets/icons/zoom_out.svg","../src/components/Settings/assets/icons/zoom_in.svg","../src/components/Settings/StatefulZoom.tsx","../src/components/Plugins/helpers/createDefaultPlugin.ts","../src/components/Settings/StatefulSliderWithPresets.tsx","../src/components/Settings/StatefulPresetsGroup.tsx","../src/components/Audio/Settings/StatefulAudioSkipBackwardInterval.tsx","../src/components/Audio/Settings/StatefulAudioSkipForwardInterval.tsx","../src/components/Audio/Settings/StatefulAudioSkipInterval.tsx","../src/components/Audio/Settings/StatefulAudioAutoPlay.tsx","../src/components/Audio/actions/Volume/assets/icons/volume_up.svg","../src/components/Audio/actions/Volume/assets/icons/volume_down.svg","../src/components/Audio/actions/Volume/assets/icons/volume_mute.svg","../src/components/Audio/actions/Volume/assets/icons/volume_off.svg","../src/components/Audio/actions/Volume/assets/styles/thorium-web.volume.module.css","../src/components/Audio/actions/Volume/StatefulAudioVolumeTrigger.tsx","../src/components/Audio/actions/Volume/StatefulAudioVolumeContainer.tsx","../src/components/Audio/actions/PlaybackRate/assets/icons/speed.svg","../src/components/Audio/actions/PlaybackRate/assets/styles/thorium-web.playbackRate.module.css","../src/components/Audio/actions/PlaybackRate/StatefulAudioPlaybackRateTrigger.tsx","../src/components/Audio/actions/PlaybackRate/StatefulAudioPlaybackRateContainer.tsx","../src/components/Audio/actions/Toc/assets/styles/thorium-web.audioToc.module.css","../src/components/Audio/actions/Toc/StatefulAudioTocTrigger.tsx","../src/components/Audio/actions/Toc/StatefulAudioTocContainer.tsx","../src/components/Audio/actions/SleepTimer/assets/icons/snooze.svg","../src/components/Audio/actions/SleepTimer/assets/styles/thorium-web.sleepTimer.module.css","../src/components/Audio/actions/SleepTimer/StatefulAudioSleepTimerTrigger.tsx","../src/components/Audio/actions/SleepTimer/StatefulAudioSleepTimerContainer.tsx","../src/components/Audio/actions/RemotePlayback/assets/icons/cast.svg","../src/components/Audio/actions/RemotePlayback/assets/icons/cast_connected.svg","../src/components/Audio/actions/RemotePlayback/assets/icons/cast_warning.svg","../src/components/Audio/actions/RemotePlayback/StatefulAudioRemotePlaybackTrigger.tsx","../src/components/Plugins/helpers/createAudioDefaultPlugin.ts","../src/components/StatefulPreferencesProvider.tsx","../src/hooks/useReaderTransitions.ts","../src/helpers/deserializePositions.ts","../src/hooks/usePublication.ts","../src/hooks/usePositionStorage.ts","../src/components/assets/styles/thorium-web.reader.app.module.css","../src/components/Docking/hooks/useResizablePanel.ts","../src/components/Docking/hooks/useDockCleanup.ts","../src/components/Docking/StatefulDockingWrapper.tsx","../src/components/assets/styles/thorium-web.reader.header.module.css","../src/components/assets/styles/thorium-web.backlink.module.css","../src/components/StatefulBackLink.tsx","../src/components/hooks/useReaderHeaderBase.ts"],"names":["hint","popover","menu","menuItem","menuItemLabel","menuItemShortcut","jsx","Fragment","icon","dockerButton","closeButton","backButton","tooltip","alwaysVisible","partiallyVisible","iconCompSm","iconCompLg","iconApplyStroke","classNames","fullscreen","modal","modalDialog","compactPopover","draggable","draggableFullHeightDetent","draggableContentHeightDetent","draggableBackdrop","draggableScrim","draggableScroller","dragIndicator","docked","dockedLeftBorder","dockedRightBorder","dialog","header","draggableHeader","heading","body","dockerWrapper","docker","resizeHandle","resizeHandleGrab","resizeHandleGrabLeft","resizeHandleGrabRight","useCallback","jsxs","useRef","useEffect","React","snapArray","scrimPref","className","detent","wrapper","form","label","input","button","numberField","useState","item","group","advancedGroup","advancedIcon","groupLabel","radioWrapper","groupWrapper","numberFieldWrapper","sliderWrapper","slider","resetButton","radio","themeRadio","themesWrapper","sliderLabel","sliderOutput","sliderTrack","sliderThumb","sliderPlaceholder","sliderWithPresetsWrapper","sliderWithPresetsRadioGroup","sliderWithPresetsRadio","sliderWithTicks","dropdown","dropdownButton","dropdownPopover","dropdownListbox","dropdownListboxItem","switch","switchIndicator","useMemo","search","searchLabel","searchInput","searchIcon","clearButton","tree","treeItem","treeItemButton","treeItemText","treeItemTextTitle","treeItemTextPosition","empty","items","value","setLetterSpacing","setLineHeight","setParagraphIndent","setParagraphSpacing","setPublisherStyles","textAlign","theme","t","setWordSpacing","useNumberFormatter","Link","listbox","listboxItem","durationField","instruction","inputs","fieldGroup","fieldInput","unitLabel","remaining","cancelButton","startButton","Button","error","main","shell","leftDock","rightDock","bottomBar","topBar","barOverlay","headerOverlay","footerOverlay","iframeContainer","loading","srOnly","dockingMap","backlinkWrapper","actionsWrapper","link"],"mappings":"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","file":"chunk-D7MFLHXV.mjs","sourcesContent":[":global(.thorium_web_layeredUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .hint {\n transform: translateY(calc(var(--th-icon-size, 24px) * 2.5));\n transition-property: transform;\n transition-duration: 200ms; \n transition-timing-function: ease-in-out;\n}\n\n:global(.thorium_web_layeredUI.thorium_web_isReflow.thorium_web_isScroll.thorium_web_isImmersive:not(.thorium_web_isHovering)) .hint {\n outline: 1px solid var(--th-theme-subdue);\n background-color: var(--th-theme-background);\n}\n\n.popover {\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n border: 1px solid var(--th-theme-subdue);\n filter: drop-shadow(var(--th-theme-elevate));\n box-sizing: border-box;\n max-width: var(--th-layout-constraints-popover, 500px);\n width: max-content;\n}\n\n.menu {\n outline: none;\n}\n\n.menuItem {\n display: flex;\n align-items: center;\n gap: calc(var(--th-layout-spacing) / 2);\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n outline: none;\n}\n\n.menuItem[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.menuItem[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.menuItem[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.menuItem > svg {\n width: calc(var(--th-icon-size, 24px) / 1.5);\n height: calc(var(--th-icon-size, 24px) / 1.5);\n fill: currentColor;\n}\n\n.menuItemLabel {\n font-size: 1rem;\n}\n\n.menuItemShortcut {\n font-family: monospace;\n font-weight: bold;\n color: var(--th-theme-subdue);\n padding: 5px;\n margin-inline-start: auto;\n border-radius: var(--th-layout-radius);\n border: 1px solid var(--th-theme-subdue);\n}","\"use client\";\n\nimport React from \"react\";\n\nimport { UnstableShortcut, UnstableShortcutRepresentation, buildShortcut, metaKeys } from \"@/core/Helpers/keyboardUtilities\";\n\nimport { Keyboard } from \"react-aria-components\";\n\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nexport const UnstableStatefulShortcut = ({\n className,\n rawForm,\n representation,\n joiner\n}: UnstableShortcut) => {\n const { shortcuts } = useSharedPreferences();\n const platformModifier = useAppSelector(state => state.reader.platformModifier);\n\n representation = representation ? representation : shortcuts.representation || UnstableShortcutRepresentation.symbol;\n joiner = joiner ? joiner : (shortcuts.joiner || \" + \");\n\n const shortcutObj = buildShortcut(rawForm);\n\n if (shortcutObj) {\n let shortcutRepresentation = [];\n\n for (const prop in shortcutObj.modifiers) {\n if (shortcutObj.modifiers[prop]) {\n if (prop === \"platformKey\") {\n shortcutRepresentation.push(platformModifier[representation]);\n } else {\n const metaKey = metaKeys[prop];\n shortcutRepresentation.push(metaKey[representation as UnstableShortcutRepresentation]);\n }\n }\n }\n\n if (shortcutObj.char) {\n shortcutRepresentation.push(shortcutObj.char);\n }\n\n if (shortcutRepresentation.length > 0) {\n const displayShortcut = shortcutRepresentation.join(joiner);\n \n return (\n <Keyboard className={ className }>{ displayShortcut }</Keyboard>\n ) \n } else {\n return (\n <></>\n )\n }\n }\n\n return (\n <></>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nimport overflowMenuStyles from \"../assets/styles/thorium-web.overflow.module.css\";\n\nimport { Text } from \"react-aria-components\";\nimport { UnstableStatefulShortcut as StatefulShortcut } from \"./UnstableStatefulShortcut\";\n\nimport { ThMenuItem, ThMenuItemProps } from \"@/core/Components/Menu/ThMenuItem\";\n\nexport interface StatefulOverflowMenuItemProps extends Omit<ThMenuItemProps, \"shortcut\"> {\n shortcut?: string | null\n}\n\nexport const StatefulOverflowMenuItem = ({\n id,\n label,\n SVGIcon,\n shortcut = undefined,\n ...props\n}: StatefulOverflowMenuItemProps) => {\n const menuItemLabelId = `${id}-label`;\n \n return(\n <>\n <ThMenuItem \n id={ id } \n label={ label }\n className={ overflowMenuStyles.menuItem } \n aria-labelledby={ menuItemLabelId } \n { ...props }\n >\n { SVGIcon && <SVGIcon aria-hidden=\"true\" focusable=\"false\" /> }\n <Text \n className={ overflowMenuStyles.menuItemLabel } \n slot=\"label\"\n id={ menuItemLabelId }\n >\n { label }\n </Text>\n { shortcut && <StatefulShortcut\n className={ overflowMenuStyles.menuItemShortcut } \n rawForm={ shortcut } \n /> }\n </ThMenuItem>\n </>\n )\n}\n",".icon,\n.dockerButton,\n.closeButton,\n.backButton {\n box-sizing: border-box;\n padding: calc(var(--th-icon-size, 24px) * (1/4));\n text-align: center;\n border-radius: var(--th-layout-radius);\n line-height: 0;\n}\n\n.backButton {\n box-sizing: content-box;\n height: var(--th-icon-size, 24px);\n border: 2px solid transparent;\n display: flex;\n align-items: center;\n}\n\n.closeButton,\n.backButton {\n margin-inline-start: auto;\n}\n\n.icon svg,\n.dockerButton svg,\n.closeButton svg,\n.backButton svg {\n fill: currentColor;\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n}\n\n.icon[data-hovered],\n.dockerButton[data-hovered],\n.closeButton[data-hovered],\n.backButton[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.icon[data-focus-visible],\n.dockerButton[data-focus-visible],\n.closeButton[data-focus-visible],\n.backButton[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.backButton[data-disabled] {\n color: var(--th-theme-disable)\n}\n\n.tooltip {\n background-color: var(--th-theme-text);\n color: var(--th-theme-background);\n padding: 5px;\n border-radius: var(--th-layout-radius);\n}\n\n/* Visibility + Immersive */\n\n.alwaysVisible {\n opacity: 1;\n}\n\n:global(.thorium_web_stackedUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .partiallyVisible {\n opacity: 0;\n}\n\n/* Utils to improve icons’ consistency */\n\n.iconCompSm {\n padding: calc(var(--th-icon-size, 24px) * (1/3));\n}\n\n.iconCompSm svg {\n width: calc(var(--th-icon-size, 24px) * (3/4));\n height: calc(var(--th-icon-size, 24px) * (3/4));\n stroke: var(--th-theme-text);\n}\n\n.iconCompLg {\n padding: calc(var(--th-icon-size, 24px) * (1/6));\n}\n\n.iconCompLg svg {\n width: calc(var(--th-icon-size, 24px) * (4/3));\n height: calc(var(--th-icon-size, 24px) * (4/3));\n}\n\n.iconApplyStroke svg {\n stroke: var(--th-theme-text);\n}","\"use client\";\n\nimport React from \"react\";\n\nimport { useObjectRef } from \"react-aria\";\n\nimport { TooltipProps } from \"react-aria-components\";\nimport { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\n\nimport readerSharedUI from \"../../assets/styles/thorium-web.button.module.css\";\n\nimport { ThActionButton, ThActionButtonProps } from \"@/core/Components/Buttons/ThActionButton\";\n\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setImmersive } from \"@/lib/readerReducer\";\n\nimport { isActiveElement, isKeyboardTriggered } from \"@/core/Helpers/focusUtilities\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulActionIconProps extends ThActionButtonProps {\n visibility?: ThCollapsibilityVisibility;\n placement?: TooltipProps[\"placement\"];\n tooltipLabel?: string;\n}\n\nexport const StatefulActionIcon = ({\n ref: externalRef,\n visibility,\n placement,\n tooltipLabel,\n children,\n ...props\n}: StatefulActionIconProps) => {\n const { theming } = useSharedPreferences();\n\n const triggerRef = useObjectRef(externalRef ?? null);\n\n const dispatch = useAppDispatch();\n\n const handleClassNameFromState = () => {\n let className = \"\";\n \n switch(visibility) {\n case ThCollapsibilityVisibility.always:\n className = readerSharedUI.alwaysVisible;\n break;\n case ThCollapsibilityVisibility.partially:\n className = readerSharedUI.partiallyVisible;\n break;\n case ThCollapsibilityVisibility.overflow:\n default:\n break;\n }\n\n return className\n };\n\n const defaultOnPressFunc = () => {\n dispatch(setImmersive(false));\n };\n\n const handleImmersive = (event: React.FocusEvent) => {\n // Check whether the focus was triggered by keyboard…\n // We don’t have access to type/modality, unlike onPress\n if (isKeyboardTriggered(event.target)) {\n dispatch(setImmersive(false));\n }\n };\n\n const blurOnEsc = (event: React.KeyboardEvent) => {\n // TODO: handle Tooltip cos first time you press esc, it’s the tooltip that is closed.\n if (triggerRef.current && isActiveElement(triggerRef.current) && event.code === \"Escape\") {\n triggerRef.current.blur();\n }\n };\n\n return (\n <ThActionButton\n ref={ triggerRef }\n className={ classNames(readerSharedUI.icon, handleClassNameFromState(), props.className) } \n onPress={ props.onPress || defaultOnPressFunc }\n onKeyDown={ blurOnEsc } \n onFocus={ handleImmersive }\n compounds={ tooltipLabel ? {\n tooltipTrigger: {\n delay: theming.icon.tooltipDelay,\n closeDelay: theming.icon.tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip,\n placement: placement,\n offset: theming.icon.tooltipOffset || 0\n },\n label: tooltipLabel\n } : undefined }\n { ...Object.fromEntries(Object.entries(props).filter(([key]) => key !== \"className\")) }\n >\n { children }\n </ThActionButton>\n )\n};","import * as React from \"react\";\nconst SvgFullscreen = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M120-120v-200h80v120h120v80H120Zm520 0v-80h120v-120h80v200H640ZM120-640v-200h200v80H200v120h-80Zm640 0v-120H640v-80h200v200h-80Z\" /></svg>;\nexport default SvgFullscreen;","import * as React from \"react\";\nconst SvgFullscreenExit = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-120v-120H120v-80h200v200h-80Zm400 0v-200h200v80H720v120h-80ZM120-640v-80h120v-120h80v200H120Zm520 0v-200h80v120h120v80H640Z\" /></svg>;\nexport default SvgFullscreenExit;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport readerSharedUI from \"../../assets/styles/thorium-web.button.module.css\";\n\nimport FullscreenCorners from \"./assets/icons/fullscreen.svg\";\nimport FullscreenExit from \"./assets/icons/fullscreen_exit.svg\";\n\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useFullscreen } from \"@/core/Hooks/useFullscreen\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setFullscreen, setHovering } from \"@/lib/readerReducer\";\nimport { isIOSish } from \"@/core/Helpers/getPlatform\";\n\nexport const StatefulFullscreenTrigger = ({ variant }: StatefulActionTriggerProps) => {\n // Note: Not using React Aria ToggleButton here as fullscreen is quite\n // difficult to control in isolation due to collapsibility + shortcuts\n\n const preferences = useActionsPreferences();\n const { t } = useI18n();\n\n const dispatch = useAppDispatch();\n const onChange = useCallback((isFullscreen: boolean) => {\n dispatch(setFullscreen(isFullscreen));\n }, [dispatch]);\n \n const fs = useFullscreen(onChange);\n\n const label = fs.isFullscreen ? t(\"reader.fullscreen.close\") : t(\"reader.fullscreen.trigger\");\n const Icon = fs.isFullscreen ? FullscreenExit : FullscreenCorners;\n\n const handlePress = () => {\n fs.handleFullscreen();\n // Has to be dispatched manually, otherwise stays true… \n dispatch(setHovering(false));\n // TODO: fix hover state on exit, if even possible w/o a lot of getting around…\n };\n\n // Per React doc/principles this isn’t common but FullScreen is quite an edge case cos’ of iPadOS…\n // And Actions is still a work in progress, with opportunities to rewrite/refactor\n // Note we don’t check window.matchMedia(\"(display-mode: standalone)\").matches as this is not a PWA yet\n // And more values here: https://web.dev/learn/pwa/detection\n if (!document.fullscreenEnabled || isIOSish()) return null;\n\n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ label }\n SVGIcon={ Icon } \n shortcut={ preferences.actionsKeys[ThActionsKeys.fullscreen].shortcut }\n onAction={ fs.handleFullscreen } \n id={ ThActionsKeys.fullscreen }\n />\n : <StatefulActionIcon \n className={ readerSharedUI.iconCompSm }\n visibility={ preferences.actionsKeys[ThActionsKeys.fullscreen].visibility } \n aria-label={ label }\n placement=\"bottom\" \n tooltipLabel={ t(\"reader.fullscreen.tooltip\") } \n onPress={ handlePress } \n >\n <Icon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n } \n </>\n )\n}","import * as React from \"react\";\nconst SvgMoreVert = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M480-160q-33 0-56.5-23.5T400-240q0-33 23.5-56.5T480-320q33 0 56.5 23.5T560-240q0 33-23.5 56.5T480-160Zm0-240q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm0-240q-33 0-56.5-23.5T400-720q0-33 23.5-56.5T480-800q33 0 56.5 23.5T560-720q0 33-23.5 56.5T480-640Z\" /></svg>;\nexport default SvgMoreVert;","\"use client\";\n\nimport React, { ReactNode, RefObject } from \"react\";\n\nimport overflowMenuStyles from \"./assets/styles/thorium-web.overflow.module.css\";\n\nimport MenuIcon from \"./assets/icons/more_vert.svg\";\n\nimport { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport { ThMenu } from \"@/core/Components/Menu/ThMenu\";\nimport { ThActionsKeys, ThDockingKeys } from \"@/preferences/models\";\nimport { StatefulActionIcon } from \"./Triggers/StatefulActionIcon\";\nimport { ThActionEntry } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setOverflow } from \"@/lib/actionsReducer\";\n\nexport interface StatefulOverflowMenuProps {\n id: string;\n items: ThActionEntry<string | ThActionsKeys | ThDockingKeys>[];\n triggerRef: RefObject<HTMLElement | null>;\n className?: string;\n children?: ReactNode;\n}\n\nexport const StatefulOverflowMenu = ({ \n id,\n className, \n items,\n triggerRef\n}: StatefulOverflowMenuProps) => {\n const { t } = useI18n();\n const dispatch = useAppDispatch();\n\n const toggleMenuState = (value: boolean) => {\n dispatch(setOverflow({\n key: id,\n isOpen: value\n }));\n }\n\n if (items.length > 0) {\n return (\n <>\n <ThMenu \n id={ id }\n triggerRef={ triggerRef }\n selectionMode=\"none\" \n className={ overflowMenuStyles.menu }\n dependencies={ [\"Trigger\"] }\n items={ items }\n compounds={{\n menuTrigger: {\n onOpenChange: (val: boolean) => toggleMenuState(val)\n },\n popover: {\n placement: \"bottom\",\n className: overflowMenuStyles.popover\n },\n button: (\n <StatefulActionIcon\n className={ className ? className : overflowMenuStyles.button }\n aria-label={ t(\"reader.overflowMenu.active.trigger\") }\n placement=\"bottom\"\n tooltipLabel={ t(\"reader.overflowMenu.active.tooltip\") }\n visibility={ ThCollapsibilityVisibility.always }\n >\n <MenuIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n ),\n }}\n />\n </>\n )\n }\n}","\"use client\";\n\nimport { useRef } from \"react\";\n\nimport { ThActionsKeys, ThDockingKeys } from \"@/preferences\";\n\nimport { ThActionEntry } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThCollapsibleActionsBar, ThCollapsibleActionsBarProps } from \"@/core/Components/Actions/ThCollapsibleActionsBar\";\nimport { StatefulOverflowMenu } from \"./StatefulOverflowMenu\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nexport interface StatefulCollapsibleActionsBarProps extends ThCollapsibleActionsBarProps {\n items: ThActionEntry<string | ThActionsKeys | ThDockingKeys>[];\n overflowMenuClassName?: string;\n}\n\nexport const StatefulCollapsibleActionsBar = ({\n id, \n items,\n overflowMenuClassName,\n ...props\n}: StatefulCollapsibleActionsBarProps) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n return (\n <>\n <ThCollapsibleActionsBar \n ref={ ref }\n id={ id }\n items={ items }\n breakpoint={ breakpoint }\n compounds={{\n menu: (<StatefulOverflowMenu \n id={ id }\n triggerRef={ ref }\n className={ overflowMenuClassName } \n items={ [] }\n />) }}\n { ...props }\n />\n </>\n )\n}\n","import { createContext } from \"react\";\nimport { useEpubNavigator } from \"../Hooks/Epub/useEpubNavigator\";\nimport { useWebPubNavigator } from \"../Hooks/WebPub/useWebPubNavigator\";\nimport { useAudioNavigator } from \"../Hooks/Audio/useAudioNavigator\";\n\ntype VisualNavigator = ReturnType<typeof useEpubNavigator> | ReturnType<typeof useWebPubNavigator>;\ntype MediaNavigator = ReturnType<typeof useAudioNavigator>;\n\ninterface NavigatorContextValue {\n media?: MediaNavigator;\n visual?: VisualNavigator;\n}\n\nexport const NavigatorContext = createContext<NavigatorContextValue | null>(null);\n\nexport const NavigatorProvider = ({ \n mediaNavigator, \n visualNavigator, \n children \n}: { \n mediaNavigator?: MediaNavigator;\n visualNavigator?: VisualNavigator;\n children: React.ReactNode \n}) => {\n return (\n <NavigatorContext.Provider value={{ media: mediaNavigator, visual: visualNavigator }}>\n { children }\n </NavigatorContext.Provider>\n );\n};","import { useContext } from \"react\";\nimport { NavigatorContext } from \"../NavigatorProvider\";\nimport { EpubSettings, WebPubSettings, FXLFrameManager, FrameManager, WebPubFrameManager } from \"@readium/navigator\";\nimport { Link, Locator } from \"@readium/shared\";\n\n// Import the navigator hook types\nimport type { useEpubNavigator } from \"../../Hooks/Epub/useEpubNavigator\";\nimport type { useWebPubNavigator } from \"../../Hooks/WebPub/useWebPubNavigator\";\nimport type { useAudioNavigator } from \"../../Hooks/Audio/useAudioNavigator\";\n\n// Define proper types for navigator interfaces\ntype VisualNavigator = ReturnType<typeof useEpubNavigator> | ReturnType<typeof useWebPubNavigator>;\ntype MediaNavigator = ReturnType<typeof useAudioNavigator>;\n\n// Union of all settings keys across both navigator types\ntype AllVisualSettings = EpubSettings & WebPubSettings;\n\n// Define the callback type used across navigators\ntype NavigationCallback = (ok: boolean) => void;\n\n// Define the unified navigator interface\ninterface UnifiedNavigator {\n // Navigation methods available in both\n go(locator: Locator, animated: boolean, callback: NavigationCallback): void;\n goLink(link: Link, animated: boolean, callback: NavigationCallback): void;\n currentLocator(): Locator | undefined;\n \n // Unified previous/next navigation\n previousLocator(): Locator | null;\n nextLocator(): Locator | null;\n \n // Unified forward/backward navigation\n goForward(animated: boolean, callback: NavigationCallback): void;\n goBackward(animated: boolean, callback: NavigationCallback): void;\n \n // Check if navigator is visual\n isVisual(): boolean;\n \n // Visual-specific methods (only available when isVisual() is true)\n getCframes?(): (FXLFrameManager | FrameManager | WebPubFrameManager | undefined)[] | undefined;\n \n // Access to underlying navigator for advanced use cases\n underlying: VisualNavigator | MediaNavigator;\n}\n\n// getSetting wrapper covering all settings from both navigator types\nconst createUnifiedGetSetting = (navigator: VisualNavigator) => {\n return <K extends keyof AllVisualSettings>(settingKey: K): AllVisualSettings[K] => {\n return (navigator.getSetting as (key: K) => AllVisualSettings[K])(settingKey);\n };\n};\n\n// Type guards to check navigator type - using context reference instead of fragile method detection\nconst isVisualNavigator = (\n navigator: VisualNavigator | MediaNavigator, \n contextVisual: VisualNavigator | undefined\n): navigator is VisualNavigator => {\n return navigator === contextVisual;\n};\n\nexport const useNavigator = () => {\n const context = useContext(NavigatorContext);\n if (!context) {\n throw new Error(\"useNavigator must be used within NavigatorProvider\");\n }\n\n return {\n get visual() {\n if (!context.visual) throw new Error(\"Visual navigator not available\");\n \n // Create a wrapper that provides a unified getSetting interface\n const visualNavigator = context.visual;\n return {\n ...visualNavigator,\n getSetting: createUnifiedGetSetting(visualNavigator)\n };\n },\n get media() {\n if (!context.media) throw new Error(\"Media navigator not available\");\n return context.media;\n },\n // Unified interface that automatically selects the appropriate navigator\n get unified(): UnifiedNavigator {\n // Prefer visual navigator when available, fallback to media\n const navigator = context.visual || context.media;\n if (!navigator) throw new Error(\"No navigator available\");\n \n const isVisual = isVisualNavigator(navigator, context.visual);\n \n return {\n // Navigation methods available in both\n go: (locator: Locator, animated: boolean, callback: NavigationCallback) => {\n return navigator.go(locator, animated, callback);\n },\n goLink: (link: Link, animated: boolean, callback: NavigationCallback) => {\n return navigator.goLink(link, animated, callback);\n },\n currentLocator: (): Locator | undefined => navigator.currentLocator(),\n \n // Unified previous/next navigation\n previousLocator: (): Locator | null => {\n if (isVisual && navigator.previousLocator) {\n return navigator.previousLocator() || null;\n }\n // For media navigator, we could implement logic to get previous track/chapter\n // For now, return null as media doesn't have this concept\n return null;\n },\n nextLocator: (): Locator | null => {\n if (isVisual && navigator.nextLocator) {\n return navigator.nextLocator() || null;\n }\n // For media navigator, we could implement logic to get next track/chapter\n // For now, return null as media doesn't have this concept\n return null;\n },\n \n // Unified forward/backward navigation\n goForward: (animated: boolean, callback: NavigationCallback) => {\n if (navigator.goForward) {\n return navigator.goForward(animated, callback);\n }\n return callback?.(false);\n },\n goBackward: (animated: boolean, callback: NavigationCallback) => {\n if (navigator.goBackward) {\n return navigator.goBackward(animated, callback);\n }\n return callback?.(false);\n },\n \n // Check if navigator is visual\n isVisual: () => isVisual,\n \n // Visual-specific methods (only available when isVisual() is true)\n getCframes: isVisual ? navigator.getCframes?.bind(navigator) : undefined,\n \n // Access to underlying navigator for advanced use cases\n underlying: navigator\n };\n }\n };\n};","/* React Aria modal provides a visual viewport for mobile + keyboard: --visual-viewport-height \n which should explain why it’s being used here while not mentioned anywhere else in the codebase */\n\n.fullscreen {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 10;\n overflow-y: auto;\n scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n scroll-padding-bottom: var(--th-layout-spacing);\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n max-height: var(--visual-viewport-height, 100dvh);\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n align-items: center;\n}\n\n.modal {\n position: fixed;\n inset: 0;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--th-layout-spacing);\n background-color: var(--th-layout-defaults-scrim, rgba(0, 0, 0, 0.2));\n pointer-events: none;\n}\n\n.modalDialog {\n pointer-events: auto;\n overflow-y: auto;\n scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n scroll-padding-bottom: var(--th-layout-spacing);\n box-sizing: border-box;\n width: 100%;\n max-width: var(--th-layout-constraints-modal, 600px);\n max-height: 90dvh;\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\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.popover {\n overflow-y: auto;\n scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n scroll-padding-bottom: var(--th-layout-spacing);\n box-sizing: border-box;\n width: calc(340px + (2 * var(--th-layout-spacing)));\n max-width: var(--th-layout-constraints-popover, 500px);\n max-height: 100%;\n max-height: var(--visual-viewport-height, 100dvh);\n padding: 0;\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\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.compactPopover {\n overflow-y: auto;\n scroll-padding-top: var(--th-layout-spacing);\n scroll-padding-bottom: var(--th-layout-spacing);\n box-sizing: border-box;\n width: calc(340px + (2 * var(--th-layout-spacing)));\n max-width: var(--th-layout-constraints-popover, 500px);\n max-height: 100%;\n max-height: var(--visual-viewport-height, 100dvh);\n padding: 0;\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\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/* React Modal Sheet handles scroll + sticky header so no need for scroll-padding here */\n.draggable {\n box-sizing: border-box;\n max-width: var(--th-layout-constraints-bottomSheet, 600px);\n left: max(calc((100% - var(--th-layout-constraints-bottomSheet, 600px)) / 2), 0px) !important;\n background-color: var(--th-theme-background) !important;\n color: var(--th-theme-text) !important;\n border: none;\n /* Animating drop-shadow pretty much kills performance, hence why we use a pseudo-element */\n filter: none !important;\n box-shadow: none !important;\n /* M3 = 28dp, see https://m3.material.io/components/bottom-sheets/overview */\n border-top-left-radius: 28px !important;\n border-top-right-radius: 28px !important;\n transition: border-radius 500ms;\n}\n\n.draggable::after {\n content: \"\";\n z-index: -1;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n /* important for performance */\n transform: translateZ(0);\n box-shadow: var(--th-theme-elevate);\n border-top-left-radius: 28px;\n border-top-right-radius: 28px;\n}\n\n.draggableFullHeightDetent {\n height: calc(100% - env(safe-area-inset-top)) !important;\n}\n\n.draggableContentHeightDetent {\n max-height: calc(100% - env(safe-area-inset-top)) !important;\n}\n\n.draggable[data-full-height] {\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n transition: border-radius 500ms;\n}\n\n.draggableBackdrop {\n /* So that React Aria can use it to dismiss the sheet as it’s set to none by React Modal Sheet. */\n pointer-events: auto !important;\n background-color: transparent !important;\n}\n\n.draggableScrim {\n background-color: var(--th-layout-defaults-scrim) !important;\n}\n\n.draggableContainer {\n padding: 0;\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n}\n\n.draggableScroller {\n position: relative;\n scroll-padding-bottom: calc(var(--th-layout-spacing) * 4);\n}\n\n.dragIndicator {\n width: calc(var(--th-icon-size, 40px) * 1.5);\n position: absolute;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.dragIndicator[data-focus-visible] {\n border-radius: var(--th-layout-radius);\n outline: 2px solid var(--th-theme-focus);\n}\n\n.dragIndicator svg {\n fill: var(--th-theme-subdue);\n width: 100%;\n height: auto;\n}\n\n.docked {\n /* We need relative positioning so that RAC FocusScope scrolls properly on tabbing */\n position: relative;\n overflow-y: auto;\n scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n scroll-padding-bottom: var(--th-layout-spacing);\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n height: 100vh;\n height: 100dvh;\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n}\n\n.dockedLeftBorder {\n border-right: 1px solid var(--th-theme-subdue);\n}\n\n.dockedRightBorder {\n border-left: 1px solid var(--th-theme-subdue);\n}\n\n.dialog {\n outline: none;\n}\n\n.header {\n display: flex;\n align-items: center;\n position: sticky;\n top: 0;\n left: 0;\n right: 0;\n z-index: 10;\n padding: calc(var(--th-layout-spacing) / 2) var(--th-layout-spacing);\n background-color: var(--th-theme-background);\n border-bottom: 1px solid var(--th-theme-subdue);\n}\n\n.draggableHeader {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n background-color: var(--th-theme-background);\n border-bottom: 1px solid var(--th-theme-subdue);\n padding: var(--th-layout-spacing) var(--th-layout-spacing) calc(var(--th-layout-spacing) / 2) var(--th-layout-spacing);\n /* Otherwise covers the modal’s */\n border-top-left-radius: 28px !important;\n border-top-right-radius: 28px !important;\n transition: border-radius 500ms;\n}\n\n.draggable[data-full-height] .draggableHeader {\n /* Otherwise covers the modal’s */\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n transition: border-radius 500ms;\n}\n\n.heading {\n font-size: 1.25rem;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.compactHeader {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.body {\n padding: var(--th-layout-spacing);\n}",".dockerWrapper {\n margin-inline-start: auto;\n margin-inline-end: calc(var(--th-icon-size, 24px) * (1 / 4) * -1); /* Optical alingment */\n display: flex;\n gap: 2px;\n padding-inline-start: var(--th-layout-spacing);\n}\n\n.docker {\n display: flex;\n gap: 2px;\n}\n\n.resizeHandle {\n position: relative;\n width: 0;\n}\n\n.resizeHandle:focus-visible {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.resizeHandleGrab {\n position: absolute;\n z-index: 1000;\n top: 50%;\n transform: translateY(-50%);\n width: 5px;\n height: 50px;\n border-radius: 5px;\n background-color: var(--th-theme-subdue);\n}\n\n.resizeHandleGrabLeft {\n left: 0;\n}\n\n.resizeHandleGrabRight {\n left: -5px;\n}","import * as React from \"react\";\nconst SvgDockToRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm120-80v-560H200v560h120Zm80 0h360v-560H400v560Zm-80 0H200h120Z\" /></svg>;\nexport default SvgDockToRight;","import * as React from \"react\";\nconst SvgDockToLeft = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm440-80h120v-560H640v560Zm-80 0v-560H200v560h360Zm80 0h120-120Z\" /></svg>;\nexport default SvgDockToLeft;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\n\nimport DockToLeft from \"./assets/icons/dock_to_right.svg\";\nimport DocktoRight from \"./assets/icons/dock_to_left.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockStart = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n const preferences = useActionsPreferences();\n const { t } = useI18n();\n const direction = useAppSelector(state => state.reader.direction);\n const actionsMap = useAppSelector(state => state.actions.keys);\n const profile = useAppSelector(state => state.reader.profile);\n const isRTL = direction === ThLayoutDirection.rtl;\n const translationKey = isRTL \n ? \"reader.app.docker.dockToRight\" \n : \"reader.app.docker.dockToLeft\";\n const localeKey = {\n trigger: t(`${ translationKey }.trigger`),\n tooltip: t(`${ translationKey }.tooltip`)\n };\n\n const actions = useActions(actionsMap);\n const isDisabled = actions.whichDocked(associatedKey) === ThDockingKeys.start;\n \n const dispatch = useAppDispatch();\n\n const handlePress = useCallback(() => {\n if (associatedKey && profile) {\n dispatch(dockAction({\n key: associatedKey,\n dockingKey: ThDockingKeys.start,\n profile: profile\n }))\n }\n }, [dispatch, associatedKey, profile]);\n \n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ localeKey.trigger }\n SVGIcon={ isRTL ? DocktoRight : DockToLeft } \n shortcut={ preferences.docking.keys[ThDockingKeys.start].shortcut }\n onAction={ handlePress } \n id={ `${ ThDockingKeys.start }-${ associatedKey }` }\n isDisabled={ isDisabled }\n />\n : <StatefulActionIcon \n className={ readerSharedUI.dockerButton } \n aria-label={ localeKey.trigger }\n placement=\"bottom\" \n tooltipLabel={ localeKey.tooltip } \n onPress={ handlePress } \n isDisabled={ isDisabled }\n >\n { isRTL \n ? <DocktoRight aria-hidden=\"true\" focusable=\"false\" /> \n : <DockToLeft aria-hidden=\"true\" focusable=\"false\" /> \n }\n </StatefulActionIcon>\n }\n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\n\nimport DockToLeft from \"./assets/icons/dock_to_right.svg\";\nimport DocktoRight from \"./assets/icons/dock_to_left.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockEnd = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n const preferences = useActionsPreferences();\n const { t } = useI18n();\n const direction = useAppSelector(state => state.reader.direction);\n const actionsMap = useAppSelector(state => state.actions.keys);\n const profile = useAppSelector(state => state.reader.profile);\n const isRTL = direction === ThLayoutDirection.rtl;\n const translationKey = isRTL \n ? \"reader.app.docker.dockToLeft\" \n : \"reader.app.docker.dockToRight\";\n const localeKey = {\n trigger: t(`${ translationKey }.trigger`),\n tooltip: t(`${ translationKey }.tooltip`)\n };\n\n const actions = useActions(actionsMap);\n const isDisabled = actions.whichDocked(associatedKey) === ThDockingKeys.end;\n\n const dispatch = useAppDispatch();\n \n const handlePress = useCallback(() => {\n if (associatedKey && profile) {\n dispatch(dockAction({\n key: associatedKey,\n dockingKey: ThDockingKeys.end,\n profile: profile\n }))\n }\n }, [dispatch, associatedKey, profile]);\n \n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ localeKey.trigger }\n SVGIcon={ isRTL ? DockToLeft : DocktoRight } \n shortcut={ preferences.docking.keys[ThDockingKeys.end].shortcut }\n onAction={ handlePress } \n id={ `${ ThDockingKeys.end }-${ associatedKey }` }\n isDisabled={ isDisabled }\n />\n : <StatefulActionIcon \n className={ readerSharedUI.dockerButton } \n aria-label={ localeKey.trigger }\n placement=\"bottom\" \n tooltipLabel={ localeKey.tooltip } \n onPress={ handlePress } \n isDisabled={ isDisabled }\n >\n { isRTL \n ? <DocktoRight aria-hidden=\"true\" focusable=\"false\" /> \n : <DockToLeft aria-hidden=\"true\" focusable=\"false\" /> \n }\n </StatefulActionIcon>\n }\n </>\n )\n}","import * as React from \"react\";\nconst SvgStack = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-400v80h-80q-33 0-56.5-23.5T80-400v-400q0-33 23.5-56.5T160-880h400q33 0 56.5 23.5T640-800v80h-80v-80H160v400h80ZM400-80q-33 0-56.5-23.5T320-160v-400q0-33 23.5-56.5T400-640h400q33 0 56.5 23.5T880-560v400q0 33-23.5 56.5T800-80H400Zm0-80h400v-400H400v400Zm200-200Z\" /></svg>;\nexport default SvgStack;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys } from \"@/preferences/models\";\n\nimport Stack from \"./assets/icons/stack.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockTransientPopover = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n const preferences = useActionsPreferences();\n const { t } = useI18n();\n const actionsMap = useAppSelector(state => state.actions.keys);\n const profile = useAppSelector(state => state.reader.profile);\n const actions = useActions(actionsMap);\n const isDisabled = !actions.isDocked(associatedKey) || actions.whichDocked(associatedKey) === ThDockingKeys.transient;\n \n const dispatch = useAppDispatch();\n\n const handlePress = useCallback(() => {\n if (associatedKey && profile) {\n dispatch(dockAction({\n key: associatedKey,\n dockingKey: ThDockingKeys.transient,\n profile: profile\n }))\n }\n }, [dispatch, associatedKey, profile]);\n \n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ t(\"reader.app.docker.popover.trigger\") }\n SVGIcon={ Stack } \n shortcut={ preferences.docking.keys[ThDockingKeys.transient].shortcut }\n onAction={ handlePress } \n id={ `${ ThDockingKeys.transient }-${ associatedKey }` } \n isDisabled={ isDisabled }\n />\n : <StatefulActionIcon \n className={ readerSharedUI.dockerButton } \n aria-label={ t(\"reader.app.docker.popover.trigger\") }\n placement=\"bottom\" \n tooltipLabel={ t(\"reader.app.docker.popover.tooltip\") } \n onPress={ handlePress } \n isDisabled={ isDisabled }\n >\n <Stack aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n }\n </>\n )\n}","\"use client\";\n\nimport React, { useCallback } from \"react\";\n\nimport dockingStyles from \"./assets/styles/thorium-web.docking.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { ThDockingKeys } from \"@/preferences/models\";\n\nimport { Toolbar } from \"react-aria-components\";\n\nimport { ThCloseButton } from \"@/core/Components/Buttons/ThCloseButton\";\nimport { StatefulCollapsibleActionsBar } from \"../Actions/StatefulCollapsibleActionsBar\";\n\nimport { StatefulDockStart } from \"./StatefulDockStart\";\nimport { StatefulDockEnd } from \"./StatefulDockEnd\";\nimport { StatefulDockTransientPopover } from \"./StatefulDockTransientPopover\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { ThActionEntry } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ActionsStateKeys } from \"@/lib/actionsReducer\";\n\nconst dockingComponentsMap = {\n [ThDockingKeys.start]: {\n trigger: StatefulDockStart\n },\n [ThDockingKeys.end]: {\n trigger: StatefulDockEnd\n },\n [ThDockingKeys.transient]: {\n trigger: StatefulDockTransientPopover\n }\n}\n\nexport interface StatefulDockerProps {\n id: ActionsStateKeys;\n keys: ThDockingKeys[];\n ref: React.ForwardedRef<HTMLButtonElement>;\n onClose: () => void;\n}\n\nexport const StatefulDocker = ({\n id,\n keys,\n ref,\n onClose\n}: StatefulDockerProps) => {\n const preferences = useActionsPreferences();\n const { theming } = useSharedPreferences();\n const { t } = useI18n();\n \n const listActionItems = useCallback(() => {\n const actionsItems: ThActionEntry<ThDockingKeys>[] = [];\n\n keys.map((key) => {\n actionsItems.push({\n Trigger: dockingComponentsMap[key].trigger,\n key: key,\n associatedKey: id\n })\n });\n\n return actionsItems;\n }, [keys, id]);\n\n return(\n <>\n <Toolbar className={ dockingStyles.dockerWrapper }>\n <StatefulCollapsibleActionsBar \n id={ `${ id }-docker-overflowMenu` }\n items={ listActionItems() }\n className={ dockingStyles.docker } \n overflowMenuClassName={ readerSharedUI.dockerButton }\n prefs={ preferences.docking }\n aria-label={ t(\"reader.app.docker.wrapper\") }\n />\n\n <ThCloseButton \n ref={ ref }\n className={ readerSharedUI.dockerButton } \n aria-label={ t(\"common.actions.close\") } \n onPress={ onClose }\n compounds={ {\n tooltipTrigger: {\n delay: theming.icon.tooltipDelay,\n closeDelay: theming.icon.tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: t(\"common.actions.close\")\n }}\n />\n </Toolbar>\n </>\n )\n}\n\n","import { useEffect } from \"react\";\n\nimport { useNavigator } from \"@/core/Navigator\";\n\nimport { useAppSelector } from \"@/lib\";\n\n/** For some unknown reason, React Aria Components’ Popover and Modal Components\n * are breaking scroll on webkit based browsers in version 1.11.0. \n * It is all the more mind-boggling that the hook we are using for \n * the Bottom Sheet don’t seem to be affected by this issue – but it could be forcing\n * a reflow thanks to its animation. \n * \n * NOTE: This is treating the symptoms and is unsustainable in the long run. \n * We have to find the root cause of this issue and fix it, \n * especially as TS-Toolkit already resolves this bug\n * when the resources are loaded into the iframe directly as scroll. \n*/\nexport const useWebkitPatch = (isOpen: boolean) => {\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = isWebPub || (scroll && !isFXL);\n\n const {\n getCframes\n } = useNavigator().unified;\n\n useEffect(() => {\n if (isScroll && !isOpen) {\n // We have to force a reflow on the iframe container to fix the issue.\n // Using the infamous Recalc technique (adding a style element with *{}) \n // in the iframe contentDocument does not work.\n const container = document.getElementById(\"thorium-web-container\");\n if (!container) return;\n\n const currentHeight = container.offsetHeight;\n container.style.height = `${ currentHeight - 1 }px`;\n\n // Otherwise Safari will ignore the reflow.\n setTimeout(() => {\n container.style.height = \"\";\n\n // This is where it becomes unsustainable, because we have to \n // force a scroll on the iframe scrolling element so that Safari\n // even renders the content that is below the viewport…\n // We only have access to the iframe scrolling element\n // because we are on the same origin…\n if (!getCframes) return;\n const frames = getCframes();\n if (!frames || !Array.isArray(frames) || frames.length === 0) return;\n const frame = frames[0];\n if (!frame?.window?.document?.scrollingElement) return;\n\n const currentScrollTop = frame.window.document.scrollingElement.scrollTop;\n\n if (currentScrollTop > 1) {\n frame.window.document.scrollingElement.scrollTop = currentScrollTop - 1;\n } else {\n frame.window.document.scrollingElement.scrollTop = currentScrollTop + 1;\n }\n\n frame.window.document.scrollingElement.scrollTop = currentScrollTop;\n }, 0);\n }\n }, [isScroll, isOpen, getCframes]);\n};\n","\"use client\";\n\nimport React, { useRef, useEffect } from \"react\";\n\nimport { StatefulSheet } from \"./models/sheets\";\nimport { ThSheetHeaderVariant } from \"@/preferences/models\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { PopoverProps } from \"react-aria-components\";\n\nimport { ThPopover } from \"@/core/Components/Containers/ThPopover\";\nimport { ThContainerHeader } from \"@/core/Components/Containers/ThContainerHeader\";\nimport { ThContainerBody } from \"@/core/Components/Containers/ThContainerBody\";\nimport { ThNavigationButton } from \"@/core/Components/Buttons/ThNavigationButton\";\nimport { StatefulDocker } from \"../Docking/StatefulDocker\";\n\nimport { useI18n } from \"@/i18n\";\nimport { useWebkitPatch } from \"./hooks/useWebkitPatch\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\n\nexport interface StatefulPopoverSheetProps extends StatefulSheet {\n placement?: PopoverProps[\"placement\"];\n}\n\nexport const StatefulPopoverSheet = ({ \n id,\n triggerRef,\n heading,\n headerVariant,\n className,\n headerClassName,\n isOpen,\n onOpenChange, \n onClosePress,\n placement,\n docker,\n children,\n resetFocus,\n focusWithinRef,\n focusSelector,\n scrollTopOnFocus,\n dismissEscapeKeyClose\n }: StatefulPopoverSheetProps) => {\n const { t } = useI18n()\n const direction = useAppSelector(state => state.reader.direction);\n const popoverRef = useRef<HTMLDivElement | null>(null);\n const popoverHeaderRef = useRef<HTMLDivElement | null>(null);\n const popoverBodyRef = useRef<HTMLDivElement | null>(null);\n const popoverCloseRef = useRef<HTMLButtonElement | null>(null);\n\n // Update the CSS variable when the popover is open and header ref is available\n useEffect(() => {\n if (isOpen && popoverRef.current && popoverHeaderRef.current) {\n popoverRef.current.style.setProperty(\n `--${ prefixString(\"sheet-sticky-header\") }`,\n `${ popoverHeaderRef.current.clientHeight }px`\n );\n }\n }, [isOpen]);\n\n // Warning: This is a temporary fix for a bug in React Aria Components.\n useWebkitPatch(!!isOpen);\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <ThPopover \n ref={ popoverRef }\n triggerRef={ triggerRef }\n focusOptions={{\n withinRef: focusWithinRef ?? popoverBodyRef,\n trackedState: isOpen,\n fallbackRef: popoverCloseRef,\n withSelector: focusSelector,\n action: {\n type: \"focus\",\n options: {\n preventScroll: scrollTopOnFocus ? true : false,\n scrollContainerToTop: scrollTopOnFocus\n }\n },\n updateState: resetFocus\n }}\n placement={ placement || \"bottom\" }\n className={ classNames(sheetStyles.popover , className) }\n isOpen={ isOpen }\n onOpenChange={ onOpenChange } \n isKeyboardDismissDisabled={ dismissEscapeKeyClose }\n compounds={{\n dialog: {\n className: sheetStyles.dialog\n }\n }}\n >\n <ThContainerHeader\n ref={ popoverHeaderRef }\n className={ classNames(sheetStyles.header, headerClassName) }\n label={ heading }\n compounds={{\n heading: {\n className: sheetStyles.heading\n }\n }}\n >\n { headerVariant === ThSheetHeaderVariant.previous \n ? <ThNavigationButton \n direction={ direction === \"ltr\" ? \"left\" : \"right\" }\n label={ t(\"reader.app.back.trigger\") }\n ref={ popoverCloseRef }\n className={ classNames(className, readerSharedUI.backButton) } \n aria-label={ t(\"reader.app.back.trigger\") }\n onPress={ onClosePress }\n />\n : <StatefulDocker \n id={ id }\n keys={ docker || [] }\n ref={ popoverCloseRef }\n onClose={ onClosePress }\n />\n }\n </ThContainerHeader>\n <ThContainerBody\n ref={ popoverBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </ThContainerBody>\n </ThPopover>\n </>\n ) \n }\n}","\"use client\";\n\nimport React, { useRef, useEffect } from \"react\";\n\nimport { StatefulSheet } from \"./models/sheets\";\nimport { ThSheetHeaderVariant } from \"@/preferences/models\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { ThModal } from \"@/core/Components/Containers/ThModal\";\nimport { ThContainerHeader } from \"@/core/Components/Containers/ThContainerHeader\";\nimport { ThContainerBody } from \"@/core/Components/Containers/ThContainerBody\";\nimport { ThNavigationButton } from \"@/core/Components/Buttons/ThNavigationButton\";\nimport { StatefulDocker } from \"../Docking/StatefulDocker\";\n\nimport { useI18n } from \"@/i18n\";\nimport { useWebkitPatch } from \"./hooks/useWebkitPatch\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\n\nexport interface StatefulModalBaseProps extends StatefulSheet {\n sheetClassName: string;\n dialogClassName?: string;\n};\n\nexport const StatefulModalBase = ({\n id,\n heading,\n headerVariant,\n className,\n sheetClassName,\n dialogClassName,\n isOpen,\n onOpenChange,\n onClosePress,\n docker,\n children,\n resetFocus,\n focusWithinRef,\n focusSelector,\n scrollTopOnFocus,\n dismissEscapeKeyClose\n }: StatefulModalBaseProps) => {\n const { t } = useI18n()\n const direction = useAppSelector(state => state.reader.direction);\n const sheetRef = useRef<HTMLDivElement | null>(null);\n const sheetHeaderRef = useRef<HTMLDivElement | null>(null);\n const sheetBodyRef = useRef<HTMLDivElement | null>(null);\n const sheetCloseRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n if (isOpen && sheetRef.current && sheetHeaderRef.current) {\n sheetRef.current.style.setProperty(\n `--${ prefixString(\"sheet-sticky-header\") }`,\n `${ sheetHeaderRef.current.clientHeight }px`\n );\n }\n }, [isOpen]);\n\n // Warning: This is a temporary fix for a bug in React Aria Components.\n useWebkitPatch(!!isOpen);\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <ThModal\n ref={ sheetRef }\n focusOptions={{\n withinRef: focusWithinRef ?? sheetBodyRef,\n trackedState: isOpen,\n fallbackRef: sheetCloseRef,\n withSelector: focusSelector,\n action: {\n type: \"focus\",\n options: {\n preventScroll: scrollTopOnFocus ? true : false,\n scrollContainerToTop: scrollTopOnFocus\n }\n },\n updateState: resetFocus\n }}\n compounds={{\n dialog: {\n className: classNames(sheetStyles.dialog, dialogClassName, className)\n }\n }}\n isOpen={ isOpen }\n onOpenChange={ onOpenChange }\n isDismissable={ true }\n className={ sheetClassName }\n isKeyboardDismissDisabled={ dismissEscapeKeyClose }\n >\n <ThContainerHeader\n ref={ sheetHeaderRef }\n className={ sheetStyles.header }\n label={ heading }\n compounds={{\n heading: {\n className: sheetStyles.heading\n }\n }}\n >\n { headerVariant === ThSheetHeaderVariant.previous\n ? <ThNavigationButton\n direction={ direction === \"ltr\" ? \"left\" : \"right\" }\n label={ t(\"reader.app.back.trigger\") }\n ref={ sheetCloseRef }\n className={ classNames(className, readerSharedUI.backButton) }\n aria-label={ t(\"reader.app.back.trigger\") }\n onPress={ onClosePress }\n />\n : <StatefulDocker\n id={ id }\n keys={ docker || [] }\n ref={ sheetCloseRef }\n onClose={ onClosePress }\n />\n }\n </ThContainerHeader>\n <ThContainerBody\n ref={ sheetBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </ThContainerBody>\n </ThModal>\n </>\n )\n }\n}\n","\"use client\";\n\nimport { StatefulSheet } from \"./models/sheets\";\nimport { StatefulModalBase } from \"./StatefulModalBase\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\n\nexport interface StatefulModalSheetProps extends StatefulSheet {};\n\nexport const StatefulModalSheet = (props: StatefulModalSheetProps) => {\n return (\n <StatefulModalBase\n { ...props }\n sheetClassName={ sheetStyles.modal }\n dialogClassName={ sheetStyles.modalDialog }\n />\n )\n}\n","\"use client\";\n\nimport React, { CSSProperties, KeyboardEvent, useCallback, useMemo, useRef } from \"react\";\n\nimport { ThBottomSheetDetent, ThSheetHeaderVariant } from \"@/preferences\";\n\nimport { StatefulSheet } from \"./models/sheets\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { SheetRef, SheetDetent } from \"react-modal-sheet\";\n\nimport { ThBottomSheet } from \"@/core/Components/Containers/ThBottomSheet\";\nimport { ThContainerHeader } from \"@/core/Components/Containers/ThContainerHeader\";\nimport { ThContainerBody } from \"@/core/Components/Containers/ThContainerBody\";\nimport { ThNavigationButton } from \"@/core/Components/Buttons/ThNavigationButton\";\nimport { ThCloseButton } from \"@/core/Components/Buttons/ThCloseButton\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\nimport { useI18n } from \"@/i18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\n\nexport interface StatefulBottomSheetProps extends StatefulSheet {};\n\nexport interface ScrimPref {\n active: boolean;\n override?: string;\n}\n\nconst DEFAULT_SNAPPOINTS = {\n min: 0.3,\n peek: 0.5,\n max: 1\n}\n\nexport const StatefulBottomSheet = ({\n id,\n heading,\n headerVariant,\n className, \n isOpen,\n onOpenChange, \n onClosePress,\n children,\n resetFocus,\n focusWithinRef,\n focusSelector,\n scrollTopOnFocus,\n dismissEscapeKeyClose\n}: StatefulBottomSheetProps) => {\n const preferences = useActionsPreferences();\n const sharedPreferences = useSharedPreferences();\n const { t } = useI18n()\n const direction = useAppSelector((state) => state.reader.direction);\n const prefersReducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n\n const sheetRef = useRef<SheetRef | null>(null);\n const sheetContainerRef = useRef<HTMLDivElement | null>(null);\n const bottomSheetBodyRef = useRef<HTMLDivElement | null>(null);\n const bottomSheetCloseRef = useRef<HTMLButtonElement | null>(null);\n\n const detent = useRef<ThBottomSheetDetent>(\"full-height\");\n const isDraggable = useRef<boolean>(true);\n\n const snapArray = useMemo(() => {\n // Val is always checked in 0...1 range\n const getSecureVal = (val: number, ref: number) => {\n if (val > ref) {\n return val;\n } else {\n return ((1 - ref) / 2) + ref;\n }\n };\n\n // Since v5\n // Array needs min @ index and max @ index 2 when complete\n // If it doesn’t have a max, then peek is @ index 1.\n let snapArray: number[] = [0];\n\n const snapPref = preferences.actionsKeys[id].snapped;\n if (snapPref) {\n // We must start with minHeight to see if it’s \n // constrained by a detent as it means\n // the bottom sheet is not draggable.\n // Hence why unshifting into the array instead of pushing\n if (snapPref.minHeight) {\n switch(snapPref.minHeight) {\n case \"content-height\":\n case \"full-height\":\n case 100:\n detent.current = snapPref.minHeight === 100 ? \"full-height\" : snapPref.minHeight;\n isDraggable.current = false;\n return [];\n default:\n const minVal = snapPref.minHeight / 100;\n // Protecting against pref > 100\n minVal > 0 && minVal < 1 \n ? snapArray.push(minVal) \n : snapArray.push(DEFAULT_SNAPPOINTS.min);\n break;\n }\n } else {\n // Fallback value\n snapArray.push(DEFAULT_SNAPPOINTS.min);\n }\n\n // From now on, check if value is greater than the previous one in array\n // If not, use DEFAULT_SNAPPOINTS fallback and check it as well\n // This is to protect from cases that don’t validate min < peek < max\n\n // If peekHeight is constrained by a detent\n // then there is no maxHeight\n if (snapPref.peekHeight) {\n switch(snapPref.peekHeight) {\n case \"content-height\":\n case \"full-height\":\n case 100:\n detent.current = snapPref.peekHeight === 100 ? \"full-height\" : snapPref.peekHeight;\n snapArray.push(1);\n return snapArray;\n default:\n const peekVal = snapPref.peekHeight / 100;\n const prevVal = snapArray[0];\n\n peekVal > 0 && peekVal < 1\n ? snapArray.push(getSecureVal(peekVal, prevVal)) \n : snapArray.push(getSecureVal(DEFAULT_SNAPPOINTS.peek, prevVal))\n break;\n }\n } else {\n // Fallback value\n snapArray.push(getSecureVal(DEFAULT_SNAPPOINTS.peek, snapArray[0]));\n }\n\n // If max-height is constrained by a content-height detent\n // then it means the bottom sheet can’t be fullscreen\n // Otherwise we can remove the top corners radii\n if (snapPref.maxHeight) {\n switch(snapPref.maxHeight) {\n case \"content-height\":\n case \"full-height\":\n case 100:\n detent.current = snapPref.maxHeight === 100 ? \"full-height\" : snapPref.maxHeight;\n snapArray.push(1);\n return snapArray;\n default:\n const maxVal = snapPref.maxHeight / 100;\n const prevVal = snapArray[0];\n\n maxVal > 0 && maxVal < 1 \n ? snapArray.push(getSecureVal(maxVal, prevVal)) \n : snapArray.push(getSecureVal(DEFAULT_SNAPPOINTS.max, prevVal));\n break;\n }\n } else {\n // Fallback value\n snapArray.push(getSecureVal(DEFAULT_SNAPPOINTS.max, snapArray[0]));\n }\n } else {\n // There is no pref set\n // Reminder: order of React Modal Sheet is descending so min, peek, max\n snapArray.push(DEFAULT_SNAPPOINTS.min, DEFAULT_SNAPPOINTS.peek, DEFAULT_SNAPPOINTS.max);\n }\n\n return snapArray;\n }, [id, preferences]);\n\n const snapIdx = useRef<number | null>(null);\n\n const onDragPressCallback = useCallback(() => {\n if (snapIdx.current !== null) {\n // In [0, min, peek, max] order, cycle to next index but skip index 0\n const nextIdx = snapIdx.current === snapArray.length - 1 ? 1 : snapIdx.current + 1;\n sheetRef.current?.snapTo(nextIdx);\n }\n }, [snapArray]);\n\n const onDragKeyCallback = useCallback((e: KeyboardEvent) => {\n if (snapIdx.current !== null) {\n switch(e.code) {\n case \"PageUp\":\n if (snapIdx.current === snapArray.length - 1) return;\n sheetRef.current?.snapTo(snapArray.length - 1);\n break;\n case \"ArrowUp\":\n if (snapIdx.current === snapArray.length - 1) return;\n sheetRef.current?.snapTo(snapIdx.current + 1);\n break;\n case \"PageDown\":\n onClosePress();\n break;\n case \"ArrowDown\":\n if (snapIdx.current === 1) {\n onClosePress();\n break;\n }\n sheetRef.current?.snapTo(snapIdx.current - 1)\n break;\n default:\n break;\n }\n }\n }, [snapArray, onClosePress]);\n\n const maxWidthPref = useMemo(() => {\n const maxWidth = preferences.actionsKeys[id].snapped?.maxWidth;\n if (typeof maxWidth === \"undefined\") {\n return undefined;\n } else if (maxWidth === null) {\n return \"100%\";\n } else {\n return `${ maxWidth }px`;\n }\n }, [id, preferences]);\n\n const scrimPref = useMemo(() => {\n let scrimPref: ScrimPref = {\n active: false,\n override: undefined\n }\n const scrim = preferences.actionsKeys[id].snapped?.scrim ?? sharedPreferences.theming.layout.defaults.scrim;\n if (scrim) {\n scrimPref.active = true;\n\n if (typeof scrim === \"string\") {\n scrimPref.override = scrim;\n }\n }\n\n return scrimPref;\n }, [id, preferences, sharedPreferences]);\n\n const detentClassName = useMemo(() => {\n let className = \"\";\n if (detent.current === \"content-height\") {\n className = sheetStyles.draggableContentHeightDetent;\n } else {\n className = sheetStyles.draggableFullHeightDetent;\n }\n return className;\n }, [detent]);\n\n const scrimClassName = useMemo(() => {\n return scrimPref.active ? sheetStyles.draggableScrim : \"\";\n }, [scrimPref]);\n\n const convertDetent = (detent: ThBottomSheetDetent): SheetDetent => {\n switch(detent) {\n case \"content-height\":\n return \"content\";\n case \"full-height\":\n return \"default\";\n default:\n return \"default\";\n }\n };\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <ThBottomSheet\n id={ id }\n ref={ sheetRef }\n className={ sheetStyles.draggableRoot }\n isOpen={ isOpen }\n focusOptions={{\n withinRef: focusWithinRef ?? bottomSheetBodyRef,\n trackedState: isOpen,\n fallbackRef: bottomSheetCloseRef,\n withSelector: focusSelector,\n action: {\n type: \"focus\",\n options: {\n preventScroll: true, // Safari needs this otherwise focus() creates artifacts on open\n scrollContainerToTop: scrollTopOnFocus\n }\n },\n updateState: resetFocus\n }}\n onOpenChange={ onOpenChange }\n isKeyboardDismissDisabled={ dismissEscapeKeyClose }\n { ...(snapArray.length > 2 \n ? { \n snapPoints: snapArray, \n initialSnap: 2,\n detent: convertDetent(detent.current)\n } \n : {\n detent: convertDetent(detent.current)\n }) \n }\n onSnap={ (index) => { snapIdx.current = index }}\n prefersReducedMotion={ prefersReducedMotion }\n compounds={ {\n container: {\n className: classNames(sheetStyles.draggable, detentClassName),\n ref: sheetContainerRef,\n style: {\n maxWidth: maxWidthPref \n } as CSSProperties\n },\n dragIndicator: {\n className: sheetStyles.dragIndicator,\n onPress: onDragPressCallback,\n onKeyDown: onDragKeyCallback\n },\n content: {\n className: classNames(sheetStyles.draggableContent, className),\n disableDrag: true\n },\n scroller: {\n className: sheetStyles.draggableScroller\n },\n backdrop: {\n className: classNames(sheetStyles.draggableBackdrop, scrimClassName),\n style: { [`--${ prefixString(\"layout-defaults-scrim\") }`]: scrimPref.override }\n }\n } }\n >\n <ThContainerHeader\n label={ heading }\n className={ sheetStyles.draggableHeader }\n compounds={ {\n heading: {\n className: sheetStyles.heading\n }\n }}\n >\n { headerVariant === ThSheetHeaderVariant.previous \n ? <ThNavigationButton \n direction={ direction === \"ltr\" ? \"left\" : \"right\" }\n label={ t(\"reader.app.back.trigger\") }\n ref={ bottomSheetCloseRef }\n className={ classNames(className, readerSharedUI.backButton) } \n aria-label={ t(\"reader.app.back.trigger\") }\n onPress={ onClosePress }\n /> \n : <ThCloseButton\n ref={ bottomSheetCloseRef }\n className={ readerSharedUI.closeButton } \n aria-label={ t(\"common.actions.close\") } \n onPress={ onClosePress }\n />\n }\n </ThContainerHeader>\n <ThContainerBody \n ref={ bottomSheetBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </ThContainerBody>\n </ThBottomSheet>\n </>\n )\n }\n}","\"use client\";\n\nimport { StatefulSheet } from \"./models/sheets\";\nimport { StatefulModalBase } from \"./StatefulModalBase\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\n\nexport interface StatefulFullScreenSheetProps extends StatefulSheet {};\n\nexport const StatefulFullScreenSheet = (props: StatefulFullScreenSheetProps) => {\n return (\n <StatefulModalBase\n { ...props }\n sheetClassName={ sheetStyles.fullscreen }\n />\n )\n}\n","\"use client\";\n\nimport React, { useCallback, useRef, useEffect } from \"react\";\n\nimport { StatefulSheet } from \"./models/sheets\";\nimport { ThDockingKeys, ThSheetHeaderVariant, ThLayoutDirection } from \"@/preferences/models\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { ThDockedPanel } from \"@/core/Components/Containers/ThDockedPanel\";\nimport { ThContainerHeader } from \"@/core/Components/Containers/ThContainerHeader\";\nimport { ThContainerBody } from \"@/core/Components/Containers/ThContainerBody\";\nimport { StatefulDocker } from \"../Docking/StatefulDocker\";\nimport { ThNavigationButton } from \"@/core/Components/Buttons/ThNavigationButton\";\n\nimport { useI18n } from \"@/i18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport classNames from \"classnames\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\n\nexport interface StatefulDockedSheetProps extends StatefulSheet {\n flow: ThDockingKeys.start | ThDockingKeys.end | null;\n}\n\nexport const StatefulDockedSheet = ({ \n id,\n heading,\n headerVariant,\n className, \n isOpen,\n onClosePress,\n docker, \n flow,\n children,\n resetFocus,\n focusSelector,\n focusWithinRef,\n scrollTopOnFocus\n }: StatefulDockedSheetProps) => {\n const { t } = useI18n()\n const dockPortal = flow && document.getElementById(flow);\n const dockedSheetRef = useRef<HTMLDivElement | null>(null);\n const dockedSheetHeaderRef = useRef<HTMLDivElement | null>(null);\n const dockedSheetBodyRef = useRef<HTMLDivElement | null>(null);\n const dockedSheetCloseRef = useRef<HTMLButtonElement | null>(null);\n\n const direction = useAppSelector(state => state.reader.direction);\n\n // Update the CSS variable when the sheet is open and header ref is available\n useEffect(() => {\n if (isOpen && dockedSheetRef.current && dockedSheetHeaderRef.current) {\n dockedSheetRef.current.style.setProperty(\n `--${ prefixString(\"sheet-sticky-header\") }`,\n `${ dockedSheetHeaderRef.current.clientHeight }px`\n );\n }\n }, [isOpen]);\n\n const classFromFlow = useCallback(() => {\n if (flow === ThDockingKeys.start) {\n return direction === ThLayoutDirection.ltr ? sheetStyles.dockedLeftBorder : sheetStyles.dockedRightBorder;\n } else if (flow === ThDockingKeys.end) {\n return direction === ThLayoutDirection.ltr ? sheetStyles.dockedRightBorder : sheetStyles.dockedLeftBorder;\n }\n }, [flow, direction]);\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <ThDockedPanel\n ref={ dockedSheetRef }\n isOpen={ isOpen }\n portal={ dockPortal }\n focusOptions={{\n withinRef: focusWithinRef ?? dockedSheetBodyRef,\n trackedState: isOpen,\n fallbackRef: dockedSheetCloseRef,\n withSelector: focusSelector,\n action: {\n type: \"scrollIntoView\",\n options: {\n behavior: \"instant\",\n block: \"center\",\n inline: \"nearest\"\n }\n },\n updateState: resetFocus\n }}\n className={ classNames(sheetStyles.docked, className, classFromFlow()) }\n >\n <ThContainerHeader \n ref={ dockedSheetHeaderRef }\n className={ sheetStyles.header }\n label={ heading }\n compounds={{\n heading: {\n className: sheetStyles.heading\n }\n }}\n >\n { headerVariant === ThSheetHeaderVariant.previous \n ? <ThNavigationButton\n direction={ direction === \"ltr\" ? \"left\" : \"right\" } \n label={ t(\"reader.app.back.trigger\") }\n ref={ dockedSheetCloseRef }\n className={ classNames(className, readerSharedUI.backButton) } \n aria-label={ t(\"reader.app.back.trigger\") }\n onPress={ onClosePress }\n /> \n : <StatefulDocker \n id={ id }\n keys={ docker || [] }\n ref={ dockedSheetCloseRef }\n onClose={ onClosePress }\n />\n } \n </ThContainerHeader>\n <ThContainerBody \n ref={ dockedSheetBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </ThContainerBody>\n </ThDockedPanel>\n </>\n )\n }\n}","\"use client\";\n\nimport React, { useRef } from \"react\";\n\nimport { StatefulSheet } from \"./models/sheets\";\n\nimport sheetStyles from \"./assets/styles/thorium-web.sheets.module.css\";\n\nimport { Popover, PopoverProps, Dialog } from \"react-aria-components\";\n\nimport { useWebkitPatch } from \"./hooks/useWebkitPatch\";\nimport { useFirstFocusable } from \"@/core/Components/Containers/hooks/useFirstFocusable\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulCompactPopoverSheetProps extends StatefulSheet {\n placement?: PopoverProps[\"placement\"];\n}\n\nexport const StatefulCompactPopoverSheet = ({ \n id,\n triggerRef,\n heading,\n className,\n isOpen,\n onOpenChange, \n placement,\n children,\n resetFocus,\n focusWithinRef,\n focusSelector,\n scrollTopOnFocus,\n dismissEscapeKeyClose\n }: StatefulCompactPopoverSheetProps) => {\n const popoverRef = useRef<HTMLDivElement | null>(null);\n const popoverBodyRef = useRef<HTMLDivElement | null>(null);\n\n useFirstFocusable({\n withinRef: focusWithinRef ?? popoverBodyRef,\n trackedState: isOpen,\n withSelector: focusSelector,\n action: {\n type: \"focus\",\n options: {\n preventScroll: scrollTopOnFocus ? true : false,\n scrollContainerToTop: scrollTopOnFocus\n }\n },\n updateState: resetFocus\n });\n\n // Warning: This is a temporary fix for a bug in React Aria Components.\n useWebkitPatch(!!isOpen);\n\n if (React.Children.toArray(children).length > 0) {\n return(\n <>\n <Popover \n ref={ popoverRef }\n triggerRef={ triggerRef }\n placement={ placement || \"bottom\" }\n isOpen={ isOpen }\n onOpenChange={ onOpenChange } \n isKeyboardDismissDisabled={ dismissEscapeKeyClose }\n className={ classNames(sheetStyles.compactPopover, className) }\n >\n <Dialog \n aria-label={ heading }\n className={ sheetStyles.dialog }\n >\n <div \n ref={ popoverBodyRef }\n className={ sheetStyles.body }\n >\n { children }\n </div>\n </Dialog>\n </Popover>\n </>\n ) \n }\n}\n","\"use client\";\n\nimport { ReactNode } from \"react\";\n\nimport { ThDockingKeys, ThSheetTypes } from \"@/preferences/models\";\n\nimport { ThTypedComponentRenderer } from \"@/core/Components/Containers/ThTypedComponentRenderer\";\nimport { StatefulPopoverSheet, StatefulPopoverSheetProps } from \"./StatefulPopoverSheet\";\nimport { StatefulModalSheet, StatefulModalSheetProps } from \"./StatefulModalSheet\";\nimport { StatefulBottomSheet, StatefulBottomSheetProps } from \"./StatefulBottomSheet\";\nimport { StatefulFullScreenSheet, StatefulFullScreenSheetProps } from \"./StatefulFullScreenSheet\";\nimport { StatefulDockedSheet, StatefulDockedSheetProps } from \"./StatefulDockedSheet\";\nimport { StatefulCompactPopoverSheet } from \"./StatefulCompactPopoverSheet\";\n\nconst componentMap = {\n [ThSheetTypes.compactPopover]: StatefulCompactPopoverSheet,\n [ThSheetTypes.popover]: StatefulPopoverSheet,\n [ThSheetTypes.modal]: StatefulModalSheet,\n [ThSheetTypes.bottomSheet]: StatefulBottomSheet,\n [ThSheetTypes.fullscreen]: StatefulFullScreenSheet,\n [ThSheetTypes.dockedStart]: (props: StatefulDockedSheetProps) => <StatefulDockedSheet { ...props } flow={ ThDockingKeys.start } />,\n [ThSheetTypes.dockedEnd]: (props: StatefulDockedSheetProps) => <StatefulDockedSheet { ...props } flow={ ThDockingKeys.end } />\n};\n\nexport const StatefulSheetWrapper = ({\n sheetType,\n sheetProps,\n children\n}: {\n sheetType: ThSheetTypes,\n sheetProps: StatefulPopoverSheetProps | StatefulModalSheetProps | StatefulFullScreenSheetProps | StatefulDockedSheetProps | StatefulBottomSheetProps,\n children: ReactNode\n}) => {\n\n return (\n <ThTypedComponentRenderer\n type={ sheetType }\n componentMap={ componentMap }\n props={ sheetProps }\n >\n { children }\n </ThTypedComponentRenderer>\n );\n}","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\nimport { ThDockingTypes, ThDockingKeys, ThSheetTypes } from \"@/preferences/models\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport { dockAction, setActionOpen } from \"@/lib/actionsReducer\";\n\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionComponentStatus } from \"@/core/Components/Actions/hooks/useActionComponentStatus\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\n\nlet dockingMap: Required<BreakpointsMap<ThDockingTypes>> | null = null;\n\nexport const useDocking = <T extends string>(key: T) => {\n const preferences = useActionsPreferences();\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n const actionsMap = useAppSelector(state => state.actions.keys);\n const actionState = actionsMap[key];\n const profile = useAppSelector(state => state.reader.profile);\n const dock = useAppSelector(state => profile ? state.actions.dock[profile] : undefined);\n const dispatch = useAppDispatch();\n\n const actions = useActions(actionsMap);\n \n // Check if docked actions still exist in plugin registry\n const startActionKey = dock?.[ThDockingKeys.start]?.actionKey;\n const endActionKey = dock?.[ThDockingKeys.end]?.actionKey;\n const startStatus = useActionComponentStatus({ actionKey: startActionKey || \"\" });\n const endStatus = useActionComponentStatus({ actionKey: endActionKey || \"\" });\n\n if (!dockingMap) {\n dockingMap = makeBreakpointsMap<ThDockingTypes>({\n defaultValue: ThDockingTypes.both, \n fromEnum: ThDockingTypes, \n pref: preferences.docking.dock, \n disabledValue: ThDockingTypes.none \n });\n }\n const currentDockConfig = breakpoint && dockingMap[breakpoint];\n \n // Use type assertion to tell TypeScript that the key is valid\n const dockablePref = (preferences.actionsKeys[key as keyof typeof preferences.actionsKeys])?.docked?.dockable || ThDockingTypes.none;\n\n const defaultSheet = (preferences.actionsKeys[key as keyof typeof preferences.actionsKeys])?.sheet?.defaultSheet || ThSheetTypes.popover;\n\n const sheetMap = makeBreakpointsMap<ThSheetTypes>({\n defaultValue: (preferences.actionsKeys[key as keyof typeof preferences.actionsKeys])?.sheet?.defaultSheet || ThSheetTypes.popover,\n fromEnum: ThSheetTypes,\n pref: (preferences.actionsKeys[key as keyof typeof preferences.actionsKeys])?.sheet?.breakpoints\n });\n const sheetPref = breakpoint && sheetMap[breakpoint] || defaultSheet;\n\n const [sheetType, setSheetType] = useState<ThSheetTypes>(defaultSheet);\n const previousSheetType = usePrevious(sheetType);\n\n // Checks whether the action can be docked: its pref should match the docking pref\n const canBeDocked = useCallback((slot: ThDockingTypes.start | ThDockingTypes.end) => {\n return (currentDockConfig === slot || currentDockConfig === ThDockingTypes.both) \n && (dockablePref === slot || dockablePref === ThDockingTypes.both);\n }, [currentDockConfig, dockablePref]);\n\n // Checks whether the sheet pref is of Dock type \n const isDockedSheetPref = useCallback((type?: ThSheetTypes.dockedStart | ThSheetTypes.dockedEnd) => {\n if (type) {\n return sheetPref === type;\n } else {\n return sheetPref === ThSheetTypes.dockedStart || sheetPref === ThSheetTypes.dockedEnd\n }\n }, [sheetPref]);\n \n // Builds the docker for the action based on all preferences\n const getDocker = useCallback((): ThDockingKeys[] => {\n // First let’s handle the cases where docker shouldn’t be used\n // The sheet is not dockable, per key.docked.dockable pref\n if (dockablePref === ThDockingTypes.none) return [];\n // There’s no docking slot available, per docking.dock pref\n if (currentDockConfig === ThDockingTypes.none) return [];\n // The sheet type is not compatible with docking\n if (sheetPref === ThSheetTypes.fullscreen || sheetPref === ThSheetTypes.bottomSheet) return [];\n\n // We can now build the docker from the display order\n let dockerKeys: ThDockingKeys[] = [];\n // In order for an action to be dockable, the dock slot has to exist\n // and the dockable preference of key.docked should match the values\n preferences.docking.displayOrder.forEach((dockingKey: ThDockingKeys) => {\n switch(dockingKey) {\n case ThDockingKeys.transient:\n // We already handled both cases for none \n dockerKeys.push(dockingKey);\n break;\n case ThDockingKeys.start:\n if (canBeDocked(ThDockingTypes.start)) {\n dockerKeys.push(dockingKey);\n }\n break;\n case ThDockingKeys.end:\n if (canBeDocked(ThDockingTypes.end)) {\n dockerKeys.push(dockingKey);\n }\n break;\n default:\n break;\n }\n });\n\n // If the action can only be transient, then it can’t be docked\n if (dockerKeys.length === 1 && dockerKeys[0] === ThDockingKeys.transient) return [];\n\n return dockerKeys;\n }, [preferences.docking.displayOrder, currentDockConfig, sheetPref, dockablePref, canBeDocked]);\n\n const getSheetType = useCallback(() => {\n // Protect against null breakpoint during initialization\n if (!breakpoint) {\n return sheetType;\n }\n \n // First check the dockable pref is none to return early\n if (dockablePref === ThDockingTypes.none) {\n // Sheet is of docked type, we return the default\n if (isDockedSheetPref()) {\n return defaultSheet;\n } else {\n // Sheet pref is not of docked type, we can return it\n return sheetPref;\n }\n };\n\n // We now need to check whether the user has docked the action themselves\n // ActionsReducer should has made sure there is no conflict to handle here \n // by updating states of actions on docking\n switch (actionState?.docking) {\n \n // if action.docking is transient we need to check the pref, \n // it can be docked and in that case we need to pick the default\n case ThDockingKeys.transient:\n if (isDockedSheetPref()) {\n return defaultSheet;\n } else {\n return sheetPref;\n }\n \n // If action.docking is set to start/end then we check the docking slot is available\n case ThDockingKeys.start:\n if (canBeDocked(ThDockingTypes.start)) {\n return ThSheetTypes.dockedStart;\n } else {\n // if the pref is not docked start, return the pref \n // else return the default\n if (!isDockedSheetPref(ThSheetTypes.dockedStart)) {\n return sheetPref;\n } else {\n return defaultSheet;\n }\n }\n\n case ThDockingKeys.end:\n if (canBeDocked(ThDockingTypes.end)) {\n return ThSheetTypes.dockedEnd;\n } else {\n // if the pref is not docked end, return the pref \n // else return the default\n if (!isDockedSheetPref(ThSheetTypes.dockedEnd)) {\n return sheetPref;\n } else {\n return defaultSheet;\n }\n }\n \n // If action.docking is null or undefined then we rely on pref \n // as it means the user did not pick another option\n case null:\n case undefined:\n // We have to check sheetPref is compatible with docking prefs\n if (isDockedSheetPref(ThSheetTypes.dockedStart)) {\n if (canBeDocked(ThDockingTypes.start)) {\n return ThSheetTypes.dockedStart;\n } else {\n return defaultSheet;\n }\n } else if (isDockedSheetPref(ThSheetTypes.dockedEnd)) {\n if (canBeDocked(ThDockingTypes.end)) {\n return ThSheetTypes.dockedEnd;\n } else {\n return defaultSheet;\n }\n } else {\n return sheetPref;\n }\n default:\n return defaultSheet;\n }\n }, [dockablePref, sheetPref, defaultSheet, actionState?.docking, canBeDocked, isDockedSheetPref, breakpoint, sheetType]);\n\n // When docking or breakpoints-related prefs change, get the correct sheet type\n useEffect(() => {\n setSheetType(getSheetType());\n }, [sheetPref, currentDockConfig, actionState?.docking, getSheetType]);\n\n // Dismiss/Close when sheetType has changed from docked to transient\n useEffect(() => {\n // This was not dismissed on breakpoint change, but by the user\n if (actionState?.docking === ThDockingKeys.transient) return;\n\n if (sheetType !== ThSheetTypes.dockedStart && sheetType !== ThSheetTypes.dockedEnd) {\n if (previousSheetType === ThSheetTypes.dockedStart || previousSheetType === ThSheetTypes.dockedEnd) {\n dispatch(setActionOpen({\n key: key,\n isOpen: false\n }));\n }\n }\n }, [dispatch, key, sheetType, previousSheetType, actionState?.docking]);\n\n // on mount, check whether we should update states for docked sheets from pref\n useEffect(() => {\n if (actionState?.isOpen == null && profile) {\n if (sheetType === ThSheetTypes.dockedStart) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.start,\n profile: profile\n }));\n dispatch(setActionOpen({\n key: key,\n isOpen: true\n }));\n } else if (sheetType === ThSheetTypes.dockedEnd) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.end,\n profile: profile\n }));\n dispatch(setActionOpen({\n key: key,\n isOpen: true\n }));\n }\n }\n }, [actionState?.isOpen, sheetType, key, dispatch, profile]);\n\n // Edge case where the sheet has been opened/closed and\n // is of dockable type, but the dock panel is not populated\n // e.g. action was mounted as a different type of sheet (breakpoint),\n // and opened/closed. If the user resizes the window (another breakpoint) \n // but we don’t dispatch docking, then it can’t be displayed \n // since the docking slot has never been populated.\n useEffect(() => {\n // Action has been opened/closed by user\n // but it’s not been manually docked, \n // which means the pref is used but \n // has not be instantiated yet, and \n // couldn’t be on first mount because\n // a different type was used in prefs\n if (actionState?.isOpen != null && actionState?.docking == null && profile) {\n if (sheetType === ThSheetTypes.dockedStart) {\n // Check if the action is docked in practice\n // if it isn’t dispatch docking of the action\n const dockingKey = actions.whichDocked(key);\n if (dockingKey !== ThDockingKeys.start) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.start,\n profile: profile\n }));\n }\n } else if (sheetType === ThSheetTypes.dockedEnd) {\n // Check if the action is docked in practice\n // if it isn’t dispatch docking of the action\n const dockingKey = actions.whichDocked(key);\n if (dockingKey !== ThDockingKeys.end) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.end,\n profile: profile\n }));\n }\n }\n }\n }, [dispatch, key, sheetType, actionState?.isOpen, actionState?.docking, actions, profile]);\n\n // Sync action docking property with profile dock state when profile changes\n useEffect(() => {\n if (profile && dock) {\n const isDockedInStart = dock[ThDockingKeys.start]?.actionKey === key;\n const isDockedInEnd = dock[ThDockingKeys.end]?.actionKey === key;\n \n if (isDockedInStart && actionState?.docking !== ThDockingKeys.start) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.start,\n profile: profile\n }));\n // Restore isOpen state if action was docked\n if (actionState?.isOpen === false) {\n dispatch(setActionOpen({\n key: key,\n isOpen: true\n }));\n }\n } else if (isDockedInEnd && actionState?.docking !== ThDockingKeys.end) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.end,\n profile: profile\n }));\n // Restore isOpen state if action was docked\n if (actionState?.isOpen === false) {\n dispatch(setActionOpen({\n key: key,\n isOpen: true\n }));\n }\n }\n }\n }, [profile, dock, actionState?.docking, actionState?.isOpen, key, dispatch]);\n\n // Clean up stale docked actions that no longer exist in plugin registry\n useEffect(() => {\n if (!profile || !dock) return;\n\n if (startActionKey && !startStatus.isComponentRegistered) {\n dispatch(dockAction({\n key: startActionKey,\n dockingKey: ThDockingKeys.transient,\n profile\n }));\n }\n\n if (endActionKey && !endStatus.isComponentRegistered) {\n dispatch(dockAction({\n key: endActionKey,\n dockingKey: ThDockingKeys.transient,\n profile\n }));\n }\n }, [profile, dock, startActionKey, endActionKey, startStatus.isComponentRegistered, endStatus.isComponentRegistered, dispatch]);\n\n return {\n getDocker,\n sheetType\n }\n}",".wrapper {}\n\n.form {\n display: flex;\n gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.label {\n margin-block: 0 var(--th-layout-spacing);\n display: block;\n}\n\n.input {\n display: block;\n font-weight: bold;\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n border: 2px solid var(--th-theme-subdue);\n}\n\n.button {\n box-sizing: content-box;\n border: 2px solid var(--th-theme-subdue);\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-icon-size, 24px) * (1/2));\n text-align: center;\n border-radius: var(--th-layout-radius);\n margin-inline-start: auto;\n align-self: flex-end;\n}\n\n.button[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.input[data-focus-visible],\n.button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.numberField[data-disabled],\n.button[data-disabled] {\n color: var(--th-theme-disable);\n} ","\"use client\";\n\nexport const isPositionsListValid = (positionsList: any[] | null | undefined): boolean => {\n return !!(positionsList && positionsList.length > 0 && positionsList.some(item => item.locations?.position));\n};;\n","\"use client\";\n\nimport { FormEvent, useCallback, useEffect, useState } from \"react\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport jumpToPositionStyles from \"./assets/styles/thorium-web.jumpToPosition.module.css\";\n\nimport { StatefulSheetWrapper } from \"../../Sheets/StatefulSheetWrapper\";\nimport { ThForm } from \"@/core/Components/Form/ThForm\";\nimport { ThFormNumberField } from \"@/core/Components/Form/Fields/ThFormNumberField\";\n\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useDocking } from \"../../Docking/hooks/useDocking\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setImmersive, setUserNavigated } from \"@/lib/readerReducer\";\n\nimport { isPositionsListValid } from \"./helpers/utils\";\n\nexport const StatefulJumpToPositionContainer = ({ \n triggerRef \n}: StatefulActionContainerProps) => {\n const { t } = useI18n();\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.jumpToPosition]);\n const positionsList = useAppSelector(state => state.publication.positionsList);\n\n const positionNumbers = useAppSelector(state => state.publication.unstableTimeline?.progression?.currentPositions);\n\n const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n const dispatch = useAppDispatch();\n\n const docking = useDocking(ThActionsKeys.jumpToPosition);\n const sheetType = docking.sheetType;\n\n const { go } = useEpubNavigator();\n\n // Component has to handle updates locally since EpubNavigator updates positions, \n // so we use these as an intermediary\n const [position, setPosition] = useState(0);\n const [errorMessage, setErrorMessage] = useState<string>();\n\n // Position Numbers can be a range so we must check position is in range\n // And not only that the array simply includes the position\n const positionInRange = useCallback(() => {\n if (!positionNumbers) return false;\n return positionNumbers.length === 2\n ? position >= positionNumbers[0] && position <= positionNumbers[1]\n : position === positionNumbers[0];\n }, [position, positionNumbers]);\n\n // Update the label to use react-i18next interpolation\n const label = t(\"reader.jumpToPosition.label\", { positionStart: 1, positionEnd: positionsList.length });\n\n const setOpen = useCallback((value: boolean) => {\n dispatch(setActionOpen({\n key: ThActionsKeys.jumpToPosition,\n isOpen: value\n }));\n }, [dispatch]);\n\n // NumberField onChange won’t fire if the value has been typed\n // so we need to handle the input manually\n const handleInput = useCallback((e: FormEvent<HTMLInputElement>) => {\n const target = e.target as HTMLInputElement;\n setPosition(parseInt(target.value));\n }, []);\n\n // This is a form submit handler so we have to preventDefault\n // We have to use this otherwise any change will trigger a navigation\n const handleAction = useCallback((e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (!positionsList) return;\n\n setErrorMessage(undefined); // Clear previous errors\n\n const item = positionsList.find(item => item.locations.position === position);\n\n if (!item) {\n setErrorMessage(t(\"reader.jumpToPosition.error.notFound\"));\n return;\n }\n \n if (positionInRange()) return setOpen(false);\n\n const cb = () => {\n setOpen(false);\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n };\n \n go(item, !reducedMotion, cb);\n }, [position, positionsList, reducedMotion, t, positionInRange, go, setOpen, dispatch]);\n\n // Since we are using an intermediary local state, we must keep track when positionNumbers changes\n useEffect(() => {\n positionNumbers && setPosition(positionNumbers[0]);\n }, [positionNumbers]);\n\n // In case there is no positions list or no valid positions we return\n if (!isPositionsListValid(positionsList)) return null;\n\n return (\n <>\n <StatefulSheetWrapper\n sheetType={sheetType}\n sheetProps={{\n id: ThActionsKeys.jumpToPosition,\n triggerRef: triggerRef,\n heading: t(\"reader.actions.goToPosition.descriptive\"),\n className: jumpToPositionStyles.wrapper,\n placement: \"bottom\",\n isOpen: actionState?.isOpen || false,\n onOpenChange: setOpen,\n onClosePress: () => setOpen(false),\n docker: docking.getDocker()\n }}\n >\n <ThForm\n label={ t(\"reader.jumpToPosition.go\") }\n className={ jumpToPositionStyles.form }\n onSubmit={ handleAction }\n compounds={{\n button: {\n className: jumpToPositionStyles.button,\n isDisabled: !position || positionInRange()\n }\n }}\n >\n <ThFormNumberField\n label={ label }\n name=\"jumpToPosition\"\n className={ jumpToPositionStyles.numberField }\n onChange={ setPosition }\n onInput={ handleInput }\n value={ position }\n minValue={ 1 }\n maxValue={ positionsList.length }\n step={ 1 }\n formatOptions={{ style: \"decimal\" }}\n isWheelDisabled={ true }\n errorMessage={ errorMessage }\n compounds={{\n label: {\n className: jumpToPositionStyles.label\n },\n input: {\n className: jumpToPositionStyles.input,\n inputMode: \"numeric\"\n }\n }}\n />\n </ThForm>\n </StatefulSheetWrapper>\n </>\n )\n}","import * as React from \"react\";\nconst SvgPinDrop = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M480-301q99-80 149.5-154T680-594q0-90-56-148t-144-58q-88 0-144 58t-56 148q0 65 50.5 139T480-301Zm0 101Q339-304 269.5-402T200-594q0-125 78-205.5T480-880q124 0 202 80.5T760-594q0 94-69.5 192T480-200Zm0-320q33 0 56.5-23.5T560-600q0-33-23.5-56.5T480-680q-33 0-56.5 23.5T400-600q0 33 23.5 56.5T480-520ZM200-80v-80h560v80H200Zm280-520Z\" /></svg>;\nexport default SvgPinDrop;","\"use client\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport TargetIcon from \"./assets/icons/pin_drop.svg\";\n\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setActionOpen, useAppDispatch, useAppSelector } from \"@/lib\";\nimport { isPositionsListValid } from \"./helpers/utils\";\n\nexport const StatefulJumpToPositionTrigger = ({ variant }: StatefulActionTriggerProps) => {\n const preferences = useActionsPreferences();\n const { t } = useI18n();\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.jumpToPosition]);\n const positionsList = useAppSelector(state => state.publication.positionsList);\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => {\n dispatch(setActionOpen({ \n key: ThActionsKeys.jumpToPosition,\n isOpen: value \n }));\n }\n\n // In case there is no positions list or no valid positions we return\n if (!isPositionsListValid(positionsList)) return null;\n\n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ t(\"reader.actions.goToPosition.descriptive\") }\n SVGIcon={ TargetIcon }\n shortcut={ preferences.actionsKeys[ThActionsKeys.jumpToPosition].shortcut }\n id={ ThActionsKeys.jumpToPosition }\n onAction={ () => setOpen(!actionState?.isOpen) }\n />\n : <StatefulActionIcon\n visibility={ preferences.actionsKeys[ThActionsKeys.jumpToPosition].visibility } \n aria-label={ t(\"reader.actions.goToPosition.descriptive\") }\n placement=\"bottom\" \n tooltipLabel={ t(\"reader.actions.goToPosition.compact\") }\n onPress={ () => setOpen(!actionState?.isOpen) }\n >\n <TargetIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n }\n </>\n )\n}",".wrapper {}\n\n.group {\n margin: calc(var(--th-layout-spacing) * 2) 0; \n}\n\n.advancedGroup {\n position: relative;\n}\n\n.advancedIcon {\n position: absolute;\n inset-inline-end: 0;\n inset-block-start: 0;\n}\n\n.label {\n display: block;\n font-weight: bold;\n font-size: 1rem;\n margin: 0;\n}\n\n.groupLabel {\n padding-top: calc(var(--th-icon-size, 24px) * (1/3));\n}\n\n.radioWrapper,\n.groupWrapper {\n margin: var(--th-layout-spacing) 0;\n text-align: center;\n border-radius: var(--th-layout-radius);\n}\n\n.numberField .groupWrapper {\n margin-bottom: 0;\n}\n\n.radioWrapper {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(min(100%, 100px), 1fr));\n gap: calc(var(--th-layout-spacing) / 4);\n width: 100%; \n}\n\n.groupWrapper {\n display: flex;\n width: fit-content;\n gap: var(--th-layout-spacing) calc(var(--th-layout-spacing) / 2);\n}\n\n.advancedGroup .radioWrapper {\n margin-bottom: 0;\n}\n\n.groupWrapper[data-focus-within]:has(input[data-focus-visible]) {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.numberFieldWrapper,\n.sliderWrapper {\n display: flex;\n align-items: flex-start;\n max-width: 100%;\n}\n\n.numberFieldWrapper .numberField,\n.sliderWrapper .slider {\n flex: 1 0 auto;\n}\n\n.group:first-of-type {\n margin-top: 0;\n}\n\n.group:last-of-type {\n margin-bottom: 0;\n}\n\n/* Reset button */\n\n.resetButton {\n margin-inline-start: auto;\n}\n\n/* Number field */\n\n.numberField .input {\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n font-weight: bold;\n align-self: center;\n max-width: 20ch;\n}\n\n.groupWrapper[data-disabled] .input {\n color: var(--th-theme-disable)\n}\n\n.radio {\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n box-sizing: border-box;\n border: 2px solid transparent;\n}\n\n.radio:not(.themeRadio) {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: calc(var(--th-layout-spacing) / 2);\n min-width: 0;\n width: 100%;\n}\n\n.radio:not(.themeRadio) > * {\n width: 100%;\n text-align: center;\n}\n\n/* Text truncation for non-theme radios */\n.radio:not(.themeRadio) span {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.2em;\n max-height: 2.4em; /* 2 lines of text */\n width: 100%;\n box-sizing: border-box;\n white-space: normal;\n}\n\n.radio:not(.themeRadio)[data-selected] {\n border: 2px solid var(--th-theme-subdue);\n}\n\n.radio[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.radio[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.radio[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n outline-offset: 2px;\n}\n\n.radio svg {\n width: var(--th-icon-size, 32px);\n height: var(--th-icon-size, 32px);\n /* So that it’s the same color as text based on state */\n fill: currentColor;\n}\n\n.themesWrapper {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n grid-auto-flow: row;\n max-width: 100%;\n gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.themeRadio {\n padding-block: calc(var(--th-layout-spacing) / 4);\n padding-inline: calc((var(--th-icon-size, 24px) * 5/6) + (var(--th-layout-spacing) / 4));\n position: relative;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.themeRadio svg {\n width: calc(var(--th-icon-size, 24px) * 5/6);\n height: calc(var(--th-icon-size, 24px) * 5/6);\n position: absolute;\n inset-inline-end: 5px;\n inset-block-end: 5px;\n /* So that it’s the same color as text w/o having to expose a custom prop globally */\n fill: currentColor;\n}\n\n.separator {\n border: none;\n border-top: 1px solid var(--th-theme-subdue);\n}\n\n/* Slider */\n\n.slider {\n display: grid;\n grid-template-areas: \"label output\"\n \"track track\";\n grid-template-columns: 1fr auto;\n gap: calc(var(--th-layout-spacing) / 2);\n color: var(--th-theme-text);\n flex-direction: column;\n max-width: min(calc(100% - (var(--th-layout-spacing) / 2)), 80%);\n}\n\n.sliderLabel {\n grid-area: label;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n\n.sliderOutput {\n grid-area: output;\n}\n\n.slider[data-disabled] .sliderLabel,\n.slider[data-disabled] .sliderOutput {\n color: var(--th-theme-disable);\n}\n\n.sliderTrack {\n grid-area: track;\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.sliderTrack::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.sliderThumb {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background: var(--th-theme-text);\n border: 2px solid var(--th-theme-subdue);\n top: 50%;\n}\n\n.slider[data-disabled] .sliderThumb {\n background: var(--th-theme-disable);\n border: 2px solid var(--th-theme-disable);\n}\n\n.sliderThumb[data-dragging] {\n background: var(--th-theme-subdue);\n}\n\n.sliderThumb[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n border: 2px solid var(--th-theme-focus);\n}\n\n.sliderPlaceholder {\n color: var(--th-theme-subdue); \n}\n\n/* Slider with presets */\n\n.sliderWithPresetsWrapper {\n display: flex;\n flex-direction: column;\n gap: var(--th-layout-spacing);\n}\n\n\n/* Let the slider fill the full width of the wrapper */\n.sliderWithPresetsWrapper .sliderWrapper {\n width: 100%;\n}\n\n.sliderWithPresetsWrapper .slider {\n max-width: 100%;\n}\n\n.sliderWithPresetsRadioGroup {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(4.5rem, 1fr));\n gap: calc(var(--th-layout-spacing) / 4);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.sliderWithPresetsRadio {\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n box-sizing: border-box;\n border: 2px solid transparent;\n text-align: center;\n font-variant-numeric: tabular-nums;\n background: transparent;\n color: var(--th-theme-text);\n}\n\n.sliderWithPresetsRadio[data-selected] {\n border: 2px solid var(--th-theme-subdue);\n}\n\n.sliderWithPresetsRadio[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.sliderWithPresetsRadio[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n outline-offset: 2px;\n}\n\n.sliderWithPresetsRadio[data-disabled] {\n color: var(--th-theme-disable);\n border-color: var(--th-theme-disable);\n}\n\n/* Slider with ticks */\n\n.sliderWithTicks .sliderTrack::before {\n background: \n /* Track line */\n linear-gradient(\n to right,\n var(--th-theme-subdue) 0%,\n var(--th-theme-subdue) 100%\n ) 0 50% / 100% 3px no-repeat,\n\n /* Ticks */\n repeating-linear-gradient(\n to right,\n var(--th-theme-text) 0%,\n var(--th-theme-text) 1px,\n transparent 1px,\n transparent calc((100% - 2px) / var(--th-slider-ticks, 10))\n ) 0 50% / 100% 15px no-repeat;\n height: 15px;\n transform: translateY(-50%);\n position: relative;\n}\n\n/* First and last tick */\n\n.sliderWithTicks .sliderTrack::after {\n content: \"\";\n background: \n /* First tick */\n linear-gradient(\n to right,\n var(--th-theme-subdue) 0%,\n var(--th-theme-subdue) 3px,\n transparent 3px,\n transparent 100%\n ) 0 50% / 100% 20px no-repeat,\n\n /* Last tick */\n linear-gradient(\n to left,\n var(--th-theme-subdue) 0%,\n var(--th-theme-subdue) 3px,\n transparent 3px,\n transparent 100%\n ) 100% 50% / 100% 20px no-repeat;\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 20px;\n transform: translateY(-50%);\n pointer-events: none;\n}\n\n/* Dropdown */\n\n.dropdown[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.dropdownButton {\n margin-top: var(--th-layout-spacing);\n position: relative;\n padding-block: calc(var(--th-layout-spacing) / 2);\n padding-inline: calc(var(--th-layout-spacing) / 2) calc(var(--th-icon-size, 24px) * 6/5);\n border-radius: var(--th-layout-radius);\n box-sizing: border-box;\n border: 1px solid var(--th-theme-subdue);\n max-width: 100%;\n}\n\n.dropdownButton[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.dropdownButton svg {\n width: calc(var(--th-icon-size, 24px) * 5/6);\n height: calc(var(--th-icon-size, 24px) * 5/6);\n position: absolute;\n inset-inline-end: calc(var(--th-layout-spacing) / 4);\n inset-block-start: calc(var(--th-layout-spacing) / 2);\n fill: currentColor;\n}\n\n.dropdownPopover {\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n padding: calc(var(--th-layout-spacing) / 2);\n border-radius: var(--th-layout-radius);\n border: 1px solid var(--th-theme-subdue);\n filter: drop-shadow(var(--th-theme-elevate));\n box-sizing: border-box;\n width: max-content;\n overflow-y: auto;\n /* TMP: Needs to be higher than bottom sheet, which requires hack for Safari iOS */\n z-index: 1000000 !important;\n}\n\n.dropdownListbox {\n display: flex;\n flex-direction: column;\n gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.dropdownListboxItem {\n padding: calc(var(--th-layout-spacing) / 4);\n border-radius: var(--th-layout-radius);\n outline: none;\n}\n\n.dropdownListboxItem[data-selected] {\n color: var(--th-theme-subdue);\n}\n\n.dropdownListboxItem[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.dropdownListboxItem[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.dropdownListboxItem[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n/* Switch */\n\n.switch {\n display: flex;\n align-items: center;\n gap: clamp(10px, calc(var(--th-layout-spacing) / 2), 20px);\n color: var(--th-theme-text);\n margin: var(--th-layout-spacing) 0;\n}\n\n.switchIndicator {\n width: 2rem;\n height: 1.143rem;\n border: 2px solid var(--th-theme-subdue);\n background: var(--th-theme-background);\n border-radius: 1.143rem;\n transition: all 200ms;\n flex-shrink: 0;\n}\n\n.switchIndicator::before {\n content: \"\";\n display: block;\n margin: 0.143rem;\n width: 0.857rem;\n height: 0.857rem;\n background: var(--th-theme-subdue);\n border-radius: 16px;\n transition: all 200ms;\n}\n\n.switch[data-selected] .switchIndicator::before {\n background: var(--th-theme-text);\n transform: translateX(100%);\n}\n\n:dir(rtl) .switch[data-selected] .switchIndicator::before {\n background: var(--th-theme-text);\n transform: translateX(-100%);\n}\n\n.switch[data-focus-visible] .switchIndicator {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.switch[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.switch[data-disabled] .switchIndicator::before {\n background: var(--th-theme-disable) !important;\n}","\"use client\";\n\nimport { ReactNode, useEffect } from \"react\";\n\nimport { ThActionsKeys, ThSheetHeaderVariant } from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport settingsStyles from \"../../Settings/assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { StatefulSheetWrapper } from \"../../Sheets/StatefulSheetWrapper\";\n\nimport { useDocking } from \"../../Docking/hooks/useDocking\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\ninterface StatefulSettingsWrapperProps extends StatefulActionContainerProps {\n heading: string;\n headerVariant: ThSheetHeaderVariant;\n onClosePress: () => void;\n dismissEscapeKeyClose?: boolean;\n resetFocus?: unknown;\n onReset?: () => void;\n children: ReactNode;\n}\n\nexport const StatefulSettingsWrapper = ({\n triggerRef,\n heading,\n headerVariant,\n onClosePress,\n dismissEscapeKeyClose,\n resetFocus,\n onReset,\n children\n}: StatefulSettingsWrapperProps) => {\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.settings]);\n const dispatch = useAppDispatch();\n const docking = useDocking(ThActionsKeys.settings);\n\n const setOpen = (value: boolean) => {\n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: value\n }));\n if (!value) dispatch(setHovering(false));\n };\n\n useEffect(() => {\n if (!actionState?.isOpen) onReset?.();\n }, [actionState?.isOpen, onReset]);\n\n return (\n <StatefulSheetWrapper\n sheetType={ docking.sheetType }\n sheetProps={ {\n id: ThActionsKeys.settings,\n triggerRef,\n heading,\n headerVariant,\n className: settingsStyles.wrapper,\n placement: \"bottom\",\n isOpen: actionState?.isOpen || false,\n onOpenChange: setOpen,\n onClosePress,\n docker: docking.getDocker(),\n resetFocus,\n scrollTopOnFocus: true,\n dismissEscapeKeyClose\n } }\n >\n { children }\n </StatefulSheetWrapper>\n );\n};\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { ThActionsKeys, ThSheetHeaderVariant } from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport { StatefulSettingsWrapper } from \"./StatefulSettingsWrapper\";\n\nimport { usePlugins } from \"@/components/Plugins/PluginProvider\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulAudioSettingsContainer = ({\n triggerRef\n}: StatefulActionContainerProps) => {\n const { preferences } = useAudioPreferences();\n const audioSettingsKeys = preferences.settings.order;\n const { settingsComponentsMap } = usePlugins();\n const { t } = useI18n();\n const dispatch = useAppDispatch();\n\n const close = useCallback(() => {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false }));\n dispatch(setHovering(false));\n }, [dispatch]);\n\n return (\n <StatefulSettingsWrapper\n triggerRef={ triggerRef }\n heading={ t(\"reader.playback.preferences.audio.title\") }\n headerVariant={ ThSheetHeaderVariant.close }\n onClosePress={ close }\n >\n { audioSettingsKeys.length > 0 && settingsComponentsMap\n ? audioSettingsKeys.map((key) => {\n const match = settingsComponentsMap[key];\n if (!match) {\n console.warn(`Action key \"${ key }\" not found in the plugin registry while present in preferences.`);\n return null;\n }\n return <match.Comp key={ key } { ...match.props } />;\n })\n : null\n }\n </StatefulSettingsWrapper>\n );\n};\n","\"use client\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { WithRef } from \"@/core/Components/customTypes\";\n\nimport { ThSettingsGroupPref, ThSpacingSettingsKeys, ThTextSettingsKeys } from \"@/preferences\";\nimport { PressEvent } from \"react-aria\";\n\nimport { SettingComponent } from \"@/components/Plugins/PluginRegistry\";\n\nimport { ThSettingsWrapper } from \"@/core/Components/Settings/ThSettingsWrapper\";\nimport { Heading, HeadingProps } from \"react-aria-components\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulGroupWrapperProps<T extends string = ThTextSettingsKeys | ThSpacingSettingsKeys> {\n label: string;\n moreLabel: string;\n moreTooltip: string;\n onPressMore: (e: PressEvent) => void;\n componentsMap: Record<string, SettingComponent>;\n prefs?: ThSettingsGroupPref<T>;\n defaultPrefs: {\n main: T[];\n subPanel: T[];\n };\n isDisabled?: boolean;\n compounds?: {\n /** \n * Custom heading. Can be either:\n * - A React element that will be rendered directly\n * - Props that will be spread onto the default Heading component\n */\n heading?: React.ReactElement<typeof Heading> | WithRef<HeadingProps, HTMLHeadingElement>;\n };\n}\n\nexport const StatefulGroupWrapper = <T extends string = ThTextSettingsKeys | ThSpacingSettingsKeys>({\n label,\n moreLabel,\n moreTooltip,\n onPressMore,\n componentsMap,\n prefs,\n defaultPrefs,\n isDisabled,\n compounds\n}: StatefulGroupWrapperProps<T>) => {\n const { preferences } = usePreferences();\n \n const main = prefs?.main || defaultPrefs.main;\n const displayOrder = prefs?.subPanel !== undefined \n ? prefs.subPanel \n : defaultPrefs.subPanel;\n\n const resolvedPrefs = {\n main: main,\n subPanel: displayOrder\n };\n \n return(\n <>\n <ThSettingsWrapper\n className={ classNames(settingsStyles.group, settingsStyles.advancedGroup) }\n label={ label }\n items={ componentsMap }\n prefs={ resolvedPrefs }\n compounds={{\n ...(compounds?.heading \n ? { heading: compounds.heading }\n : {\n heading: {\n className: classNames(settingsStyles.label, settingsStyles.groupLabel)\n }\n }),\n button: { \n className: classNames(readerSharedUI.icon, settingsStyles.advancedIcon), \n \"aria-label\": moreLabel, \n isDisabled: isDisabled, \n compounds: { \n tooltipTrigger: { \n delay: preferences.theming.icon.tooltipDelay, \n closeDelay: preferences.theming.icon.tooltipDelay \n }, \n tooltip: { \n className: readerSharedUI.tooltip, \n placement: \"top\",\n offset: preferences.theming.icon.tooltipOffset || 0\n },\n label: moreTooltip\n },\n onPress: onPressMore\n }\n }}\n />\n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { \n defaultSpacingSettingsMain, \n defaultSpacingSettingsSubpanel, \n ThSettingsContainerKeys, \n ThSpacingSettingsKeys \n} from \"@/preferences\";\n\nimport { StatefulGroupWrapper } from \"../StatefulGroupWrapper\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { usePlugins } from \"../../Plugins/PluginProvider\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setSettingsContainer } from \"@/lib/readerReducer\";\n\nexport const StatefulSpacingGroup = () => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const { spacingSettingsComponentsMap } = usePlugins();\n\n const dispatch = useAppDispatch();\n \n const setSpacingContainer = useCallback(() => {\n dispatch(setSettingsContainer(ThSettingsContainerKeys.spacing));\n }, [dispatch]);\n\n return (\n <>\n <StatefulGroupWrapper<ThSpacingSettingsKeys> \n label={ t(\"reader.preferences.spacing.title\") }\n moreLabel={ t(\"reader.settings.spacing.advanced.trigger\") }\n moreTooltip={ t(\"reader.settings.spacing.advanced.tooltip\") }\n onPressMore={ setSpacingContainer }\n componentsMap={ spacingSettingsComponentsMap }\n prefs={ preferences.settings.spacing }\n defaultPrefs={ {\n main: defaultSpacingSettingsMain, \n subPanel: defaultSpacingSettingsSubpanel\n }}\n />\n </>\n );\n}\n\nexport const StatefulSpacingGroupContainer = () => {\n const { preferences } = usePreferences();\n\n const displayOrder = preferences.settings.spacing?.subPanel as ThSpacingSettingsKeys[] | null | undefined || defaultSpacingSettingsSubpanel;\n const { spacingSettingsComponentsMap } = usePlugins();\n\n return(\n <>\n { displayOrder.map((key: ThSpacingSettingsKeys) => {\n const match = spacingSettingsComponentsMap[key];\n if (!match) {\n console.warn(`Setting key \"${ key }\" not found in the plugin registry while present in preferences.`);\n return null;\n }\n return <match.Comp key={ key } standalone={ true } />;\n }) }\n </>\n )\n}","\"use client\";\n\nimport React, { useCallback } from \"react\";\n\nimport { \n defaultTextSettingsMain, \n defaultTextSettingsSubpanel, \n ThSettingsContainerKeys, \n ThTextSettingsKeys \n} from \"@/preferences\";\n\nimport { StatefulGroupWrapper } from \"../StatefulGroupWrapper\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { usePlugins } from \"../../Plugins/PluginProvider\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setSettingsContainer } from \"@/lib/readerReducer\";\n\nexport const StatefulTextGroup = () => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const { textSettingsComponentsMap } = usePlugins();\n\n const dispatch = useAppDispatch();\n\n const setTextContainer = useCallback(() => {\n dispatch(setSettingsContainer(ThSettingsContainerKeys.text));\n }, [dispatch]);\n\n return(\n <>\n <StatefulGroupWrapper<ThTextSettingsKeys> \n label={ t(\"reader.preferences.text\") }\n moreLabel={ t(\"reader.settings.text.advanced.trigger\") }\n moreTooltip={ t(\"reader.settings.text.advanced.tooltip\") }\n onPressMore={ setTextContainer }\n componentsMap={ textSettingsComponentsMap }\n prefs={ preferences.settings.text }\n defaultPrefs={ {\n main: defaultTextSettingsMain, \n subPanel: defaultTextSettingsSubpanel\n }}\n />\n </>\n )\n}\n\nexport const StatefulTextGroupContainer = () => {\n const { preferences } = usePreferences();\n const displayOrder = preferences.settings.text?.subPanel as ThTextSettingsKeys[] | null | undefined || defaultTextSettingsSubpanel;\n const { textSettingsComponentsMap } = usePlugins();\n\n return(\n <>\n { displayOrder.map((key: ThTextSettingsKeys) => {\n const match = textSettingsComponentsMap[key];\n if (!match) {\n console.warn(`Action key \"${ key }\" not found in the plugin registry while present in preferences.`);\n return null;\n }\n return <match.Comp key={ key } standalone={ true } />;\n }) }\n </>\n )\n}","\"use client\";\n\nimport { useCallback, useEffect, useMemo } from \"react\";\n\nimport {\n defaultSpacingSettingsMain,\n defaultSpacingSettingsSubpanel,\n defaultTextSettingsMain,\n defaultTextSettingsSubpanel,\n usePreferenceKeys\n} from \"@/preferences\";\n\nimport {\n ThActionsKeys,\n ThSettingsContainerKeys,\n ThSheetHeaderVariant,\n ThTextSettingsKeys,\n ThSpacingSettingsKeys,\n ThSettingsKeys\n} from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport { StatefulSettingsWrapper } from \"./StatefulSettingsWrapper\";\nimport { StatefulSpacingGroupContainer } from \"../../Settings/Spacing/StatefulSpacingGroup\";\nimport { StatefulTextGroupContainer } from \"../../Settings/Text/StatefulTextGroup\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { usePlugins } from \"@/components/Plugins/PluginProvider\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering, setSettingsContainer } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulVisualSettingsContainer = ({\n triggerRef\n}: StatefulActionContainerProps) => {\n const {\n fxlSettingsKeys,\n mainSpacingSettingsKeys,\n mainTextSettingsKeys,\n reflowSettingsKeys,\n subPanelSpacingSettingsKeys,\n subPanelTextSettingsKeys,\n webPubSettingsKeys,\n } = usePreferenceKeys();\n const { preferences } = usePreferences();\n const { t } = useI18n();\n const { settingsComponentsMap } = usePlugins();\n const profile = useAppSelector(state => state.reader.profile);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const hasDisplayTransformability = useAppSelector(state => state.publication.hasDisplayTransformability);\n const contains = useAppSelector(state => state.reader.settingsContainer);\n const dispatch = useAppDispatch();\n\n const settingItems = useMemo(() => {\n return profile === \"webPub\"\n ? webPubSettingsKeys\n : isFXL\n ? fxlSettingsKeys\n : reflowSettingsKeys\n }, [profile, isFXL, fxlSettingsKeys, reflowSettingsKeys, webPubSettingsKeys]);\n\n const setInitial = useCallback(() => {\n dispatch(setSettingsContainer(ThSettingsContainerKeys.initial));\n }, [dispatch]);\n\n const close = useCallback(() => {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false }));\n dispatch(setHovering(false));\n }, [dispatch]);\n\n const isTextNested = useCallback((key: string) => {\n const textSettings = [\n mainTextSettingsKeys || defaultTextSettingsMain,\n subPanelTextSettingsKeys || defaultTextSettingsSubpanel,\n ].flat() as string[];\n\n return textSettings.includes(key);\n }, [mainTextSettingsKeys, subPanelTextSettingsKeys]);\n\n const isSpacingNested = useCallback((key: string) => {\n const spacingSettings = [\n mainSpacingSettingsKeys || defaultSpacingSettingsMain,\n subPanelSpacingSettingsKeys || defaultSpacingSettingsSubpanel,\n ].flat() as string[];\n\n return spacingSettings.includes(key);\n }, [mainSpacingSettingsKeys, subPanelSpacingSettingsKeys]);\n\n const isWebPubDisabled = useCallback((key: string) => {\n if (profile !== \"webPub\") {\n return false;\n }\n\n if (key === \"zoom\") {\n return false;\n }\n\n if (Object.values(ThTextSettingsKeys).includes(key as ThTextSettingsKeys) ||\n Object.values(ThSpacingSettingsKeys).includes(key as ThSpacingSettingsKeys) ||\n key === ThSettingsKeys.textGroup ||\n key === ThSettingsKeys.spacingGroup) {\n return !hasDisplayTransformability;\n }\n\n return true;\n }, [profile, hasDisplayTransformability]);\n\n const renderSettings = useCallback(() => {\n switch (contains) {\n case ThSettingsContainerKeys.text:\n return <StatefulTextGroupContainer />;\n\n case ThSettingsContainerKeys.spacing:\n return <StatefulSpacingGroupContainer />;\n\n case ThSettingsContainerKeys.initial:\n default:\n return (\n <>\n { settingItems.length > 0 && settingsComponentsMap\n ? settingItems\n .filter((key) => {\n if (isTextNested(key) || isSpacingNested(key)) {\n return false;\n }\n\n if (isWebPubDisabled(key)) {\n return false;\n }\n\n return true;\n })\n .map((key) => {\n const match = settingsComponentsMap[key];\n if (!match) {\n console.warn(`Action key \"${ key }\" not found in the plugin registry while present in preferences.`);\n return null;\n }\n return <match.Comp key={ key } { ...match.props } />;\n })\n : <></>\n }\n </>\n );\n }\n }, [settingsComponentsMap, contains, settingItems, isTextNested, isSpacingNested, isWebPubDisabled]);\n\n const getHeading = useCallback(() => {\n switch (contains) {\n case ThSettingsContainerKeys.text:\n return t(\"reader.preferences.text\");\n\n case ThSettingsContainerKeys.spacing:\n return t(\"reader.preferences.spacing.title\");\n\n case ThSettingsContainerKeys.initial:\n default:\n return t(\"reader.preferences.title\");\n }\n }, [contains, t]);\n\n const getHeaderVariant = useCallback(() => {\n switch (contains) {\n case ThSettingsContainerKeys.text:\n return preferences.settings.text?.header || ThSheetHeaderVariant.close;\n\n case ThSettingsContainerKeys.spacing:\n return preferences.settings.spacing?.header || ThSheetHeaderVariant.close;\n\n case ThSettingsContainerKeys.initial:\n default:\n return ThSheetHeaderVariant.close;\n }\n }, [contains, preferences.settings.spacing, preferences.settings.text]);\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && contains !== ThSettingsContainerKeys.initial) {\n dispatch(setSettingsContainer(ThSettingsContainerKeys.initial));\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape, true);\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape, true);\n };\n }, [contains, dispatch]);\n\n return (\n <StatefulSettingsWrapper\n triggerRef={ triggerRef }\n heading={ getHeading() }\n headerVariant={ getHeaderVariant() }\n onClosePress={ contains === ThSettingsContainerKeys.initial ? close : setInitial }\n onReset={ setInitial }\n dismissEscapeKeyClose={ contains !== ThSettingsContainerKeys.initial }\n resetFocus={ contains }\n >\n { renderSettings() }\n </StatefulSettingsWrapper>\n );\n};\n","import * as React from \"react\";\nconst SvgMatchCase = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"m131-252 165-440h79l165 440h-76l-39-112H247l-40 112h-76Zm139-176h131l-64-182h-4l-63 182Zm395 186q-51 0-81-27.5T554-342q0-44 34.5-72.5T677-443q23 0 45 4t38 11v-12q0-29-20.5-47T685-505q-23 0-42 9.5T610-468l-47-35q24-29 54.5-43t68.5-14q69 0 103 32.5t34 97.5v178h-63v-37h-4q-14 23-38 35t-53 12Zm12-54q35 0 59.5-24t24.5-56q-14-8-33.5-12.5T689-393q-32 0-50 14t-18 37q0 20 16 33t40 13Z\" /></svg>;\nexport default SvgMatchCase;","import * as React from \"react\";\nconst SvgInstantMix = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M200-160v-280h-80v-80h240v80h-80v280h-80Zm0-440v-200h80v200h-80Zm160 0v-80h80v-120h80v120h80v80H360Zm80 440v-360h80v360h-80Zm240 0v-120h-80v-80h240v80h-80v120h-80Zm0-280v-360h80v360h-80Z\" /></svg>;\nexport default SvgInstantMix;","\"use client\";\n\nimport LetterIcon from \"./assets/icons/match_case.svg\";\nimport TuneIcon from \"./assets/icons/instant_mix.svg\";\n\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulSettingsTrigger = ({ variant }: StatefulActionTriggerProps) => {\n const preferences = useActionsPreferences();\n const { t } = useI18n();\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.settings]);\n const profile = useAppSelector(state => state.reader.profile);\n const isAudio = profile === \"audio\";\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => { \n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: value\n }));\n\n // hover false otherwise it tends to stay on close button press…\n if (!value) dispatch(setHovering(false));\n }\n\n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu)\n ? <StatefulOverflowMenuItem\n label={ isAudio ? t(\"reader.playback.preferences.audio.title\") : t(\"reader.preferences.title\") }\n SVGIcon={ isAudio ? TuneIcon : LetterIcon }\n shortcut={ preferences.actionsKeys[ThActionsKeys.settings].shortcut }\n id={ ThActionsKeys.settings }\n onAction={ () => setOpen(!actionState?.isOpen) }\n />\n : <StatefulActionIcon\n visibility={ preferences.actionsKeys[ThActionsKeys.settings].visibility }\n aria-label={ isAudio ? t(\"reader.playback.preferences.audio.title\") : t(\"reader.preferences.title\") }\n placement=\"bottom\"\n tooltipLabel={ isAudio ? t(\"reader.playback.preferences.audio.title\") : t(\"reader.preferences.title\") }\n onPress={ () => setOpen(!actionState?.isOpen) }\n >\n { isAudio \n ? <TuneIcon aria-hidden=\"true\" focusable=\"false\" />\n : <LetterIcon aria-hidden=\"true\" focusable=\"false\" />\n }\n </StatefulActionIcon>\n }\n </>\n )\n}","/* Search */\n.wrapper {}\n\n.search {\n margin-bottom: var(--th-layout-spacing);\n display: grid;\n grid-template-areas: \"label label\"\n \"input button\";\n grid-template-columns: 1fr auto;\n align-items: center;\n width: 100%;\n}\n\n.searchLabel {\n grid-area: label;\n margin-bottom: calc(var(--th-layout-spacing) / 2);\n}\n\n.searchInput {\n grid-area: input;\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n display: block;\n border-radius: var(--th-layout-radius);\n border: 2px solid var(--th-theme-subdue);\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n}\n\n.searchInput::-webkit-search-cancel-button,\n.searchInput::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n.searchInput[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.searchIcon,\n.clearButton {\n grid-area: button;\n margin-inline-start: calc(var(--th-icon-size, 24px) * -1.25);\n height: 100%;\n display: flex;\n align-items: center;\n}\n\n.searchIcon svg {\n fill: var(--th-theme-subdue);\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n}\n\n.clearButton svg {\n fill: var(--th-theme-text);\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n}\n\n.searchIcon[hidden],\n.clearButton[data-disabled] {\n display: none;\n}\n\n.tree {\n background: var(--th-theme-background);\n color: var(--th-theme-text);\n outline: none;\n width: 100%;\n max-height: 100%;\n box-sizing: border-box;\n}\n\n/* React Aria is providing a --tree-item-level as items are not nested */\n.treeItem {\n display: flex;\n padding: calc(var(--th-layout-spacing) / 2);\n padding-inline-start: calc(((var(--tree-item-level) - 1) * var(--th-layout-spacing)) + (var(--th-layout-spacing) / 2));\n border-radius: var(--th-layout-radius);\n border: 2px solid transparent;\n box-sizing: border-box;\n}\n\n.tree:has(.treeItemButton) .treeItem {\n padding-inline-start: calc((var(--tree-item-level) * var(--th-layout-spacing)) + (var(--th-layout-spacing) / 2));\n}\n\n.tree .treeItem:has(.treeItemButton) {\n padding-inline-start: calc(((var(--tree-item-level) - 1) * var(--th-layout-spacing)));\n}\n\n.treeItemText {\n display: flex;\n flex: 1 1 auto;\n}\n\n.treeItemTextTitle {\n text-wrap: balance;\n}\n\n.treeItemTextPosition {\n margin-inline-start: auto;\n padding-inline-start: calc(var(--th-layout-spacing) / 2);\n color: var(--th-theme-subdue);\n font-variant-numeric: lining-nums tabular-nums;\n}\n\n.treeItemButton {\n align-self: flex-start;\n width: calc(var(--th-icon-size, 24px) * 5/6);\n height: calc(var(--th-icon-size, 24px) * 5/6);\n margin-inline-end: calc(var(--th-layout-spacing) / 2);\n flex-shrink: 0;\n}\n\n.treeItem[data-href] {\n cursor: pointer;\n}\n\n/* [data-hover] is only updated on tree items that can be expanded ATM… */\n.treeItem:hover {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.treeItem[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.treeItem[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.treeItem[data-selected] {\n border: 2px solid var(--th-theme-subdue);\n}\n\n.treeItemButton svg {\n flex: none;\n rotate: 0deg;\n transition: rotate 200ms;\n width: 100%;\n height: 100%;\n fill: currentColor;\n}\n\n.treeItem[data-expanded] .treeItemButton svg {\n rotate: 90deg;\n}\n\n.empty {\n max-width: 25ch;\n text-align: start;\n text-wrap: balance;\n}","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { Key, useFilter } from \"react-aria-components\";\n\nimport { TocItem } from \"@/core/Hooks/useTimeline\";\n\ninterface UseTocContentOptions {\n isOpen: boolean;\n tocTree: TocItem[] | undefined;\n tocEntry: string | undefined;\n}\n\nfunction filterTocTree(\n items: TocItem[],\n query: string,\n contains: (string: string, substring: string) => boolean\n): TocItem[] {\n if (!query) return items;\n const recursiveFilter = (items: TocItem[]): TocItem[] =>\n items.reduce((acc: TocItem[], item: TocItem) => {\n if (item.title && contains(item.title, query)) acc.push({ ...item, children: undefined });\n if (item.children) acc.push(...recursiveFilter(item.children));\n return acc;\n }, []);\n return recursiveFilter(items).map((item, i) => ({ ...item, key: `${item.id}-${i}` }));\n}\n\nexport function useTocContent({ isOpen, tocTree, tocEntry }: UseTocContentOptions) {\n const [expandedKeys, setExpandedKeys] = useState<Set<Key>>(new Set());\n const [filterValue, setFilterValue] = useState(\"\");\n const treeRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const { contains } = useFilter({ sensitivity: \"base\" });\n\n // Reset filter when closed\n useEffect(() => {\n if (!isOpen) setFilterValue(\"\");\n }, [isOpen]);\n\n // ESC clears filter and prevents container from dismissing\n useEffect(() => {\n if (!isOpen || !filterValue) return;\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n setFilterValue(\"\");\n }\n };\n document.addEventListener(\"keydown\", handleEscape, true);\n return () => document.removeEventListener(\"keydown\", handleEscape, true);\n }, [isOpen, filterValue]);\n\n // Expand parents of current entry\n useEffect(() => {\n if (!tocEntry || !tocTree) return;\n setExpandedKeys(prev => {\n const next = new Set<Key>(prev);\n let changed = false;\n const expand = (items: TocItem[]): boolean =>\n items.some(item => {\n if (item.id === tocEntry) return true;\n if (item.children) {\n const found = expand(item.children);\n if (found && !next.has(item.id)) { next.add(item.id); changed = true; }\n return found;\n }\n return false;\n });\n expand(tocTree);\n return changed ? next : prev;\n });\n }, [tocEntry, tocTree]);\n\n const displayedTocTree = filterTocTree(tocTree || [], filterValue, contains);\n\n return { expandedKeys, setExpandedKeys, filterValue, setFilterValue, displayedTocTree, treeRef, searchInputRef };\n}\n","import * as React from \"react\";\nconst SvgChevronRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" /></svg>;\nexport default SvgChevronRight;","\"use client\";\n\nimport { CSSProperties, RefObject } from \"react\";\n\nimport {\n Button,\n Collection,\n Key,\n Selection,\n Tree,\n TreeItem,\n TreeItemContent\n} from \"react-aria-components\";\n\nimport { TocItem } from \"@/core/Hooks/useTimeline\";\nimport { ThFormSearchField } from \"@/core/Components\";\n\nimport Chevron from \"./assets/icons/chevron_right.svg\";\nimport tocStyles from \"./assets/styles/thorium-web.toc.module.css\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nexport interface TocContentProps {\n filterValue: string;\n onFilterChange: (value: string) => void;\n displayedTocTree: TocItem[];\n tocTree: TocItem[] | undefined;\n tocEntry: Key | string | undefined;\n expandedKeys: Set<Key>;\n onExpandedChange: (keys: Set<Key>) => void;\n onSelectionChange: (keys: Selection) => void;\n isRTL?: boolean;\n treeRef?: RefObject<HTMLDivElement | null>;\n searchInputRef?: RefObject<HTMLInputElement | null>;\n compounds?: {\n tree?: { className?: string };\n treeWrapper?: { className?: string };\n };\n}\n\nexport const TocContent = ({\n filterValue,\n onFilterChange,\n displayedTocTree,\n tocTree,\n tocEntry,\n expandedKeys,\n onExpandedChange,\n onSelectionChange,\n isRTL = false,\n treeRef,\n searchInputRef,\n compounds,\n}: TocContentProps) => {\n const { t } = useI18n();\n\n if (!tocTree || tocTree.length === 0) {\n return <div className={ tocStyles.empty }>{ t(\"reader.tableOfContents.emptyState.description\") }</div>;\n }\n\n return (\n <>\n <ThFormSearchField\n aria-label={ t(\"common.actions.search\") }\n value={ filterValue }\n onChange={ onFilterChange }\n onClear={ () => onFilterChange(\"\") }\n className={ tocStyles.search }\n compounds={ {\n label: { className: tocStyles.searchLabel },\n input: {\n ref: searchInputRef,\n className: tocStyles.searchInput,\n placeholder: t(\"common.actions.search\")\n },\n searchIcon: { className: tocStyles.searchIcon, hidden: !!filterValue },\n clearButton: {\n className: tocStyles.clearButton,\n isDisabled: !filterValue,\n \"aria-label\": t(\"common.actions.clear\")\n }\n } }\n />\n <div { ...compounds?.treeWrapper }>\n <Tree\n ref={ treeRef }\n aria-label={ t(\"reader.toc.entries\") }\n selectionMode=\"single\"\n items={ displayedTocTree }\n className={ [tocStyles.tree, compounds?.tree?.className].filter(Boolean).join(\" \") }\n onSelectionChange={ onSelectionChange }\n selectedKeys={ tocEntry ? [tocEntry] : [] }\n expandedKeys={ expandedKeys }\n onExpandedChange={ onExpandedChange }\n >\n { function renderItem(item) {\n return (\n <TreeItem\n data-href={ item.href }\n className={ tocStyles.treeItem }\n textValue={ item.title || \"\" }\n >\n <TreeItemContent>\n { item.children && (\n <Button\n slot=\"chevron\"\n className={ tocStyles.treeItemButton }\n style={ { transform: isRTL ? \"scaleX(-1)\" : \"none\" } as CSSProperties }\n >\n <Chevron aria-hidden=\"true\" focusable=\"false\" />\n </Button>\n ) }\n <div className={ tocStyles.treeItemText }>\n <div className={ tocStyles.treeItemTextTitle }>{ item.title }</div>\n { item.position && <div className={ tocStyles.treeItemTextPosition }>{ item.position }</div> }\n </div>\n </TreeItemContent>\n <Collection items={ item.children }>\n { renderItem }\n </Collection>\n </TreeItem>\n );\n } }\n </Tree>\n </div>\n </>\n );\n};\n","\"use client\";\n\nimport { useCallback, useEffect } from \"react\";\n\nimport { Link } from \"@readium/shared\";\nimport { ThActionsKeys, ThDockingKeys, ThSheetTypes, ThLayoutDirection } from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport tocStyles from \"./assets/styles/thorium-web.toc.module.css\";\n\nimport { StatefulSheetWrapper } from \"../../Sheets/StatefulSheetWrapper\";\nimport { Selection } from \"react-aria-components\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useDocking } from \"../../Docking/hooks/useDocking\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setTocEntry } from \"@/lib/publicationReducer\";\nimport { findTocItemById } from \"@/helpers/buildTocTree\";\nimport { setImmersive, setUserNavigated } from \"@/lib/readerReducer\";\n\nimport { isActiveElement } from \"@/core/Helpers/focusUtilities\";\n\nimport { useTocContent } from \"./useTocContent\";\nimport { TocContent } from \"./TocContent\";\n\nexport const StatefulTocContainer = ({ triggerRef }: StatefulActionContainerProps) => {\n const { t } = useI18n();\n\n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const tocEntry = unstableTimeline?.toc?.currentEntry ?? undefined;\n const tocEntryId = tocEntry?.id;\n const tocTree = unstableTimeline?.toc?.tree;\n\n const direction = useAppSelector(state => state.reader.direction);\n const isRTL = direction === ThLayoutDirection.rtl;\n\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.toc]);\n const dispatch = useAppDispatch();\n\n const { goLink } = useNavigator().unified;\n const docking = useDocking(ThActionsKeys.toc);\n const sheetType = docking.sheetType;\n\n const setOpen = useCallback((value: boolean) => {\n dispatch(setActionOpen({ key: ThActionsKeys.toc, isOpen: value }));\n }, [dispatch]);\n\n const { expandedKeys, setExpandedKeys, filterValue, setFilterValue, displayedTocTree, treeRef, searchInputRef } =\n useTocContent({ isOpen: actionState?.isOpen ?? false, tocTree, tocEntry: tocEntryId });\n\n const handleAction = (keys: Selection) => {\n if (keys === \"all\" || !keys || keys.size === 0) return;\n\n const key = [...keys][0];\n const el = document.querySelector(`[data-key=${key}]`);\n const href = el?.getAttribute(\"data-href\");\n\n if (!href) return;\n\n const link: Link = new Link({ href: href });\n const matched = findTocItemById(tocTree || [], key as string);\n\n const cb = actionState?.isOpen &&\n (sheetType === ThSheetTypes.dockedStart || sheetType === ThSheetTypes.dockedEnd)\n ? () => {\n dispatch(setTocEntry(matched || null));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n }\n : () => {\n dispatch(setTocEntry(matched || null));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n setOpen(false);\n };\n\n goLink(link, true, cb);\n };\n\n // Since React Aria components intercept keys and do not continue propagation\n // we have to handle the escape key in capture phase\n useEffect(() => {\n if (actionState?.isOpen && (!actionState?.docking || actionState?.docking === ThDockingKeys.transient)) {\n const handleEscape = (event: KeyboardEvent) => {\n if ((!isActiveElement(searchInputRef.current) && !filterValue) && event.key === \"Escape\") {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape, true);\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape, true);\n };\n }\n }, [actionState, setOpen, filterValue, searchInputRef]);\n\n return (\n <StatefulSheetWrapper\n sheetType={ sheetType }\n sheetProps={ {\n id: ThActionsKeys.toc,\n triggerRef: triggerRef,\n heading: t(\"reader.tableOfContents.title\"),\n className: tocStyles.wrapper,\n placement: \"bottom\",\n isOpen: actionState?.isOpen || false,\n onOpenChange: setOpen,\n onClosePress: () => setOpen(false),\n docker: docking.getDocker(),\n resetFocus: tocEntryId,\n focusWithinRef: treeRef\n } }\n >\n <TocContent\n filterValue={ filterValue }\n onFilterChange={ setFilterValue }\n displayedTocTree={ displayedTocTree }\n tocTree={ tocTree }\n tocEntry={ tocEntryId }\n expandedKeys={ expandedKeys }\n onExpandedChange={ setExpandedKeys }\n onSelectionChange={ handleAction }\n isRTL={ isRTL }\n treeRef={ treeRef }\n searchInputRef={ searchInputRef }\n />\n </StatefulSheetWrapper>\n );\n};\n","import * as React from \"react\";\nconst SvgToc = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M120-280v-80h560v80H120Zm0-160v-80h560v80H120Zm0-160v-80h560v80H120Zm680 320q-17 0-28.5-11.5T760-320q0-17 11.5-28.5T800-360q17 0 28.5 11.5T840-320q0 17-11.5 28.5T800-280Zm0-160q-17 0-28.5-11.5T760-480q0-17 11.5-28.5T800-520q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440Zm0-160q-17 0-28.5-11.5T760-640q0-17 11.5-28.5T800-680q17 0 28.5 11.5T840-640q0 17-11.5 28.5T800-600Z\" /></svg>;\nexport default SvgToc;","\"use client\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport TocIcon from \"./assets/icons/toc.svg\";\n\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulTocTrigger = ({ variant }: StatefulActionTriggerProps) => {\n const preferences = useActionsPreferences();\n const { t } = useI18n();\n const actionState = useAppSelector(state => state.actions.keys[ThActionsKeys.toc]);\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => {\n dispatch(setActionOpen({ \n key: ThActionsKeys.toc,\n isOpen: value \n }));\n }\n\n return(\n <>\n { (variant && variant === ThActionsTriggerVariant.menu) \n ? <StatefulOverflowMenuItem \n label={ t(\"reader.tableOfContents.title\") }\n SVGIcon={ TocIcon } \n shortcut={ preferences.actionsKeys[ThActionsKeys.toc].shortcut }\n id={ ThActionsKeys.toc }\n onAction={ () => setOpen(!actionState?.isOpen) }\n />\n : <StatefulActionIcon \n visibility={ preferences.actionsKeys[ThActionsKeys.toc].visibility }\n aria-label={ t(\"reader.tableOfContents.title\") } \n placement=\"bottom\"\n tooltipLabel={ t(\"reader.tableOfContents.title\") } \n onPress={ () => setOpen(!actionState?.isOpen) }\n >\n <TocIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n }\n </>\n )\n}","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport debounce from \"debounce\";\n\nexport const useGridTemplate = (ref: React.RefObject<HTMLDivElement | null>, type: \"columns\" | \"rows\" = \"columns\") => {\n const [visibleColumns, setVisibleColumns] = useState<number | null>(null);\n\n const updateVisibleColumns = () => {\n if (!ref.current) return;\n const computedStyle = window.getComputedStyle(ref.current);\n const columns = computedStyle.getPropertyValue(`grid-template-${ type }`);\n const columnCount = columns.replace(\"0px\", \"\").split(\" \").length;\n setVisibleColumns(columnCount);\n };\n\n const debouncedUpdateVisibleColumns = debounce(updateVisibleColumns, 100);\n\n useEffect(() => {\n updateVisibleColumns();\n\n const resizeObserver = new ResizeObserver(debouncedUpdateVisibleColumns);\n if (ref.current) {\n resizeObserver.observe(ref.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n debouncedUpdateVisibleColumns.clear();\n };\n });\n\n return visibleColumns;\n};","\"use client\";\n\nimport React from \"react\";\n\nimport { useGridTemplate } from \"./useGridTemplate\";\n\nexport interface useGridNavigationProps {\n containerRef: React.RefObject<HTMLDivElement | null>,\n items: React.RefObject<any[]>,\n currentValue: any,\n onChange: (value: any) => void,\n isRTL?: boolean,\n onEscape?: () => void,\n onFocus?: (value: string) => void\n}\n\nexport const useGridNavigation = ({\n containerRef,\n items,\n currentValue,\n onChange,\n isRTL,\n onEscape,\n onFocus\n}: useGridNavigationProps) => {\n const visibleColumns = useGridTemplate(containerRef, \"columns\");\n\n const onKeyDown = React.useCallback((e: React.KeyboardEvent) => {\n const columns = visibleColumns || 1;\n if (columns <= 1 || !items.current?.length) return;\n\n // Handle both object items { value, label, icon } and primitive items\n const currentIdx = items.current.findIndex((val) => {\n if (typeof val === \"object\" && val !== null && \"value\" in val) {\n return val.value === currentValue;\n }\n return val === currentValue;\n });\n\n if (currentIdx === -1) return;\n\n let nextIdx: number | null = null;\n\n switch (e.code) {\n case \"ArrowUp\":\n e.preventDefault();\n nextIdx = currentIdx - columns;\n break;\n case \"ArrowDown\":\n e.preventDefault();\n nextIdx = currentIdx + columns;\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n nextIdx = isRTL ? currentIdx + 1 : currentIdx - 1;\n break;\n case \"ArrowRight\":\n e.preventDefault();\n nextIdx = isRTL ? currentIdx - 1 : currentIdx + 1;\n break;\n case \"Escape\":\n if (onEscape) {\n e.preventDefault();\n onEscape();\n }\n return;\n default:\n return;\n }\n\n if (nextIdx !== null && nextIdx >= 0 && nextIdx < items.current.length) {\n const nextItem = items.current[nextIdx];\n\n // Extract value from object items or use primitive directly\n const nextValue = (typeof nextItem === \"object\" && nextItem !== null && \"value\" in nextItem)\n ? nextItem.value\n : nextItem;\n\n onChange(nextValue);\n\n if (onFocus) {\n onFocus(nextValue);\n }\n }\n }, [visibleColumns, items, currentValue, onChange, isRTL, onEscape, onFocus]);\n\n return { onKeyDown };\n};","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThActionsKeys, ThLayoutDirection, ThSettingsContainerKeys } from \"@/preferences/models\";\n\nimport { ThRadioGroup, ThRadioGroupProps } from \"@/core/Components/Settings/ThRadioGroup\";\n\nimport { useGridNavigation } from \"./hooks/useGridNavigation\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setSettingsContainer } from \"@/lib/readerReducer\";\n\nexport interface StatefulRadioGroupProps extends Omit<ThRadioGroupProps, \"classNames\"> {\n standalone?: boolean;\n useGraphicalNavigation?: boolean;\n onEscape?: () => void;\n}\n\nexport const StatefulRadioGroup = ({\n ref,\n standalone,\n useGraphicalNavigation = true,\n label,\n items,\n value,\n children,\n onChange,\n onEscape,\n ...props\n}: StatefulRadioGroupProps) => {\n const itemsRef = useRef(items || []);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const direction = useAppSelector(state => state.reader.direction);\n const isRTL = direction === ThLayoutDirection.rtl;\n const settingsContainer = useAppSelector(state => state.reader.settingsContainer);\n \n const dispatch = useAppDispatch();\n\n // Default escape handler that adapts to context\n const onEscapeCallback = useCallback(() => {\n if (settingsContainer !== ThSettingsContainerKeys.initial) {\n // In subpanel - go back to initial view\n dispatch(setSettingsContainer(ThSettingsContainerKeys.initial));\n } else {\n // In main panel - close settings\n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: false\n }));\n }\n }, [dispatch, settingsContainer]);\n\n // Default focus handler that focuses elements by value within the container only\n const onFocusCallback = useCallback((value: string) => {\n const element = wrapperRef.current?.querySelector(`[value=\"${ value }\"]`);\n if (element) (element as HTMLElement).focus();\n }, []);\n\n const { onKeyDown } = useGridNavigation({\n containerRef: wrapperRef,\n items: useGraphicalNavigation !== false ? itemsRef : { current: [] },\n currentValue: useGraphicalNavigation !== false ? value : null,\n onChange: onChange || (() => {}),\n isRTL,\n onEscape: onEscape || onEscapeCallback,\n onFocus: onFocusCallback\n });\n\nreturn (\n <>\n <ThRadioGroup \n ref={ ref }\n className={ standalone ? settingsStyles.group : \"\" }\n { ...props }\n { ...(standalone ? { label: label } : { \"aria-label\": label }) }\n value={ value }\n onChange={ onChange }\n items={ useGraphicalNavigation !== false ? items : [] }\n compounds={{\n wrapper: {\n className: settingsStyles.radioWrapper,\n ref: wrapperRef\n },\n label: {\n className: settingsStyles.label\n },\n radio: {\n className: settingsStyles.radio,\n onKeyDown: useGraphicalNavigation !== false ? onKeyDown : undefined\n }\n }}\n >\n { children }\n </ThRadioGroup>\n </>\n )\n};","import * as React from \"react\";\nconst SvgDocumentScanner = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M80-720v-200h200v80H160v120H80Zm720 0v-120H680v-80h200v200h-80ZM80-40v-200h80v120h120v80H80Zm600 0v-80h120v-120h80v200H680ZM280-240h400v-480H280v480Zm0 80q-33 0-56.5-23.5T200-240v-480q0-33 23.5-56.5T280-800h400q33 0 56.5 23.5T760-720v480q0 33-23.5 56.5T680-160H280Zm80-400h240v-80H360v80Zm0 120h240v-80H360v80Zm0 120h240v-80H360v80Zm-80 80v-480 480Z\" /></svg>;\nexport default SvgDocumentScanner;","import * as React from \"react\";\nconst SvgArticle = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M280-280h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm-80 480q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z\" /></svg>;\nexport default SvgArticle;","import * as React from \"react\";\nconst SvgMenuBook = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M560-564v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-600q-38 0-73 9.5T560-564Zm0 220v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-380q-38 0-73 9t-67 27Zm0-110v-68q33-14 67.5-21t72.5-7q26 0 51 4t49 10v64q-24-9-48.5-13.5T700-490q-38 0-73 9.5T560-454ZM260-320q47 0 91.5 10.5T440-278v-394q-41-24-87-36t-93-12q-36 0-71.5 7T120-692v396q35-12 69.5-18t70.5-6Zm260 42q44-21 88.5-31.5T700-320q36 0 70.5 6t69.5 18v-396q-33-14-68.5-21t-71.5-7q-47 0-93 12t-87 36v394Zm-40 118q-48-38-104-59t-116-21q-42 0-82.5 11T100-198q-21 11-40.5-1T40-234v-482q0-11 5.5-21T62-752q46-24 96-36t102-12q58 0 113.5 15T480-740q51-30 106.5-45T700-800q52 0 102 12t96 36q11 5 16.5 15t5.5 21v482q0 23-19.5 35t-40.5 1q-37-20-77.5-31T700-240q-60 0-116 21t-104 59ZM280-494Z\" /></svg>;\nexport default SvgMenuBook;","\"use client\";\n\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport AutoLayoutIcon from \"./assets/icons/document_scanner.svg\";\nimport OneColIcon from \"./assets/icons/article.svg\";\nimport TwoColsIcon from \"./assets/icons/menu_book.svg\";\n\nimport { StatefulRadioGroup } from \"../../Settings/StatefulRadioGroup\";\n\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport { setColumnCount } from \"@/lib/settingsReducer\";\n\nimport debounce from \"debounce\";\n\nexport const StatefulColumns = () => {\n const { t } = useI18n();\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = scroll && !isFXL;\n\n const columnCount = useAppSelector(state => state.settings.columnCount) || \"auto\";\n const [effectiveValue, setEffectiveValue] = useState(columnCount);\n\n const fontSize = useAppSelector(state => state.settings.fontSize);\n const fontFamily = useAppSelector(state => state.settings.fontFamily);\n const wordSpacing = useAppSelector(state => state.settings.wordSpacing);\n const letterSpacing = useAppSelector(state => state.settings.letterSpacing);\n const publisherStyles = useAppSelector(state => state.settings.publisherStyles);\n\n const layoutSettings = useMemo(() => {\n return {\n fontSize,\n fontFamily,\n wordSpacing,\n letterSpacing,\n publisherStyles\n };\n }, [fontSize, fontFamily, wordSpacing, letterSpacing, publisherStyles]);\n\n const dispatch = useAppDispatch();\n\n const { submitPreferences, getSetting } = useEpubNavigator();\n\n const items = useMemo(() => [\n {\n id: \"auto\",\n icon: AutoLayoutIcon,\n label: t(\"reader.preferences.columns.auto\"), \n value: \"auto\" \n },\n {\n id: \"1\",\n icon: OneColIcon,\n label: t(\"reader.preferences.columns.single.compact\"), \n value: \"1\" \n },\n {\n id: \"2\",\n icon: TwoColsIcon,\n label: t(\"reader.preferences.columns.dual.compact\"), \n value: \"2\",\n // This is subpar when the columnCount is 1 though because\n // it won't be disabled, but it's the best we can do with\n // the preferences API at the moment\n isDisabled: effectiveValue === \"1\" && columnCount === \"2\"\n }\n ], [t, effectiveValue, columnCount]);\n\n const updateEffectiveValue = useCallback((preference: string, setting: number | null) => {\n const derivedValue = preference === \"auto\" || setting === null ? \"auto\" : setting.toString();\n setEffectiveValue(derivedValue);\n }, []);\n\n const updatePreference = useCallback(async (value: string) => {\n const colCount = value === \"auto\" ? null : Number(value);\n await submitPreferences({ columnCount: colCount });\n updateEffectiveValue(value, getSetting(\"columnCount\"));\n dispatch(setColumnCount(value));\n }, [submitPreferences, getSetting, updateEffectiveValue, dispatch]);\n\n const debouncedUpdate = useCallback(() => {\n const update = () => updateEffectiveValue(columnCount, getSetting(\"columnCount\"));\n debounce(update, 50)();\n\n // layoutSettings is required as a dependency because it contains all the settings\n // that affect column layout (fontSize, fontFamily, wordSpacing, letterSpacing, publisherStyles)\n // and we need to recalculate the layout when any of these change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [columnCount, layoutSettings, getSetting, updateEffectiveValue]);\n\n useEffect(() => {\n debouncedUpdate();\n\n window.addEventListener(\"resize\", debouncedUpdate);\n\n return () => {\n window.removeEventListener(\"resize\", debouncedUpdate);\n };\n }, [debouncedUpdate]);\n\n return (\n <>\n <StatefulRadioGroup \n standalone={ true }\n label={ t(\"reader.preferences.columns.title\") }\n orientation=\"horizontal\"\n value={ effectiveValue }\n onChange={ async (val: string) => await updatePreference(val) }\n isDisabled={ isScroll }\n items={ items }\n />\n </>\n );\n}","\"use client\";\n\nimport React from \"react\";\n\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThDropdown, ThDropdownProps } from \"@/core/Components/Settings/ThDropdown/ThDropdown\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulDropdownProps extends Omit<ThDropdownProps, \"classNames\"> {\n standalone?: boolean;\n}\n\nexport const StatefulDropdown = ({\n standalone,\n label,\n className,\n compounds,\n ...props\n}: StatefulDropdownProps) => {\n\n return (\n <ThDropdown\n { ...props }\n { ...(standalone ? { label } : { \"aria-label\": label }) }\n className={ classNames(\n settingsStyles.dropdown,\n standalone && settingsStyles.group,\n className\n ) }\n compounds={{\n label: {\n className: settingsStyles.label,\n ...(compounds?.label || {})\n },\n ...(React.isValidElement(compounds?.button) \n ? { button: compounds.button }\n : {\n button: {\n className: settingsStyles.dropdownButton,\n ...(compounds?.button || {})\n }\n }),\n popover: {\n className: settingsStyles.dropdownPopover,\n placement: \"bottom\",\n ...(compounds?.popover || {})\n },\n ...(React.isValidElement(compounds?.listbox) \n ? { listbox: compounds.listbox }\n : {\n listbox: {\n className: settingsStyles.dropdownListbox,\n ...(compounds?.listbox || {})\n },\n listboxItem: {\n className: settingsStyles.dropdownListboxItem,\n ...(compounds?.listboxItem || {})\n }\n })\n }}\n />\n );\n};\n","\"use client\";\n\nimport { CSSProperties, Key, useCallback, useRef } from \"react\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport settingsStyles from \"../assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { StatefulDropdown } from \"../StatefulDropdown\";\nimport { ListBox, ListBoxItem } from \"react-aria-components\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { FontDefinition } from \"@/preferences/models\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontFamily } from \"@/lib/settingsReducer\";\nimport { setWebPubFontFamily } from \"@/lib/webPubSettingsReducer\";\n\nexport const StatefulFontFamily = ({ standalone = true }: StatefulSettingsItemProps & { publicationLanguage?: string }) => {\n const { getFontMetadata, getFontsList } = usePreferences();\n const { t } = useI18n();\n\n const getFontFamilyLabel = useCallback((font: FontDefinition): string => {\n // Handle i18n label if present\n if (font.label) {\n if (typeof font.label === \"string\") {\n return t(font.label, { defaultValue: font.label || font.name });\n } else if (typeof font.label === \"object\" && \"key\" in font.label) {\n return t(font.label.key, { \n defaultValue: font.label.fallback || font.name \n });\n }\n }\n\n // Fall back to the font's name\n return font.name;\n }, [t]);\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n\n const fontLanguage = useAppSelector(state => state.publication.fontLanguage) || \"default\";\n\n // Get language-specific font preferences\n const fontPreferences = getFontsList({ language: fontLanguage });\n\n const fontFamily = useAppSelector(state => {\n const fontSettings = isWebPub ? state.webPubSettings.fontFamily : state.settings.fontFamily;\n return fontSettings[fontLanguage] ?? \"publisher\";\n });\n \n // Check if current font exists in available options, fallback to publisher if not\n const availableFontIds = new Set([\n \"publisher\",\n ...Object.keys(fontPreferences)\n ]);\n const currentFontFamily = availableFontIds.has(fontFamily) ? fontFamily : \"publisher\";\n\n const fontFamilyOptions = useRef([\n {\n id: \"publisher\",\n label: t(\"reader.preferences.fontFamily.publisher\"),\n value: null\n },\n ...Object.entries(fontPreferences).map(([id, font]) => {\n const metadata = getFontMetadata(id);\n return {\n id,\n label: getFontFamilyLabel(font),\n value: metadata.fontStack || metadata.fontFamily\n };\n })\n ]);\n\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const updatePreference = useCallback(async (key: Key | null) => {\n if (!key || key === fontFamily) return;\n\n const selectedOption = fontFamilyOptions.current.find((option) => option.id === key) as {\n id: keyof ReturnType<typeof getFontsList> | \"publisher\";\n label: string;\n value: string | null;\n };\n \n if (selectedOption) {\n await submitPreferences({ fontFamily: selectedOption.value });\n \n const currentSetting = getSetting(\"fontFamily\");\n \n // Handle publisher font case (when currentSetting is null)\n if (currentSetting === null) {\n if (isWebPub) {\n dispatch(setWebPubFontFamily({ key: fontLanguage, value: \"publisher\" }));\n } else {\n dispatch(setFontFamily({ key: fontLanguage, value: \"publisher\" }));\n }\n return;\n }\n \n // Handle other font cases\n const entry = Object.entries(fontPreferences).find(([id]) => {\n const metadata = getFontMetadata(id);\n return metadata.fontStack === currentSetting || \n metadata.fontFamily === currentSetting;\n });\n \n if (entry) {\n const [selectedOptionId] = entry;\n if (isWebPub) {\n dispatch(setWebPubFontFamily({ key: fontLanguage, value: selectedOptionId }));\n } else {\n dispatch(setFontFamily({ key: fontLanguage, value: selectedOptionId }));\n }\n }\n }\n }, [isWebPub, fontLanguage, fontFamily, submitPreferences, getSetting, fontPreferences, getFontMetadata, dispatch]);\n\n return (\n <StatefulDropdown\n standalone={ standalone }\n label={ t(\"reader.preferences.fontFamily.title\") }\n selectedKey={ currentFontFamily }\n onSelectionChange={ async (key) => await updatePreference(key) }\n compounds={ {\n listbox: (\n <ListBox\n className={ settingsStyles.dropdownListbox }\n items={ fontFamilyOptions.current }\n >\n { (item) => (\n <ListBoxItem\n className={ settingsStyles.dropdownListboxItem }\n id={ item.id }\n key={ item.id }\n textValue={ item.value || undefined }\n style={{ fontFamily: item.value || undefined } as CSSProperties}\n >\n { item.label }\n </ListBoxItem>\n )}\n </ListBox>\n )\n }}\n />\n )\n}","import * as React from \"react\";\nconst SvgFormatBoldWght200 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M315.08-230v-500H483q57.31 0 101.15 36.15Q628-657.69 628-599.77q0 38.69-20.31 67.73-20.31 29.04-50.31 42.58 36.54 10.23 62.04 42.92t25.5 78.85q0 64.38-48.07 101.04Q548.77-230 491-230H315.08Zm51-47.38h122.46q46.46 0 75.04-27.97 28.57-27.96 28.57-65.11 0-37.16-28.57-65.12-28.58-27.96-75.73-27.96H366.08v186.16Zm0-232.62h114.54q39.92 0 67.61-24.69 27.69-24.69 27.69-61.85 0-37.84-28.15-62.08-28.15-24.23-66.69-24.23h-115V-510Z\" /></svg>;\nexport default SvgFormatBoldWght200;","import * as React from \"react\";\nconst SvgFormatBoldWght500 = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M260.04-192.11v-576.02h240.61q68.11 0 123.71 42.03 55.6 42.03 55.6 113.99 0 48.13-21.81 77.43-21.8 29.29-45.39 42.48v.72q29.54 12.68 58.37 45.07t28.83 89.52q0 86.61-64.29 125.69-64.28 39.09-127.5 39.09H260.04Zm129.13-116.3h109.98q43.22 0 56.11-22.95 12.89-22.94 12.89-37.77 0-14.83-12.89-37.89-12.89-23.07-58.39-23.07h-107.7v121.68Zm0-234.22h99.46q31.09 0 46.92-16.88 15.84-16.88 15.84-38.6 0-24-17.36-39.36t-43.88-15.36H389.17v110.2Z\" /></svg>;\nexport default SvgFormatBoldWght500;","\"use client\";\n\nimport { useMemo, useCallback } from \"react\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport DefaultIcon from \"./assets/icons/format_bold_wght200.svg\";\nimport BolderIcon from \"./assets/icons/format_bold_wght500.svg\";\n\nimport { StatefulRadioGroup } from \"@/components/Settings/StatefulRadioGroup\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontWeight } from \"@/lib/settingsReducer\";\nimport { setWebPubFontWeight } from \"@/lib/webPubSettingsReducer\";\n\ntype FontWeight = \"default\" | \"bolder\";\n\nexport const UnstableStatefulFontWeight = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n \n const fontWeight = useAppSelector(state => isWebPub ? state.webPubSettings.fontWeight : state.settings.fontWeight) ?? 400;\n\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const items = [\n {\n id: \"default\",\n icon: DefaultIcon,\n label: t(\"reader.preferences.fontWeight.normal\"), \n value: \"default\" \n },\n {\n id: \"bolder\",\n icon: BolderIcon,\n label: t(\"reader.preferences.fontWeight.bold\"), \n value: \"bolder\" \n }\n ];\n\n const derivedValue = useMemo(() => {\n if (fontWeight === 400) {\n return \"default\";\n } else if (fontWeight === 700) {\n return \"bolder\";\n }\n return \"default\";\n }, [fontWeight]);\n\n const updatePreference = useCallback(async (value: FontWeight) => {\n const fontWeightValue = value === \"default\" ? 400 : 700;\n await submitPreferences({ fontWeight: fontWeightValue });\n const effectiveSetting = getSetting(\"fontWeight\");\n\n if (isWebPub) {\n dispatch(setWebPubFontWeight(effectiveSetting));\n } else {\n dispatch(setFontWeight(effectiveSetting));\n }\n }, [isWebPub, submitPreferences, getSetting, dispatch]);\n\n return(\n <>\n <StatefulRadioGroup \n standalone={ standalone } \n label={ t(\"reader.preferences.fontWeight.title\") }\n orientation=\"horizontal\" \n value={ derivedValue } \n onChange={ async (val: string) => await updatePreference(val as FontWeight) }\n items={ items }\n /> \n </>\n )\n}","\"use client\";\n\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThSwitch, ThSwitchProps } from \"@/core/Components/Settings/ThSwitch\";\n\nexport interface StatefulSwitchProps extends Omit<ThSwitchProps, \"classNames\"> {\n standalone?: boolean;\n}\n\nexport const StatefulSwitch = ({\n standalone,\n label,\n heading, \n ...props\n}: StatefulSwitchProps) => {\n return(\n <>\n <ThSwitch \n { ...props }\n { ...(standalone ? { heading: heading } : {}) }\n label={ label }\n className={ settingsStyles.switch }\n compounds={{\n wrapper: {\n className: settingsStyles.group\n },\n heading: {\n className: settingsStyles.label\n },\n indicator: {\n className: settingsStyles.switchIndicator\n }\n }}\n />\n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\nimport { ThTextAlignOptions } from \"@/preferences/models\";\n\nimport { StatefulSwitch } from \"../StatefulSwitch\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setHyphens } from \"@/lib/settingsReducer\";\nimport { setWebPubHyphens } from \"@/lib/webPubSettingsReducer\";\n\n// TMP Component that is not meant to be implemented AS-IS, for testing purposes\nexport const StatefulHyphens = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n \n const hyphens = useAppSelector(state => isWebPub ? state.webPubSettings.hyphens : state.settings.hyphens) ?? false;\n const textAlign = useAppSelector(state => isWebPub ? state.webPubSettings.textAlign : state.settings.textAlign) ?? ThTextAlignOptions.publisher;\n\n const dispatch = useAppDispatch();\n \n const { getSetting, submitPreferences } = useNavigator().visual;\n \n const updatePreference = useCallback(async (value: boolean) => {\n await submitPreferences({ hyphens: value });\n const effectiveSetting = getSetting(\"hyphens\");\n \n if (isWebPub) {\n dispatch(setWebPubHyphens(effectiveSetting));\n } else {\n dispatch(setHyphens(effectiveSetting));\n }\n }, [isWebPub, submitPreferences, getSetting, dispatch]);\n\n return(\n <>\n <StatefulSwitch \n standalone={ standalone }\n heading={ t(\"reader.preferences.hyphens.title\") }\n label={ t(\"reader.preferences.hyphens.label\") }\n onChange={ async (isSelected: boolean) => await updatePreference(isSelected) }\n isSelected={ hyphens ?? false }\n isDisabled={ textAlign === ThTextAlignOptions.publisher }\n />\n </>\n )\n}","import * as React from \"react\";\nconst SvgContract = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-80q-50 0-85-35t-35-85v-120h120v-560h600v680q0 50-35 85t-85 35H240Zm480-80q17 0 28.5-11.5T760-200v-600H320v480h360v120q0 17 11.5 28.5T720-160ZM360-600v-80h360v80H360Zm0 120v-80h360v80H360ZM240-160h360v-80H200v40q0 17 11.5 28.5T240-160Zm0 0h-40 400-360Z\" /></svg>;\nexport default SvgContract;","import * as React from \"react\";\nconst SvgDocs = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M320-440h320v-80H320v80Zm0 120h320v-80H320v80Zm0 120h200v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z\" /></svg>;\nexport default SvgDocs;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThLayoutOptions } from \"@/preferences/models\";\n\nimport ScrollableIcon from \"./assets/icons/contract.svg\";\nimport PaginatedIcon from \"./assets/icons/docs.svg\";\n\nimport { StatefulRadioGroup } from \"../../Settings/StatefulRadioGroup\";\n\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setScroll } from \"@/lib/settingsReducer\";\n\nexport const StatefulLayout = () => {\n const { t } = useI18n();\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = scroll && !isFXL;\n\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useEpubNavigator();\n\n const items = [\n {\n id: ThLayoutOptions.paginated,\n icon: PaginatedIcon,\n label: t(\"reader.preferences.layout.paginated\"),\n value: ThLayoutOptions.paginated\n },\n {\n id: ThLayoutOptions.scroll,\n icon: ScrollableIcon,\n label: t(\"reader.preferences.layout.scrolled\"),\n value: ThLayoutOptions.scroll\n }\n ];\n\n const updatePreference = useCallback(async (value: string) => { \n const derivedValue = value === ThLayoutOptions.scroll;\n await submitPreferences({ scroll: derivedValue });\n dispatch(setScroll(getSetting(\"scroll\")));\n }, [submitPreferences, getSetting, dispatch]);\n\n return (\n <>\n <StatefulRadioGroup\n standalone={ true }\n label={ t(\"reader.preferences.layout.title\") }\n orientation=\"horizontal\"\n value={ isScroll ? ThLayoutOptions.scroll : ThLayoutOptions.paginated }\n onChange={ async (val: string) => await updatePreference(val) }\n items={ items }\n />\n </>\n )\n}","\"use client\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThNumberField, ThNumberFieldProps } from \"@/core/Components/Settings/ThNumberField\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulNumberFieldProps extends Omit<ThNumberFieldProps, \"classNames\"> {\n standalone?: boolean;\n resetLabel?: string;\n placeholder?: string;\n}\n\nexport const StatefulNumberField = ({\n standalone,\n label,\n placeholder,\n value,\n resetLabel,\n ...props\n}: StatefulNumberFieldProps) => {\n const { t } = useI18n();\n const { preferences } = usePreferences();\n\n return (\n <>\n <ThNumberField\n value={ value }\n { ...props }\n { ...(standalone ? { label: label } : { \"aria-label\": label }) }\n placeholder={ placeholder }\n className={ settingsStyles.numberField }\n compounds={{\n wrapper: {\n className: classNames(\n settingsStyles.numberFieldWrapper,\n standalone && settingsStyles.group\n )\n },\n group: {\n className: settingsStyles.groupWrapper\n },\n label: {\n className: settingsStyles.label\n },\n stepper: {\n className: readerSharedUI.icon\n },\n input: {\n className: settingsStyles.input,\n },\n reset: {\n className: classNames(readerSharedUI.icon, settingsStyles.resetButton),\n compounds: {\n tooltipTrigger: {\n delay: preferences.theming.arrow.tooltipDelay,\n closeDelay: preferences.theming.arrow.tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: resetLabel ?? t(\"common.actions.reset\")\n }\n }\n }}\n />\n </>\n );\n};","\"use client\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThSlider, ThSliderProps } from \"@/core/Components/Settings/ThSlider\";\n\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulSliderProps extends Omit<ThSliderProps, \"classNames\"> {\n standalone?: boolean;\n placeholder?: string;\n resetLabel?: string;\n displayTicks?: boolean;\n}\n\nexport const StatefulSlider = ({\n standalone,\n label,\n placeholder,\n displayTicks = false,\n value,\n resetLabel,\n ...props\n}: StatefulSliderProps) => {\n const { t } = useI18n();\n const { theming } = useSharedPreferences();\n const tooltipDelay = theming.icon.tooltipDelay;\n \n const style = {\n ...(displayTicks && props.range && props.step ? {\n \"--th-slider-ticks\": (() => {\n const [min, max] = [Math.min(...props.range), Math.max(...props.range)];\n const step = props.step || 1;\n const range = max - min;\n const totalIntervals = range / step;\n return Math.ceil(totalIntervals);\n })()\n } : {}),\n ...props.style\n };\n\n return (\n <>\n <ThSlider\n value={ value }\n { ...props }\n { ...(standalone ? { label: label } : {\"aria-label\": label}) }\n placeholder={ placeholder }\n className={ classNames(\n settingsStyles.slider,\n displayTicks && settingsStyles.sliderWithTicks\n ) }\n style={ style }\n compounds={{\n wrapper: {\n className: classNames(\n settingsStyles.sliderWrapper,\n standalone && settingsStyles.group\n )\n },\n label: {\n className: classNames(settingsStyles.label, settingsStyles.sliderLabel)\n },\n output: {\n className: settingsStyles.sliderOutput\n },\n placeholder: {\n className: settingsStyles.sliderPlaceholder\n },\n track: {\n className: settingsStyles.sliderTrack\n },\n thumb: {\n className: settingsStyles.sliderThumb\n },\n reset: {\n className: classNames(readerSharedUI.icon, settingsStyles.resetButton),\n compounds: {\n tooltipTrigger: {\n delay: tooltipDelay,\n closeDelay: tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: resetLabel ?? t(\"common.actions.reset\")\n }\n }\n }}\n />\n </>\n )\n}","import { useMemo } from \"react\";\nimport { usePlugins } from \"@/components/Plugins/PluginProvider\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { ThSettingsKeys, ThTextSettingsKeys, ThSpacingSettingsKeys } from \"@/preferences/models\";\n\ninterface UseSettingsComponentStatusOptions {\n /** The settings key to check (e.g., ThSettingsKeys.spacingPresets) */\n settingsKey: ThSettingsKeys | ThTextSettingsKeys | ThSpacingSettingsKeys;\n /** The publication type to determine which order array to check */\n publicationType?: \"reflow\" | \"fxl\" | \"webpub\";\n /** Whether this is a text or spacing component to check the correct panels */\n componentType?: \"text\" | \"spacing\";\n /** Optional additional condition that must be true for the component to be considered displayed */\n additionalCondition?: boolean;\n}\n\ninterface SettingsComponentStatus {\n /** Whether the component is registered in the component map */\n isComponentRegistered: boolean;\n /** Whether the component is included in the main panel display order */\n isInMainPanel: boolean;\n /** Whether the component is included in the sub-panel display order */\n isInSubPanel: boolean;\n /** Whether the component is displayed (in either panel and meets additional conditions) */\n isDisplayed: boolean;\n /** Whether the component is currently being used (both registered AND displayed) */\n isComponentUsed: boolean;\n}\n\n/**\n * Generic hook to check if a settings component is registered and displayed.\n * This abstracts the common pattern of checking component registration and display order.\n * \n * @param options - Configuration options for the component status check\n * @returns Object containing various status flags for the component\n */\nexport function useSettingsComponentStatus(options: UseSettingsComponentStatusOptions): SettingsComponentStatus {\n const { settingsKey, publicationType, componentType, additionalCondition = true } = options;\n \n const { spacingSettingsComponentsMap, textSettingsComponentsMap, settingsComponentsMap } = usePlugins();\n const { preferences } = usePreferences();\n\n return useMemo(() => {\n // 1. Check if component is registered in any of the component maps\n const isComponentRegistered = !!(\n settingsComponentsMap?.[settingsKey] ||\n spacingSettingsComponentsMap?.[settingsKey] ||\n textSettingsComponentsMap?.[settingsKey]\n );\n\n // 2. Check if component is in the correct display order array based on publication type\n let isInOrder = false;\n switch (publicationType) {\n case \"reflow\":\n isInOrder = preferences.settings?.reflowOrder?.includes(settingsKey as ThSettingsKeys) || false;\n break;\n case \"fxl\":\n isInOrder = preferences.settings?.fxlOrder?.includes(settingsKey as ThSettingsKeys) || false;\n break;\n case \"webpub\":\n isInOrder = preferences.settings?.webPubOrder?.includes(settingsKey as ThSettingsKeys) || false;\n break;\n }\n \n // 3. Check if component is in the correct panels based on component type\n let isInMainPanel = false;\n let isInSubPanel = false;\n \n if (componentType === \"text\") {\n isInMainPanel = preferences.settings?.text?.main?.includes(settingsKey as any) || false;\n isInSubPanel = preferences.settings?.text?.subPanel?.includes(settingsKey as any) || false;\n } else if (componentType === \"spacing\") {\n isInMainPanel = preferences.settings?.spacing?.main?.includes(settingsKey as any) || false;\n isInSubPanel = preferences.settings?.spacing?.subPanel?.includes(settingsKey as any) || false;\n }\n \n // 4. Component is displayed if it's in order array and in any panel\n const isDisplayed = isInOrder || (isInMainPanel || isInSubPanel) && additionalCondition;\n\n // 5. Component is used if it's both registered AND displayed\n const isComponentUsed = isComponentRegistered && isDisplayed;\n\n return {\n isComponentRegistered,\n isInMainPanel,\n isInSubPanel,\n isDisplayed,\n isComponentUsed\n };\n }, [\n settingsKey,\n publicationType,\n componentType,\n additionalCondition,\n preferences,\n spacingSettingsComponentsMap,\n textSettingsComponentsMap,\n settingsComponentsMap\n ]);\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport { \n ThSettingsKeys, \n ThSpacingSettingsKeys, \n ThSpacingPresetKeys, \n ThLineHeightOptions, \n} from \"@/preferences/models\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { usePreferenceKeys } from \"@/preferences/hooks/usePreferenceKeys\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib\";\nimport {\n SpacingStateKey,\n setLetterSpacing,\n setLineHeight,\n setParagraphIndent,\n setParagraphSpacing,\n setPublisherStyles,\n setSpacingPreset,\n setWordSpacing\n} from \"@/lib/settingsReducer\";\nimport {\n setWebPubLetterSpacing,\n setWebPubLineHeight,\n setWebPubParagraphIndent,\n setWebPubParagraphSpacing,\n setWebPubPublisherStyles,\n setWebPubSpacingPreset,\n setWebPubWordSpacing\n} from \"@/lib/webPubSettingsReducer\";\n\n/**\n * Hook to determine if preset system should be active\n * Only active when component is both registered AND displayed\n * This allows us to correctly handle overrides for presets,\n * and states for spacing components\n */\nexport const useSpacingPresets = () => {\n const readerProfile = useAppSelector((state) => state.reader.profile);\n const isWebPub = readerProfile === \"webPub\";\n const isFXL = useAppSelector(state => state.publication.isFXL);\n \n // Select the appropriate settings based on reader profile\n const settings = useAppSelector(state => \n isWebPub ? state.webPubSettings : state.settings\n );\n \n // Get spacing with fallback\n const spacing = settings?.spacing || { \n preset: ThSpacingPresetKeys.publisher, \n custom: {}, \n baseline: {} \n };\n\n const { reflowSpacingPresetKeys, fxlSpacingPresetKeys, webPubSpacingPresetKeys } = usePreferenceKeys();\n\n const { preferences } = usePreferences();\n\n const dispatch = useAppDispatch();\n\n const spacingKeys = useMemo(() => {\n return isWebPub \n ? webPubSpacingPresetKeys\n : isFXL \n ? fxlSpacingPresetKeys \n : reflowSpacingPresetKeys;\n }, [isWebPub, isFXL, webPubSpacingPresetKeys, fxlSpacingPresetKeys, reflowSpacingPresetKeys]);\n\n // Check if spacing presets component is being used\n const { isComponentUsed: shouldApplyPresets } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.spacingPresets,\n publicationType: isWebPub ? \"webpub\" : isFXL ? \"fxl\" : \"reflow\",\n componentType: \"spacing\",\n additionalCondition: spacingKeys.length > 0\n });\n\n // Get current state values from the already selected settings\n const {\n letterSpacing,\n lineHeight,\n paragraphIndent,\n paragraphSpacing,\n wordSpacing\n } = settings || {};\n\n // Helper function to get base Redux state value for a setting key\n const getBaseReduxValue = (key: ThSpacingSettingsKeys): any => {\n switch (key) {\n case ThSpacingSettingsKeys.letterSpacing:\n return letterSpacing;\n case ThSpacingSettingsKeys.lineHeight:\n return lineHeight;\n case ThSpacingSettingsKeys.paragraphIndent:\n return paragraphIndent;\n case ThSpacingSettingsKeys.paragraphSpacing:\n return paragraphSpacing;\n case ThSpacingSettingsKeys.wordSpacing:\n return wordSpacing;\n default:\n return undefined;\n }\n };\n\n // Helper function to get default value for a setting key when no preset/custom value exists\n const getDefaultValue = (key: ThSpacingSettingsKeys): any => {\n switch (key) {\n case ThSpacingSettingsKeys.lineHeight:\n return ThLineHeightOptions.publisher;\n case ThSpacingSettingsKeys.letterSpacing:\n case ThSpacingSettingsKeys.paragraphIndent:\n case ThSpacingSettingsKeys.paragraphSpacing:\n case ThSpacingSettingsKeys.wordSpacing:\n return null;\n default:\n return null;\n }\n };\n\n // Helper function to get preset value for a setting key\n const getPresetValue = useCallback((presetKey: ThSpacingPresetKeys, settingKey: ThSpacingSettingsKeys): any => {\n if (presetKey === ThSpacingPresetKeys.custom) {\n return spacing.custom?.[settingKey as SpacingStateKey];\n }\n\n // Only try to get from config for presets that have defined values\n if (presetKey !== ThSpacingPresetKeys.publisher) {\n const spacingConfig = preferences.settings.spacing?.presets;\n if (spacingConfig?.keys) {\n const presetValues = spacingConfig.keys[presetKey as ThSpacingPresetKeys.tight | ThSpacingPresetKeys.balanced | ThSpacingPresetKeys.loose | ThSpacingPresetKeys.accessible];\n const presetValue = presetValues?.[settingKey as unknown as keyof typeof presetValues];\n if (presetValue !== undefined) {\n return presetValue;\n }\n }\n }\n\n return getDefaultValue(settingKey);\n }, [preferences.settings.spacing?.presets, spacing.custom]);\n\n const getPresetValuesCallback = useCallback((presetKey: ThSpacingPresetKeys) => {\n return {\n [ThSpacingSettingsKeys.letterSpacing]: getPresetValue(presetKey, ThSpacingSettingsKeys.letterSpacing),\n [ThSpacingSettingsKeys.lineHeight]: getPresetValue(presetKey, ThSpacingSettingsKeys.lineHeight),\n [ThSpacingSettingsKeys.paragraphIndent]: getPresetValue(presetKey, ThSpacingSettingsKeys.paragraphIndent),\n [ThSpacingSettingsKeys.paragraphSpacing]: getPresetValue(presetKey, ThSpacingSettingsKeys.paragraphSpacing),\n [ThSpacingSettingsKeys.wordSpacing]: getPresetValue(presetKey, ThSpacingSettingsKeys.wordSpacing),\n };\n }, [getPresetValue]);\n\n // Helper function to get effective spacing value with proper return types\n // Function overloads for proper typing\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.letterSpacing): number | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.lineHeight): ThLineHeightOptions | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.paragraphIndent): number | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.paragraphSpacing): number | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys.wordSpacing): number | null;\n function getEffectiveSpacingValue(key: ThSpacingSettingsKeys): any {\n // If preset system is not active, return Redux state directly\n if (!shouldApplyPresets) {\n return getBaseReduxValue(key);\n }\n\n if (spacing.preset === ThSpacingPresetKeys.custom) {\n const customValue = spacing.custom?.[key as SpacingStateKey];\n if (customValue !== undefined) {\n return customValue;\n }\n return getDefaultValue(key);\n }\n\n return getPresetValue(spacing.preset, key);\n };\n\n // Helper function to get reset spacing value (pure preset values, ignoring customizations)\n // Function overloads for proper typing\n function getSpacingResetValue(key: ThSpacingSettingsKeys.letterSpacing): number | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys.lineHeight): ThLineHeightOptions | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys.paragraphIndent): number | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys.paragraphSpacing): number | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys.wordSpacing): number | null;\n function getSpacingResetValue(key: ThSpacingSettingsKeys): any {\n if (!shouldApplyPresets) {\n return getDefaultValue(key);\n }\n\n if (spacing.preset) {\n if (spacing.preset !== ThSpacingPresetKeys.publisher && \n spacing.preset !== ThSpacingPresetKeys.custom) {\n const spacingConfig = preferences.settings?.spacing?.presets;\n if (spacingConfig?.keys) {\n const presetValues = spacingConfig.keys[spacing.preset as ThSpacingPresetKeys.tight | ThSpacingPresetKeys.balanced | ThSpacingPresetKeys.loose | ThSpacingPresetKeys.accessible];\n const presetValue = presetValues?.[key as unknown as keyof typeof presetValues];\n if (presetValue !== undefined) {\n return presetValue;\n }\n }\n }\n }\n\n // For publisher or custom preset or when no preset is selected, return the default value\n return getDefaultValue(key);\n }\n\n const getEffectiveSpacingValueCallback = useCallback(getEffectiveSpacingValue, [\n getEffectiveSpacingValue,\n shouldApplyPresets,\n spacing.preset,\n spacing.custom,\n spacing.baseline,\n preferences.settings?.spacing?.presets,\n letterSpacing,\n lineHeight,\n paragraphIndent,\n paragraphSpacing,\n wordSpacing\n ]);\n\n const getSpacingResetValueCallback = useCallback(getSpacingResetValue, [\n shouldApplyPresets,\n getSpacingResetValue,\n spacing.preset,\n preferences.settings?.spacing?.presets\n ]);\n\n const canBeResetCallback = useCallback((key: ThSpacingSettingsKeys): boolean => {\n const effectiveValue = getEffectiveSpacingValueCallback(key as any);\n return effectiveValue !== null && effectiveValue !== undefined;\n }, [getEffectiveSpacingValueCallback]);\n\n // Spacing actions (automatically handle preset logic)\n\n const setLetterSpacingAction = useCallback((value: number | null) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubLetterSpacing(payload));\n } else {\n dispatch(setLetterSpacing(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setLineHeightAction = useCallback((value: ThLineHeightOptions) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubLineHeight(payload));\n } else {\n dispatch(setLineHeight(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setParagraphIndentAction = useCallback((value: number | null) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubParagraphIndent(payload));\n } else {\n dispatch(setParagraphIndent(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setParagraphSpacingAction = useCallback((value: number | null) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubParagraphSpacing(payload));\n } else {\n dispatch(setParagraphSpacing(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setWordSpacingAction = useCallback((value: number | null) => {\n const payload: any = { value };\n if (shouldApplyPresets && spacing.preset) {\n payload.preset = spacing.preset;\n }\n if (isWebPub) {\n dispatch(setWebPubWordSpacing(payload));\n } else {\n dispatch(setWordSpacing(payload));\n }\n }, [dispatch, isWebPub, shouldApplyPresets, spacing.preset]);\n\n const setPublisherStylesAction = useCallback((value: boolean) => {\n if (shouldApplyPresets && value) {\n if (isWebPub) {\n dispatch(setWebPubSpacingPreset({ \n preset: ThSpacingPresetKeys.publisher, \n values: {} \n }));\n dispatch(setWebPubPublisherStyles(value));\n } else {\n dispatch(setSpacingPreset({ \n preset: ThSpacingPresetKeys.publisher, \n values: {} \n }));\n dispatch(setPublisherStyles(value));\n }\n }\n }, [dispatch, isWebPub, shouldApplyPresets]);\n\n return {\n currentPreset: spacing.preset,\n getPresetValues: getPresetValuesCallback,\n getEffectiveSpacingValue: getEffectiveSpacingValueCallback,\n getSpacingResetValue: getSpacingResetValueCallback,\n canBeReset: canBeResetCallback,\n setLetterSpacing: setLetterSpacingAction,\n setLineHeight: setLineHeightAction,\n setParagraphIndent: setParagraphIndentAction,\n setParagraphSpacing: setParagraphSpacingAction,\n setWordSpacing: setWordSpacingAction,\n setPublisherStyles: setPublisherStylesAction\n };\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\ninterface EffectiveRangeResult {\n range: [number, number];\n presets?: number[];\n}\n\n/**\n * Returns the effective range and presets to use for a range setting, clamped\n * to the navigator's supported range when provided. Falls back to the preferred\n * range if it fits within the supported range, otherwise uses the supported\n * range directly. Presets outside the effective range are filtered out.\n */\nexport const useEffectiveRange = (\n preferred: [number, number],\n supportedRange: [number, number] | undefined,\n presets?: number[]\n): EffectiveRangeResult => {\n return useMemo(() => {\n let range: [number, number];\n\n if (!supportedRange) {\n range = preferred;\n } else {\n const prefMin = Math.min(...preferred);\n const prefMax = Math.max(...preferred);\n const supMin = Math.min(...supportedRange);\n const supMax = Math.max(...supportedRange);\n range = (prefMin >= supMin && prefMax <= supMax) ? preferred : supportedRange;\n }\n\n if (!presets) return { range };\n\n const [min, max] = [Math.min(...range), Math.max(...range)];\n const effectivePresets = presets.filter(p => p >= min && p <= max);\n\n return { range, presets: effectivePresets };\n }, [preferred, supportedRange, presets]);\n};\n","import { ThSettingsRangePlaceholder } from \"@/preferences\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nexport const usePlaceholder = (\n placeholder: ThSettingsRangePlaceholder | string | { key: string; fallback?: string } | undefined,\n range: [number, number],\n format?: \"percent\" | \"number\" | \"multiplier\"\n): string | undefined => {\n const { t } = useI18n();\n\n if (!placeholder) {\n return undefined;\n }\n\n // Handle enum values\n if (placeholder === ThSettingsRangePlaceholder.none) {\n return undefined;\n }\n if (placeholder === ThSettingsRangePlaceholder.range) {\n switch (format) {\n case \"percent\":\n const minRange = range[0] * 100;\n const maxRange = range[1] * 100;\n const minPercent = minRange === 0 ? \"0\" : `${minRange}%`;\n const maxPercent = maxRange === 0 ? \"0\" : `${maxRange}%`;\n return `${ minPercent } - ${ maxPercent }`;\n case \"multiplier\":\n const minMultiplierRange = range[0];\n const maxMultiplierRange = range[1];\n const minMultiplier = minMultiplierRange === 0 ? \"0\" : `${minMultiplierRange}×`;\n const maxMultiplier = maxMultiplierRange === 0 ? \"0\" : `${maxMultiplierRange}×`;\n return `${ minMultiplier } - ${ maxMultiplier }`;\n case \"number\":\n default:\n return `${ range[0] } - ${ range[1] }`;\n }\n }\n\n // Handle i18n object\n if (typeof placeholder === \"object\" && \"key\" in placeholder) {\n const translatedPlaceholder = t(placeholder.key);\n return translatedPlaceholder !== placeholder.key ? translatedPlaceholder : placeholder.fallback;\n }\n\n // Handle string values (literal text, not translated)\n if (typeof placeholder === \"string\") {\n return placeholder;\n }\n\n return undefined;\n};","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulNumberField } from \"../StatefulNumberField\";\nimport { StatefulSlider } from \"../StatefulSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { EpubPreferencesEditor } from \"@readium/navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { usePlaceholder } from \"../hooks/usePlaceholder\";\nimport { useEffectiveRange } from \"../hooks/useEffectiveRange\";\n\nexport const StatefulLetterSpacing = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const config = preferences.settings.keys[ThSettingsKeys.letterSpacing];\n\n const { getSetting, submitPreferences, preferencesEditor } = useNavigator().visual;\n\n const { range } = useEffectiveRange(config.range, (preferencesEditor as EpubPreferencesEditor | undefined)?.letterSpacing?.supportedRange);\n\n const letterSpacingRangeConfig = {\n variant: config.variant,\n placeholder: config.placeholder,\n range,\n step: config.step\n };\n\n const placeholderText = usePlaceholder(letterSpacingRangeConfig.placeholder, letterSpacingRangeConfig.range, \"percent\");\n\n const { getEffectiveSpacingValue, setLetterSpacing, canBeReset } = useSpacingPresets();\n\n const letterSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.letterSpacing);\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n letterSpacing: Array.isArray(value) ? value[0] : value\n });\n\n setLetterSpacing(getSetting(\"letterSpacing\"));\n }, [submitPreferences, getSetting, setLetterSpacing]);\n\n return (\n <>\n { letterSpacingRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField \n standalone={ standalone }\n label={ t(\"reader.preferences.letterSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ letterSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.letterSpacing) ? async() => await updatePreference(null) : undefined }\n range={ letterSpacingRangeConfig.range }\n step={ letterSpacingRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{ style: \"percent\" }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ standalone }\n displayTicks={ letterSpacingRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.preferences.letterSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ letterSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.letterSpacing) ? async() => await updatePreference(null) : undefined }\n range={ letterSpacingRangeConfig.range }\n step={ letterSpacingRangeConfig.step }\n formatOptions={ { style: \"percent\" } }\n />\n } \n </>\n )\n}","import { useMemo } from \"react\";\nimport { ThLineHeightOptions, ThSettingsKeys } from \"@/preferences/models\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\n/**\n * Hook that returns a mapping of line height options to their actual numeric values\n * This eliminates code duplication across spacing components\n */\nexport const useLineHeight = () => {\n const { preferences } = usePreferences();\n\n return useMemo(() => ({\n [ThLineHeightOptions.publisher]: null,\n [ThLineHeightOptions.small]: preferences.settings.keys[ThSettingsKeys.lineHeight].keys[ThLineHeightOptions.small],\n [ThLineHeightOptions.medium]: preferences.settings.keys[ThSettingsKeys.lineHeight].keys[ThLineHeightOptions.medium],\n [ThLineHeightOptions.large]: preferences.settings.keys[ThSettingsKeys.lineHeight].keys[ThLineHeightOptions.large],\n }), [preferences.settings.keys]);\n};\n","import * as React from \"react\";\nconst SvgBook = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h480q33 0 56.5 23.5T800-800v640q0 33-23.5 56.5T720-80H240Zm0-80h480v-640h-80v280l-100-60-100 60v-280H240v640Zm0 0v-640 640Zm200-360 100-60 100 60-100-60-100 60Z\" /></svg>;\nexport default SvgBook;","import * as React from \"react\";\nconst SvgDensitySmall = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-80v-80h720v80H120Zm0-240v-80h720v80H120Zm0-240v-80h720v80H120Zm0-240v-80h720v80H120Z\" /></svg>;\nexport default SvgDensitySmall;","import * as React from \"react\";\nconst SvgDensityMedium = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-120v-80h720v80H120Zm0-320v-80h720v80H120Zm0-320v-80h720v80H120Z\" /></svg>;\nexport default SvgDensityMedium;","import * as React from \"react\";\nconst SvgDensityLarge = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-120v-80h720v80H120Zm0-640v-80h720v80H120Z\" /></svg>;\nexport default SvgDensityLarge;","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\n\nimport { ThLineHeightOptions, ThSpacingSettingsKeys, ThSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport BookIcon from \"../assets/icons/book.svg\";\nimport SmallIcon from \"./assets/icons/density_small.svg\";\nimport MediumIcon from \"./assets/icons/density_medium.svg\";\nimport LargeIcon from \"./assets/icons/density_large.svg\";\n\nimport { StatefulRadioGroup } from \"../StatefulRadioGroup\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { EpubPreferencesEditor } from \"@readium/navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useEffectiveRange } from \"../hooks/useEffectiveRange\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useLineHeight } from \"./hooks/useLineHeight\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\n\nexport const StatefulLineHeight = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n const { preferences } = usePreferences();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n\n const publisherStyles = useAppSelector(state => isWebPub ? state.webPubSettings.publisherStyles : state.settings.publisherStyles) ?? true;\n\n const { getSetting, submitPreferences, preferencesEditor } = useNavigator().visual;\n\n const { getEffectiveSpacingValue, setLineHeight } = useSpacingPresets();\n\n const lineHeight = getEffectiveSpacingValue(ThSpacingSettingsKeys.lineHeight);\n\n const lineHeightOptions = useLineHeight();\n\n const lineHeightNumericValues = useMemo(\n () => Object.values(lineHeightOptions).filter((v): v is number => v !== null),\n [lineHeightOptions]\n );\n\n const { presets: effectivePresets } = useEffectiveRange(\n [Math.min(...lineHeightNumericValues), Math.max(...lineHeightNumericValues)],\n (preferencesEditor as EpubPreferencesEditor | undefined)?.lineHeight?.supportedRange,\n lineHeightNumericValues\n );\n\n // Dynamically build items array based on allowUnset preference and navigator supported range\n const items = useMemo(() => {\n const baseItems = [\n {\n id: ThLineHeightOptions.small,\n icon: SmallIcon,\n label: t(\"reader.preferences.lineHeight.small\"),\n value: ThLineHeightOptions.small\n },\n {\n id: ThLineHeightOptions.medium,\n icon: MediumIcon,\n label: t(\"reader.preferences.lineHeight.medium\"),\n value: ThLineHeightOptions.medium\n },\n {\n id: ThLineHeightOptions.large,\n icon: LargeIcon,\n label: t(\"reader.preferences.lineHeight.large\"),\n value: ThLineHeightOptions.large\n },\n ].filter(item => {\n const v = lineHeightOptions[item.id];\n return effectivePresets === undefined || effectivePresets.includes(v);\n });\n\n // Only add publisher option if allowUnset is true\n if (preferences.settings.keys[ThSettingsKeys.lineHeight].allowUnset !== false) {\n baseItems.unshift({\n id: ThLineHeightOptions.publisher,\n icon: BookIcon,\n label: t(\"reader.preferences.lineHeight.default\"),\n value: ThLineHeightOptions.publisher\n });\n }\n\n return baseItems;\n }, [preferences.settings.keys, lineHeightOptions, effectivePresets, t]);\n\n const updatePreference = useCallback(async (value: string) => {\n const computedValue = value === ThLineHeightOptions.publisher\n ? null\n : lineHeightOptions[value as keyof typeof ThLineHeightOptions];\n\n await submitPreferences({\n lineHeight: computedValue\n });\n\n const currentLineHeight = getSetting(\"lineHeight\");\n const currentDisplayLineHeightOption = Object.entries(lineHeightOptions).find(([key, value]) => value === currentLineHeight)?.[0] as ThLineHeightOptions;\n\n setLineHeight(currentDisplayLineHeightOption);\n }, [submitPreferences, getSetting, setLineHeight, lineHeightOptions]);\n\n return (\n <>\n <StatefulRadioGroup\n standalone={ standalone }\n label={ t(\"reader.preferences.lineHeight.title\") }\n orientation=\"horizontal\"\n value={ !isWebPub && publisherStyles ? ThLineHeightOptions.publisher : lineHeight }\n onChange={ async (val: string) => await updatePreference(val) }\n items={ items }\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulNumberField } from \"../StatefulNumberField\";\nimport { StatefulSlider } from \"../StatefulSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { EpubPreferencesEditor } from \"@readium/navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { usePlaceholder } from \"../hooks/usePlaceholder\";\nimport { useEffectiveRange } from \"../hooks/useEffectiveRange\";\n\nexport const StatefulParagraphIndent = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n \n const config = preferences.settings.keys[ThSettingsKeys.paragraphIndent];\n\n const { getSetting, submitPreferences, preferencesEditor } = useNavigator().visual;\n\n const { range } = useEffectiveRange(config.range, (preferencesEditor as EpubPreferencesEditor | undefined)?.paragraphIndent?.supportedRange);\n\n const paragraphIndentRangeConfig = {\n variant: config.variant,\n placeholder: config.placeholder,\n range,\n step: config.step\n };\n\n const placeholderText = usePlaceholder(paragraphIndentRangeConfig.placeholder, paragraphIndentRangeConfig.range, \"multiplier\");\n\n const { getEffectiveSpacingValue, setParagraphIndent, canBeReset } = useSpacingPresets();\n\n const paragraphIndent = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphIndent);\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n paragraphIndent: Array.isArray(value) ? value[0] : value\n });\n\n setParagraphIndent(getSetting(\"paragraphIndent\"));\n }, [submitPreferences, getSetting, setParagraphIndent]);\n\n return (\n <>\n { paragraphIndentRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField \n standalone={ standalone }\n label={ t(\"reader.preferences.paragraphIndent\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ paragraphIndent ?? undefined } \n onChange={ async(value) => await updatePreference(value) } \n onReset={ canBeReset(ThSpacingSettingsKeys.paragraphIndent) ? async () => await updatePreference(null) : undefined }\n range={ paragraphIndentRangeConfig.range }\n step={ paragraphIndentRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{\n signDisplay: \"exceptZero\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ standalone }\n displayTicks={ paragraphIndentRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.preferences.paragraphIndent\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ paragraphIndent ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.paragraphIndent) ? async () => await updatePreference(null) : undefined }\n range={ paragraphIndentRangeConfig.range }\n step={ paragraphIndentRangeConfig.step }\n formatOptions={{\n signDisplay: \"exceptZero\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n }}\n />\n } \n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulNumberField } from \"../StatefulNumberField\";\nimport { StatefulSlider } from \"../StatefulSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { EpubPreferencesEditor } from \"@readium/navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { usePlaceholder } from \"../hooks/usePlaceholder\";\nimport { useEffectiveRange } from \"../hooks/useEffectiveRange\";\n\nexport const StatefulParagraphSpacing = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const config = preferences.settings.keys[ThSettingsKeys.paragraphSpacing];\n\n const { getSetting, submitPreferences, preferencesEditor } = useNavigator().visual;\n\n const { range } = useEffectiveRange(config.range, (preferencesEditor as EpubPreferencesEditor | undefined)?.paragraphSpacing?.supportedRange);\n\n const paragraphSpacingRangeConfig = {\n variant: config.variant,\n placeholder: config.placeholder,\n range,\n step: config.step\n };\n\n const placeholderText = usePlaceholder(paragraphSpacingRangeConfig.placeholder, paragraphSpacingRangeConfig.range, \"multiplier\");\n\n const { getEffectiveSpacingValue, setParagraphSpacing, canBeReset } = useSpacingPresets();\n\n const paragraphSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphSpacing);\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n paragraphSpacing: Array.isArray(value) ? value[0] : value\n });\n\n setParagraphSpacing(getSetting(\"paragraphSpacing\"));\n }, [submitPreferences, getSetting, setParagraphSpacing]);\n\n return (\n <>\n { paragraphSpacingRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField \n standalone={ standalone }\n label={ t(\"reader.preferences.paragraphSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ paragraphSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value) } \n onReset={ canBeReset(ThSpacingSettingsKeys.paragraphSpacing) ? async() => await updatePreference(null) : undefined }\n range={ paragraphSpacingRangeConfig.range }\n step={ paragraphSpacingRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{\n signDisplay: \"exceptZero\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ standalone }\n displayTicks={ paragraphSpacingRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.preferences.paragraphSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ paragraphSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.paragraphSpacing) ? async() => await updatePreference(null) : undefined }\n range={ paragraphSpacingRangeConfig.range }\n step={ paragraphSpacingRangeConfig.step }\n formatOptions={{\n signDisplay: \"exceptZero\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n }}\n /> \n }\n </>\n )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThLineHeightOptions, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"./models/settings\";\n\nimport { StatefulSwitch } from \"./StatefulSwitch\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./Spacing/hooks/useSpacingPresets\";\nimport { useLineHeight } from \"./Spacing/hooks/useLineHeight\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nexport const StatefulPublisherStyles = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n const publisherStyles = useAppSelector(state => state.settings.publisherStyles);\n\n const { getEffectiveSpacingValue, setPublisherStyles } = useSpacingPresets();\n\n const lineHeight = getEffectiveSpacingValue(ThSpacingSettingsKeys.lineHeight);\n const paragraphIndent = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphIndent);\n const paragraphSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphSpacing);\n const letterSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.letterSpacing);\n const wordSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.wordSpacing);\n\n const lineHeightOptions = useLineHeight();\n\n const { submitPreferences } = useNavigator().visual;\n\n const updatePreference = useCallback(async (isSelected: boolean) => {\n const values = isSelected ? \n {\n lineHeight: null,\n paragraphIndent: null,\n paragraphSpacing: null,\n letterSpacing: null,\n wordSpacing: null\n } : \n {\n lineHeight: lineHeight === ThLineHeightOptions.publisher \n ? null \n : lineHeightOptions[lineHeight as keyof typeof ThLineHeightOptions],\n paragraphIndent: paragraphIndent,\n paragraphSpacing: paragraphSpacing,\n letterSpacing: letterSpacing,\n wordSpacing: wordSpacing\n };\n await submitPreferences(values);\n\n setPublisherStyles(isSelected ? true : false);\n }, [submitPreferences, setPublisherStyles, lineHeight, paragraphIndent, paragraphSpacing, letterSpacing, wordSpacing, lineHeightOptions]);\n\n return(\n <>\n <StatefulSwitch \n standalone={ standalone }\n label={ t(\"reader.preferences.publisherStyles.label\") }\n onChange={ async (isSelected: boolean) => await updatePreference(isSelected) }\n isSelected={ publisherStyles }\n />\n </>\n )\n}","import * as React from \"react\";\nconst SvgAccessibility = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M480-720q-33 0-56.5-23.5T400-800q0-33 23.5-56.5T480-880q33 0 56.5 23.5T560-800q0 33-23.5 56.5T480-720ZM360-80v-520q-60-5-122-15t-118-25l20-80q78 21 166 30.5t174 9.5q86 0 174-9.5T820-720l20 80q-56 15-118 25t-122 15v520h-80v-240h-80v240h-80Z\" /></svg>;\nexport default SvgAccessibility;","import * as React from \"react\";\nconst SvgTune = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M440-120v-240h80v80h320v80H520v80h-80Zm-320-80v-80h240v80H120Zm160-160v-80H120v-80h160v-80h80v240h-80Zm160-80v-80h400v80H440Zm160-160v-240h80v80h160v80H680v80h-80Zm-480-80v-80h400v80H120Z\" /></svg>;\nexport default SvgTune;","import { ThSpacingSettingsKeys } from \"@/preferences/models\";\n\n/**\n * Check if spacing settings are available for customization\n * Returns true if subPanel contains at least one spacing setting (excluding spacingPresets and publisherStyles)\n */\nexport const hasCustomizableSpacingSettings = (subPanelKeys: ThSpacingSettingsKeys[]): boolean => {\n const spacingSettingsKeys = [\n ThSpacingSettingsKeys.letterSpacing,\n ThSpacingSettingsKeys.lineHeight,\n ThSpacingSettingsKeys.paragraphIndent,\n ThSpacingSettingsKeys.paragraphSpacing,\n ThSpacingSettingsKeys.wordSpacing\n ];\n\n return spacingSettingsKeys.some(key => subPanelKeys.includes(key));\n};\n","import { useCallback, useMemo } from \"react\";\n\nimport { \n ThSpacingPresetKeys,\n ThLineHeightOptions,\n ThSpacingSettingsKeys,\n} from \"@/preferences/models\";\n\nimport BookIcon from \"../assets/icons/book.svg\";\nimport SmallIcon from \"./assets/icons/density_small.svg\";\nimport MediumIcon from \"./assets/icons/density_medium.svg\";\nimport LargeIcon from \"./assets/icons/density_large.svg\";\nimport AccessibleIcon from \"./assets/icons/accessibility.svg\";\nimport TuneIcon from \"./assets/icons/tune.svg\";\n\nimport { StatefulSettingsItemProps } from \"@/components/Settings\";\n\nimport { StatefulRadioGroup } from \"../StatefulRadioGroup\";\n\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePreferenceKeys } from \"@/preferences/hooks/usePreferenceKeys\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useLineHeight } from \"./hooks/useLineHeight\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib\";\nimport { setSpacingPreset } from \"@/lib/settingsReducer\";\nimport { setWebPubSpacingPreset } from \"@/lib/webPubSettingsReducer\";\n\nimport { hasCustomizableSpacingSettings } from \"./helpers/spacingSettings\";\n\nconst iconMap = {\n [ThSpacingPresetKeys.publisher]: BookIcon,\n [ThSpacingPresetKeys.accessible]: AccessibleIcon,\n [ThSpacingPresetKeys.custom]: TuneIcon,\n [ThSpacingPresetKeys.tight]: SmallIcon,\n [ThSpacingPresetKeys.balanced]: MediumIcon,\n [ThSpacingPresetKeys.loose]: LargeIcon,\n};\n\nexport const StatefulSpacingPresets = ({ standalone }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n const { reflowSpacingPresetKeys, fxlSpacingPresetKeys, webPubSpacingPresetKeys, subPanelSpacingSettingsKeys } = usePreferenceKeys();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n const spacing = useAppSelector(state => isWebPub ? state.webPubSettings.spacing : state.settings.spacing);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n\n const dispatch = useAppDispatch();\n\n const { submitPreferences } = useNavigator().visual;\n\n const lineHeightOptions = useLineHeight();\n\n const { getPresetValues } = useSpacingPresets();\n\n const updatePreference = useCallback(async (value: string) => {\n const spacingKey = value as ThSpacingPresetKeys;\n \n // Get preset values directly from preferences config\n const presetValues = getPresetValues(spacingKey);\n \n // Raw values for Redux state (lineHeight stays as enum)\n const reduxValues = {\n [ThSpacingSettingsKeys.letterSpacing]: presetValues?.[ThSpacingSettingsKeys.letterSpacing] ?? null,\n [ThSpacingSettingsKeys.lineHeight]: presetValues?.[ThSpacingSettingsKeys.lineHeight] ?? null,\n [ThSpacingSettingsKeys.paragraphIndent]: presetValues?.[ThSpacingSettingsKeys.paragraphIndent] ?? null,\n [ThSpacingSettingsKeys.paragraphSpacing]: presetValues?.[ThSpacingSettingsKeys.paragraphSpacing] ?? null,\n [ThSpacingSettingsKeys.wordSpacing]: presetValues?.[ThSpacingSettingsKeys.wordSpacing] ?? null,\n };\n \n // Convert lineHeight for preferences API (enum to number)\n const lineHeightValue = reduxValues[ThSpacingSettingsKeys.lineHeight];\n const lineHeightValueNumber = lineHeightValue && lineHeightValue !== ThLineHeightOptions.publisher \n ? lineHeightOptions[lineHeightValue as ThLineHeightOptions] \n : null;\n \n const preferencesToSubmit = {\n [ThSpacingSettingsKeys.letterSpacing]: reduxValues[ThSpacingSettingsKeys.letterSpacing],\n [ThSpacingSettingsKeys.lineHeight]: lineHeightValueNumber,\n [ThSpacingSettingsKeys.paragraphIndent]: reduxValues[ThSpacingSettingsKeys.paragraphIndent],\n [ThSpacingSettingsKeys.paragraphSpacing]: reduxValues[ThSpacingSettingsKeys.paragraphSpacing],\n [ThSpacingSettingsKeys.wordSpacing]: reduxValues[ThSpacingSettingsKeys.wordSpacing],\n };\n \n await submitPreferences(preferencesToSubmit);\n \n if (isWebPub) {\n dispatch(setWebPubSpacingPreset({\n preset: spacingKey,\n values: reduxValues,\n }));\n } else {\n dispatch(setSpacingPreset({\n preset: spacingKey,\n values: reduxValues,\n }));\n }\n }, [isWebPub, dispatch, submitPreferences, getPresetValues, lineHeightOptions]);\n\n // Use appropriate spacing keys based on layout\n const spacingKeys = useMemo(() => {\n const baseKeys = isWebPub \n ? webPubSpacingPresetKeys \n : isFXL \n ? fxlSpacingPresetKeys \n : reflowSpacingPresetKeys;\n const subPanelKeys = subPanelSpacingSettingsKeys || [];\n\n const hasCustomizableSettings = hasCustomizableSpacingSettings(subPanelKeys);\n\n if (hasCustomizableSettings) {\n return baseKeys;\n } else {\n // Exclude \"custom\" if no spacing settings are available for customization\n return baseKeys.filter(key => key !== ThSpacingPresetKeys.custom);\n }\n }, [isWebPub, isFXL, fxlSpacingPresetKeys, reflowSpacingPresetKeys, webPubSpacingPresetKeys, subPanelSpacingSettingsKeys]);\n\n // Create dynamic items array based on spacing keys\n const items = useMemo(() => {\n return spacingKeys.map((key: ThSpacingPresetKeys) => ({\n id: key,\n icon: iconMap[key],\n value: key,\n label: t(`reader.preferences.spacing.presets.${ key === ThSpacingPresetKeys.publisher ? \"default\" : key }`)\n }));\n }, [spacingKeys, t]);\n\n // Return null if no items to display\n if (items.length === 0) {\n return null;\n }\n\n return (\n <>\n <StatefulRadioGroup\n standalone={ standalone }\n label={ t(\"reader.preferences.spacing.presets.title\") }\n orientation=\"horizontal\"\n value={ spacing?.preset || ThSpacingPresetKeys.publisher }\n onChange={ async (val: string) => await updatePreference(val as ThSpacingPresetKeys) }\n items={ items }\n />\n </>\n );\n}","import * as React from \"react\";\nconst SvgFormatAlignLeft = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-120v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Z\" /></svg>;\nexport default SvgFormatAlignLeft;","import * as React from \"react\";\nconst SvgFormatAlignRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-760v-80h720v80H120Zm240 160v-80h480v80H360ZM120-440v-80h720v80H120Zm240 160v-80h480v80H360ZM120-120v-80h720v80H120Z\" /></svg>;\nexport default SvgFormatAlignRight;","import * as React from \"react\";\nconst SvgFormatAlignJustify = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M120-120v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Z\" /></svg>;\nexport default SvgFormatAlignJustify;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThTextAlignOptions } from \"@/preferences/models\";\nimport { StatefulSettingsItemProps } from \"../models/settings\";\nimport { TextAlignment } from \"@readium/navigator\";\n\nimport BookIcon from \"../assets/icons/book.svg\";\nimport LeftAlignIcon from \"./assets/icons/format_align_left.svg\";\nimport RightAlignIcon from \"./assets/icons/format_align_right.svg\";\nimport JustifyIcon from \"./assets/icons/format_align_justify.svg\";\n\nimport { StatefulRadioGroup } from \"../StatefulRadioGroup\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setTextAlign, setHyphens } from \"@/lib/settingsReducer\";\nimport { setWebPubHyphens, setWebPubTextAlign } from \"@/lib/webPubSettingsReducer\";\n\nexport const StatefulTextAlign = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n \n const isRTL = useAppSelector(state => state.publication.isRTL);\n const textAlign = useAppSelector(state => isWebPub ? state.webPubSettings.textAlign : state.settings.textAlign) ?? ThTextAlignOptions.publisher;\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const items = [\n {\n id: ThTextAlignOptions.publisher,\n icon: BookIcon,\n label: t(\"reader.preferences.textAlign.default\"), \n value: ThTextAlignOptions.publisher \n },\n {\n id: ThTextAlignOptions.start,\n icon: isRTL ? RightAlignIcon : LeftAlignIcon,\n label: isRTL ? t(\"reader.preferences.textAlign.right\") : t(\"reader.preferences.textAlign.left\"), \n value: ThTextAlignOptions.start \n },\n {\n id: ThTextAlignOptions.justify,\n icon: JustifyIcon,\n label: t(\"reader.preferences.textAlign.justify\"), \n value: ThTextAlignOptions.justify \n }\n ];\n\n const updatePreference = useCallback(async (value: string) => {\n const textAlign: TextAlignment | null = value === ThTextAlignOptions.publisher \n ? null \n : value === ThTextAlignOptions.start \n ? TextAlignment.start \n : TextAlignment.justify;\n \n const currentHyphens = getSetting(\"hyphens\") as boolean | undefined | null;\n \n const hyphens = textAlign === null \n ? null \n : (currentHyphens ?? textAlign === TextAlignment.justify);\n \n await submitPreferences({\n textAlign: textAlign,\n hyphens: hyphens\n });\n \n const textAlignSetting = getSetting(\"textAlign\") as TextAlignment | null;\n const textAlignValue = textAlignSetting === null ? ThTextAlignOptions.publisher : textAlignSetting as unknown as ThTextAlignOptions;\n const effectiveHyphens = getSetting(\"hyphens\");\n \n if (isWebPub) {\n dispatch(setWebPubTextAlign(textAlignValue));\n dispatch(setWebPubHyphens(effectiveHyphens));\n } else {\n dispatch(setTextAlign(textAlignValue));\n dispatch(setHyphens(effectiveHyphens));\n }\n }, [isWebPub, getSetting, submitPreferences, dispatch]);\n\n return (\n <>\n <StatefulRadioGroup \n standalone={ standalone } \n label={ t(\"reader.preferences.textAlign.title\") }\n orientation=\"horizontal\" \n value={ textAlign } \n onChange={ async (val: string) => await updatePreference(val) }\n items={ items }\n />\n </>\n );\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulSwitch } from \"../StatefulSwitch\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setTextNormalization } from \"@/lib/settingsReducer\";\nimport { setWebPubTextNormalization } from \"@/lib/webPubSettingsReducer\";\n\n// TMP Component that is not meant to be implemented AS-IS, for testing purposes\nexport const StatefulTextNormalize = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n \n const textNormalization = useAppSelector(state => isWebPub ? state.webPubSettings.textNormalization : state.settings.textNormalization) ?? false;\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const updatePreference = useCallback(async (value: boolean) => {\n await submitPreferences({ textNormalization: value });\n const effectiveSetting = getSetting(\"textNormalization\");\n\n if (isWebPub) {\n dispatch(setWebPubTextNormalization(effectiveSetting));\n } else {\n dispatch(setTextNormalization(effectiveSetting));\n }\n }, [isWebPub, submitPreferences, getSetting, dispatch]);\n\n return(\n <>\n <StatefulSwitch \n standalone={ standalone }\n heading={ t(\"reader.preferences.textNormalization.title\") }\n label={ t(\"reader.preferences.textNormalization.label\") }\n onChange={ async (isSelected: boolean) => await updatePreference(isSelected) }\n isSelected={ textNormalization ?? false }\n />\n </>\n )\n}","import * as React from \"react\";\nconst SvgCheck = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\" /></svg>;\nexport default SvgCheck;","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { ThemeKeyType } from \"@/preferences\";\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nimport settingsStyles from \"../Settings/assets/styles/thorium-web.reader.settings.module.css\";\n\nimport CheckIcon from \"./assets/icons/check.svg\";\n\nimport { ThActionsKeys, ThLayoutDirection } from \"@/preferences/models\";\n\nimport { StatefulRadioGroup } from \"./StatefulRadioGroup\";\nimport { Radio } from \"react-aria-components\";\n\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useGridNavigation } from \"@/components/Settings/hooks/useGridNavigation\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib\";\nimport { setTheme } from \"@/lib/themeReducer\";\n\nimport classNames from \"classnames\";\nimport { buildThemeObject } from \"@/preferences/helpers/buildThemeObject\";\n\nexport const StatefulTheme = () => {\n const profile = useAppSelector(state => state.reader.profile);\n const { theming } = useSharedPreferences();\n const { systemThemes, keys: themeKeys, audioOrder: audioThemeOrder, reflowOrder: reflowThemeOrder, fxlOrder: fxlThemeOrder } = theming.themes;\n const { t } = useI18n();\n\n const radioGroupRef = useRef<HTMLDivElement | null>(null);\n const radioGroupWrapperRef = useRef<HTMLDivElement | null>(null);\n\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const direction = useAppSelector(state => state.reader.direction);\n const isRTL = direction === ThLayoutDirection.rtl;\n\n const themeArray: (ThemeKeyType | \"auto\")[] = profile === \"audio\"\n ? ((audioThemeOrder ?? []) as (ThemeKeyType | \"auto\")[])\n : (isFXL\n ? ((fxlThemeOrder ?? []) as (ThemeKeyType | \"auto\")[])\n : ((reflowThemeOrder ?? []) as (ThemeKeyType | \"auto\")[]));\n\n const themeObject = useAppSelector(state => state.theming.theme);\n const theme = profile === \"audio\" ? themeObject.audio : (isFXL ? themeObject.fxl : themeObject.reflow);\n const colorScheme = useAppSelector(state => state.theming.colorScheme);\n const coverTheme = useAppSelector(state => state.theming.coverTheme);\n\n const themeItems = useRef<(ThemeKeyType | \"auto\")[]>(\n themeArray.filter((theme: ThemeKeyType | \"auto\") => {\n if (theme === \"auto\") {\n return systemThemes !== undefined &&\n Object.values(systemThemes).every(t => themeArray.includes(t as ThemeKeyType));\n }\n return true;\n })\n );\n\n const dispatch = useAppDispatch();\n\n // Handling grid navigation through StatefulRadioGroup\n // would add a ton of complexity due to the extensive\n // logic for handling different types of children (render, node, etc.)\n // So we handle it here instead for the time being\n const { onKeyDown } = useGridNavigation({\n containerRef: radioGroupWrapperRef,\n items: themeItems,\n currentValue: theme,\n onChange: async (val) => await updatePreference(val as ThemeKeyType),\n isRTL,\n onEscape: () => dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: false\n })),\n onFocus: (id) => {\n const element = radioGroupWrapperRef.current?.querySelector(`[id=\"${ id }\"]`);\n if (element) (element as HTMLElement).focus();\n }\n })\n\n const { submitPreferences } = useEpubNavigator();\n\n const updatePreference = useCallback(async (value: ThemeKeyType | \"auto\") => {\n const themeProps = buildThemeObject<typeof value>({\n theme: value,\n themeKeys: themeKeys ?? {},\n systemThemes: systemThemes as { light: ThemeKeyType; dark: ThemeKeyType } | undefined,\n colorScheme\n })\n await submitPreferences(themeProps);\n\n dispatch(setTheme({\n key: profile === \"audio\" ? \"audio\" : (isFXL ? \"fxl\" : \"reflow\"),\n value: value\n }));\n }, [isFXL, themeKeys, systemThemes, submitPreferences, dispatch, colorScheme, profile]);\n\n // It's easier to inline styles from preferences for these\n // than spamming the entire app with all custom properties right now\n const doStyles = useCallback((t: ThemeKeyType | \"auto\") => {\n // For some reason Typescript will just refuse to create dts files\n // for the packages if we set it to CSSProperties…\n let cssProps: any = {\n boxSizing: \"border-box\",\n color: \"#999999\"\n };\n\n if (t === \"auto\") {\n if (profile === \"audio\" && coverTheme) {\n cssProps.background = coverTheme.background;\n cssProps.color = coverTheme.text;\n cssProps.border = `1px solid ${ coverTheme.subdue }`;\n } else if (systemThemes !== undefined) {\n cssProps.background = isRTL\n ? `linear-gradient(148deg, ${ themeKeys[systemThemes.dark].background } 48%, ${ themeKeys[systemThemes.light].background } 100%)`\n : `linear-gradient(148deg, ${ themeKeys[systemThemes.light].background } 0%, ${ themeKeys[systemThemes.dark].background } 48%)`;\n cssProps.color = \"#ffffff\";\n cssProps.border = `1px solid ${ themeKeys[systemThemes.light].subdue }`;\n } else {\n cssProps.display = \"none\";\n }\n } else {\n const theme = themeKeys[t as string];\n if (theme) {\n cssProps.background = theme.background;\n cssProps.color = theme.text;\n cssProps.border = `1px solid ${theme.subdue}`;\n }\n };\n\n return cssProps;\n }, [themeKeys, systemThemes, isRTL, profile, coverTheme]);\n\n // Edge case where the value stored is auto, but the array doesn't have it\n useEffect(() => {\n if (theme === \"auto\" && !themeItems.current.includes(theme)) {\n updatePreference(themeItems.current[0]);\n }\n }, [theme, updatePreference]);\n\n return (\n <>\n <StatefulRadioGroup\n ref={ radioGroupRef }\n standalone={ true }\n label={ t(\"reader.preferences.themes.title\") }\n value={ theme }\n onChange={ async (val) => await updatePreference(val as ThemeKeyType) }\n useGraphicalNavigation={ false }\n >\n <div\n ref={ radioGroupWrapperRef }\n className={ classNames(settingsStyles.radioWrapper, settingsStyles.themesWrapper)\n }>\n { themeItems.current.map(( themeItem ) =>\n <Radio\n className={ classNames(\n settingsStyles.radio,\n settingsStyles.themeRadio\n ) }\n value={ themeItem }\n id={ themeItem }\n key={ themeItem }\n style={ doStyles(themeItem) }\n onKeyDown={ onKeyDown }\n >\n <span>\n { t(`reader.preferences.themes.${ themeItem }`, { defaultValue: themeItem }) }\n { themeItem === theme && <CheckIcon aria-hidden=\"true\" focusable=\"false\" /> }\n </span>\n </Radio>\n ) }\n </div>\n </StatefulRadioGroup>\n </>\n )\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\n\nimport { StatefulSettingsItemProps } from \"../models/settings\";\n\nimport { StatefulNumberField } from \"../StatefulNumberField\";\nimport { StatefulSlider } from \"../StatefulSlider\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { EpubPreferencesEditor } from \"@readium/navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { usePlaceholder } from \"../hooks/usePlaceholder\";\nimport { useEffectiveRange } from \"../hooks/useEffectiveRange\";\n\nexport const StatefulWordSpacing = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const config = preferences.settings.keys[ThSettingsKeys.wordSpacing];\n\n const { getSetting, submitPreferences, preferencesEditor } = useNavigator().visual;\n\n const { range } = useEffectiveRange(config.range, (preferencesEditor as EpubPreferencesEditor | undefined)?.wordSpacing?.supportedRange);\n\n const wordSpacingRangeConfig = {\n variant: config.variant,\n placeholder: config.placeholder,\n range,\n step: config.step\n };\n\n const placeholderText = usePlaceholder(wordSpacingRangeConfig.placeholder, wordSpacingRangeConfig.range, \"percent\");\n\n const { getEffectiveSpacingValue, setWordSpacing, canBeReset } = useSpacingPresets();\n\n const wordSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.wordSpacing);\n \n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n wordSpacing: Array.isArray(value) ? value[0] : value\n });\n \n setWordSpacing(getSetting(\"wordSpacing\"));\n }, [submitPreferences, getSetting, setWordSpacing]);\n\n return (\n <>\n { wordSpacingRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField \n standalone={ standalone }\n label={ t(\"reader.preferences.wordSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ wordSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value) } \n onReset={ canBeReset(ThSpacingSettingsKeys.wordSpacing) ? async() => await updatePreference(null) : undefined }\n range={ wordSpacingRangeConfig.range }\n step={ wordSpacingRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{ style: \"percent\" }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ standalone }\n displayTicks={ wordSpacingRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.preferences.wordSpacing\") }\n placeholder={ placeholderText }\n defaultValue={ undefined } \n value={ wordSpacing ?? undefined } \n onChange={ async(value) => await updatePreference(value as number) } \n onReset={ canBeReset(ThSpacingSettingsKeys.wordSpacing) ? async() => await updatePreference(null) : undefined }\n range={ wordSpacingRangeConfig.range }\n step={ wordSpacingRangeConfig.step }\n formatOptions={{ style: \"percent\" }}\n /> \n }\n </>\n )\n}","import * as React from \"react\";\nconst SvgTextDecrease = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"m40-200 210-560h100l210 560h-96l-51-143H187l-51 143H40Zm176-224h168l-82-232h-4l-82 232Zm384-16v-80h320v80H600Z\" /></svg>;\nexport default SvgTextDecrease;","import * as React from \"react\";\nconst SvgTextIncrease = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"m40-200 210-560h100l210 560h-96l-51-143H187l-51 143H40Zm176-224h168l-82-232h-4l-82 232Zm504 104v-120H600v-80h120v-120h80v120h120v80H800v120h-80Z\" /></svg>;\nexport default SvgTextIncrease;","import * as React from \"react\";\nconst SvgZoomOut = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400ZM280-540v-80h200v80H280Z\" /></svg>;\nexport default SvgZoomOut;","import * as React from \"react\";\nconst SvgZoomIn = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Zm-40-60v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\" /></svg>;\nexport default SvgZoomIn;","\"use client\";\n\nimport React, { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant } from \"@/preferences\";\n\nimport Decrease from \"./assets/icons/text_decrease.svg\";\nimport Increase from \"./assets/icons/text_increase.svg\";\nimport ZoomOut from \"./assets/icons/zoom_out.svg\";\nimport ZoomIn from \"./assets/icons/zoom_in.svg\";\n\nimport { StatefulSlider } from \"./StatefulSlider\";\nimport { StatefulNumberField } from \"./StatefulNumberField\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useNavigator } from \"@/core/Navigator/hooks\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { usePlaceholder } from \"./hooks/usePlaceholder\";\nimport { useEffectiveRange } from \"./hooks/useEffectiveRange\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setFontSize } from \"@/lib/settingsReducer\";\nimport { setWebPubZoom } from \"@/lib/webPubSettingsReducer\";\nimport { EpubPreferencesEditor, WebPubPreferencesEditor } from \"@readium/navigator\";\n\nexport const StatefulZoom = () => {\n const { preferences } = usePreferences();\n const { t } = useI18n();\n\n const readerProfile = useAppSelector((state) => state.reader.profile);\n const isFXL = useAppSelector((state) => state.publication.isFXL);\n const fontSize = useAppSelector((state) => state.settings.fontSize) || 1;\n const webPubZoom = useAppSelector((state) => state.webPubSettings.zoom) || 1;\n const derivedState = readerProfile === \"webPub\" ? webPubZoom : fontSize;\n \n const dispatch = useAppDispatch();\n \n const { \n getSetting, \n submitPreferences,\n preferencesEditor \n } = useNavigator().visual;\n\n // Somewhat wrong to cast here, although we control this\n // because we have a component that is relying on two different things\n // so TypeScript has a very hard time with this.\n // TODO: FIX root cause of the issue\n const preferenceEditorProperty = readerProfile === \"webPub\" \n ? (preferencesEditor as WebPubPreferencesEditor)?.zoom \n : isFXL \n ? (preferencesEditor as any)?.zoom \n : (preferencesEditor as EpubPreferencesEditor)?.fontSize;\n\n const updatePreference = useCallback(async (value: number | number[]) => {\n if (readerProfile === \"webPub\") {\n await submitPreferences({ zoom: Array.isArray(value) ? value[0] : value });\n dispatch(setWebPubZoom(getSetting(\"zoom\")));\n } else {\n await submitPreferences({ fontSize: Array.isArray(value) ? value[0] : value });\n dispatch(setFontSize(getSetting(\"fontSize\")));\n }\n }, [readerProfile, submitPreferences, getSetting, dispatch]);\n\n const zoomConfig = preferences.settings.keys[ThSettingsKeys.zoom];\n const { range: effectiveRange } = useEffectiveRange(zoomConfig.range, preferenceEditorProperty?.supportedRange);\n\n const zoomRangeConfig = {\n variant: zoomConfig.variant,\n placeholder: zoomConfig.placeholder,\n range: effectiveRange,\n step: zoomConfig.step\n }\n\n const placeholderText = usePlaceholder(zoomRangeConfig.placeholder, zoomRangeConfig.range);\n\n return (\n <>\n { zoomRangeConfig.variant === ThSettingsRangeVariant.numberField \n ? <StatefulNumberField\n standalone={ true }\n defaultValue={ 1 } \n value={ derivedState } \n onChange={ async(value) => await updatePreference(value) } \n label={ isFXL ? t(\"reader.preferences.zoom\") : t(\"reader.preferences.fontSize\") }\n placeholder={ placeholderText }\n range={ zoomRangeConfig.range }\n step={ zoomRangeConfig.step }\n steppers={{\n decrementIcon: isFXL ? ZoomOut : Decrease,\n decrementLabel: t(\"common.actions.decrease\"),\n incrementIcon: isFXL ? ZoomIn : Increase,\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{ style: \"percent\" }} \n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n : <StatefulSlider\n standalone={ true }\n displayTicks={ zoomRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n defaultValue={ 1 } \n value={ derivedState } \n onChange={ async(value) => await updatePreference(value as number) } \n label={ isFXL ? t(\"reader.preferences.zoom\") : t(\"reader.preferences.fontSize\") }\n placeholder={ placeholderText }\n range={ zoomRangeConfig.range }\n step={ zoomRangeConfig.step }\n formatOptions={{ style: \"percent\" }} \n />\n } \n </>\n );\n};","import { ThPlugin } from \"../PluginRegistry\";\nimport { ThActionsKeys, ThSettingsKeys } from \"@/preferences/models\";\n\nimport { StatefulFullscreenTrigger } from \"../../Actions/Fullscreen/StatefulFullscreenTrigger\";\nimport { StatefulJumpToPositionTrigger } from \"../../Actions/JumpToPosition/StatefulJumpToPositionTrigger\";\nimport { StatefulJumpToPositionContainer } from \"../../Actions/JumpToPosition/StatefulJumpToPositionContainer\";\nimport { StatefulSettingsTrigger } from \"../../Actions/Settings/StatefulSettingsTrigger\";\nimport { StatefulVisualSettingsContainer } from \"../../Actions/Settings/StatefulVisualSettingsContainer\";\nimport { StatefulTocTrigger } from \"../../Actions/Toc/StatefulTocTrigger\";\nimport { StatefulTocContainer } from \"../../Actions/Toc/StatefulTocContainer\";\n\nimport { StatefulColumns } from \"../../Epub/Settings/StatefulColumns\";\nimport { StatefulFontFamily } from \"../../Settings/Text/StatefulFontFamily\";\nimport { UnstableStatefulFontWeight } from \"../../Settings/Text/StatefulFontWeight\";\nimport { StatefulHyphens } from \"../../Settings/Text/StatefulHyphens\";\nimport { StatefulLayout } from \"../../Epub/Settings/StatefulLayout\";\nimport { StatefulLetterSpacing } from \"../../Settings/Spacing/StatefulLetterSpacing\";\nimport { StatefulLineHeight } from \"../../Settings/Spacing/StatefulLineHeight\";\nimport { StatefulParagraphIndent } from \"../../Settings/Spacing/StatefulParagraphIndent\";\nimport { StatefulParagraphSpacing } from \"../../Settings/Spacing/StatefulParagraphSpacing\";\nimport { StatefulPublisherStyles } from \"../../Settings/StatefulPublisherStyles\";\nimport { StatefulSpacingGroup } from \"../../Settings/Spacing/StatefulSpacingGroup\";\nimport { StatefulSpacingPresets } from \"../../Settings/Spacing/StatefulSpacingPresets\";\nimport { StatefulTextAlign } from \"../../Settings/Text/StatefulTextAlign\";\nimport { StatefulTextGroup } from \"../../Settings/Text/StatefulTextGroup\";\nimport { StatefulTextNormalize } from \"../../Settings/Text/StatefulTextNormalize\";\nimport { StatefulTheme } from \"../../Settings/StatefulTheme\";\nimport { StatefulWordSpacing } from \"../../Settings/Spacing/StatefulWordSpacing\";\nimport { StatefulZoom } from \"../../Settings/StatefulZoom\";\n\nexport const createDefaultPlugin = (): ThPlugin => {\n return {\n id: \"core\",\n name: \"Core Components\",\n description: \"Default components for Thorium Web Epub StatefulReader\",\n version: \"1.3.0\",\n components: {\n actions: {\n [ThActionsKeys.fullscreen]: {\n Trigger: StatefulFullscreenTrigger\n },\n [ThActionsKeys.jumpToPosition]: {\n Trigger: StatefulJumpToPositionTrigger,\n Target: StatefulJumpToPositionContainer\n },\n [ThActionsKeys.settings]: {\n Trigger: StatefulSettingsTrigger,\n Target: StatefulVisualSettingsContainer\n },\n [ThActionsKeys.toc]: {\n Trigger: StatefulTocTrigger,\n Target: StatefulTocContainer\n }\n },\n settings: {\n [ThSettingsKeys.columns]: {\n Comp: StatefulColumns\n },\n [ThSettingsKeys.fontFamily]: {\n Comp: StatefulFontFamily,\n type: \"text\"\n },\n [ThSettingsKeys.fontWeight]: {\n Comp: UnstableStatefulFontWeight,\n type: \"text\"\n },\n [ThSettingsKeys.hyphens]: {\n Comp: StatefulHyphens,\n type: \"text\"\n },\n [ThSettingsKeys.layout]: {\n Comp: StatefulLayout\n },\n [ThSettingsKeys.letterSpacing]: {\n Comp: StatefulLetterSpacing,\n type: \"spacing\"\n },\n [ThSettingsKeys.lineHeight]: {\n Comp: StatefulLineHeight,\n type: \"spacing\"\n },\n [ThSettingsKeys.paragraphIndent]: {\n Comp: StatefulParagraphIndent,\n type: \"spacing\"\n },\n [ThSettingsKeys.paragraphSpacing]: {\n Comp: StatefulParagraphSpacing,\n type: \"spacing\"\n },\n [ThSettingsKeys.publisherStyles]: {\n Comp: StatefulPublisherStyles,\n type: \"spacing\"\n },\n [ThSettingsKeys.spacingGroup]: {\n Comp: StatefulSpacingGroup,\n },\n [ThSettingsKeys.spacingPresets]: {\n Comp: StatefulSpacingPresets,\n type: \"spacing\"\n },\n [ThSettingsKeys.textAlign]: {\n Comp: StatefulTextAlign,\n type: \"text\"\n },\n [ThSettingsKeys.textGroup]: {\n Comp: StatefulTextGroup\n },\n [ThSettingsKeys.textNormalize]: {\n Comp: StatefulTextNormalize,\n type: \"text\"\n },\n [ThSettingsKeys.theme]: {\n Comp: StatefulTheme\n },\n [ThSettingsKeys.wordSpacing]: {\n Comp: StatefulWordSpacing,\n type: \"spacing\"\n },\n [ThSettingsKeys.zoom]: {\n Comp: StatefulZoom\n }\n }\n }\n };\n};","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useNumberFormatter } from \"react-aria\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\nimport settingsStyles from \"./assets/styles/thorium-web.reader.settings.module.css\";\n\nimport { ThSliderWithPresets, ThSliderWithPresetsProps } from \"@/core/Components/Settings/ThSliderWithPresets\";\n\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useGridNavigation } from \"./hooks/useGridNavigation\";\nimport { ThLayoutDirection } from \"@/preferences/models\";\n\nimport classNames from \"classnames\";\n\nexport interface StatefulSliderWithPresetsProps extends Omit<ThSliderWithPresetsProps, \"compounds\"> {\n standalone?: boolean;\n placeholder?: string;\n resetLabel?: string;\n displayTicks?: boolean;\n hideOutput?: boolean;\n onEscape?: () => void;\n}\n\nexport const StatefulSliderWithPresets = ({\n standalone,\n label,\n placeholder,\n displayTicks = false,\n hideOutput = false,\n value,\n resetLabel,\n presets,\n formatValue,\n onEscape,\n ...props\n}: StatefulSliderWithPresetsProps) => {\n const { t } = useI18n();\n const { theming, direction } = useSharedPreferences();\n const numberFormatter = useNumberFormatter(props.formatOptions);\n const resolvedFormatValue = formatValue ?? (props.formatOptions ? (v: number) => numberFormatter.format(v) : undefined);\n const tooltipDelay = theming.icon.tooltipDelay;\n\n const presetsListRef = useRef<HTMLDivElement | null>(null);\n const presetsRef = useRef(presets);\n presetsRef.current = presets;\n\n const currentScalarValue = Array.isArray(value) ? value[0] : value;\n\n const { onKeyDown } = useGridNavigation({\n containerRef: presetsListRef,\n items: presetsRef,\n currentValue: currentScalarValue,\n onChange: (v) => props.onChange?.([v]),\n isRTL: direction === ThLayoutDirection.rtl,\n onEscape,\n onFocus: (v) => {\n const el = presetsListRef.current?.querySelector(`input[value=\"${ v }\"]`) as HTMLElement | null;\n el?.focus();\n },\n });\n\n const style = {\n ...(displayTicks && props.range && props.step ? {\n \"--th-slider-ticks\": (() => {\n const [min, max] = [Math.min(...props.range), Math.max(...props.range)];\n const step = props.step || 1;\n const range = max - min;\n const totalIntervals = range / step;\n return Math.ceil(totalIntervals);\n })()\n } : {}),\n ...props.style\n };\n\n return (\n <ThSliderWithPresets\n presets={ presets }\n formatValue={ resolvedFormatValue }\n value={ value }\n { ...props }\n { ...(standalone ? { label: label } : { \"aria-label\": label }) }\n placeholder={ placeholder }\n className={ classNames(\n settingsStyles.slider,\n displayTicks && settingsStyles.sliderWithTicks\n ) }\n style={ style }\n compounds={{\n wrapper: {\n className: classNames(\n settingsStyles.sliderWithPresetsWrapper,\n standalone && settingsStyles.group\n )\n },\n slider: {\n wrapper: {\n className: settingsStyles.sliderWrapper\n },\n label: {\n className: classNames(settingsStyles.label, settingsStyles.sliderLabel)\n },\n output: {\n className: settingsStyles.sliderOutput,\n ...(hideOutput && { style: () => ({ display: \"none\" }) })\n },\n placeholder: {\n className: settingsStyles.sliderPlaceholder\n },\n track: {\n className: settingsStyles.sliderTrack\n },\n thumb: {\n className: settingsStyles.sliderThumb\n },\n reset: {\n className: classNames(readerSharedUI.icon, settingsStyles.resetButton),\n compounds: {\n tooltipTrigger: {\n delay: tooltipDelay,\n closeDelay: tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: resetLabel ?? t(\"common.actions.reset\")\n }\n }\n },\n presetsList: {\n \"aria-label\": label,\n },\n presetsWrapper: {\n ref: presetsListRef,\n className: settingsStyles.sliderWithPresetsRadioGroup,\n },\n preset: {\n className: settingsStyles.sliderWithPresetsRadio,\n onKeyDown\n }\n }}\n />\n );\n};\n","\"use client\";\n\nimport { useNumberFormatter } from \"react-aria\";\n\nimport { StatefulRadioGroup, StatefulRadioGroupProps } from \"./StatefulRadioGroup\";\n\nexport interface StatefulPresetsGroupProps extends Omit<StatefulRadioGroupProps, \"items\" | \"value\" | \"onChange\"> {\n presets: number[];\n value?: number;\n formatOptions?: Intl.NumberFormatOptions;\n formatValue?: (value: number) => string;\n onChange?: (value: number) => void;\n}\n\nexport const StatefulPresetsGroup = ({\n presets,\n value,\n formatOptions,\n formatValue,\n onChange,\n ...props\n}: StatefulPresetsGroupProps) => {\n const numberFormatter = useNumberFormatter(formatOptions);\n const resolvedFormatValue = formatValue ?? (formatOptions ? (v: number) => numberFormatter.format(v) : String);\n\n const items = presets.map((p) => ({\n id: String(p),\n value: String(p),\n label: resolvedFormatValue(p),\n }));\n\n const radioValue = value !== undefined && presets.includes(value) ? String(value) : \"\";\n\n const handleChange = (v: string) => {\n onChange?.(parseFloat(v));\n };\n\n return (\n <StatefulRadioGroup\n { ...props }\n items={ items }\n value={ radioValue }\n onChange={ handleChange }\n />\n );\n};\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsRangeVariant } from \"@/preferences\";\n\nimport { ThActionsKeys, ThAudioKeys } from \"@/preferences/models\";\n\nimport { StatefulNumberField } from \"../../Settings/StatefulNumberField\";\nimport { StatefulSlider } from \"../../Settings/StatefulSlider\";\nimport { StatefulSliderWithPresets } from \"../../Settings/StatefulSliderWithPresets\";\nimport { StatefulPresetsGroup } from \"../../Settings/StatefulPresetsGroup\";\n\nimport { useNavigator } from \"@/core/Navigator/hooks\";\nimport { usePlaceholder } from \"../../Settings/hooks/usePlaceholder\";\nimport { useEffectiveRange } from \"../../Settings/hooks/useEffectiveRange\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib\";\nimport { setSkipBackwardInterval } from \"@/lib/audioSettingsReducer\";\nimport { defaultAudioSkipBackwardInterval } from \"@/preferences/models/audio\";\n\nexport interface StatefulAudioSkipBackwardIntervalProps {\n standalone?: boolean;\n}\n\nexport const StatefulAudioSkipBackwardInterval = ({\n standalone = true\n}: StatefulAudioSkipBackwardIntervalProps) => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n\n const skipBackwardInterval = useAppSelector(state => state.audioSettings.skipBackwardInterval);\n const dispatch = useAppDispatch();\n const { submitPreferences, getSetting, preferencesEditor } = useNavigator().media;\n\n const config = preferences.settings.keys[ThAudioKeys.skipBackwardInterval] ?? defaultAudioSkipBackwardInterval;\n\n const { range, presets } = useEffectiveRange(config.range, preferencesEditor?.skipBackwardInterval?.supportedRange, config.presets);\n\n const skipBackwardIntervalRangeConfig = {\n variant: config.variant,\n placeholder: config.placeholder,\n range,\n step: config.step\n };\n\n const placeholderText = usePlaceholder(skipBackwardIntervalRangeConfig.placeholder, skipBackwardIntervalRangeConfig.range);\n\n const updatePreference = useCallback(async (value: number | number[]) => {\n const val = Array.isArray(value) ? value[0] : value;\n await submitPreferences({ skipBackwardInterval: val });\n const effectiveSkipBackwardInterval = getSetting(\"skipBackwardInterval\");\n dispatch(setSkipBackwardInterval(effectiveSkipBackwardInterval));\n }, [submitPreferences, getSetting, dispatch]);\n\n if (skipBackwardIntervalRangeConfig.variant === ThSettingsRangeVariant.numberField) {\n return (\n <StatefulNumberField\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipBackwardInterval\") }\n placeholder={ placeholderText }\n defaultValue={ undefined }\n value={ skipBackwardInterval ?? undefined }\n onChange={ updatePreference }\n onReset={ undefined }\n range={ skipBackwardIntervalRangeConfig.range || [1, 60] }\n step={ skipBackwardIntervalRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={ { style: \"unit\", unit: \"second\" } }\n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n );\n }\n\n if (skipBackwardIntervalRangeConfig.variant === ThSettingsRangeVariant.presetsGroup) {\n return (\n <StatefulPresetsGroup\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipBackwardInterval\") }\n presets={ presets || [] }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n onEscape={ () => dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false })) }\n value={ skipBackwardInterval ?? undefined }\n onChange={ (v) => updatePreference(v) }\n />\n );\n }\n\n if (skipBackwardIntervalRangeConfig.variant === ThSettingsRangeVariant.sliderWithPresets) {\n return (\n <StatefulSliderWithPresets\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipBackwardInterval\") }\n placeholder={ placeholderText }\n presets={ presets || [] }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n onEscape={ () => dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false })) }\n value={ skipBackwardInterval ?? undefined }\n onChange={ updatePreference }\n range={ skipBackwardIntervalRangeConfig.range }\n step={ skipBackwardIntervalRangeConfig.step }\n />\n );\n }\n\n return (\n <StatefulSlider\n standalone={ standalone }\n displayTicks={ skipBackwardIntervalRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.playback.preferences.audio.skipBackwardInterval\") }\n placeholder={ placeholderText }\n defaultValue={ undefined }\n value={ skipBackwardInterval ?? undefined }\n onChange={ updatePreference }\n range={ skipBackwardIntervalRangeConfig.range }\n step={ skipBackwardIntervalRangeConfig.step }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n />\n );\n};\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsRangeVariant } from \"@/preferences\";\n\nimport { ThActionsKeys, ThAudioKeys } from \"@/preferences/models\";\n\nimport { StatefulNumberField } from \"../../Settings/StatefulNumberField\";\nimport { StatefulSlider } from \"../../Settings/StatefulSlider\";\nimport { StatefulSliderWithPresets } from \"../../Settings/StatefulSliderWithPresets\";\nimport { StatefulPresetsGroup } from \"../../Settings/StatefulPresetsGroup\";\n\nimport { useNavigator } from \"@/core/Navigator/hooks\";\nimport { usePlaceholder } from \"../../Settings/hooks/usePlaceholder\";\nimport { useEffectiveRange } from \"../../Settings/hooks/useEffectiveRange\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib\";\nimport { setSkipForwardInterval } from \"@/lib/audioSettingsReducer\";\nimport { defaultAudioSkipForwardInterval } from \"@/preferences/models/audio\";\n\nexport interface StatefulAudioSkipForwardIntervalProps {\n standalone?: boolean;\n}\n\nexport const StatefulAudioSkipForwardInterval = ({\n standalone = true\n}: StatefulAudioSkipForwardIntervalProps) => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n\n const skipForwardInterval = useAppSelector(state => state.audioSettings.skipForwardInterval);\n const dispatch = useAppDispatch();\n const { submitPreferences, getSetting, preferencesEditor } = useNavigator().media;\n\n const config = preferences.settings.keys[ThAudioKeys.skipForwardInterval] ?? defaultAudioSkipForwardInterval;\n\n const { range, presets } = useEffectiveRange(config.range, preferencesEditor?.skipForwardInterval?.supportedRange, config.presets);\n\n const skipForwardIntervalRangeConfig = {\n variant: config.variant,\n placeholder: config.placeholder,\n range,\n step: config.step\n };\n\n const placeholderText = usePlaceholder(skipForwardIntervalRangeConfig.placeholder, skipForwardIntervalRangeConfig.range);\n\n const updatePreference = useCallback(async (value: number | number[]) => {\n const val = Array.isArray(value) ? value[0] : value;\n await submitPreferences({ skipForwardInterval: val });\n const effectiveSkipForwardInterval = getSetting(\"skipForwardInterval\");\n dispatch(setSkipForwardInterval(effectiveSkipForwardInterval));\n }, [submitPreferences, getSetting, dispatch]);\n\n if (skipForwardIntervalRangeConfig.variant === ThSettingsRangeVariant.numberField) {\n return (\n <StatefulNumberField\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipForwardInterval\") }\n placeholder={ placeholderText }\n defaultValue={ undefined }\n value={ skipForwardInterval }\n onChange={ updatePreference }\n onReset={ undefined }\n range={ skipForwardIntervalRangeConfig.range || [1, 60] }\n step={ skipForwardIntervalRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n );\n }\n\n if (skipForwardIntervalRangeConfig.variant === ThSettingsRangeVariant.presetsGroup) {\n return (\n <StatefulPresetsGroup\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipForwardInterval\") }\n presets={ presets || [] }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n onEscape={ () => dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false })) }\n value={ skipForwardInterval }\n onChange={ (v) => updatePreference(v) }\n />\n );\n }\n\n if (skipForwardIntervalRangeConfig.variant === ThSettingsRangeVariant.sliderWithPresets) {\n return (\n <StatefulSliderWithPresets\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipForwardInterval\") }\n placeholder={ placeholderText }\n presets={ presets || [] }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n onEscape={ () => dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false })) }\n value={ skipForwardInterval }\n onChange={ updatePreference }\n range={ skipForwardIntervalRangeConfig.range }\n step={ skipForwardIntervalRangeConfig.step }\n />\n );\n }\n\n return (\n <StatefulSlider\n standalone={ standalone }\n displayTicks={ skipForwardIntervalRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.playback.preferences.audio.skipForwardInterval\") }\n placeholder={ placeholderText }\n value={ skipForwardInterval }\n onChange={ updatePreference }\n range={ skipForwardIntervalRangeConfig.range }\n step={ skipForwardIntervalRangeConfig.step }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n />\n );\n};\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsRangeVariant } from \"@/preferences\";\n\nimport { ThActionsKeys, ThAudioKeys } from \"@/preferences/models\";\n\nimport { StatefulNumberField } from \"../../Settings/StatefulNumberField\";\nimport { StatefulSlider } from \"../../Settings/StatefulSlider\";\nimport { StatefulSliderWithPresets } from \"../../Settings/StatefulSliderWithPresets\";\nimport { StatefulPresetsGroup } from \"../../Settings/StatefulPresetsGroup\";\n\nimport { useNavigator } from \"@/core/Navigator/hooks\";\nimport { usePlaceholder } from \"../../Settings/hooks/usePlaceholder\";\nimport { useEffectiveRange } from \"../../Settings/hooks/useEffectiveRange\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib\";\nimport { setSkipInterval } from \"@/lib/audioSettingsReducer\";\nimport { defaultAudioSkipInterval } from \"@/preferences/models/audio\";\n\nexport interface StatefulAudioSkipIntervalProps {\n standalone?: boolean;\n}\n\nexport const StatefulAudioSkipInterval = ({\n standalone = true\n}: StatefulAudioSkipIntervalProps) => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n\n const skipInterval = useAppSelector(state => state.audioSettings.skipInterval);\n const dispatch = useAppDispatch();\n\n const { submitPreferences, getSetting, preferencesEditor } = useNavigator().media;\n\n const config = preferences.settings.keys[ThAudioKeys.skipInterval] ?? defaultAudioSkipInterval;\n\n const { range, presets } = useEffectiveRange(config.range, preferencesEditor?.skipForwardInterval?.supportedRange, config.presets);\n\n const skipIntervalRangeConfig = {\n variant: config.variant,\n placeholder: config.placeholder,\n range,\n step: config.step\n };\n\n const placeholderText = usePlaceholder(skipIntervalRangeConfig.placeholder, skipIntervalRangeConfig.range);\n\n const updatePreference = useCallback(async (value: number | number[]) => {\n const val = Array.isArray(value) ? value[0] : value;\n await submitPreferences({\n skipForwardInterval: val,\n skipBackwardInterval: val\n });\n dispatch(setSkipInterval(getSetting(\"skipForwardInterval\")));\n }, [submitPreferences, getSetting, dispatch]);\n\n if (skipIntervalRangeConfig.variant === ThSettingsRangeVariant.numberField) {\n return (\n <StatefulNumberField\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipInterval\") }\n placeholder={ placeholderText }\n defaultValue={ undefined }\n value={ skipInterval }\n onChange={ updatePreference }\n onReset={ undefined }\n range={ skipIntervalRangeConfig.range || [1, 60] }\n step={ skipIntervalRangeConfig.step }\n steppers={{\n decrementLabel: t(\"common.actions.decrease\"),\n incrementLabel: t(\"common.actions.increase\")\n }}\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n isWheelDisabled={ true }\n isVirtualKeyboardDisabled={ true }\n />\n );\n }\n\n if (skipIntervalRangeConfig.variant === ThSettingsRangeVariant.presetsGroup) {\n return (\n <StatefulPresetsGroup\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipInterval\") }\n presets={ presets || [] }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n onEscape={ () => dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false })) }\n value={ skipInterval }\n onChange={ (v) => updatePreference(v) }\n />\n );\n }\n\n if (skipIntervalRangeConfig.variant === ThSettingsRangeVariant.sliderWithPresets) {\n return (\n <StatefulSliderWithPresets\n standalone={ standalone }\n label={ t(\"reader.playback.preferences.audio.skipInterval\") }\n placeholder={ placeholderText }\n presets={ presets || [] }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n onEscape={ () => dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false })) }\n value={ skipInterval }\n onChange={ updatePreference }\n range={ skipIntervalRangeConfig.range }\n step={ skipIntervalRangeConfig.step }\n />\n );\n }\n\n return (\n <StatefulSlider\n standalone={ standalone }\n displayTicks={ skipIntervalRangeConfig.variant === ThSettingsRangeVariant.incrementedSlider }\n label={ t(\"reader.playback.preferences.audio.skipInterval\") }\n placeholder={ placeholderText }\n value={ skipInterval }\n onChange={ updatePreference }\n range={ skipIntervalRangeConfig.range }\n step={ skipIntervalRangeConfig.step }\n formatOptions={{ style: \"unit\", unit: \"second\" }}\n />\n );\n};\n\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { StatefulSwitch } from \"../../Settings/StatefulSwitch\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useNavigator } from \"@/core/Navigator\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport { setAutoPlay } from \"@/lib/audioSettingsReducer\";\n\nexport interface StatefulAudioAutoPlayProps {\n standalone?: boolean;\n}\n\nexport const StatefulAudioAutoPlay = ({\n standalone = true\n}: StatefulAudioAutoPlayProps) => {\n const { t } = useI18n();\n\n const autoPlay = useAppSelector(state => state.audioSettings.autoPlay);\n const dispatch = useAppDispatch();\n const { submitPreferences, getSetting } = useNavigator().media;\n\n const updatePreference = useCallback(async (isSelected: boolean) => {\n await submitPreferences({ autoPlay: isSelected });\n const effectiveAutoPlay = getSetting(\"autoPlay\");\n dispatch(setAutoPlay(effectiveAutoPlay));\n }, [submitPreferences, getSetting, dispatch]);\n\n return (\n <StatefulSwitch\n standalone={ standalone }\n heading={ t(\"reader.playback.preferences.autoPlay.title\") }\n label={ t(\"reader.playback.preferences.autoPlay.label\") }\n isSelected={ autoPlay }\n onChange={ updatePreference }\n />\n );\n};\n","import * as React from \"react\";\nconst SvgVolumeUp = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M560-131v-82q90-26 145-100t55-168q0-94-55-168T560-749v-82q124 28 202 125.5T840-481q0 127-78 224.5T560-131ZM120-360v-240h160l200-200v640L280-360H120Zm440 40v-322q47 22 73.5 66t26.5 96q0 51-26.5 94.5T560-320ZM400-606l-86 86H200v80h114l86 86v-252ZM300-480Z\" /></svg>;\nexport default SvgVolumeUp;","import * as React from \"react\";\nconst SvgVolumeDown = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M200-360v-240h160l200-200v640L360-360H200Zm440 40v-322q45 21 72.5 65t27.5 97q0 53-27.5 96T640-320ZM480-606l-86 86H280v80h114l86 86v-252ZM380-480Z\" /></svg>;\nexport default SvgVolumeDown;","import * as React from \"react\";\nconst SvgVolumeMute = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M280-360v-240h160l200-200v640L440-360H280Zm80-80h114l86 86v-252l-86 86H360v80Zm100-40Z\" /></svg>;\nexport default SvgVolumeMute;","import * as React from \"react\";\nconst SvgVolumeOff = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M792-56 671-177q-25 16-53 27.5T560-131v-82q14-5 27.5-10t25.5-12L480-368v208L280-360H120v-240h128L56-792l56-56 736 736-56 56Zm-8-232-58-58q17-31 25.5-65t8.5-70q0-94-55-168T560-749v-82q124 28 202 125.5T840-481q0 53-14.5 102T784-288ZM650-422l-90-90v-130q47 22 73.5 66t26.5 96q0 15-2.5 29.5T650-422ZM480-592 376-696l104-104v208Zm-80 238v-94l-72-72H200v80h114l86 86Zm-36-130Z\" /></svg>;\nexport default SvgVolumeOff;",".wrapper {\n width: auto;\n}\n\n.button {\n --th-icon-size: calc(var(--audio-icon-base) * (5/4));\n padding: calc(var(--th-icon-size) * (1/4));\n outline: none;\n}\n\n.button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.button[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.sliderTrack {\n position: relative;\n box-sizing: border-box;\n}\n\n.sliderTrack::before {\n content: \"\";\n display: block;\n position: absolute;\n background: var(--th-theme-subdue);\n}\n\n.slider[data-disabled] .sliderTrack::before {\n background: var(--th-theme-disable);\n}\n\n/* Vertical */\n\n.slider[data-orientation=\"vertical\"] .sliderTrack {\n height: 150px;\n width: 30px;\n margin-block: calc(1.25rem / 2);\n}\n\n.slider[data-orientation=\"vertical\"] .sliderTrack::before {\n width: 3px;\n height: 100%;\n left: 50%;\n transform: translateX(-50%);\n}\n\n.slider[data-orientation=\"vertical\"] .sliderThumb {\n left: 50%;\n transform: translateX(-50%);\n}\n\n/* Horizontal */\n\n.slider[data-orientation=\"horizontal\"] {\n max-width: 320px;\n width: 100%;\n}\n\n.slider[data-orientation=\"horizontal\"] .sliderTrack {\n width: 100%;\n height: 30px;\n}\n\n.slider[data-orientation=\"horizontal\"] .sliderTrack::before {\n height: 3px;\n width: 100%;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.slider[data-orientation=\"horizontal\"] .sliderThumb {\n top: 50%;\n transform: translateY(-50%);\n}\n\n/* Thumb shared */\n\n.sliderThumb {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background: var(--th-theme-text);\n border: 2px solid var(--th-theme-subdue);\n}\n\n.slider[data-disabled] .sliderThumb {\n background: var(--th-theme-disable);\n border: 2px solid var(--th-theme-disable);\n}\n\n.sliderThumb[data-dragging] {\n background: var(--th-theme-subdue);\n}\n\n.sliderThumb[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n border: 2px solid var(--th-theme-focus);\n}","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport VolumeUpIcon from \"./assets/icons/volume_up.svg\";\nimport VolumeDownIcon from \"./assets/icons/volume_down.svg\";\nimport VolumeMuteIcon from \"./assets/icons/volume_mute.svg\";\nimport VolumeOffIcon from \"./assets/icons/volume_off.svg\";\n\nimport { ThAudioKeys, ThAudioActionKeys } from \"@/preferences/models\";\nimport { StatefulActionIcon } from \"../../../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulActionTriggerProps } from \"../../../Actions/models/actions\";\n\nimport volumeStyles from \"./assets/styles/thorium-web.volume.module.css\";\n\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useEffectiveRange } from \"../../../Settings/hooks/useEffectiveRange\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { toggleActionOpen } from \"@/lib/actionsReducer\";\nimport { useNavigator } from \"@/core/Navigator\";\n\nexport const StatefulAudioVolumeTrigger = ({ ref }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n const { preferencesEditor } = useNavigator().media;\n\n const volume = useAppSelector(state => state.audioSettings.volume);\n const isTrackReady = useAppSelector(state => state.player.isTrackReady);\n const isStalled = useAppSelector(state => state.player.isStalled);\n const isDisabled = !isTrackReady || isStalled;\n\n const dispatch = useAppDispatch();\n\n const config = preferences.settings.keys[ThAudioKeys.volume];\n const { range } = useEffectiveRange(config.range, preferencesEditor?.volume?.supportedRange);\n\n const VolumeIcon = useMemo(() => {\n if (volume === 0) return VolumeOffIcon;\n const max = Math.max(...range);\n if (volume <= max / 3) return VolumeMuteIcon;\n if (volume <= (max / 3) * 2) return VolumeDownIcon;\n return VolumeUpIcon;\n }, [volume, range]);\n\n return (\n <StatefulActionIcon\n ref={ ref }\n tooltipLabel={ t(\"reader.playback.preferences.audio.volume\") }\n placement=\"top\"\n onPress={ () => dispatch(toggleActionOpen({ key: ThAudioActionKeys.volume })) }\n isDisabled={ isDisabled }\n className={ volumeStyles.button }\n >\n <VolumeIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n );\n};\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThAudioKeys, ThAudioActionKeys, ThSheetTypes } from \"@/preferences/models\";\nimport { ThSlider } from \"@/core/Components/Settings/ThSlider\";\nimport { StatefulActionContainerProps } from \"../../../Actions/models/actions\";\n\nimport volumeStyles from \"./assets/styles/thorium-web.volume.module.css\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useEffectiveRange } from \"../../../Settings/hooks/useEffectiveRange\";\nimport { useDocking } from \"../../../Docking/hooks/useDocking\";\nimport { StatefulSheetWrapper } from \"@/components/Sheets/StatefulSheetWrapper\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setVolume } from \"@/lib/audioSettingsReducer\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulAudioVolumeContainer = ({ triggerRef, placement = \"top\" }: StatefulActionContainerProps) => {\n const volume = useAppSelector(state => state.audioSettings.volume);\n const isOpen = useAppSelector(state => state.actions.keys[ThAudioActionKeys.volume]?.isOpen ?? false);\n\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n\n const dispatch = useAppDispatch();\n const { submitPreferences, getSetting, preferencesEditor } = useNavigator().media;\n\n const config = preferences.settings.keys[ThAudioKeys.volume];\n const { range } = useEffectiveRange(config.range, preferencesEditor?.volume?.supportedRange);\n\n const updatePreference = useCallback(async (value: number | number[]) => {\n const val = Array.isArray(value) ? value[0] : value;\n await submitPreferences({ volume: val });\n const effectiveVolume = getSetting(\"volume\");\n dispatch(setVolume(effectiveVolume));\n }, [submitPreferences, getSetting, dispatch]);\n\n const docking = useDocking(ThAudioActionKeys.volume);\n\n const sliderOrientation = (docking.sheetType === ThSheetTypes.popover || docking.sheetType === ThSheetTypes.compactPopover)\n ? \"vertical\"\n : \"horizontal\";\n\n const setOpen = useCallback((open: boolean) => {\n dispatch(setActionOpen({ key: ThAudioActionKeys.volume, isOpen: open }));\n }, [dispatch]);\n\n return (\n <StatefulSheetWrapper\n sheetType={ docking.sheetType }\n sheetProps={ {\n id: ThAudioActionKeys.volume,\n triggerRef,\n heading: t(\"reader.playback.preferences.audio.volume\"),\n className: volumeStyles.wrapper,\n placement,\n isOpen,\n onOpenChange: setOpen,\n onClosePress: () => setOpen(false),\n docker: docking.getDocker(),\n } }\n >\n <ThSlider\n aria-label={ t(\"reader.playback.preferences.audio.volume\") }\n className={ volumeStyles.slider }\n orientation={ sliderOrientation }\n range={ range }\n step={ config.step }\n value={ volume }\n onChange={ updatePreference }\n compounds={ {\n track: { className: volumeStyles.sliderTrack },\n thumb: { className: volumeStyles.sliderThumb },\n output: { style: () => ({ display: \"none\" }) }\n } }\n />\n </StatefulSheetWrapper>\n );\n};\n","import * as React from \"react\";\nconst SvgSpeed = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M480-316.5q38-.5 56-27.5l224-336-336 224q-27 18-28.5 55t22.5 61q24 24 62 23.5Zm0-483.5q59 0 113.5 16.5T696-734l-76 48q-33-17-68.5-25.5T480-720q-133 0-226.5 93.5T160-400q0 42 11.5 83t32.5 77h552q23-38 33.5-79t10.5-85q0-36-8.5-70T766-540l48-76q30 47 47.5 100T880-406q1 57-13 109t-41 99q-11 18-30 28t-40 10H204q-21 0-40-10t-30-28q-26-45-40-95.5T80-400q0-83 31.5-155.5t86-127Q252-737 325-768.5T480-800Zm7 313Z\" /></svg>;\nexport default SvgSpeed;",".wrapper {\n width: auto;\n}\n\n.button {\n --th-icon-size: calc(var(--audio-icon-base) * (5/4));\n padding: calc(var(--th-icon-size) * (1/4));\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: none;\n}\n\n.button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.button[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.button:has(.label) {\n padding-bottom: calc(var(--th-icon-size) * (2/3));\n}\n\n.label {\n position: absolute;\n bottom: calc(var(--th-icon-size) * (1/4));\n left: 50%;\n transform: translateX(-50%);\n white-space: nowrap;\n line-height: 1;\n font-size: calc(var(--th-icon-size, 24px) * (5/12));\n font-variant-numeric: tabular-nums;\n font-weight: bold;\n}\n\n/* Playback rate - slider with presets variant */\n\n.slider {\n min-width: 260px;\n}\n\n/* Playback rate - number field variant */\n\n.numberfield {\n min-width: 140px;\n display: flex;\n justify-content: center;\n}","\"use client\";\n\nimport SpeedIcon from \"./assets/icons/speed.svg\";\n\nimport { ThAudioActionKeys } from \"@/preferences/models\";\nimport { StatefulActionIcon } from \"../../../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulActionTriggerProps } from \"../../../Actions/models/actions\";\n\nimport playbackStyles from \"./assets/styles/thorium-web.playbackRate.module.css\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { toggleActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulAudioPlaybackRateTrigger = ({ ref }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n\n const playbackRate = useAppSelector(state => state.audioSettings.playbackRate);\n const isTrackReady = useAppSelector(state => state.player.isTrackReady);\n const isStalled = useAppSelector(state => state.player.isStalled);\n const isDisabled = !isTrackReady || isStalled;\n\n const dispatch = useAppDispatch();\n\n return (\n <StatefulActionIcon\n ref={ ref }\n tooltipLabel={ t(\"reader.playback.preferences.playbackRate.descriptive\") }\n placement=\"top\"\n onPress={ () => dispatch(toggleActionOpen({ key: ThAudioActionKeys.playbackRate })) }\n isDisabled={ isDisabled }\n className={ playbackStyles.button }\n >\n <SpeedIcon aria-hidden=\"true\" focusable=\"false\" />\n <span className={ playbackStyles.label } aria-hidden=\"true\">{ playbackRate }×</span>\n </StatefulActionIcon>\n );\n};\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThAudioKeys, ThAudioActionKeys, ThSettingsRangeVariant } from \"@/preferences/models\";\nimport { StatefulSliderWithPresets } from \"../../../Settings/StatefulSliderWithPresets\";\nimport { ThSlider } from \"@/core/Components/Settings/ThSlider\";\nimport { ThNumberField } from \"@/core/Components/Settings/ThNumberField\";\nimport { StatefulActionContainerProps } from \"../../../Actions/models/actions\";\n\nimport playbackStyles from \"./assets/styles/thorium-web.playbackRate.module.css\";\n\nimport { useNavigator } from \"@/core/Navigator/hooks\";\nimport { useEffectiveRange } from \"../../../Settings/hooks/useEffectiveRange\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useDocking } from \"../../../Docking/hooks/useDocking\";\nimport { StatefulSheetWrapper } from \"@/components/Sheets/StatefulSheetWrapper\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setPlaybackRate } from \"@/lib/audioSettingsReducer\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulAudioPlaybackRateContainer = ({ triggerRef, placement = \"top\" }: StatefulActionContainerProps) => {\n const isOpen = useAppSelector(state => state.actions.keys[ThAudioActionKeys.playbackRate]?.isOpen ?? false);\n\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n const playbackRate = useAppSelector(state => state.audioSettings.playbackRate);\n const dispatch = useAppDispatch();\n const { submitPreferences, getSetting, preferencesEditor } = useNavigator().media;\n\n const config = preferences.settings.keys[ThAudioKeys.playbackRate];\n const { range, presets } = useEffectiveRange(config.range, preferencesEditor?.playbackRate?.supportedRange, config.presets);\n\n const updatePreference = useCallback(async (value: number) => {\n await submitPreferences({ playbackRate: value });\n dispatch(setPlaybackRate(getSetting(\"playbackRate\")));\n }, [submitPreferences, getSetting, dispatch]);\n\n const docking = useDocking(ThAudioActionKeys.playbackRate);\n\n const setOpen = useCallback((open: boolean) => {\n dispatch(setActionOpen({ key: ThAudioActionKeys.playbackRate, isOpen: open }));\n }, [dispatch]);\n\n const renderContent = () => {\n if (config.variant === ThSettingsRangeVariant.slider) {\n return (\n <div className={ playbackStyles.slider }>\n <ThSlider\n aria-label={ t(\"reader.playback.preferences.playbackRate.descriptive\") }\n range={ range }\n step={ config.step }\n value={ playbackRate }\n onChange={ (v) => updatePreference(Array.isArray(v) ? v[0] : v) }\n />\n </div>\n );\n }\n\n if (config.variant === ThSettingsRangeVariant.numberField) {\n return (\n <div className={ playbackStyles.numberField }>\n <ThNumberField\n aria-label={ t(\"reader.playback.preferences.playbackRate.descriptive\") }\n range={ range }\n step={ config.step }\n value={ playbackRate }\n onChange={ updatePreference }\n />\n </div>\n );\n }\n\n // Default: sliderWithPresets\n return (\n <div className={ playbackStyles.slider }>\n <StatefulSliderWithPresets\n standalone\n label={ t(\"reader.playback.preferences.playbackRate.descriptive\") }\n presets={ presets || [] }\n formatValue={ (v) => `${v}×` }\n value={ playbackRate }\n onChange={ (v) => updatePreference(Array.isArray(v) ? v[0] : v) }\n range={ range }\n step={ config.step }\n onEscape={ () => setOpen(false) }\n />\n </div>\n );\n };\n\n return (\n <StatefulSheetWrapper\n sheetType={ docking.sheetType }\n sheetProps={ {\n id: ThAudioActionKeys.playbackRate,\n triggerRef,\n heading: t(\"reader.playback.preferences.playbackRate.descriptive\"),\n className: playbackStyles.wrapper,\n placement,\n isOpen,\n onOpenChange: setOpen,\n onClosePress: () => setOpen(false),\n docker: docking.getDocker(),\n } }\n >\n { renderContent() }\n </StatefulSheetWrapper>\n );\n};\n",".button {\n --th-icon-size: calc(var(--audio-icon-base) * (5/4));\n padding: calc(var(--th-icon-size) * (1/4));\n outline: none;\n}\n\n.button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.button[data-disabled] {\n color: var(--th-theme-disable);\n}","\"use client\";\n\nimport TocIcon from \"@/components/Actions/Toc/assets/icons/toc.svg\";\n\nimport { ThAudioActionKeys } from \"@/preferences/models\";\nimport { StatefulActionIcon } from \"../../../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulActionTriggerProps } from \"../../../Actions/models/actions\";\n\nimport audioTocStyles from \"./assets/styles/thorium-web.audioToc.module.css\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { toggleActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulAudioTocTrigger = ({ ref }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n\n const isTrackReady = useAppSelector(state => state.player.isTrackReady);\n const isStalled = useAppSelector(state => state.player.isStalled);\n const isDisabled = !isTrackReady || isStalled;\n\n const dispatch = useAppDispatch();\n\n return (\n <StatefulActionIcon\n ref={ ref }\n tooltipLabel={ t(\"reader.tableOfContents.title\") }\n placement=\"top\"\n onPress={ () => dispatch(toggleActionOpen({ key: ThAudioActionKeys.toc })) }\n isDisabled={ isDisabled }\n className={ audioTocStyles.button }\n >\n <TocIcon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n );\n};\n","\"use client\";\n\nimport { useCallback, useEffect } from \"react\";\n\nimport { Link } from \"@readium/shared\";\nimport { ThAudioActionKeys, ThSheetTypes, ThLayoutDirection } from \"@/preferences/models\";\n\nimport { useTocContent } from \"@/components/Actions/Toc/useTocContent\";\nimport { TocContent } from \"@/components/Actions/Toc/TocContent\";\n\nimport { StatefulSheetWrapper } from \"@/components/Sheets/StatefulSheetWrapper\";\nimport { StatefulActionContainerProps } from \"../../../Actions/models/actions\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { isActiveElement } from \"@/core/Helpers/focusUtilities\";\nimport { useDocking } from \"../../../Docking/hooks/useDocking\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setTocEntry } from \"@/lib/publicationReducer\";\nimport { findTocItemById } from \"@/helpers/buildTocTree\";\nimport { setImmersive, setUserNavigated } from \"@/lib/readerReducer\";\n\nimport { Selection } from \"react-aria-components\";\n\nexport const StatefulAudioTocContainer = ({ triggerRef }: StatefulActionContainerProps) => {\n const { t } = useI18n();\n const { goLink } = useNavigator().unified;\n const dispatch = useAppDispatch();\n\n const isOpen = useAppSelector(state => state.actions.keys[ThAudioActionKeys.toc]?.isOpen ?? false);\n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const tocEntry = unstableTimeline?.toc?.currentEntry ?? undefined;\n const tocEntryId = tocEntry?.id;\n const tocTree = unstableTimeline?.toc?.tree;\n\n const direction = useAppSelector(state => state.reader.direction);\n const isRTL = direction === ThLayoutDirection.rtl;\n\n const docking = useDocking(ThAudioActionKeys.toc);\n const sheetType = docking.sheetType;\n\n const setOpen = useCallback((value: boolean) => {\n dispatch(setActionOpen({ key: ThAudioActionKeys.toc, isOpen: value }));\n }, [dispatch]);\n\n const { expandedKeys, setExpandedKeys, filterValue, setFilterValue, displayedTocTree, treeRef, searchInputRef } =\n useTocContent({ isOpen, tocTree, tocEntry: tocEntryId });\n\n useEffect(() => {\n if (isOpen) {\n const handleEscape = (event: KeyboardEvent) => {\n if ((!isActiveElement(searchInputRef.current) && !filterValue) && event.key === \"Escape\") {\n setOpen(false);\n }\n };\n document.addEventListener(\"keydown\", handleEscape, true);\n return () => document.removeEventListener(\"keydown\", handleEscape, true);\n }\n }, [isOpen, filterValue, searchInputRef, setOpen]);\n\n const handleAction = (keys: Selection) => {\n if (keys === \"all\" || !keys || keys.size === 0) return;\n const key = [...keys][0];\n const el = document.querySelector(`[data-key=${key}]`);\n const href = el?.getAttribute(\"data-href\");\n if (!href) return;\n const matched = findTocItemById(tocTree || [], key as string);\n\n const cb = isOpen && (sheetType === ThSheetTypes.dockedStart || sheetType === ThSheetTypes.dockedEnd)\n ? () => {\n dispatch(setTocEntry(matched || null));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n }\n : () => {\n dispatch(setTocEntry(matched || null));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n setOpen(false);\n };\n\n goLink(new Link({ href }), true, cb);\n };\n\n return (\n <StatefulSheetWrapper\n sheetType={ sheetType }\n sheetProps={ {\n id: ThAudioActionKeys.toc,\n triggerRef,\n heading: t(\"reader.tableOfContents.title\"),\n className: \"\",\n isOpen,\n onOpenChange: setOpen,\n onClosePress: () => setOpen(false),\n docker: docking.getDocker(),\n resetFocus: tocEntryId,\n focusWithinRef: treeRef,\n } }\n >\n <TocContent\n filterValue={ filterValue }\n onFilterChange={ setFilterValue }\n displayedTocTree={ displayedTocTree }\n tocTree={ tocTree }\n tocEntry={ tocEntryId }\n expandedKeys={ expandedKeys }\n onExpandedChange={ setExpandedKeys }\n onSelectionChange={ handleAction }\n isRTL={ isRTL }\n treeRef={ treeRef }\n searchInputRef={ searchInputRef }\n />\n </StatefulSheetWrapper>\n );\n};\n","import * as React from \"react\";\nconst SvgSnooze = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M380-334h200v-60H468l112-126v-54H380v60h114L380-386v52Zm-40.5 225.5q-65.5-28.5-114-77t-77-114Q120-365 120-440t28.5-140.5q28.5-65.5 77-114t114-77Q405-800 480-800t140.5 28.5q65.5 28.5 114 77t77 114Q840-515 840-440t-28.5 140.5q-28.5 65.5-77 114t-114 77Q555-80 480-80t-140.5-28.5ZM480-440ZM224-866l56 56-170 170-56-56 170-170Zm512 0 170 170-56 56-170-170 56-56ZM480-160q117 0 198.5-81.5T760-440q0-117-81.5-198.5T480-720q-117 0-198.5 81.5T200-440q0 117 81.5 198.5T480-160Z\" /></svg>;\nexport default SvgSnooze;",".wrapper {}\n\n.button {\n --th-icon-size: calc(var(--audio-icon-base) * (5/4));\n padding: calc(var(--th-icon-size) * (1/4));\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n outline: none;\n}\n\n.button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.button[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.button:has(.label) {\n padding-bottom: calc(var(--th-icon-size) * (2/3));\n}\n\n.label {\n position: absolute;\n bottom: calc(var(--th-icon-size) * (1/4));\n left: 50%;\n transform: translateX(-50%);\n white-space: nowrap;\n line-height: 1;\n font-size: calc(var(--th-icon-size, 24px) * (5/12));\n font-variant-numeric: tabular-nums;\n font-weight: bold;\n}\n\n.listbox {\n display: flex;\n flex-direction: column;\n gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.listboxItem {\n padding: calc(var(--th-layout-spacing) / 4);\n border-radius: var(--th-layout-radius);\n outline: none;\n cursor: default;\n}\n\n.listboxItem[data-selected] {\n background-color: var(--th-theme-hover);\n font-weight: bold;\n}\n\n.listboxItem[data-hovered]:not([data-selected]) {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.listboxItem[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n/* Sleep timer duration field */\n\n.durationField {\n display: flex;\n flex-direction: column;\n}\n\n.instruction {\n display: block;\n margin: 0 0 var(--th-layout-spacing) 0;\n}\n\n.inputs {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: calc(var(--th-layout-spacing) / 4);\n margin-bottom: var(--th-layout-spacing);\n}\n\n.fieldGroup {\n display: contents;\n}\n\n.fieldInput {\n width: 4ch;\n text-align: center;\n background: transparent;\n border: 2px solid var(--th-theme-subdue);\n border-radius: var(--th-layout-radius);\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n color: var(--th-theme-text);\n font-variant-numeric: tabular-nums;\n font-weight: bold;\n outline: none;\n}\n\n.fieldInput[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.unitLabel {\n margin-inline-end: calc(var(--th-layout-spacing) / 4);\n}\n\n.remaining {\n font-variant-numeric: tabular-nums;\n font-weight: bold;\n margin: 0 0 var(--th-layout-spacing) 0;\n}\n\n.cancelButton {\n margin-top: var(--th-layout-spacing);\n}\n\n/* Start button */\n\n.startButton {\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-icon-size, 24px) * (1/2));\n border-radius: var(--th-layout-radius);\n border: 2px solid var(--th-theme-subdue);\n background: transparent;\n color: var(--th-theme-text);\n cursor: default;\n width: 100%;\n box-sizing: border-box;\n text-align: center;\n}\n\n.startButton[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover)\n}\n\n.startButton[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.startButton[data-disabled] {\n color: var(--th-theme-disable);\n}","\"use client\";\n\nimport SnoozeIcon from \"./assets/icons/snooze.svg\";\n\nimport { ThAudioActionKeys } from \"@/preferences/models\";\nimport { StatefulActionIcon } from \"../../../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulActionTriggerProps } from \"../../../Actions/models/actions\";\n\nimport timerStyles from \"./assets/styles/thorium-web.sleepTimer.module.css\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { toggleActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulAudioSleepTimerTrigger = ({ ref }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n\n const remainingSeconds = useAppSelector(state => state.player.sleepTimer.remainingSeconds);\n const onTrackEnd = useAppSelector(state => state.player.sleepTimer.onTrackEnd);\n const onFragmentEnd = useAppSelector(state => state.player.sleepTimer.onFragmentEnd);\n const isTrackReady = useAppSelector(state => state.player.isTrackReady);\n const isStalled = useAppSelector(state => state.player.isStalled);\n const isDisabled = !isTrackReady || isStalled;\n\n const dispatch = useAppDispatch();\n\n const isActive = remainingSeconds !== null || onTrackEnd || onFragmentEnd;\n\n const formatBadge = (seconds: number): string => {\n if (seconds < 60) return `${ seconds }${ t(\"audio.settings.sleepTimer.seconds\") }`;\n return `${ Math.ceil(seconds / 60) }${ t(\"audio.settings.sleepTimer.minutes\") }`;\n };\n\n const sleepTimerLabel = (() => {\n if (onTrackEnd) return t(\"reader.playback.preferences.sleepTimer.presets.endOfResource\");\n if (onFragmentEnd) return t(\"reader.playback.preferences.sleepTimer.presets.endOfFragment\");\n return formatBadge(remainingSeconds!);\n })();\n\n return (\n <StatefulActionIcon\n ref={ ref }\n tooltipLabel={ t(\"reader.playback.preferences.sleepTimer.descriptive\") }\n placement=\"top\"\n onPress={ () => dispatch(toggleActionOpen({ key: ThAudioActionKeys.sleepTimer })) }\n isDisabled={ isDisabled }\n className={ timerStyles.button }\n >\n <SnoozeIcon aria-hidden=\"true\" focusable=\"false\" />\n { isActive && (\n <span className={ timerStyles.label } aria-hidden=\"true\">\n { sleepTimerLabel }\n </span>\n ) }\n </StatefulActionIcon>\n );\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { Button } from \"react-aria-components\";\nimport { FocusScope } from \"react-aria\";\n\nimport { ThAudioActionKeys, ThAudioKeys, ThSettingsTimerVariant } from \"@/preferences/models\";\nimport { ThNumberField } from \"@/core/Components/Settings/ThNumberField\";\nimport { ThRadioGroup } from \"@/core/Components/Settings/ThRadioGroup\";\nimport { StatefulActionContainerProps } from \"../../../Actions/models/actions\";\n\nimport timerStyles from \"./assets/styles/thorium-web.sleepTimer.module.css\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useDocking } from \"../../../Docking/hooks/useDocking\";\nimport { StatefulSheetWrapper } from \"@/components/Sheets/StatefulSheetWrapper\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setSleepTimerOnTrackEnd, setSleepTimerOnFragmentEnd, setSleepTimerRemainingSeconds } from \"@/lib/playerReducer\";\n\nexport const StatefulAudioSleepTimerContainer = ({ triggerRef, placement = \"top\" }: StatefulActionContainerProps) => {\n const [hours, setHours] = useState(0);\n const [minutes, setMinutes] = useState(0);\n\n const isOpen = useAppSelector(state => state.actions.keys[ThAudioActionKeys.sleepTimer]?.isOpen ?? false);\n const remainingSeconds = useAppSelector(state => state.player.sleepTimer.remainingSeconds);\n const onTrackEnd = useAppSelector(state => state.player.sleepTimer.onTrackEnd);\n const onFragmentEnd = useAppSelector(state => state.player.sleepTimer.onFragmentEnd);\n const playerStatus = useAppSelector(state => state.player.status);\n const dispatch = useAppDispatch();\n\n const { t } = useI18n();\n\n const formatRemaining = (seconds: number): string => {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n const mm = m.toString().padStart(2, \"0\");\n const ss = s.toString().padStart(2, \"0\");\n const min = t(\"audio.settings.sleepTimer.minutes\");\n const sec = t(\"audio.settings.sleepTimer.seconds\");\n if (h > 0) return `${ h }${ t(\"audio.settings.sleepTimer.hours\") } ${ mm }${ min } ${ ss }${ sec }`;\n return `${ mm }${ min } ${ ss }${ sec }`;\n };\n\n const { preferences } = useAudioPreferences();\n const { pause } = useNavigator().media;\n\n const config = preferences.settings.keys[ThAudioKeys.sleepTimer];\n const variant = config.variant;\n\n useEffect(() => {\n if (remainingSeconds === null) return;\n if (remainingSeconds <= 0) {\n pause();\n dispatch(setSleepTimerRemainingSeconds(null));\n return;\n }\n if (playerStatus !== \"playing\") return;\n const id = setTimeout(() => {\n dispatch(setSleepTimerRemainingSeconds(remainingSeconds - 1));\n }, 1000);\n return () => clearTimeout(id);\n }, [remainingSeconds, playerStatus, pause, dispatch]);\n\n const handleCancel = useCallback(() => {\n dispatch(setSleepTimerRemainingSeconds(null));\n dispatch(setSleepTimerOnTrackEnd(false));\n dispatch(setSleepTimerOnFragmentEnd(false));\n dispatch(setActionOpen({ key: ThAudioActionKeys.sleepTimer, isOpen: false }));\n }, [dispatch]);\n\n const handleStart = useCallback(() => {\n const totalSeconds = hours * 3600 + minutes * 60;\n if (totalSeconds <= 0) return;\n dispatch(setSleepTimerRemainingSeconds(totalSeconds));\n dispatch(setActionOpen({ key: ThAudioActionKeys.sleepTimer, isOpen: false }));\n }, [hours, minutes, dispatch]);\n\n const handlePresetSelect = useCallback((value: string) => {\n if (value === \"endOfResource\") {\n dispatch(setSleepTimerOnTrackEnd(true));\n dispatch(setSleepTimerOnFragmentEnd(false));\n dispatch(setSleepTimerRemainingSeconds(null));\n } else if (value === \"endOfFragment\") {\n dispatch(setSleepTimerOnTrackEnd(false));\n dispatch(setSleepTimerOnFragmentEnd(true));\n dispatch(setSleepTimerRemainingSeconds(null));\n } else {\n dispatch(setSleepTimerOnTrackEnd(false));\n dispatch(setSleepTimerOnFragmentEnd(false));\n dispatch(setSleepTimerRemainingSeconds(Number(value) * 60));\n }\n dispatch(setActionOpen({ key: ThAudioActionKeys.sleepTimer, isOpen: false }));\n }, [dispatch]);\n\n const docking = useDocking(ThAudioActionKeys.sleepTimer);\n\n const setOpen = useCallback((open: boolean) => {\n dispatch(setActionOpen({ key: ThAudioActionKeys.sleepTimer, isOpen: open }));\n }, [dispatch]);\n\n const isActive = remainingSeconds !== null || onTrackEnd || onFragmentEnd;\n const maxHours = (config.variant === ThSettingsTimerVariant.durationField ? config.maxHours : undefined) ?? 23;\n\n const renderContent = () => {\n if (variant === ThSettingsTimerVariant.presetList && config?.variant === ThSettingsTimerVariant.presetList) {\n const items = config.presets.map(preset => {\n if (preset === \"endOfResource\") {\n return {\n id: \"endOfResource\",\n value: \"endOfResource\",\n label: t(\"reader.playback.preferences.sleepTimer.presets.endOfResource\"),\n };\n } else if (preset === \"endOfFragment\") {\n return {\n id: \"endOfFragment\",\n value: \"endOfFragment\",\n label: t(\"reader.playback.preferences.sleepTimer.presets.endOfFragment\"),\n };\n } else {\n return {\n id: String(preset),\n value: String(preset),\n label: `${ preset } ${ t(\"audio.settings.sleepTimer.minutes\") }`,\n };\n }\n });\n\n const activeValue = onTrackEnd\n ? \"endOfResource\"\n : onFragmentEnd\n ? \"endOfFragment\"\n : remainingSeconds !== null ? String(remainingSeconds / 60) : \"\";\n\n return (\n <div className={ timerStyles.durationField }>\n <ThRadioGroup\n aria-label={ t(\"reader.playback.preferences.sleepTimer.descriptive\") }\n value={ activeValue }\n onChange={ handlePresetSelect }\n items={ items }\n compounds={{\n wrapper: { className: timerStyles.listbox },\n radio: { className: timerStyles.listboxItem },\n }}\n />\n { isActive && (\n <Button\n className={ `${ timerStyles.startButton } ${ timerStyles.cancelButton }` }\n onPress={ handleCancel }\n >\n { t(\"common.actions.cancel\") }\n </Button>\n ) }\n </div>\n );\n }\n\n // durationField variant\n if (isActive && remainingSeconds !== null) {\n return (\n <div className={ timerStyles.durationField }>\n <p className={ timerStyles.remaining }>\n { t(\"audio.settings.sleepTimer.remaining\", { remaining: formatRemaining(remainingSeconds) }) }\n </p>\n <Button\n className={ timerStyles.startButton }\n onPress={ handleCancel }\n >\n { t(\"common.actions.cancel\") }\n </Button>\n </div>\n );\n }\n\n return (\n <div className={ timerStyles.durationField }>\n <p className={ timerStyles.instruction }>\n { t(\"audio.settings.sleepTimer.instruction\") }\n </p>\n <div className={ timerStyles.inputs }>\n <ThNumberField\n aria-label={ t(\"audio.settings.sleepTimer.hours\") }\n range={ [0, maxHours] }\n step={ 1 }\n value={ hours }\n onChange={ setHours }\n onInputChange={ (raw) => setHours(parseInt(raw) || 0) }\n compounds={{\n group: { className: timerStyles.fieldGroup },\n input: { className: timerStyles.fieldInput }\n }}\n />\n <span className={ timerStyles.unitLabel } aria-hidden=\"true\">\n { t(\"audio.settings.sleepTimer.hours\") }\n </span>\n <ThNumberField\n aria-label={ t(\"audio.settings.sleepTimer.minutes\") }\n range={ [0, 59] }\n step={ 1 }\n value={ minutes }\n onChange={ setMinutes }\n onInputChange={ (raw) => setMinutes(parseInt(raw) || 0) }\n compounds={{\n group: { className: timerStyles.fieldGroup },\n input: { className: timerStyles.fieldInput }\n }}\n />\n <span className={ timerStyles.unitLabel } aria-hidden=\"true\">\n { t(\"audio.settings.sleepTimer.minutes\") }\n </span>\n </div>\n <Button\n className={ timerStyles.startButton }\n isDisabled={ hours === 0 && minutes === 0 }\n onPress={ handleStart }\n >\n { t(\"audio.settings.sleepTimer.start\") }\n </Button>\n </div>\n );\n };\n\n return (\n <StatefulSheetWrapper\n sheetType={ docking.sheetType }\n sheetProps={ {\n id: ThAudioActionKeys.sleepTimer,\n triggerRef,\n heading: t(\"reader.playback.preferences.sleepTimer.descriptive\"),\n className: timerStyles.wrapper,\n placement,\n isOpen,\n onOpenChange: setOpen,\n onClosePress: () => setOpen(false),\n docker: docking.getDocker(),\n } }\n >\n <FocusScope contain>\n { renderContent() }\n </FocusScope>\n </StatefulSheetWrapper>\n );\n};\n","import * as React from \"react\";\nconst SvgCast = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M480-480Zm320 320H600q0-20-1.5-40t-4.5-40h206v-480H160v46q-20-3-40-4.5T80-680v-40q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160Zm-720 0v-120q50 0 85 35t35 85H80Zm200 0q0-83-58.5-141.5T80-360v-80q117 0 198.5 81.5T360-160h-80Zm160 0q0-75-28.5-140.5t-77-114q-48.5-48.5-114-77T80-520v-80q91 0 171 34.5T391-471q60 60 94.5 140T520-160h-80Z\" /></svg>;\nexport default SvgCast;","import * as React from \"react\";\nconst SvgCastConnected = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M720-320H575q-7-21-15.5-41.5T542-400h98v-160H413q-29-25-62.5-45T281-640h439v320ZM480-480ZM80-160v-120q50 0 85 35t35 85H80Zm200 0q0-83-58.5-141.5T80-360v-80q117 0 198.5 81.5T360-160h-80Zm160 0q0-75-28.5-140.5t-77-114q-48.5-48.5-114-77T80-520v-80q91 0 171 34.5T391-471q60 60 94.5 140T520-160h-80Zm360 0H600q0-20-1.5-40t-4.5-40h206v-480H160v46q-20-3-40-4.5T80-680v-40q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160Z\" /></svg>;\nexport default SvgCastConnected;","import * as React from \"react\";\nconst SvgCastWarning = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M480-480ZM80-280q50 0 85 35t35 85H80v-120Zm0-160q117 0 198.5 81.5T360-160h-80q0-83-58.5-141.5T80-360v-80Zm0-160q91 0 171 34.5T391-471q60 60 94.5 140T520-160h-80q0-75-28.5-140.5t-77-114q-48.5-48.5-114-77T80-520v-80Zm720 440H600q0-20-1.5-40t-4.5-40h206v-212q22-7 42-16.5t38-22.5v251q0 33-23.5 56.5T800-160ZM80-680v-40q0-33 23.5-56.5T160-800h292q-6 19-9 39t-3 41H160v46q-20-3-40-4.5T80-680Zm498.5 101.5Q520-637 520-720t58.5-141.5Q637-920 720-920t141.5 58.5Q920-803 920-720t-58.5 141.5Q803-520 720-520t-141.5-58.5ZM720-600q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6Zm-20-80h40v-160h-40v160Z\" /></svg>;\nexport default SvgCastWarning;","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport CastIcon from \"./assets/icons/cast.svg\";\nimport CastConnectedIcon from \"./assets/icons/cast_connected.svg\";\nimport CastWarningIcon from \"./assets/icons/cast_warning.svg\";\n\nimport { ThAudioActionKeys } from \"@/preferences/models\";\nimport { StatefulActionIcon } from \"../../../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../../../Actions/Triggers/StatefulOverflowMenuItem\";\nimport { StatefulActionTriggerProps } from \"../../../Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useAudioPreferences } from \"@/preferences/hooks/useAudioPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setRemotePlaybackState } from \"@/lib/playerReducer\";\n\nexport const StatefulAudioRemotePlaybackTrigger = ({ variant }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n const { preferences } = useAudioPreferences();\n const dispatch = useAppDispatch();\n\n const remotePlaybackState = useAppSelector(state => state.player.remotePlaybackState);\n const [isAvailable, setIsAvailable] = useState<boolean | null>(null);\n const watchIdRef = useRef<number | undefined>(undefined);\n\n const { remotePlayback } = useNavigator().media;\n\n useEffect(() => {\n if (!remotePlayback) return;\n\n remotePlayback.watchAvailability((available) => {\n setIsAvailable(available);\n }).then((id) => {\n watchIdRef.current = id;\n }).catch(() => {\n // API not supported or disableRemotePlayback is set — always show\n setIsAvailable(true);\n });\n\n return () => {\n if (watchIdRef.current !== undefined) {\n remotePlayback.cancelWatchAvailability(watchIdRef.current);\n }\n };\n }, [remotePlayback]);\n\n const handlePress = useCallback(async () => {\n if (!remotePlayback) return;\n try {\n await remotePlayback.prompt();\n } catch (err: unknown) {\n if (err instanceof DOMException && (err.name === \"AbortError\" || err.name === \"NotAllowedError\")) return;\n dispatch(setRemotePlaybackState(\"error\"));\n }\n }, [remotePlayback, dispatch]);\n\n if (preferences.contentProtection?.disableRemotePlayback) return null;\n if (!remotePlayback || isAvailable === false) return null;\n\n const isConnected = remotePlaybackState === \"connected\" || remotePlaybackState === \"connecting\";\n const isError = remotePlaybackState === \"error\";\n const Icon = isError ? CastWarningIcon : isConnected ? CastConnectedIcon : CastIcon;\n\n const token = preferences.actions.secondary.keys[ThAudioActionKeys.remotePlayback];\n const label = isConnected\n ? t(\"audio.remotePlayback.connected\")\n : t(\"audio.remotePlayback.trigger\");\n\n return (\n <>\n { (variant && variant === ThActionsTriggerVariant.menu)\n ? <StatefulOverflowMenuItem\n label={ label }\n SVGIcon={ Icon }\n shortcut={ token?.shortcut ?? null }\n id={ ThAudioActionKeys.remotePlayback }\n isDisabled={ isError }\n onAction={ handlePress }\n />\n : <StatefulActionIcon\n visibility={ token?.visibility }\n tooltipLabel={ label }\n placement=\"bottom\"\n aria-label={ label }\n isDisabled={ isError }\n onPress={ handlePress }\n >\n <Icon aria-hidden=\"true\" focusable=\"false\" />\n </StatefulActionIcon>\n }\n </>\n );\n};\n","import { ThPlugin } from \"../PluginRegistry\";\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { ThAudioKeys, ThAudioActionKeys } from \"@/preferences/models/audio\";\n\nimport { StatefulSettingsTrigger } from \"../../Actions/Settings/StatefulSettingsTrigger\";\nimport { StatefulAudioSettingsContainer } from \"../../Actions/Settings/StatefulAudioSettingsContainer\";\nimport { StatefulTocTrigger } from \"../../Actions/Toc/StatefulTocTrigger\";\nimport { StatefulTocContainer } from \"../../Actions/Toc/StatefulTocContainer\";\nimport { StatefulFullscreenTrigger } from \"../../Actions/Fullscreen/StatefulFullscreenTrigger\";\n\nimport { StatefulAudioSkipBackwardInterval } from \"../../Audio/Settings/StatefulAudioSkipBackwardInterval\";\nimport { StatefulAudioSkipForwardInterval } from \"../../Audio/Settings/StatefulAudioSkipForwardInterval\";\nimport { StatefulAudioSkipInterval } from \"../../Audio/Settings/StatefulAudioSkipInterval\";\nimport { StatefulAudioAutoPlay } from \"../../Audio/Settings/StatefulAudioAutoPlay\";\nimport { StatefulTheme } from \"../../Settings/StatefulTheme\";\n\nimport { StatefulAudioVolumeTrigger } from \"../../Audio/actions/Volume/StatefulAudioVolumeTrigger\";\nimport { StatefulAudioVolumeContainer } from \"../../Audio/actions/Volume/StatefulAudioVolumeContainer\";\nimport { StatefulAudioPlaybackRateTrigger } from \"../../Audio/actions/PlaybackRate/StatefulAudioPlaybackRateTrigger\";\nimport { StatefulAudioPlaybackRateContainer } from \"../../Audio/actions/PlaybackRate/StatefulAudioPlaybackRateContainer\";\nimport { StatefulAudioTocTrigger } from \"../../Audio/actions/Toc/StatefulAudioTocTrigger\";\nimport { StatefulAudioTocContainer } from \"../../Audio/actions/Toc/StatefulAudioTocContainer\";\nimport { StatefulAudioSleepTimerTrigger } from \"../../Audio/actions/SleepTimer/StatefulAudioSleepTimerTrigger\";\nimport { StatefulAudioSleepTimerContainer } from \"../../Audio/actions/SleepTimer/StatefulAudioSleepTimerContainer\";\nimport { StatefulAudioRemotePlaybackTrigger } from \"../../Audio/actions/RemotePlayback/StatefulAudioRemotePlaybackTrigger\";\n\nexport const createAudioDefaultPlugin = (): ThPlugin => {\n return {\n id: \"audio-core\",\n name: \"Audio Core Components\",\n description: \"Default components for Thorium Web Audio StatefulReader\",\n version: \"1.3.0\",\n components: {\n actions: {\n [ThActionsKeys.settings]: {\n Trigger: StatefulSettingsTrigger,\n Target: StatefulAudioSettingsContainer\n },\n [ThActionsKeys.toc]: {\n Trigger: StatefulTocTrigger,\n Target: StatefulTocContainer\n },\n [ThActionsKeys.fullscreen]: {\n Trigger: StatefulFullscreenTrigger\n },\n [ThAudioActionKeys.remotePlayback]: {\n Trigger: StatefulAudioRemotePlaybackTrigger\n }\n },\n primaryAudioActions: {\n [ThAudioActionKeys.volume]: { Trigger: StatefulAudioVolumeTrigger, Target: StatefulAudioVolumeContainer },\n [ThAudioActionKeys.playbackRate]: { Trigger: StatefulAudioPlaybackRateTrigger, Target: StatefulAudioPlaybackRateContainer },\n [ThAudioActionKeys.toc]: { Trigger: StatefulAudioTocTrigger, Target: StatefulAudioTocContainer },\n [ThAudioActionKeys.sleepTimer]: { Trigger: StatefulAudioSleepTimerTrigger, Target: StatefulAudioSleepTimerContainer },\n },\n settings: {\n [ThAudioKeys.theme]: {\n Comp: StatefulTheme\n },\n [ThAudioKeys.skipInterval]: {\n Comp: StatefulAudioSkipInterval\n },\n [ThAudioKeys.skipBackwardInterval]: {\n Comp: StatefulAudioSkipBackwardInterval\n },\n [ThAudioKeys.skipForwardInterval]: {\n Comp: StatefulAudioSkipForwardInterval\n },\n [ThAudioKeys.autoPlay]: {\n Comp: StatefulAudioAutoPlay\n }\n }\n }\n };\n};\n","\"use client\";\n\nimport { ReactNode, useMemo } from \"react\";\nimport { useStore } from \"react-redux\";\n\nimport { DefaultKeys, ThPreferences } from \"@/preferences/preferences\";\nimport { defaultPreferences } from \"@/preferences/defaultPreferences\";\n\nimport { ThPreferencesProvider } from \"@/preferences/ThPreferencesProvider\";\nimport { ThReduxPreferencesAdapter } from \"@/lib/ThReduxPreferencesAdapter\";\n\nimport { RootState } from \"@/lib/store\";\n\nexport const StatefulPreferencesProvider = ({ \n children,\n initialPreferences = defaultPreferences as ThPreferences<DefaultKeys>\n}: { \n children: ReactNode;\n initialPreferences?: ThPreferences<DefaultKeys>;\n}) => {\n const store = useStore<RootState>();\n \n const adapter = useMemo(() => {\n return new ThReduxPreferencesAdapter<DefaultKeys>(store, initialPreferences);\n }, [store, initialPreferences]);\n \n return (\n <ThPreferencesProvider adapter={ adapter }>\n { children }\n </ThPreferencesProvider>\n );\n}\n","import { useAppSelector } from \"@/lib/hooks\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\n\nexport interface ReaderTransitions {\n // Current states\n isImmersive: boolean;\n isFullscreen: boolean;\n isScroll: boolean;\n hasUserNavigated: boolean;\n \n // Previous states\n wasImmersive: boolean;\n wasFullscreen: boolean;\n wasScroll: boolean;\n wasUserNavigated: boolean;\n \n // State transitions\n fromImmersive: boolean;\n toImmersive: boolean;\n fromFullscreen: boolean;\n toFullscreen: boolean;\n fromScroll: boolean;\n toScroll: boolean;\n fromUserNavigation: boolean;\n toUserNavigation: boolean;\n}\n\nexport const useReaderTransitions = (): ReaderTransitions => {\n // Current states\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const hasUserNavigated = useAppSelector(state => state.reader.hasUserNavigated);\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n \n const isScroll = scroll && !isFXL;\n \n // Previous states\n const wasImmersive = usePrevious(isImmersive) ?? false;\n const wasFullscreen = usePrevious(isFullscreen) ?? false;\n const wasScroll = usePrevious(isScroll) ?? false;\n const wasUserNavigated = usePrevious(hasUserNavigated) ?? false;\n\n // State transitions\n const fromImmersive = wasImmersive && !isImmersive;\n const toImmersive = !wasImmersive && isImmersive;\n const fromFullscreen = wasFullscreen && !isFullscreen;\n const toFullscreen = !wasFullscreen && isFullscreen;\n const fromScroll = wasScroll && !isScroll;\n const toScroll = !wasScroll && isScroll;\n const fromUserNavigation = wasUserNavigated && !hasUserNavigated;\n const toUserNavigation = !wasUserNavigated && hasUserNavigated;\n\n return {\n // Current states\n isImmersive,\n isFullscreen,\n isScroll,\n hasUserNavigated,\n \n // Previous states\n wasImmersive,\n wasFullscreen,\n wasScroll,\n wasUserNavigated,\n \n // State transitions\n fromImmersive,\n toImmersive,\n fromFullscreen,\n toFullscreen,\n fromScroll,\n toScroll,\n fromUserNavigation,\n toUserNavigation\n };\n};\n","import { Locator } from \"@readium/shared\";\n\nexport const deserializePositions = (positionsList?: Locator[]) => {\n return positionsList?.map((locator) => ({\n href: locator.href,\n type: locator.type,\n locations: {\n position: locator.locations.position,\n progression: locator.locations.progression,\n totalProgression: locator.locations.totalProgression\n },\n }));\n};","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Link } from \"@readium/shared\";\nimport { \n Manifest, \n Publication, \n Fetcher, \n HttpFetcher, \n Layout, \n ReadingProgression,\n Feature,\n Profile\n} from \"@readium/shared\";\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport {\n setRTL,\n setFXL,\n setPositionsList,\n setHasDisplayTransformability,\n setTocTree,\n} from \"@/lib/publicationReducer\";\nimport { buildTocTree } from \"@/helpers/buildTocTree\";\nimport { setReaderProfile, ReaderProfile } from \"@/lib/readerReducer\";\nimport { deserializePositions } from \"@/helpers/deserializePositions\";\nimport { ErrorHandler, ProcessedError } from \"@/helpers/errorHandler\";\n\nexport interface UsePublicationOptions {\n url: string;\n onError?: (error: ProcessedError) => void;\n fetcher?: Fetcher;\n}\n\nexport interface UsePublicationReturn {\n // Loading states\n isLoading: boolean;\n error: ProcessedError | null;\n\n // Publication data\n publication: Publication | null;\n manifest: object | null;\n selfLink: string | null;\n localDataKey: string | null;\n\n // Profile detection\n profile: ReaderProfile | null;\n\n // Publication metadata\n isRTL: boolean;\n isFXL: boolean;\n hasDisplayTransformability: boolean;\n}\n\nconst detectProfile = (manifest: Manifest): ReaderProfile => {\n // Check conformsTo in manifest metadata to determine profile\n const metadata = manifest.metadata;\n if (!metadata) return \"webPub\"; // Default to webPub when no metadata\n \n const conformsTo = metadata.conformsTo;\n if (!conformsTo) return \"webPub\"; // Default to webPub when no conformsTo\n \n // Handle both string and array formats\n const profiles = Array.isArray(conformsTo) ? conformsTo : [conformsTo];\n \n // Check for audiobook profile first\n if (profiles.some((profile: Profile) => \n profile === Profile.AUDIOBOOK\n )) {\n return \"audio\";\n }\n \n // Check for epub profile\n if (profiles.some((profile: Profile) => \n profile === Profile.EPUB\n )) {\n return \"epub\";\n }\n \n // Default to webPub for any other profile or no specific profile\n return \"webPub\";\n};\n\nexport const usePublication = ({\n url,\n onError = () => {},\n fetcher: customFetcher\n}: UsePublicationOptions): UsePublicationReturn => {\n const dispatch = useAppDispatch();\n\n // Basic states\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<ProcessedError | null>(null);\n const [manifest, setManifest] = useState<object | null>(null);\n const [selfLink, setSelfLink] = useState<string | null>(null);\n const [localDataKey, setLocalDataKey] = useState<string | null>(null);\n\n // Publication states\n const [publication, setPublication] = useState<Publication | null>(null);\n const [profile, setProfile] = useState<ReaderProfile | null>(null);\n\n // Metadata states\n const [isRTL, setIsRTL] = useState(false);\n const [isFXL, setIsFXL] = useState(false);\n const [hasDisplayTransformability, setHasDisplayTransformabilityState] = useState(false);\n\n const handleManifestError = (error: unknown, context: string) => {\n console.error(`${ context }:`, error);\n const processedError = ErrorHandler.process(error, context);\n setError(processedError);\n setIsLoading(false);\n };\n\n // Basic URL validation and loading\n useEffect(() => {\n if (!url) {\n const validationError = ErrorHandler.process(new Error('Manifest URL is required'), 'Validation');\n setError(validationError);\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n \n // Decode URL if needed\n const decodedUrl = decodeURIComponent(url);\n \n const manifestLink = new Link({ href: decodedUrl });\n const fetcher = customFetcher || new HttpFetcher(undefined);\n\n try {\n const fetched = fetcher.get(manifestLink);\n \n // Get self-link first\n fetched.link().then(async (link) => {\n try {\n const selfHref = link.toURL(decodedUrl);\n setSelfLink(selfHref || null);\n if (selfHref) {\n setLocalDataKey(`${ selfHref }-current-location`);\n \n // Create fetcher with selfHref for proper URL resolution\n const manifestFetcher = customFetcher || new HttpFetcher(undefined, selfHref);\n \n // Fetch manifest with proper fetcher\n const manifestFetched = manifestFetcher.get(manifestLink);\n const manifestData = await manifestFetched.readAsJSON();\n \n setManifest(manifestData as object);\n \n // Create publication\n const manifestObj = Manifest.deserialize(manifestData)!;\n manifestObj.setSelfLink(selfHref);\n\n // Detect profile from parsed manifest\n const detectedProfile = detectProfile(manifestObj);\n setProfile(detectedProfile);\n dispatch(setReaderProfile(detectedProfile));\n\n const pub = new Publication({\n manifest: manifestObj,\n fetcher: manifestFetcher\n });\n \n // For EPUB, fetch positions before mounting reader\n if (detectedProfile === \"epub\") {\n try {\n const rawPositions = await pub.positionsFromManifest();\n const positionsList = deserializePositions(rawPositions);\n dispatch(setPositionsList(positionsList));\n } catch (error) {\n console.error(\"Failed to fetch positions:\", error);\n dispatch(setPositionsList([]));\n }\n }\n\n // For audio, build the TOC tree from the publication\n if (detectedProfile === \"audio\") {\n const tocLinks = manifestObj.toc?.items && manifestObj.toc.items.length > 0\n ? manifestObj.toc.items\n : manifestObj.readingOrder?.items || [];\n const publicationTitle = manifestObj.metadata.title.getTranslation(\"en\");\n let idCounter = 0;\n const idGenerator = () => `toc-${ ++idCounter }`;\n dispatch(setTocTree(buildTocTree(tocLinks, idGenerator, undefined, publicationTitle)));\n }\n\n setPublication(pub);\n setIsLoading(false);\n }\n } catch (error: unknown) {\n handleManifestError(error, \"Error loading manifest\");\n }\n });\n } catch (error: unknown) {\n handleManifestError(error, \"Error loading manifest\");\n }\n }, [url, customFetcher, dispatch]);\n\n // Process publication metadata when publication is ready\n useEffect(() => {\n if (!publication) return;\n\n // RTL detection\n const rtl = publication.metadata.effectiveReadingProgression === ReadingProgression.rtl;\n setIsRTL(rtl);\n dispatch(setRTL(rtl));\n\n // FXL detection (only relevant for epub)\n if (profile === \"epub\") {\n const fxl = publication.metadata.effectiveLayout === Layout.fixed;\n setIsFXL(fxl);\n dispatch(setFXL(fxl));\n }\n\n // Display transformability\n const displayTransformability = publication.metadata.accessibility?.feature?.some(\n feature => feature && feature.value === Feature.DISPLAY_TRANSFORMABILITY.value\n ) || false;\n setHasDisplayTransformabilityState(displayTransformability);\n dispatch(setHasDisplayTransformability(displayTransformability));\n\n // Positions list (only for epub)\n if (profile === \"epub\" && publication) {\n const fetchPositions = async () => {\n try {\n const positionsList = await publication.positionsFromManifest();\n const deserializedPositionsList = deserializePositions(positionsList);\n dispatch(setPositionsList(deserializedPositionsList));\n } catch (error) {\n console.error(\"Failed to fetch positions:\", error);\n dispatch(setPositionsList([]));\n }\n };\n\n fetchPositions();\n }\n }, [publication, profile, dispatch]);\n\n // Call onError callback when error changes\n useEffect(() => {\n if (error) {\n onError(error);\n }\n }, [error, onError]);\n\n return {\n isLoading,\n error,\n publication,\n manifest,\n selfLink,\n localDataKey,\n profile,\n isRTL,\n isFXL,\n hasDisplayTransformability\n };\n};\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Locator } from \"@readium/shared\";\nimport { PositionStorage } from \"@/components/Reader/StatefulReaderWrapper\";\nimport { useLocalStorage } from \"../core/Hooks/useLocalStorage\";\n\nexport const usePositionStorage = (key: string | null, customStorage?: PositionStorage) => {\n const localStorageData = useLocalStorage(key);\n const [customData, setCustomData] = useState<Locator | null>(() => \n customStorage ? (customStorage.get() || null) : null\n );\n \n if (customStorage) {\n const set = (newValue: Locator | null) => {\n if (newValue) {\n customStorage.set(newValue);\n }\n setCustomData(newValue);\n };\n \n const get = () => customData;\n \n return {\n setLocalData: set,\n getLocalData: get,\n localData: customData\n };\n }\n \n return localStorageData;\n};\n","/* For some classNames we need global, as they impact other modules */\n\n.wrapper {\n height: 100%;\n width: 100%;\n margin: 0;\n}\n\n.main {\n width: 100%;\n height: 100%;\n margin: 0;\n}\n\n.shell {\n width: 100%;\n height: 100%;\n margin: 0;\n}\n\n.leftDock {\n height: 100vh;\n height: 100dvh;\n}\n\n.rightDock {\n height: 100vh;\n height: 100dvh;\n}\n\n/* Top and bottom bars */\n\n.bottomBar,\n.topBar {\n box-sizing: border-box;\n gap: 2px;\n touch-action: manipulation;\n background-color: var(--th-theme-background);\n}\n\n.bottomBar {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* Stacked UI */\n\n.main :global(.thorium_web_stackedUI) {\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:global(.thorium_web_stackedUI) .topBar,\n:global(.thorium_web_stackedUI) .bottomBar {\n flex: 0 0 calc(var(--th-icon-size, 24px) * 2.5);\n height: calc(var(--th-icon-size, 24px) * 2.5);\n}\n\n:global(.thorium_web_stackedUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .topBar,\n:global(.thorium_web_stackedUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .bottomBar {\n opacity: var(--th-theme-immerse);\n}\n\n/* Layered UI */\n\n.main :global(.thorium_web_layeredUI) {\n position: relative;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n height: 100vh;\n height: 100dvh;\n max-height: 100%;\n background-color: var(--th-theme-background);\n}\n\n:global(.thorium_web_layeredUI) .topBar,\n:global(.thorium_web_layeredUI) .bottomBar {\n position: absolute;\n left: 0;\n right: 0;\n height: calc(var(--th-icon-size, 24px) * 2.5);\n z-index: 2;\n box-shadow: var(--th-theme-elevate);\n overflow: hidden;\n transition-property: transform, box-shadow;\n transition-duration: 200ms;\n transition-timing-function: ease-in-out;\n transform: translateY(0);\n}\n\n:global(.thorium_web_layeredUI) .topBar {\n top: 0;\n}\n\n:global(.thorium_web_layeredUI) .bottomBar {\n bottom: 0;\n}\n\n:global(.thorium_web_layeredUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .topBar {\n transform: translateY(calc(var(--th-icon-size, 24px) * -2.5));\n box-shadow: none;\n overflow: unset;\n}\n\n:global(.thorium_web_layeredUI.thorium_web_isImmersive:not(.thorium_web_isHovering)) .bottomBar {\n transform: translateY(calc(var(--th-icon-size, 24px) * 2.5));\n box-shadow: none;\n}\n\n.barOverlay {\n position: absolute;\n left: 0;\n right: 0;\n height: calc(var(--th-icon-size, 24px) * 2.5);\n pointer-events: auto;\n opacity: 0;\n z-index: 1000;\n}\n\n.headerOverlay {\n position: absolute;\n left: 0;\n right: 0;\n height: calc(var(--th-icon-size, 24px) * 2.5);\n pointer-events: auto;\n opacity: 0;\n z-index: 1000;\n top: 0;\n}\n\n.footerOverlay {\n position: absolute;\n left: 0;\n right: 0;\n height: calc(var(--th-icon-size, 24px) * 2.5);\n pointer-events: auto;\n opacity: 0;\n z-index: 1000;\n bottom: 0;\n}\n\n/* iFrame + its container */\n\n.iframeContainer {\n contain: content;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n}\n\n.iframeContainer :global(.readium-navigator-iframe) {\n width: 100%;\n height: 100%;\n border-width: 0;\n}\n\n/* FXL: Loading spinner for resources */\n@keyframes loading {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.iframeContainer :global(div:has(> .readium-navigator-iframe.blank))::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -30px;\n margin-left: -30px;\n width: 50px;\n height: 50px;\n border-radius: 50px;\n border: 5px solid grey;\n border-top-color: black;\n animation: loading 2s linear infinite;\n}\n\n/* Utils */\n\n.srOnly {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { ThActionsDockedPref } from \"@/preferences\";\n\nimport { DockStateObject } from \"@/lib/actionsReducer\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\n// TODO: Responsive.\n// When resizing the window, all widths should be recalculated.\n// There is no guarantee that the panel group is the same size as the window,\n// so we have to rewrite this hook to observe the panel group, and push the new\n// widths to the StatefulDockingWrapper so that it can update panels.\n// Note that the StatefulDockingWrapper cannot pass PanelGroup as a ref,\n// it requires using a utility method: getPanelGroupElement(id)\n// See https://github.com/bvaughn/react-resizable-panels/tree/main/packages/react-resizable-panels#can-a-attach-a-ref-to-the-dom-elements\nexport const useResizablePanel = (panel: DockStateObject | undefined) => {\n const defaultPanel: DockStateObject = {\n actionKey: null,\n active: false,\n collapsed: false\n };\n \n const safePanel = panel || defaultPanel;\n const preferences = useActionsPreferences();\n const { theming } = useSharedPreferences();\n const defaultWidth = theming.layout.defaults.dockingWidth;\n const [pref, setPref] = useState<ThActionsDockedPref | null>(\n safePanel.actionKey ? preferences.actionsKeys[safePanel.actionKey]?.docked || null : null\n );\n\n const actionsMap = useAppSelector(state => state.actions.keys);\n const actions = useActions(actionsMap);\n const previouslyCollapsed = usePrevious(safePanel.collapsed);\n\n const previousWidth = actions.getDockedWidth(safePanel.actionKey) || null;\n const width = pref?.width || defaultWidth;\n const minWidth = pref?.minWidth && pref.minWidth < width \n ? pref.minWidth \n : defaultWidth < width \n ? defaultWidth\n : width;\n const maxWidth = pref?.maxWidth && pref.maxWidth > width \n ? pref.maxWidth \n : defaultWidth > width\n ? defaultWidth\n : width;\n\n const isPopulated = () => {\n return safePanel.active && actions.isOpen(safePanel.actionKey);\n };\n\n const isCollapsed = () => {\n return safePanel.collapsed;\n }\n\n const forceExpand = () => {\n return !!(isPopulated() && previouslyCollapsed && !safePanel.collapsed);\n }\n\n const currentKey = () => {\n return safePanel.actionKey;\n };\n\n const isResizable = () => {\n return isPopulated() ? Math.round(width) > Math.round(minWidth) && Math.round(width) < Math.round(maxWidth) : false;\n };\n\n const hasDragIndicator = () => {\n return pref?.dragIndicator || false;\n };\n\n const getWidth = useCallback(() => {\n return previousWidth \n ? Math.round((previousWidth / window.innerWidth) * 100) \n : Math.round((width / window.innerWidth) * 100);\n }, [previousWidth, width]);\n\n const getMinWidth = useCallback(() => {\n return Math.round((minWidth / window.innerWidth) * 100);\n }, [minWidth]);\n\n const getMaxWidth = useCallback(() => {\n return Math.round((maxWidth / window.innerWidth) * 100);\n }, [maxWidth]);\n\n const getCurrentPxWidth = useCallback((percentage: number) => {\n let current = Math.round((percentage * window.innerWidth) / 100);\n \n if (current < minWidth) {\n current = minWidth;\n }\n \n if (current > maxWidth) {\n current = maxWidth;\n }\n \n return current;\n }, [minWidth, maxWidth]);\n\n // When the docked action changes, we need to update its preferences \n useEffect(() => {\n setPref(safePanel.actionKey ? preferences.actionsKeys[safePanel.actionKey]?.docked || null : null);\n }, [safePanel.actionKey, preferences]);\n\n return {\n currentKey, \n isPopulated, \n isCollapsed, \n forceExpand, \n isResizable,\n hasDragIndicator, \n getWidth,\n getMinWidth,\n getMaxWidth,\n getCurrentPxWidth\n }\n}","\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { ThDockingKeys } from \"@/preferences/models\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\nimport { useActionComponentStatus } from \"@/core/Components/Actions/hooks/useActionComponentStatus\";\n\n/**\n * Reusable hook to clean up stale docked actions.\n * Compares docked actionKeys to available actions and clears any that don't exist.\n */\nexport const useDockCleanup = (profile: string | undefined) => {\n const dispatch = useAppDispatch();\n const dock = useAppSelector(state => profile ? state.actions.dock[profile] : undefined);\n\n const startActionKey = dock?.[ThDockingKeys.start]?.actionKey;\n const endActionKey = dock?.[ThDockingKeys.end]?.actionKey;\n \n const startStatus = useActionComponentStatus({ actionKey: startActionKey || \"\" });\n const endStatus = useActionComponentStatus({ actionKey: endActionKey || \"\" });\n\n useEffect(() => {\n if (!profile || !dock) return;\n\n if (startActionKey && !startStatus.isComponentRegistered) {\n dispatch(dockAction({\n key: startActionKey,\n dockingKey: ThDockingKeys.transient,\n profile\n }));\n }\n\n if (endActionKey && !endStatus.isComponentRegistered) {\n dispatch(dockAction({\n key: endActionKey,\n dockingKey: ThDockingKeys.transient,\n profile\n }));\n }\n }, [profile, dock, startActionKey, endActionKey, startStatus.isComponentRegistered, endStatus.isComponentRegistered, dispatch]);\n};\n","\"use client\";\n\nimport { ReactNode, useCallback, useEffect, useRef } from \"react\";\n\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport dockingStyles from \"./assets/styles/thorium-web.docking.module.css\";\n\nimport { ImperativePanelHandle, Panel, PanelGroup, PanelResizeHandle } from \"react-resizable-panels\";\n\nimport { ThDockingTypes, ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\nimport { ActionsStateKeys } from \"@/lib/actionsReducer\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useResizablePanel } from \"./hooks/useResizablePanel\";\nimport { useDockCleanup } from \"./hooks/useDockCleanup\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { activateDockPanel, collapseDockPanel, deactivateDockPanel, expandDockPanel, setDockPanelWidth } from \"@/lib/actionsReducer\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport classNames from \"classnames\";\n\nexport interface DockPanelSizes {\n width: number;\n minWidth: number;\n maxWidth: number;\n getCurrentPxWidth: (percentage: number) => number;\n}\n\nconst DockHandle = ({\n flow,\n isResizable,\n isPopulated, \n hasDragIndicator\n}: { \n flow: ThDockingKeys.start | ThDockingKeys.end;\n isResizable: boolean;\n isPopulated: boolean;\n hasDragIndicator?: boolean;\n}) => {\n const handleID = `${ flow }-resize-handle`;\n\n const direction = useAppSelector(state => state.reader.direction);\n\n const classFromFlow = useCallback(() => {\n if (flow === ThDockingKeys.start) {\n return direction === ThLayoutDirection.ltr ? dockingStyles.resizeHandleGrabLeft : dockingStyles.resizeHandleGrabRight;\n } else if (flow === ThDockingKeys.end) {\n return direction === ThLayoutDirection.ltr ? dockingStyles.resizeHandleGrabRight : dockingStyles.resizeHandleGrabLeft;\n }\n }, [flow, direction]);\n\n return(\n <>\n <PanelResizeHandle \n id={ handleID } \n className={ dockingStyles.resizeHandle }\n disabled={ !isResizable }\n tabIndex={ isPopulated ? 0 : -1 }\n >\n { isResizable && hasDragIndicator && \n <div className={ classNames(dockingStyles.resizeHandleGrab, classFromFlow()) }></div> \n }\n </PanelResizeHandle>\n </>\n )\n};\n\nconst DockPanel = ({\n actionKey,\n flow,\n sizes,\n isResizable,\n isPopulated,\n isCollapsed,\n forceExpand,\n hasDragIndicator,\n profile\n}: { \n actionKey: ActionsStateKeys | null;\n flow: ThDockingKeys.start | ThDockingKeys.end;\n sizes: DockPanelSizes;\n isResizable: boolean;\n isPopulated: boolean;\n isCollapsed: boolean;\n forceExpand: boolean;\n hasDragIndicator?: boolean;\n profile: string;\n}) => {\n const { t } = useI18n();\n\n const panelRef = useRef<ImperativePanelHandle>(null);\n const direction = useAppSelector(state => state.reader.direction);\n const dispatch = useAppDispatch();\n\n const dockClassName = flow === ThDockingKeys.end && direction === ThLayoutDirection.ltr ? readerStyles.rightDock : readerStyles.leftDock;\n\n const makeDockLabel = useCallback(() => { \n let label = \"\";\n if (flow === ThDockingKeys.end && direction === ThLayoutDirection.ltr) {\n label += t(\"reader.app.docking.dockingRight\");\n } else {\n label += t(\"reader.app.docking.dockingLeft\")\n }\n\n if (actionKey) {\n if (!isPopulated) {\n label += ` – ${ t(\"reader.app.docking.dockingClosed\", { action: t(`reader.${ actionKey }.heading`) }) }`;\n } else if (isCollapsed) {\n label += ` – ${ t(\"reader.app.docking.dockingCollapsed\", { action: t(`reader.${ actionKey }.heading`) }) }`;\n }\n } else {\n label += ` – ${ t(\"reader.app.docking.dockingEmpty\") }`;\n }\n\n return label;\n }, [flow, direction, isPopulated, isCollapsed, actionKey, t]);\n\n const collapsePanel = useCallback(() => {\n if (panelRef.current) {\n panelRef.current.collapse();\n dispatch(collapseDockPanel({ slot: flow, profile }));\n }\n }, [dispatch, flow, profile]);\n\n const expandPanel = useCallback(() => {\n if (panelRef.current) {\n panelRef.current.expand();\n dispatch(expandDockPanel({ slot: flow, profile }));\n }\n }, [dispatch, flow, profile]);\n\n useEffect(() => {\n dispatch(activateDockPanel({ slot: flow, profile }));\n\n return () => {\n dispatch(deactivateDockPanel({ slot: flow, profile }));\n }\n }, [dispatch, flow, profile]);\n\n useEffect(() => {\n isPopulated || forceExpand ? expandPanel() : collapsePanel();\n }, [isPopulated, forceExpand, collapsePanel, expandPanel]);\n\n return(\n <>\n { flow === ThDockingKeys.end &&\n <DockHandle \n flow={ ThDockingKeys.end } \n isResizable={ isResizable } \n isPopulated={ isPopulated }\n hasDragIndicator={ hasDragIndicator } \n /> \n } \n <Panel \n id={ `${ flow }-panel` } \n order={ flow === ThDockingKeys.end ? 3 : 1 } \n collapsible={ true }\n collapsedSize={ 0 }\n ref={ panelRef }\n defaultSize={ isPopulated ? sizes.width : 0 } \n minSize={ sizes.minWidth } \n maxSize={ sizes.maxWidth }\n onCollapse={ collapsePanel }\n onExpand={ expandPanel }\n onResize={ (size: number) => size !== 0 && dispatch(setDockPanelWidth({\n key: flow,\n width: sizes.getCurrentPxWidth(size),\n profile: profile\n }))}\n inert={ isCollapsed } \n >\n <div \n id={ flow } \n aria-label={ makeDockLabel() }\n className={ classNames(dockingStyles.panelContainer, dockClassName) }\n ></div>\n </Panel>\n { flow === ThDockingKeys.start && \n <DockHandle \n flow={ ThDockingKeys.start } \n isResizable={ isResizable } \n isPopulated={ isPopulated } \n hasDragIndicator={ hasDragIndicator } \n /> \n } \n </>\n );\n};\n\nexport const StatefulDockingWrapper = ({ \n children\n}: { \n children: ReactNode; \n}) => {\n const preferences = useActionsPreferences();\n const profile = useAppSelector(state => state.reader.profile);\n \n // Clean up stale docked actions\n useDockCleanup(profile);\n \n const dockingStart = useAppSelector(state => profile && state.actions.dock[profile] ? state.actions.dock[profile][ThDockingKeys.start] : undefined);\n const dockingEnd = useAppSelector(state => profile && state.actions.dock[profile] ? state.actions.dock[profile][ThDockingKeys.end] : undefined)\n const startPanel = useResizablePanel(dockingStart);\n const endPanel = useResizablePanel(dockingEnd);\n\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n if (!preferences.docking.dock) {\n return(\n <>\n { children }\n </>\n )\n } else {\n const dockingMap = makeBreakpointsMap<ThDockingTypes>({\n defaultValue: ThDockingTypes.both, \n fromEnum: ThDockingTypes, \n pref: preferences.docking.dock, \n disabledValue: ThDockingTypes.none\n });\n\n const dockConfig = breakpoint && dockingMap[breakpoint] || ThDockingTypes.both;\n\n return (\n <>\n <PanelGroup direction=\"horizontal\">\n { \n (dockConfig === ThDockingTypes.both || dockConfig === ThDockingTypes.start) \n && profile && <DockPanel \n actionKey={ startPanel.currentKey() }\n flow={ ThDockingKeys.start } \n sizes={{\n width: startPanel.getWidth(),\n minWidth: startPanel.getMinWidth(),\n maxWidth: startPanel.getMaxWidth(),\n getCurrentPxWidth: startPanel.getCurrentPxWidth\n }} \n isResizable={ startPanel.isResizable() }\n isPopulated={ startPanel.isPopulated() }\n isCollapsed={ startPanel.isCollapsed() } \n forceExpand={ startPanel.forceExpand() }\n hasDragIndicator={ startPanel.hasDragIndicator() }\n profile={ profile }\n />\n }\n \n <Panel id=\"main-panel\" order={ 2 }>\n { children }\n </Panel>\n \n { \n (dockConfig === ThDockingTypes.both || dockConfig === ThDockingTypes.end) \n && profile && <DockPanel \n actionKey={ endPanel.currentKey() }\n flow={ ThDockingKeys.end } \n sizes={{\n width: endPanel.getWidth(),\n minWidth: endPanel.getMinWidth(),\n maxWidth: endPanel.getMaxWidth(),\n getCurrentPxWidth: endPanel.getCurrentPxWidth\n }} \n isResizable={ endPanel.isResizable() }\n isPopulated={ endPanel.isPopulated() }\n isCollapsed={ endPanel.isCollapsed() } \n forceExpand={ endPanel.forceExpand() }\n hasDragIndicator={ endPanel.hasDragIndicator() }\n profile={ profile }\n />\n }\n </PanelGroup>\n </>\n )\n }\n}",".header {\n box-sizing: border-box;\n display: grid;\n grid-template-areas: \"header-start header-center header-end\";\n grid-template-columns: 1fr 3fr 1fr;\n padding: 0.25rem 0.5rem 0;\n}\n\n.backlinkWrapper {\n grid-area: header-start;\n justify-self: start;\n align-self: center;\n}\n\n.header h1 {\n font-size: 1rem;\n color: var(--th-theme-text);\n font-weight: normal;\n grid-area: header-center;\n justify-self: center;\n align-self: center;\n max-width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; \n transition: opacity 200ms ease-in-out;\n}\n\n.actionsWrapper {\n grid-area: header-end;\n justify-self: end;\n display: flex;\n align-items: center;\n gap: 2px;\n}",".link {\n display: block;\n box-sizing: content-box;\n padding: calc(var(--th-icon-size, 24px) * (1/4));\n text-align: start;\n border-radius: var(--th-layout-radius);\n max-width: 100%;\n height: var(--th-icon-size, 24px);\n}\n\n.link svg {\n fill: var(--th-theme-text);\n max-width: 100%;\n height: 100%;\n}\n\n.link img {\n max-width: 100%;\n height: 100%;\n}\n\n.link[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.link[data-hovered] svg {\n fill: var(--th-theme-onHover)\n}\n\n.link[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.link[data-disabled] {\n color: var(--th-theme-disable)\n}\n\n.link[data-disabled] svg {\n fill: var(--th-theme-disable)\n}","\"use client\";\n\nimport React from \"react\";\n\nimport backLinkStyles from \"./assets/styles/thorium-web.backlink.module.css\";\nimport readerSharedUI from \"./assets/styles/thorium-web.button.module.css\";\n\nimport { ThBackLinkVariant, ThLayoutDirection } from \"@/preferences/models\";\n\nimport { ThBackArrow } from \"@/core/Components/Links\";\nimport { ThHome } from \"@/core/Components/Links\";\nimport { ThLibrary } from \"@/core/Components/Links\";\nimport { ThLink } from \"@/core/Components/Links\";\n\nimport { useI18n } from \"@/i18n\";\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulBackLink = ({ \n className \n}: { \n className?: string \n}) => {\n const { t } = useI18n();\n const { direction, theming } = useSharedPreferences();\n const backLinkPref = theming.header?.backLink;\n const tooltipDelay = theming.icon.tooltipDelay;\n const isRTL = direction === ThLayoutDirection.rtl;\n\n const variant = backLinkPref?.variant || ThBackLinkVariant.arrow;\n const href = backLinkPref?.href;\n const content = backLinkPref?.content;\n const visibility = backLinkPref?.visibility || \"partially\";\n const backLinkClassName = classNames(backLinkStyles.link, visibility === \"always\" ? readerSharedUI.alwaysVisible : readerSharedUI.partiallyVisible);\n\n const compounds = {\n tooltipTrigger: {\n delay: tooltipDelay,\n closeDelay: tooltipDelay\n },\n tooltip: {\n className: readerSharedUI.tooltip\n },\n label: t(\"reader.app.header.backLink.tooltip\")\n };\n\n if (!href) return null;\n\n switch (variant) {\n case ThBackLinkVariant.arrow:\n return (\n <div className={ className }>\n <ThBackArrow \n className={ backLinkClassName } \n href={ href } \n direction={ isRTL ? \"right\" : \"left\" }\n aria-label={ t(\"reader.app.header.backLink.trigger\") }\n compounds={ compounds }\n />\n </div>\n );\n\n case ThBackLinkVariant.home:\n return (\n <div className={ className }>\n <ThHome \n className={ backLinkClassName } \n href={ href } \n aria-label={ t(\"reader.app.header.backLink.trigger\") }\n compounds={ compounds }\n />\n </div>\n );\n\n case ThBackLinkVariant.library:\n return (\n <div className={ className }>\n <ThLibrary \n className={ backLinkClassName } \n href={ href } \n aria-label={ t(\"reader.app.header.backLink.trigger\") }\n compounds={ compounds }\n />\n </div>\n );\n\n default:\n if (!content) return null;\n \n let contentNode: React.ReactNode = null;\n \n switch (content.type) {\n case \"img\":\n contentNode = <img alt={ content.alt ?? \"\" } src={ content.src } />;\n break;\n \n case \"svg\":\n // Parse the SVG string\n const parser = new DOMParser();\n const doc = parser.parseFromString(content.content, \"image/svg+xml\");\n const svgElement = doc.documentElement;\n \n // Extract all attributes\n const attributes: Record<string, string> = {};\n for (const { name, value } of Array.from(svgElement.attributes)) {\n attributes[name] = value;\n }\n \n // Create the SVG element with all its original attributes\n contentNode = React.createElement(\"svg\", {\n ...attributes,\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n xmlns: \"http://www.w3.org/2000/svg\",\n dangerouslySetInnerHTML: { \n __html: svgElement.innerHTML \n }\n });\n break;\n }\n \n return (\n <div className={ className }>\n <ThLink \n className={ backLinkClassName } \n href={ href } \n aria-label={ t(\"reader.app.header.backLink.trigger\") }\n compounds={ compounds }\n >\n { contentNode }\n </ThLink>\n </div>\n );\n }\n}","\"use client\";\n\nimport { useCallback, useEffect, useRef, HTMLAttributes } from \"react\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport { ThActionEntry } from \"@/core/Components/Actions/ThActionsBar\";\nimport { usePlugins } from \"../Plugins/PluginProvider\";\nimport { useActions } from \"@/core/Components\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useFocusWithin } from \"react-aria\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\n\nimport { isPositionsListValid } from \"../Actions/JumpToPosition/helpers/utils\";\nimport { isIOSish } from \"@/core/Helpers/getPlatform\";\n\nexport const useReaderHeaderBase = (actionKeys: string[]) => {\n const headerRef = useRef<HTMLDivElement>(null);\n const { t } = useI18n();\n const { actionsComponentsMap } = usePlugins();\n\n const actionsMap = useAppSelector(state => state.actions.keys);\n const overflowMap = useAppSelector(state => state.actions.overflow);\n const isScroll = useAppSelector(state => state.settings.scroll);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const hasScrollAffordance = useAppSelector(state => state.reader.hasScrollAffordance);\n const positionsList = useAppSelector(state => state.publication.positionsList);\n\n const actions = useActions({ ...actionsMap, ...overflowMap });\n const dispatch = useAppDispatch();\n\n const { focusWithinProps } = useFocusWithin({\n onFocusWithin() {\n dispatch(setHovering(true));\n },\n onBlurWithin() {\n if (actions.everyOpenDocked()) {\n dispatch(setHovering(false));\n }\n }\n });\n\n const setHover = () => {\n if (!hasScrollAffordance && actions.everyOpenDocked()) {\n dispatch(setHovering(true));\n }\n };\n\n const removeHover = () => {\n if (!hasScrollAffordance && actions.everyOpenDocked()) {\n dispatch(setHovering(false));\n }\n };\n\n const listActionItems = useCallback(() => {\n const actionsItems: ThActionEntry<string>[] = [];\n\n if (actionsComponentsMap && Object.keys(actionsComponentsMap).length > 0) {\n actionKeys.forEach((key) => {\n if (actionsComponentsMap[key]) {\n actionsItems.push({\n Trigger: actionsComponentsMap[key].Trigger,\n Target: actionsComponentsMap[key].Target,\n key: key\n });\n } else {\n console.warn(`Action key \"${ key }\" not found in the plugin registry while present in preferences.`);\n }\n });\n }\n\n return actionsItems.filter(item => {\n if (item.key === ThActionsKeys.jumpToPosition) {\n return isPositionsListValid(positionsList);\n }\n if (item.key === ThActionsKeys.fullscreen) {\n return document.fullscreenEnabled && !isIOSish();\n }\n return true;\n });\n }, [actionKeys, actionsComponentsMap, positionsList]);\n\n useEffect(() => {\n if (isImmersive) {\n const focusElement = document.activeElement;\n if (focusElement && headerRef.current?.contains(focusElement)) {\n (focusElement as HTMLElement).blur();\n }\n }\n }, [isImmersive]);\n\n return {\n headerRef,\n focusWithinProps: focusWithinProps as HTMLAttributes<HTMLElement>,\n setHover,\n removeHover,\n listActionItems,\n isImmersive,\n isHovering,\n isScroll,\n t,\n };\n};\n"]}
|