@edrlab/thorium-web 1.5.7 → 1.6.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.
Files changed (66) hide show
  1. package/dist/{ThPreferencesAdapter-GepvYoaL.d.mts → ThPreferencesAdapter-B39cxwAo.d.mts} +4 -22
  2. package/dist/{ThSettingsWrapper-DyYC678Q.d.mts → ThSettingsWrapper-DBrfTO6I.d.mts} +1 -1
  3. package/dist/{actions-CTg9C4C-.d.mts → actions-CN51OeyO.d.mts} +29 -6
  4. package/dist/{actionsReducer-Cnd7Cdh9.d.mts → actionsReducer-D3Ujx25n.d.mts} +5 -13
  5. package/dist/{chunk-C6LWEQL2.mjs → chunk-7X5KT42Z.mjs} +336 -310
  6. package/dist/chunk-7X5KT42Z.mjs.map +1 -0
  7. package/dist/{chunk-I765HTBI.mjs → chunk-GC7ENGE2.mjs} +49 -76
  8. package/dist/chunk-GC7ENGE2.mjs.map +1 -0
  9. package/dist/{chunk-MBWYHA4U.mjs → chunk-GGNTMKHK.mjs} +8 -8
  10. package/dist/chunk-GGNTMKHK.mjs.map +1 -0
  11. package/dist/{chunk-TNXLY2ZQ.mjs → chunk-GWL53CI4.mjs} +9 -9
  12. package/dist/chunk-GWL53CI4.mjs.map +1 -0
  13. package/dist/{chunk-JXHRUQKP.mjs → chunk-OOAZZ3IZ.mjs} +9 -9
  14. package/dist/chunk-OOAZZ3IZ.mjs.map +1 -0
  15. package/dist/{chunk-2YS5JTIR.mjs → chunk-QME5CNAT.mjs} +5 -5
  16. package/dist/{chunk-2YS5JTIR.mjs.map → chunk-QME5CNAT.mjs.map} +1 -1
  17. package/dist/{chunk-6DR4EAK3.mjs → chunk-WA35SQJK.mjs} +2 -2
  18. package/dist/chunk-WA35SQJK.mjs.map +1 -0
  19. package/dist/components/Audio/index.css +1 -1
  20. package/dist/components/Audio/index.css.map +1 -1
  21. package/dist/components/Audio/index.d.mts +9 -9
  22. package/dist/components/Audio/index.mjs +4 -4
  23. package/dist/components/Epub/index.css +1 -1
  24. package/dist/components/Epub/index.css.map +1 -1
  25. package/dist/components/Epub/index.d.mts +9 -9
  26. package/dist/components/Epub/index.mjs +5 -5
  27. package/dist/components/Reader/index.css +1 -1
  28. package/dist/components/Reader/index.css.map +1 -1
  29. package/dist/components/Reader/index.d.mts +8 -8
  30. package/dist/components/Reader/index.mjs +9 -9
  31. package/dist/components/WebPub/index.css +1 -1
  32. package/dist/components/WebPub/index.css.map +1 -1
  33. package/dist/components/WebPub/index.d.mts +9 -9
  34. package/dist/components/WebPub/index.mjs +5 -5
  35. package/dist/core/Components/index.d.mts +5 -5
  36. package/dist/core/Hooks/index.d.mts +4 -4
  37. package/dist/lib/index.d.mts +7 -7
  38. package/dist/lib/index.mjs +1 -1
  39. package/dist/locales/ar/thorium-shared.json +109 -14
  40. package/dist/locales/ar/thorium-web.json +67 -7
  41. package/dist/locales/en/thorium-shared.json +3 -0
  42. package/dist/locales/en/thorium-web.json +1 -2
  43. package/dist/locales/es/thorium-shared.json +2 -2
  44. package/dist/locales/es/thorium-web.json +1 -1
  45. package/dist/locales/et/thorium-shared.json +3 -0
  46. package/dist/locales/fi/thorium-shared.json +3 -0
  47. package/dist/locales/fr/thorium-shared.json +1 -1
  48. package/dist/locales/it/thorium-shared.json +3 -0
  49. package/dist/locales/lt/thorium-shared.json +6 -3
  50. package/dist/locales/pl/thorium-shared.json +6 -0
  51. package/dist/locales/sl/thorium-shared.json +380 -0
  52. package/dist/locales/sv/thorium-shared.json +6 -0
  53. package/dist/locales/sv/thorium-web.json +2 -2
  54. package/dist/preferences/index.d.mts +8 -8
  55. package/dist/preferences/index.mjs +1 -1
  56. package/dist/{settingsReducer-DRWEq8Cm.d.mts → settingsReducer-flD_zs4E.d.mts} +1 -1
  57. package/dist/{useContrast-Unp3534Z.d.mts → useContrast-BJlYqbPP.d.mts} +1 -1
  58. package/dist/{usePreferences-Bi-ptif0.d.mts → usePreferences-DZX-xVu2.d.mts} +4 -4
  59. package/dist/{useReaderTransitions-B9fOF61y.d.mts → useReaderTransitions-CIbMYwzs.d.mts} +7 -7
  60. package/package.json +3 -3
  61. package/dist/chunk-6DR4EAK3.mjs.map +0 -1
  62. package/dist/chunk-C6LWEQL2.mjs.map +0 -1
  63. package/dist/chunk-I765HTBI.mjs.map +0 -1
  64. package/dist/chunk-JXHRUQKP.mjs.map +0 -1
  65. package/dist/chunk-MBWYHA4U.mjs.map +0 -1
  66. package/dist/chunk-TNXLY2ZQ.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Plugins/PluginRegistry.ts","../src/components/Plugins/PluginProvider.tsx","../src/components/Actions/hooks/useActionComponentStatus.ts","../src/components/Actions/assets/styles/thorium-web.overflow.module.css","../src/components/Actions/Triggers/StatefulShortcut.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/hooks/useIsScroll.ts","../src/hooks/useReaderTransitions.ts","../src/helpers/serializePositions.ts","../src/hooks/usePublication.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/helpers/dockReservation.ts","../src/components/Docking/hooks/useDockReservation.ts","../src/components/Docking/hooks/useDockTrigger.ts","../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/hooks/usePositionStorage.ts","../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/Settings/helpers/settingsKeyMapping.ts","../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/hooks/useReaderSetting.ts","../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/usePlaceholder.ts","../src/components/Settings/hooks/useEffectiveRange.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/Text/StatefulLigatures.tsx","../src/components/Settings/Text/StatefulNoRuby.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/components/StatefulGlobalPreferencesProvider.tsx","../src/helpers/peripherals.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/Docking/hooks/useFocusedDockableKey.ts","../src/core/Hooks/useTocTreeBuilder.ts","../src/components/Actions/Toc/useTocEntryTracking.ts","../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","tooltipShortcut","alwaysVisible","partiallyVisible","iconCompSm","iconCompLg","iconApplyStroke","classNames","jsxs","useMemo","createContext","useContext","useState","error","useEffect","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","useRef","React","snapArray","scrimPref","className","detent","wrapper","form","label","input","button","numberField","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","search","searchLabel","searchInput","searchIcon","clearButton","tree","treeItem","treeItemButton","treeItemText","treeItemTextTitle","treeItemTextPosition","empty","items","getScriptMode","Link","value","val","setLetterSpacing","setLineHeight","setParagraphIndent","setParagraphSpacing","setPublisherStyles","theme","t","setWordSpacing","useNumberFormatter","listbox","listboxItem","durationField","instruction","inputs","fieldGroup","fieldInput","unitLabel","remaining","cancelButton","startButton","Button","useStore","main","shell","leftDock","rightDock","bottomBar","topBar","barOverlay","headerOverlay","footerOverlay","iframeContainer","loading","srOnly","backlinkWrapper","actionsWrapper","link"],"mappings":"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","file":"chunk-7X5KT42Z.mjs","sourcesContent":["import { ThSettingsEntry } from \"@/core/Components\";\nimport { StatefulActionsMapObject } from \"../Actions\";\n\nexport enum ThPluginType {\n ACTION = \"action\",\n SETTING = \"setting\",\n}\n\nexport type ActionComponent = StatefulActionsMapObject;\n\nexport interface SettingComponent extends ThSettingsEntry {\n type?: \"text\" | \"spacing\";\n props?: any;\n}\n\nexport interface ThPlugin {\n id: string;\n name: string;\n description?: string;\n version?: string;\n components: {\n actions?: Record<string, ActionComponent>;\n settings?: Record<string, SettingComponent>;\n primaryAudioActions?: Record<string, ActionComponent>;\n };\n}\n\n// Store plugins in a module-level variable to ensure persistence\nconst pluginsStore: ThPlugin[] = [];\n\nclass PluginRegistryClass {\n register(plugin: ThPlugin): void {\n const existingPluginIndex = pluginsStore.findIndex(p => p.id === plugin.id);\n \n if (existingPluginIndex >= 0) {\n pluginsStore[existingPluginIndex] = plugin;\n } else {\n pluginsStore.push(plugin);\n }\n }\n \n unregister(pluginId: string): void {\n const filteredPlugins = pluginsStore.filter(plugin => plugin.id !== pluginId);\n \n // Clear the array and repopulate it\n pluginsStore.length = 0;\n pluginsStore.push(...filteredPlugins);\n }\n \n getPlugins(): ThPlugin[] {\n return [...pluginsStore];\n }\n \n getComponentMaps() {\n const actionsComponentsMap: Record<string, ActionComponent> = {} as Record<string, ActionComponent>;\n const settingsComponentsMap: Record<string, SettingComponent> = {} as Record<string, SettingComponent>;\n const primaryAudioActionsMap: Record<string, ActionComponent> = {} as Record<string, ActionComponent>;\n\n // Process plugins in reverse order so later plugins override earlier ones\n [...pluginsStore].reverse().forEach(plugin => {\n // Merge actions components\n if (plugin.components.actions) {\n Object.entries(plugin.components.actions).forEach(([key, component]) => {\n actionsComponentsMap[key as string] = component;\n });\n }\n\n // Merge settings components\n if (plugin.components.settings) {\n Object.entries(plugin.components.settings).forEach(([key, component]) => {\n settingsComponentsMap[key as string] = component;\n });\n }\n\n // Merge primary audio action components\n if (plugin.components.primaryAudioActions) {\n Object.entries(plugin.components.primaryAudioActions).forEach(([key, component]) => {\n primaryAudioActionsMap[key as string] = component;\n });\n }\n });\n\n return {\n actionsComponentsMap,\n settingsComponentsMap,\n primaryAudioActionsMap\n };\n }\n}\n\n// Export singleton instance\nexport const ThPluginRegistry = new PluginRegistryClass();","\"use client\";\n\nimport React, { createContext, useContext, useEffect, useState } from \"react\";\nimport { ThPluginRegistry, ActionComponent, SettingComponent } from \"./PluginRegistry\";\n\ninterface ThPluginContextType {\n actionsComponentsMap: Record<string, ActionComponent>;\n settingsComponentsMap: Record<string, SettingComponent>;\n textSettingsComponentsMap: Record<string, SettingComponent>;\n spacingSettingsComponentsMap: Record<string, SettingComponent>;\n primaryAudioActionsMap: Record<string, ActionComponent>;\n registerPlugin: typeof ThPluginRegistry.register;\n unregisterPlugin: typeof ThPluginRegistry.unregister;\n}\n\nconst ThPluginContext = createContext<ThPluginContextType>({\n actionsComponentsMap: {} as Record<string, ActionComponent>,\n settingsComponentsMap: {} as Record<string, SettingComponent>,\n textSettingsComponentsMap: {} as Record<string, SettingComponent>,\n spacingSettingsComponentsMap: {} as Record<string, SettingComponent>,\n primaryAudioActionsMap: {} as Record<string, ActionComponent>,\n registerPlugin: ThPluginRegistry.register.bind(ThPluginRegistry),\n unregisterPlugin: ThPluginRegistry.unregister.bind(ThPluginRegistry)\n});\n\nexport const usePlugins = () => useContext(ThPluginContext);\n\nexport const ThPluginProvider = ({ children }: { children: React.ReactNode }) => {\n const [componentMaps, setComponentMaps] = useState<{\n actionsComponentsMap: Record<string, ActionComponent>;\n settingsComponentsMap: Record<string, SettingComponent>;\n textSettingsComponentsMap: Record<string, SettingComponent>;\n spacingSettingsComponentsMap: Record<string, SettingComponent>;\n primaryAudioActionsMap: Record<string, ActionComponent>;\n }>(() => {\n // Force a fresh retrieval of component maps\n const maps = ThPluginRegistry.getComponentMaps();\n return {\n ...maps,\n textSettingsComponentsMap: getTypedSettingsComponents(maps.settingsComponentsMap, \"text\"),\n spacingSettingsComponentsMap: getTypedSettingsComponents(maps.settingsComponentsMap, \"spacing\")\n };\n });\n \n // Helper function to filter settings components by type\n function getTypedSettingsComponents(\n componentsMap: Record<string, SettingComponent>,\n type: \"text\" | \"spacing\"\n ): Record<string, SettingComponent> {\n return Object.entries(componentsMap)\n .filter(([_, component]) => component.type === type)\n .reduce((acc, [key, component]) => {\n acc[key] = component;\n return acc;\n }, {} as Record<string, SettingComponent>);\n }\n \n // Update component maps when plugins change\n useEffect(() => {\n const updateComponentMaps = () => {\n const maps = ThPluginRegistry.getComponentMaps();\n setComponentMaps({\n ...maps,\n textSettingsComponentsMap: getTypedSettingsComponents(maps.settingsComponentsMap, \"text\"),\n spacingSettingsComponentsMap: getTypedSettingsComponents(maps.settingsComponentsMap, \"spacing\"),\n });\n };\n \n // Initial update to ensure we have the latest maps\n updateComponentMaps();\n }, []);\n \n // Wrapper for register that triggers an update\n const registerPlugin = (plugin: Parameters<typeof ThPluginRegistry.register>[0]) => {\n ThPluginRegistry.register(plugin);\n };\n \n // Wrapper for unregister that triggers an update\n const unregisterPlugin = (pluginId: string) => {\n ThPluginRegistry.unregister(pluginId);\n };\n \n // Provide the component maps and plugin management functions\n const value = {\n ...componentMaps,\n registerPlugin,\n unregisterPlugin\n };\n \n return (\n <ThPluginContext.Provider value={ value }>\n { children }\n </ThPluginContext.Provider>\n );\n};","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { usePlugins } from \"../../Plugins/PluginProvider\";\n\ninterface UseActionComponentStatusOptions {\n actionKey: string;\n orderArray?: string[];\n additionalCondition?: boolean;\n}\n\ninterface ActionComponentStatus {\n isComponentRegistered: boolean;\n isInOrder: boolean;\n isComponentAvailable: boolean;\n}\n\n/**\n * Generic hook to check if an action component is registered in the plugin registry,\n * in the provided display order array, and meets any additional conditions.\n * Parallel to useSettingsComponentStatus for settings.\n *\n * @param options - Configuration options for the action component status check\n * @returns Object containing status flags for the action component\n */\nexport const useActionComponentStatus = (options: UseActionComponentStatusOptions): ActionComponentStatus => {\n const { actionKey, orderArray, additionalCondition } = options;\n\n const { actionsComponentsMap, primaryAudioActionsMap } = usePlugins();\n\n return useMemo(() => {\n const isComponentRegistered = !!actionsComponentsMap?.[actionKey] ||\n !!primaryAudioActionsMap?.[actionKey];\n\n const isInOrder = orderArray ? orderArray.includes(actionKey) : true;\n const isComponentAvailable = isComponentRegistered && isInOrder && (additionalCondition ?? true);\n\n return { isComponentRegistered, isInOrder, isComponentAvailable };\n }, [actionKey, orderArray, additionalCondition, actionsComponentsMap, primaryAudioActionsMap]);\n};\n",":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 { KeyCombo } from \"@readium/navigator-html-injectables\";\nimport { I18nValue } from \"@/preferences/models/i18n\";\n\nimport { Keyboard } from \"react-aria-components\";\n\nimport { ShortcutRepresentation, metaKeys, UnstablePlatformModifier } from \"@/core/Helpers/keyboardUtilities\";\nimport { ThShortcutConfig } from \"@/preferences/models/actions\";\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nconst DIGIT_OFFSET = 48;\nconst F_KEY_OFFSET = 112;\n\nconst resolveKeyLabel = (keyCode: number, label: I18nValue<string> | undefined, t: (key: string, options?: any) => string): string => {\n if (label !== undefined) {\n if (typeof label === \"string\") return label;\n return t(label.key, { defaultValue: label.fallback });\n }\n\n if (keyCode >= 65 && keyCode <= 90) return String.fromCharCode(keyCode);\n if (keyCode >= DIGIT_OFFSET && keyCode <= 57) return String.fromCharCode(keyCode);\n if (keyCode >= F_KEY_OFFSET && keyCode <= 123) return `F${keyCode - F_KEY_OFFSET + 1}`;\n\n return \"\";\n};\n\nconst pickCombo = (keyCombos: KeyCombo[], platformModifier: UnstablePlatformModifier): KeyCombo => {\n if (keyCombos.length === 1) return keyCombos[0];\n\n const wantsCtrl = platformModifier.modifier === \"ctrlKey\";\n const preferred = keyCombos.find(c => wantsCtrl ? c.ctrl : c.meta);\n return preferred ?? keyCombos[0];\n};\n\nexport interface StatefulShortcutProps {\n className?: string;\n combo: ThShortcutConfig;\n representation?: ShortcutRepresentation;\n joiner?: string;\n}\n\nexport const StatefulShortcut = ({\n className,\n combo,\n representation,\n joiner\n}: StatefulShortcutProps) => {\n const { shortcuts } = useSharedPreferences();\n const platformModifier = useAppSelector(state => state.reader.platformModifier);\n const { t } = useI18n();\n\n const rep = representation ?? shortcuts.representation ?? ShortcutRepresentation.symbol;\n const sep = joiner ?? shortcuts.joiner ?? \" + \";\n\n const { keyCombos, label } = combo;\n if (!keyCombos.length) return <></>;\n\n const chosen = pickCombo(keyCombos, platformModifier);\n const parts: string[] = [];\n\n if (chosen.ctrl) parts.push(metaKeys.ctrlKey[rep]);\n if (chosen.alt) parts.push(metaKeys.altKey[rep]);\n if (chosen.shift) parts.push(metaKeys.shiftKey[rep]);\n if (chosen.meta) parts.push(metaKeys.metaKey[rep]);\n\n const keyLabel = resolveKeyLabel(chosen.keyCode, label, t);\n if (keyLabel) parts.push(keyLabel);\n\n if (!parts.length) return <></>;\n\n return (\n <Keyboard className={ className }>{ parts.join(sep) }</Keyboard>\n );\n};\n","\"use client\";\n\nimport { ThShortcutConfig } from \"@/preferences/models/actions\";\n\n\nimport overflowMenuStyles from \"../assets/styles/thorium-web.overflow.module.css\";\n\nimport { Text } from \"react-aria-components\";\nimport { StatefulShortcut } from \"./StatefulShortcut\";\n\nimport { ThMenuItem, ThMenuItemProps } from \"@/core/Components/Menu/ThMenuItem\";\n\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nexport interface StatefulOverflowMenuItemProps extends Omit<ThMenuItemProps, \"shortcut\"> {\n shortcut?: ThShortcutConfig | null\n}\n\nexport const StatefulOverflowMenuItem = ({\n id,\n label,\n SVGIcon,\n shortcut = undefined,\n ...props\n}: StatefulOverflowMenuItemProps) => {\n const { shortcuts } = useSharedPreferences();\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 && shortcuts.displayIn?.includes(\"menuItem\") && <StatefulShortcut\n className={ overflowMenuStyles.menuItemShortcut }\n combo={ 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 display: flex;\n align-items: center;\n gap: 0.5em;\n background-color: var(--th-theme-text);\n color: var(--th-theme-background);\n padding: 5px 10px;\n border-radius: var(--th-layout-radius);\n}\n\n.tooltipShortcut {\n font-family: monospace;\n font-weight: bold;\n padding: 5px;\n border-radius: var(--th-layout-radius);\n border: 1px solid currentColor;\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\";\nimport { ThShortcutConfig } from \"@/preferences/models/actions\";\n\nimport readerSharedUI from \"../../assets/styles/thorium-web.button.module.css\";\n\nimport { ThActionButton, ThActionButtonProps } from \"@/core/Components/Buttons/ThActionButton\";\nimport { StatefulShortcut } from \"./StatefulShortcut\";\n\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setImmersive } from \"@/lib/readerReducer\";\n\nimport { isActiveElement, isKeyboardTriggered } from \"@/core/Helpers/focusUtilities\";\nimport classNames from \"classnames\";\n\nexport interface StatefulActionIconProps extends ThActionButtonProps {\n visibility?: ThCollapsibilityVisibility;\n placement?: TooltipProps[\"placement\"];\n tooltipLabel?: string;\n shortcut?: ThShortcutConfig | null;\n}\n\nexport const StatefulActionIcon = ({\n ref: externalRef,\n visibility,\n placement,\n tooltipLabel,\n shortcut,\n children,\n ...props\n}: StatefulActionIconProps) => {\n const { theming, shortcuts } = 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: (\n <>\n { tooltipLabel }\n { shortcut && shortcuts.displayIn?.includes(\"tooltip\") && <StatefulShortcut className={ readerSharedUI.tooltipShortcut } combo={ shortcut } /> }\n </>\n )\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\";\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 (!fs.isSupported) 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 shortcut={ preferences.actionsKeys[ThActionsKeys.fullscreen].shortcut }\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\nconst MENU_DEPENDENCIES = [\"Trigger\"];\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={ MENU_DEPENDENCIES }\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 { useMemo, 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.containerBreakpoint);\n\n const compounds = useMemo(() => ({\n menu: (\n <StatefulOverflowMenu\n id={ id }\n triggerRef={ ref }\n className={ overflowMenuClassName }\n items={ [] }\n />\n )\n }), [id, overflowMenuClassName]);\n\n return (\n <>\n <ThCollapsibleActionsBar\n ref={ ref }\n id={ id }\n items={ items }\n breakpoint={ breakpoint }\n compounds={ compounds }\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, useMemo } from \"react\";\nimport { NavigatorContext } from \"../NavigatorProvider\";\nimport { EpubSettings, WebPubSettings, FXLFrameManager, FrameManager, WebPubFrameManager, ScriptMode } 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 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 // Script mode of the current publication (undefined for media navigators)\n getScriptMode(): ScriptMode | undefined;\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 // Build unified navigator, recreating only when the underlying navigators change\n const unified = useMemo<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 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 goForward: (animated: boolean, callback: NavigationCallback) => {\n if (navigator.goForward) {\n return navigator.goForward(animated, callback);\n }\n return callback?.(false);\n },\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 isVisual: () => isVisual,\n\n getScriptMode: (): ScriptMode | undefined => {\n if (isVisual && (navigator as ReturnType<typeof useEpubNavigator> | ReturnType<typeof useWebPubNavigator>).getScriptMode) {\n return (navigator as ReturnType<typeof useEpubNavigator> | ReturnType<typeof useWebPubNavigator>).getScriptMode?.();\n }\n return undefined;\n },\n\n getCframes: isVisual ? navigator.getCframes?.bind(navigator) : undefined,\n\n underlying: navigator\n };\n }, [context.visual, context.media]);\n\n // Memoize visual navigator wrapper to prevent recreation\n const visualMemo = useMemo(() => {\n if (!context.visual) return null;\n \n const visualNavigator = context.visual;\n return {\n ...visualNavigator,\n getSetting: createUnifiedGetSetting(visualNavigator)\n };\n }, [context.visual]);\n\n // Memoize media navigator to prevent recreation\n const mediaMemo = useMemo(() => {\n return context.media;\n }, [context.media]);\n\n return useMemo(() => ({\n get visual() {\n if (!visualMemo) throw new Error(\"Visual navigator not available\");\n return visualMemo;\n },\n get media() {\n if (!mediaMemo) throw new Error(\"Media navigator not available\");\n return mediaMemo;\n },\n get unified(): UnifiedNavigator {\n return unified;\n }\n }), [visualMemo, mediaMemo, unified]);\n};","\"use client\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nexport const useIsScroll = (): boolean => {\n const profile = useAppSelector(state => state.reader.profile);\n const scroll = useAppSelector(state => state.settings.scroll);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const scriptMode = useAppSelector(state => state.publication.scriptMode);\n\n if (profile === \"webPub\") return true;\n return (scroll || scriptMode === \"cjk-vertical\" || scriptMode === \"mongolian-vertical\") && !isFXL;\n};\n","import { useAppSelector } from \"@/lib/hooks\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { useIsScroll } from \"./useIsScroll\";\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 isScroll = useIsScroll();\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\n// The RWPM JSON shape produced by Locator.serialize()/consumed by Locator.deserialize().\n// Positions live in Redux (which requires serializable state), so they're stored in this\n// shape rather than as real Locator instances — code that needs a real Locator (e.g. to\n// call navigator.go()) must deserialize it first.\nexport interface SerializedLocator {\n href: string;\n type: string;\n title?: string;\n locations?: {\n fragments?: string[];\n progression?: number;\n totalProgression?: number;\n position?: number;\n };\n text?: {\n after?: string;\n before?: string;\n highlight?: string;\n };\n}\n\nexport const serializePositions = (positionsList?: Locator[]): SerializedLocator[] | undefined => {\n return positionsList?.map((locator) => locator.serialize());\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 setScriptMode,\n setPositionsList,\n setHasDisplayTransformability,\n} from \"@/lib/publicationReducer\";\nimport { getScriptMode } from \"@readium/navigator\";\nimport { setReaderProfile, ReaderProfile } from \"@/lib/readerReducer\";\nimport { serializePositions } from \"@/helpers/serializePositions\";\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 = serializePositions(rawPositions);\n dispatch(setPositionsList(positionsList ?? []));\n } catch (error) {\n console.error(\"Failed to fetch positions:\", error);\n dispatch(setPositionsList([]));\n }\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 // Script mode and RTL detection\n const mode = getScriptMode(publication.metadata);\n dispatch(setScriptMode(mode));\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 = serializePositions(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","/* 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 /* Deliberately non-zero: a zero-width separator can tie in offsetLeft/\n offsetWidth with an adjacent fully-collapsed Panel, which breaks\n react-resizable-panels' offset-based Panel/Separator ordering. */\n width: 1px;\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;","import { ThActionsTokens, ThAudioActionsTokens, ThSheetTypes } from \"@/preferences/models\";\n\n// Reserving a slot only makes sense for an action that lives there by\n// default: it is what \"the user can't pop it out\" is protecting. An action\n// whose default sheet isn't dockedStart/dockedEnd is only ever docked by the\n// user's own choice, so `docked.reserved` is inert on it — same as unset\nexport const isReservedByPref = (actionPref: ThActionsTokens | ThAudioActionsTokens | undefined): boolean => {\n const isDockedByDefault = actionPref?.sheet?.defaultSheet === ThSheetTypes.dockedStart\n || actionPref?.sheet?.defaultSheet === ThSheetTypes.dockedEnd;\n return !!actionPref?.docked?.reserved && isDockedByDefault;\n};\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThDockingKeys } from \"@/preferences/models\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { isReservedByPref } from \"../helpers/dockReservation\";\n\nexport const useDockReservation = <T extends string>(key: T) => {\n const preferences = useActionsPreferences();\n const profile = useAppSelector(state => state.reader.profile);\n const dock = useAppSelector(state => profile ? state.actions.dock[profile] : undefined);\n\n const actionPref = preferences.actionsKeys[key as keyof typeof preferences.actionsKeys];\n const reserved = isReservedByPref(actionPref);\n\n // A reserved occupant can't be displaced by any other action's docking\n const isSlotLockedByOther = useCallback((slot: ThDockingKeys.start | ThDockingKeys.end) => {\n return !!dock?.[slot]?.reserved && dock?.[slot]?.actionKey !== key;\n }, [dock, key]);\n\n return {\n dock,\n reserved,\n isSlotLockedByOther\n };\n};\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThDockingKeys } from \"@/preferences/models\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nimport { useDockReservation } from \"./useDockReservation\";\n\nexport const useDockTrigger = (slot: ThDockingKeys.start | ThDockingKeys.end, associatedKey?: string) => {\n const profile = useAppSelector(state => state.reader.profile);\n const actionsMap = useAppSelector(state => profile ? state.actions.keys[profile] : undefined);\n const actions = useActions(actionsMap || {});\n const { reserved, isSlotLockedByOther } = useDockReservation(associatedKey ?? \"\");\n const dispatch = useAppDispatch();\n\n const isDisabled = actions.whichDocked(associatedKey) === slot || isSlotLockedByOther(slot);\n\n const handlePress = useCallback(() => {\n if (associatedKey && profile) {\n dispatch(dockAction({\n key: associatedKey,\n dockingKey: slot,\n profile: profile,\n reserved\n }))\n }\n }, [dispatch, associatedKey, profile, reserved, slot]);\n\n return { isDisabled, handlePress };\n};\n","\"use client\";\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 { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useDockTrigger } from \"./hooks/useDockTrigger\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\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 { isDisabled, handlePress } = useDockTrigger(ThDockingKeys.start, associatedKey);\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 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 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 { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useDockTrigger } from \"./hooks/useDockTrigger\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\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 { isDisabled, handlePress } = useDockTrigger(ThDockingKeys.end, associatedKey);\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 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 profile = useAppSelector(state => state.reader.profile);\n const actionsMap = useAppSelector(state => profile ? state.actions.keys[profile] : undefined);\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","\"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","import { useEffect } from \"react\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { FXLFrameManager, FrameManager, WebPubFrameManager } from \"@readium/navigator\";\n\nimport { useIsScroll } from \"@/hooks\";\nimport { useAppSelector } from \"@/lib/hooks\";\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 isScroll = useIsScroll();\n const scriptMode = useAppSelector(state => state.publication.scriptMode);\n const isHorizontalScroll = scriptMode === \"cjk-vertical\" || scriptMode === \"mongolian-vertical\";\n\n const prevIsOpen = usePrevious(isOpen);\n\n let getCframes: (() => (FXLFrameManager | FrameManager | WebPubFrameManager | undefined)[] | undefined) | undefined;\n try {\n const visual = useNavigator().visual;\n getCframes = visual.getCframes;\n } catch (_e) {\n // Visual navigator not available (audio profile)\n getCframes = undefined;\n }\n\n useEffect(() => {\n if (isScroll && prevIsOpen && !isOpen && getCframes) {\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 if (isHorizontalScroll) {\n const currentWidth = container.offsetWidth;\n container.style.width = `${ currentWidth - 1 }px`;\n } else {\n const currentHeight = container.offsetHeight;\n container.style.height = `${ currentHeight - 1 }px`;\n }\n\n // Otherwise Safari will ignore the reflow.\n setTimeout(() => {\n if (isHorizontalScroll) {\n container.style.width = \"\";\n } else {\n container.style.height = \"\";\n }\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\n // Safely check if frame window is accessible\n let frameWindow;\n try {\n frameWindow = frame?.window;\n if (!frameWindow?.document?.scrollingElement) return;\n } catch (_e) {\n // Frame is not accessible (cross-origin or invalid state)\n return;\n }\n\n if (isHorizontalScroll) {\n const currentScrollLeft = frameWindow.document.scrollingElement.scrollLeft;\n const nudge = currentScrollLeft <= 0 ? -1 : 1;\n frameWindow.document.scrollingElement.scrollLeft = currentScrollLeft + nudge;\n frameWindow.document.scrollingElement.scrollLeft = currentScrollLeft;\n } else {\n const currentScrollTop = frameWindow.document.scrollingElement.scrollTop;\n if (currentScrollTop > 1) {\n frameWindow.document.scrollingElement.scrollTop = currentScrollTop - 1;\n } else {\n frameWindow.document.scrollingElement.scrollTop = currentScrollTop + 1;\n }\n frameWindow.document.scrollingElement.scrollTop = currentScrollTop;\n }\n }, 0);\n }\n }, [isScroll, isHorizontalScroll, isOpen, prevIsOpen, 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 id={ id }\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 id={ id }\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 id: id,\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, useState } 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 }: StatefulDockedSheetProps) => {\n const { t } = useI18n()\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 const [dockPortal, setDockPortal] = useState<HTMLElement | null>(null);\n\n const direction = useAppSelector(state => state.reader.direction);\n const profile = useAppSelector(state => state.reader.profile);\n const isSlotActive = useAppSelector(state => profile && flow ? !!state.actions.dock[profile]?.[flow]?.active : false);\n\n // The node only exists while its DockPanel is mounted, and `active` tracks\n // exactly that. Resolved in state because reading it during render can return\n // null on the mounting commit, with no re-render to ever correct it\n useEffect(() => {\n setDockPortal(flow ? document.getElementById(flow) : null);\n }, [flow, isSlotActive, isOpen]);\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 id={ id }\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 id={ id }\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, useMemo } from \"react\";\n\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 { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useDockReservation } from \"./useDockReservation\";\n\nconst isDockedType = (type: ThSheetTypes) => type === ThSheetTypes.dockedStart || type === ThSheetTypes.dockedEnd;\n\nexport const useDocking = <T extends string>(key: T) => {\n const preferences = useActionsPreferences();\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n const profile = useAppSelector(state => state.reader.profile);\n const actionsMap = useAppSelector(state => profile ? state.actions.keys[profile] : undefined);\n const actionState = actionsMap?.[key];\n const { dock, reserved, isSlotLockedByOther } = useDockReservation(key);\n const dispatch = useAppDispatch();\n\n const dockingPref = preferences.docking.dock;\n const dockingMap = useMemo(() => makeBreakpointsMap<ThDockingTypes>({\n defaultValue: ThDockingTypes.both,\n fromEnum: ThDockingTypes,\n pref: dockingPref,\n disabledValue: ThDockingTypes.none\n }), [dockingPref]);\n const currentDockConfig = breakpoint && dockingMap[breakpoint];\n\n // Use type assertion to tell TypeScript that the key is valid\n const actionPref = preferences.actionsKeys[key as keyof typeof preferences.actionsKeys];\n const dockablePref = actionPref?.docked?.dockable || ThDockingTypes.none;\n const reopenOnLoadPref = !!actionPref?.docked?.reopenOnLoad;\n\n const defaultSheet = actionPref?.sheet?.defaultSheet || ThSheetTypes.popover;\n const fallbackSheet = actionPref?.sheet?.fallbackSheet || ThSheetTypes.modal;\n // defaultSheet may itself be dockedStart/dockedEnd; safeDefaultSheet is always\n // renderable and is what every \"docking isn't available\" fallback should use\n const safeDefaultSheet = isDockedType(defaultSheet) ? fallbackSheet : defaultSheet;\n\n const sheetBreakpointsPref = actionPref?.sheet?.breakpoints;\n const sheetMap = useMemo(() => makeBreakpointsMap<ThSheetTypes>({\n defaultValue: defaultSheet,\n fromEnum: ThSheetTypes,\n pref: sheetBreakpointsPref\n }), [defaultSheet, sheetBreakpointsPref]);\n const sheetPref = breakpoint && sheetMap[breakpoint] || defaultSheet;\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 && !isSlotLockedByOther(slot === ThDockingTypes.start ? ThDockingKeys.start : ThDockingKeys.end);\n }, [currentDockConfig, dockablePref, isSlotLockedByOther]);\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 // The pref can itself point at a dock slot the action can’t have, leaving it\n // with no panel to portal into. Branches below each check only the one slot\n // they know about, so validate against both here\n const usableSheetPref = useCallback((): ThSheetTypes => {\n if (sheetPref === ThSheetTypes.dockedStart && !canBeDocked(ThDockingTypes.start)) return safeDefaultSheet;\n if (sheetPref === ThSheetTypes.dockedEnd && !canBeDocked(ThDockingTypes.end)) return safeDefaultSheet;\n return sheetPref;\n }, [sheetPref, canBeDocked, safeDefaultSheet]);\n\n // A \"transient\" persisted before the action became reserved is a state the\n // action can no longer leave on its own: reserved actions expose no undock\n // control, so nothing can move it back to a slot. Treated as unclaimed\n // everywhere below, and written back to a real slot by the effect that\n // claims it — leaving it would render a docked sheet with no slot to\n // portal into, which no trigger can then open\n const hasStaleTransient = actionState?.docking === ThDockingKeys.transient && reserved;\n const effectiveDocking = hasStaleTransient ? undefined : actionState?.docking;\n\n // sheetPref once it's known to name a slot other than the one actually\n // being resolved: a non-docked value is a deliberate per-breakpoint choice\n // and used as-is, a docked one carries no usable slot information here\n const nonDockedSheetPref = isDockedType(sheetPref) ? safeDefaultSheet : sheetPref;\n\n // Derived, never stored: held in state it lags a render behind the values it\n // comes from, and the effects below then dispatch against a stale sheet type\n const sheetType: ThSheetTypes = useMemo(() => {\n // Protect against null breakpoint during initialization\n if (!breakpoint) {\n return safeDefaultSheet;\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 safe fallback\n if (isDockedSheetPref()) {\n return safeDefaultSheet;\n } else {\n // Sheet pref is not of docked type, we can return it\n return usableSheetPref();\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 (effectiveDocking) {\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 safeDefaultSheet;\n } else {\n return usableSheetPref();\n }\n\n // The chosen slot may not be the one the static pref names, so\n // usableSheetPref (keyed to sheetPref's own slot) can't be reused here.\n // Unavailable: an explicit per-breakpoint non-docked sheet wins,\n // otherwise fall to fallbackSheet\n case ThDockingKeys.start:\n if (canBeDocked(ThDockingTypes.start)) {\n return ThSheetTypes.dockedStart;\n } else {\n return nonDockedSheetPref;\n }\n\n case ThDockingKeys.end:\n if (canBeDocked(ThDockingTypes.end)) {\n return ThSheetTypes.dockedEnd;\n } else {\n return nonDockedSheetPref;\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 safeDefaultSheet;\n }\n } else if (isDockedSheetPref(ThSheetTypes.dockedEnd)) {\n if (canBeDocked(ThDockingTypes.end)) {\n return ThSheetTypes.dockedEnd;\n } else {\n return safeDefaultSheet;\n }\n } else {\n return usableSheetPref();\n }\n default:\n return safeDefaultSheet;\n }\n }, [dockablePref, safeDefaultSheet, effectiveDocking, canBeDocked, isDockedSheetPref, usableSheetPref, nonDockedSheetPref, breakpoint]);\n\n const previousSheetType = usePrevious(sheetType);\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 // Reserved actions never expose an undock control\n if (!reserved) {\n dockerKeys.push(dockingKey);\n }\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, reserved, canBeDocked]);\n\n // Two independent gaps to fill once the breakpoint says this action is docked.\n // Both guards are cleared by their own dispatch, so each is one-shot\n useEffect(() => {\n if (!profile) return;\n\n if (!isDockedType(sheetType)) {\n // Docking isn't available at this breakpoint. A remembered `isOpen:\n // true` from a wider viewport shouldn't leak into whatever fallback\n // sheet this action renders as on a cold load — the \"dismiss when\n // sheet stops being docked\" effect below can't catch this itself,\n // since `usePrevious` has nothing to compare against on first render.\n // Gated to that one-shot case: previousSheetType is only null on\n // mount, so a later deliberate reopen isn't clobbered right back shut\n if (previousSheetType == null && (actionState?.docking === ThDockingKeys.start || actionState?.docking === ThDockingKeys.end) && actionState?.isOpen) {\n dispatch(setActionOpen({\n key: key,\n isOpen: false,\n profile\n }));\n }\n return;\n }\n\n // The slot was never claimed: docking comes from prefs, or the action was\n // opened at a breakpoint where it rendered as another sheet type.\n // Displacing a non-reserved occupant is allowed — dockAction is the one\n // place that arbitrates reservation\n if (effectiveDocking == null) {\n dispatch(dockAction({\n key: key,\n dockingKey: sheetType === ThSheetTypes.dockedStart ? ThDockingKeys.start : ThDockingKeys.end,\n profile: profile,\n reserved\n }));\n }\n\n // isOpen is only undetermined here for an action that's never been\n // docked before (nothing to remember), or a stale transient whose\n // persisted `false` belonged to a sheet type it no longer has. Both\n // fall back to `docked.reopenOnLoad`; any other persisted value is the\n // user's own choice and is left untouched\n if (actionState?.isOpen == null || hasStaleTransient) {\n dispatch(setActionOpen({\n key: key,\n isOpen: reopenOnLoadPref,\n profile\n }));\n }\n }, [effectiveDocking, hasStaleTransient, actionState?.isOpen, actionState?.docking, sheetType, previousSheetType, key, dispatch, profile, reserved, reopenOnLoadPref]);\n\n // Dismiss when the sheet stops being docked. `docking` is left pointing at\n // the slot, so it is reclaimed for free once the slot comes back\n useEffect(() => {\n // This was not dismissed on breakpoint change, but by the user\n if (effectiveDocking === ThDockingKeys.transient) return;\n\n // What the user docked has the upper hand: losing the slot to a breakpoint\n // falls back to the sheet pref but stays open. Only a reserved occupant\n // overrides that choice, since it can’t be displaced\n if (effectiveDocking === ThDockingKeys.start && !isSlotLockedByOther(ThDockingKeys.start)) return;\n if (effectiveDocking === ThDockingKeys.end && !isSlotLockedByOther(ThDockingKeys.end)) return;\n\n if (!previousSheetType || !isDockedType(previousSheetType) || isDockedType(sheetType)) return;\n if (!breakpoint || !profile) return;\n\n dispatch(setActionOpen({\n key: key,\n isOpen: false,\n profile\n }));\n }, [dispatch, key, sheetType, previousSheetType, breakpoint, profile, effectiveDocking, isSlotLockedByOther]);\n\n // Sync action docking property with profile dock state when profile changes.\n // The slot is authoritative here: it can already name this action while the\n // action's own `docking` still belongs to the profile we came from\n useEffect(() => {\n if (!profile || !dock) return;\n\n const startSlot = dock[ThDockingKeys.start];\n const endSlot = dock[ThDockingKeys.end];\n const isDockedInStart = startSlot?.actionKey === key;\n const isDockedInEnd = endSlot?.actionKey === key;\n const wasAlreadyDockedInStart = actionState?.docking === ThDockingKeys.start;\n const wasAlreadyDockedInEnd = actionState?.docking === ThDockingKeys.end;\n\n // Re-dispatch whenever the slot assignment changes, or when it doesn't\n // but the persisted `reserved` flag has drifted from the current pref\n // (e.g. `docked.reserved` was toggled in config for an action that's\n // already sitting in its slot)\n if (isDockedInStart && (!wasAlreadyDockedInStart || startSlot?.reserved !== reserved)) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.start,\n profile: profile,\n reserved\n }));\n // isOpen is only undetermined here for an action that's never been\n // docked before in this profile; anything else (true or false) is\n // the user's own choice and stays untouched\n if (!wasAlreadyDockedInStart && actionState?.isOpen == null && reopenOnLoadPref) {\n dispatch(setActionOpen({\n key: key,\n isOpen: true,\n profile\n }));\n }\n } else if (isDockedInEnd && (!wasAlreadyDockedInEnd || endSlot?.reserved !== reserved)) {\n dispatch(dockAction({\n key: key,\n dockingKey: ThDockingKeys.end,\n profile: profile,\n reserved\n }));\n // isOpen is only undetermined here for an action that's never been\n // docked before in this profile; anything else (true or false) is\n // the user's own choice and stays untouched\n if (!wasAlreadyDockedInEnd && actionState?.isOpen == null && reopenOnLoadPref) {\n dispatch(setActionOpen({\n key: key,\n isOpen: true,\n profile\n }));\n }\n }\n }, [profile, dock, actionState?.docking, actionState?.isOpen, key, dispatch, reserved, reopenOnLoadPref]);\n\n return {\n getDocker,\n sheetType\n }\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\nimport { SerializedLocator } from \"@/helpers/serializePositions\";\n\nexport const isPositionsListValid = (positionsList: SerializedLocator[] | 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 { Locator } from \"@readium/shared\";\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 profile = useAppSelector(state => state.reader.profile);\n const actionState = useAppSelector(state => profile ? state.actions.keys[profile][ThActionsKeys.jumpToPosition] : undefined);\n const positionsList = useAppSelector(state => state.publication.positionsList);\n\n const positionNumbers = useAppSelector(state => state.publication.progress?.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 if (profile) {\n dispatch(setActionOpen({\n key: ThActionsKeys.jumpToPosition,\n isOpen: value,\n profile\n }));\n }\n }, [dispatch, profile]);\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 const locator = Locator.deserialize(item);\n if (!locator) {\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(locator, !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 profile = useAppSelector(state => state.reader.profile);\n const actionState = useAppSelector(state => profile ? state.actions.keys[profile][ThActionsKeys.jumpToPosition] : undefined);\n const positionsList = useAppSelector(state => state.publication.positionsList);\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => {\n if (profile) {\n dispatch(setActionOpen({ \n key: ThActionsKeys.jumpToPosition,\n isOpen: value,\n profile\n }));\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 shortcut={ preferences.actionsKeys[ThActionsKeys.jumpToPosition].shortcut }\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 profile = useAppSelector(state => state.reader.profile);\n const actionState = useAppSelector(state => profile ? state.actions.keys[profile][ThActionsKeys.settings] : undefined);\n const dispatch = useAppDispatch();\n const docking = useDocking(ThActionsKeys.settings);\n\n const setOpen = (value: boolean) => {\n if (profile) {\n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: value,\n profile\n }));\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, useAppSelector } 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 const profile = useAppSelector(state => state.reader.profile);\n\n const close = useCallback(() => {\n if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false, profile }));\n }\n dispatch(setHovering(false));\n }, [dispatch, profile]);\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 { useFilteredPreferenceKeys } from \"@/preferences/hooks/useFilteredPreferenceKeys\";\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 const { mainSpacingSettingsKeys, subPanelSpacingSettingsKeys } = useFilteredPreferenceKeys();\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={ {\n main: mainSpacingSettingsKeys,\n subPanel: preferences.settings.spacing?.subPanel === null ? null : subPanelSpacingSettingsKeys,\n header: preferences.settings.spacing?.header\n } }\n defaultPrefs={ {\n main: defaultSpacingSettingsMain,\n subPanel: defaultSpacingSettingsSubpanel\n }}\n />\n </>\n );\n}\n\nexport const StatefulSpacingGroupContainer = () => {\n const { subPanelSpacingSettingsKeys } = useFilteredPreferenceKeys();\n const { spacingSettingsComponentsMap } = usePlugins();\n\n return(\n <>\n { subPanelSpacingSettingsKeys.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}\n","\"use client\";\n\nimport { 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 { useFilteredPreferenceKeys } from \"@/preferences/hooks/useFilteredPreferenceKeys\";\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 const { mainTextSettingsKeys, subPanelTextSettingsKeys } = useFilteredPreferenceKeys();\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={ {\n main: mainTextSettingsKeys,\n subPanel: preferences.settings.text?.subPanel === null ? null : subPanelTextSettingsKeys,\n header: preferences.settings.text?.header\n } }\n defaultPrefs={ {\n main: defaultTextSettingsMain,\n subPanel: defaultTextSettingsSubpanel\n }}\n />\n </>\n )\n}\n\nexport const StatefulTextGroupContainer = () => {\n const { subPanelTextSettingsKeys } = useFilteredPreferenceKeys();\n const { textSettingsComponentsMap } = usePlugins();\n\n return(\n <>\n { subPanelTextSettingsKeys.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}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo } from \"react\";\n\nimport {\n defaultSpacingSettingsMain,\n defaultSpacingSettingsSubpanel,\n defaultTextSettingsMain,\n defaultTextSettingsSubpanel,\n useFilteredPreferenceKeys\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 } = useFilteredPreferenceKeys();\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 if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false, profile }));\n }\n dispatch(setHovering(false));\n }, [dispatch, profile]);\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 profile = useAppSelector(state => state.reader.profile);\n const actionState = useAppSelector(state => profile ? state.actions.keys[profile][ThActionsKeys.settings] : undefined);\n const isAudio = profile === \"audio\";\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => { \n if (profile) {\n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: value,\n profile\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 shortcut={ preferences.actionsKeys[ThActionsKeys.settings].shortcut }\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 \"@/helpers/buildTocTree\";\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);\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 \"@/helpers/buildTocTree\";\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 dir={ isRTL ? \"rtl\" : \"ltr\" }\n >\n { function renderItem(item) {\n return (\n <TreeItem\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 } 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 toc = useAppSelector(state => state.publication.toc);\n const tocEntry = toc?.currentEntry ?? undefined;\n const tocEntryId = tocEntry?.id;\n const tocTree = toc?.tree;\n\n const { goLink, getScriptMode } = useNavigator().unified;\n // vertical-cjk has RTL reading progression but lays out as LTR in the TOC\n const isRTL = getScriptMode() === \"rtl\";\n\n const profile = useAppSelector(state => state.reader.profile);\n const actionState = useAppSelector(state => profile ? state.actions.keys[profile][ThActionsKeys.toc] : undefined);\n const dispatch = useAppDispatch();\n const docking = useDocking(ThActionsKeys.toc);\n const sheetType = docking.sheetType;\n\n const setOpen = useCallback((value: boolean) => {\n if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.toc, isOpen: value, profile }));\n }\n }, [dispatch, profile]);\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] as string;\n const matched = findTocItemById(tocTree || [], key);\n\n if (!matched) return;\n\n const link: Link = new Link({ href: matched.href });\n\n const cb = actionState?.isOpen &&\n (sheetType === ThSheetTypes.dockedStart || sheetType === ThSheetTypes.dockedEnd)\n ? () => {\n dispatch(setTocEntry(matched));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n }\n : () => {\n dispatch(setTocEntry(matched));\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 profile = useAppSelector(state => state.reader.profile);\n const actionState = useAppSelector(state => profile ? state.actions.keys[profile][ThActionsKeys.toc] : undefined);\n const dispatch = useAppDispatch();\n\n const setOpen = (value: boolean) => {\n if (profile) {\n dispatch(setActionOpen({ \n key: ThActionsKeys.toc,\n isOpen: value,\n profile\n }));\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 shortcut={ preferences.actionsKeys[ThActionsKeys.toc].shortcut }\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 profile = useAppSelector(state => state.reader.profile);\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 if (profile) {\n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: false,\n profile\n }));\n }\n }\n }, [dispatch, settingsContainer, profile]);\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 { ThSettingsKeys } from \"@/preferences/models\";\n\nexport const SETTINGS_KEY_TO_PREFERENCE = {\n [ThSettingsKeys.columns]: \"columnCount\",\n [ThSettingsKeys.fontFamily]: \"fontFamily\",\n [ThSettingsKeys.fontWeight]: \"fontWeight\",\n [ThSettingsKeys.hyphens]: \"hyphens\",\n [ThSettingsKeys.layout]: \"scroll\",\n [ThSettingsKeys.letterSpacing]: \"letterSpacing\",\n [ThSettingsKeys.ligatures]: \"ligatures\",\n [ThSettingsKeys.lineHeight]: \"lineHeight\",\n [ThSettingsKeys.paragraphIndent]: \"paragraphIndent\",\n [ThSettingsKeys.paragraphSpacing]: \"paragraphSpacing\",\n [ThSettingsKeys.publisherStyles]: \"publisherStyles\",\n [ThSettingsKeys.spacingGroup]: \"spacingGroup\",\n [ThSettingsKeys.spacingPresets]: \"spacingPresets\",\n [ThSettingsKeys.textAlign]: \"textAlign\",\n [ThSettingsKeys.textGroup]: \"textGroup\",\n [ThSettingsKeys.textNormalize]: \"textNormalization\",\n [ThSettingsKeys.noRuby]: \"noRuby\",\n [ThSettingsKeys.theme]: \"theme\",\n [ThSettingsKeys.wordSpacing]: \"wordSpacing\",\n [ThSettingsKeys.zoom]: \"zoom\",\n} as const;\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 { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { ThSettingsKeys } from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../../Settings/helpers/settingsKeyMapping\";\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\";\nimport { useIsScroll } from \"@/hooks\";\n\nimport debounce from \"debounce\";\n\nexport const StatefulColumns = () => {\n const { t } = useI18n();\n const isScroll = useIsScroll();\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 prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.columns];\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({ [prefKey]: colCount });\n updateEffectiveValue(value, getSetting(prefKey));\n dispatch(setColumnCount(value));\n }, [prefKey, submitPreferences, getSetting, updateEffectiveValue, dispatch]);\n\n const debouncedUpdate = useCallback(() => {\n const update = () => updateEffectiveValue(columnCount, getSetting(prefKey));\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 { useAppSelector } from \"@/lib/hooks\";\nimport { initialSettingsState, SettingsReducerState } from \"@/lib/settingsReducer\";\nimport { initialWebPubSettingsState, WebPubSettingsReducerState } from \"@/lib/webPubSettingsReducer\";\n\ntype SharedSettingsKey = keyof SettingsReducerState & keyof WebPubSettingsReducerState;\n\nexport function useReaderSetting(key: \"zoom\"): number;\nexport function useReaderSetting<K extends SharedSettingsKey>(key: K): SettingsReducerState[K];\nexport function useReaderSetting<K extends SharedSettingsKey>(key: K | \"zoom\") {\n return useAppSelector(state => {\n const isWebPub = state.reader.profile === \"webPub\";\n\n if (key === \"zoom\") {\n if (isWebPub) {\n const val = state.webPubSettings.zoom;\n return val !== undefined ? val : initialWebPubSettingsState.zoom;\n }\n const val = state.settings.fontSize;\n return val !== undefined ? val : initialSettingsState.fontSize;\n }\n\n if (isWebPub) {\n const val = state.webPubSettings[key as SharedSettingsKey];\n return (val !== undefined ? val : initialWebPubSettingsState[key as SharedSettingsKey]) as SettingsReducerState[K];\n }\n\n const val = state.settings[key as SharedSettingsKey];\n return val !== undefined ? val : initialSettingsState[key as SharedSettingsKey];\n });\n}\n","\"use client\";\n\nimport { CSSProperties, Key, useCallback, useRef } from \"react\";\n\nimport { ThSettingsKeys } from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 { useReaderSetting } from \"../hooks/useReaderSetting\";\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 fontFamilySettings = useReaderSetting(\"fontFamily\");\n const fontFamily = fontFamilySettings[fontLanguage] ?? \"publisher\";\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 prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.fontFamily];\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({ [prefKey]: selectedOption.value });\n \n const currentSetting = getSetting(prefKey);\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 }, [prefKey, 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 { ThSettingsKeys } from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 { useReaderSetting } from \"../hooks/useReaderSetting\";\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 = useReaderSetting(\"fontWeight\");\n\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.fontWeight];\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({ [prefKey]: fontWeightValue });\n const effectiveSetting = getSetting(prefKey);\n\n if (isWebPub) {\n dispatch(setWebPubFontWeight(effectiveSetting));\n } else {\n dispatch(setFontWeight(effectiveSetting));\n }\n }, [prefKey, 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 { ThSettingsKeys } from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 { useReaderSetting } from \"../hooks/useReaderSetting\";\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 = useReaderSetting(\"hyphens\");\n const textAlign = useReaderSetting(\"textAlign\");\n\n const dispatch = useAppDispatch();\n \n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.hyphens];\n\n const updatePreference = useCallback(async (value: boolean) => {\n await submitPreferences({ [prefKey]: value });\n const effectiveSetting = getSetting(prefKey);\n \n if (isWebPub) {\n dispatch(setWebPubHyphens(effectiveSetting));\n } else {\n dispatch(setHyphens(effectiveSetting));\n }\n }, [prefKey, 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, ThSettingsKeys } from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../../Settings/helpers/settingsKeyMapping\";\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 } from \"@/lib/hooks\";\nimport { setScroll } from \"@/lib/settingsReducer\";\nimport { useIsScroll } from \"@/hooks\";\n\nexport const StatefulLayout = () => {\n const { t } = useI18n();\n const isScroll = useIsScroll();\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 prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.layout];\n\n const updatePreference = useCallback(async (value: string) => {\n const derivedValue = value === ThLayoutOptions.scroll;\n await submitPreferences({ [prefKey]: derivedValue });\n dispatch(setScroll(getSetting(prefKey)));\n }, [prefKey, 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 { useFilteredPreferenceKeys } from \"@/preferences/hooks/useFilteredPreferenceKeys\";\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 /** 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, additionalCondition = true } = options;\n \n const { spacingSettingsComponentsMap, textSettingsComponentsMap, settingsComponentsMap } = usePlugins();\n const { reflowSettingsKeys, fxlSettingsKeys, webPubSettingsKeys, mainTextSettingsKeys, subPanelTextSettingsKeys, mainSpacingSettingsKeys, subPanelSpacingSettingsKeys } = useFilteredPreferenceKeys();\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 = reflowSettingsKeys.includes(settingsKey as ThSettingsKeys) || false;\n break;\n case \"fxl\":\n isInOrder = fxlSettingsKeys.includes(settingsKey as ThSettingsKeys) || false;\n break;\n case \"webpub\":\n isInOrder = webPubSettingsKeys.includes(settingsKey as ThSettingsKeys) || false;\n break;\n }\n \n // 3. Check if component is in any panel (text or spacing)\n const isInMainPanel =\n mainTextSettingsKeys.includes(settingsKey as any) ||\n mainSpacingSettingsKeys.includes(settingsKey as any) ||\n false;\n const isInSubPanel =\n subPanelTextSettingsKeys.includes(settingsKey as any) ||\n subPanelSpacingSettingsKeys.includes(settingsKey as any) ||\n false;\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 additionalCondition,\n reflowSettingsKeys,\n fxlSettingsKeys,\n webPubSettingsKeys,\n mainTextSettingsKeys,\n subPanelTextSettingsKeys,\n mainSpacingSettingsKeys,\n subPanelSpacingSettingsKeys,\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 { useFilteredPreferenceKeys } from \"@/preferences/hooks/useFilteredPreferenceKeys\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib\";\nimport { useReaderSetting } from \"@/components/Settings/hooks/useReaderSetting\";\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 const spacing = useReaderSetting(\"spacing\");\n\n const { reflowSpacingPresetKeys, fxlSpacingPresetKeys, webPubSpacingPresetKeys } = useFilteredPreferenceKeys();\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 additionalCondition: spacingKeys.length > 0\n });\n\n const letterSpacing = useReaderSetting(\"letterSpacing\");\n const lineHeight = useReaderSetting(\"lineHeight\");\n const paragraphIndent = useReaderSetting(\"paragraphIndent\");\n const paragraphSpacing = useReaderSetting(\"paragraphSpacing\");\n const wordSpacing = useReaderSetting(\"wordSpacing\");\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","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 { 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","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant, ThSpacingSettingsKeys } from \"@/preferences\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.letterSpacing];\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n [prefKey]: Array.isArray(value) ? value[0] : value\n });\n\n setLetterSpacing(getSetting(prefKey));\n }, [prefKey, 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\";\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { lineHeightRangeConfig, RCSSI18nEntry } from \"@readium/navigator\";\nimport i18nData from \"@readium/css/css/vars/i18n.json\";\n\nexport const ORDERED_LINE_HEIGHT_OPTIONS = [ThLineHeightOptions.small, ThLineHeightOptions.medium, ThLineHeightOptions.large] as const;\n\n// Resolves duplicate clamped values by distributing them evenly within their\n// effective range [min(clamped), max(clamped)]. Returns input unchanged if all distinct.\nfunction spreadValues(values: number[], globalMin: number, globalMax: number): number[] {\n const n = values.length;\n if (n <= 1) return values;\n const indexed = values.map((v, i) => ({ v, i })).sort((a, b) => a.v - b.v);\n if (indexed.every((item, i) => i === 0 || item.v !== indexed[i - 1].v)) return values;\n const lo = indexed[0].v === indexed[n - 1].v ? globalMin : indexed[0].v;\n const hi = indexed[0].v === indexed[n - 1].v ? globalMax : indexed[n - 1].v;\n const step = (hi - lo) / (n - 1);\n const result = new Array<number>(n);\n for (let i = 0; i < n; i++) result[indexed[i].i] = lo + i * step;\n return result;\n}\n\nconst getLineHeightCompensation = (language: string): number => {\n const data = i18nData as Record<string, RCSSI18nEntry>;\n if (data[language]?.lineHeightCompensation !== undefined) return data[language].lineHeightCompensation!;\n const stripped = language.split(\"-\").slice(0, -1).join(\"-\");\n if (stripped && data[stripped]?.lineHeightCompensation !== undefined) return data[stripped].lineHeightCompensation!;\n return data.latin?.lineHeightCompensation ?? 1;\n};\n\nexport const useLineHeight = () => {\n const { preferences } = usePreferences();\n const fontLanguage = useAppSelector(state => state.publication.fontLanguage);\n\n return useMemo(() => {\n const keys = preferences.settings.keys[ThSettingsKeys.lineHeight].keys;\n const factor = getLineHeightCompensation(fontLanguage);\n const values = {\n [ThLineHeightOptions.publisher]: null as null,\n [ThLineHeightOptions.small]: keys[ThLineHeightOptions.small],\n [ThLineHeightOptions.medium]: keys[ThLineHeightOptions.medium],\n [ThLineHeightOptions.large]: keys[ThLineHeightOptions.large],\n };\n const compensate = (v: number | null): number | null => v !== null ? v * factor : null;\n const compensatedValues = {\n [ThLineHeightOptions.publisher]: null as null,\n [ThLineHeightOptions.small]: compensate(values[ThLineHeightOptions.small]),\n [ThLineHeightOptions.medium]: compensate(values[ThLineHeightOptions.medium]),\n [ThLineHeightOptions.large]: compensate(values[ThLineHeightOptions.large]),\n };\n\n const [minRange, maxRange] = lineHeightRangeConfig.range;\n const clamp = (v: number | null): number =>\n v === null ? minRange : Math.min(Math.max(v, minRange), maxRange);\n\n const ordered = ORDERED_LINE_HEIGHT_OPTIONS;\n const clamped = ordered.map(key => clamp(compensatedValues[key]));\n const processed = spreadValues(clamped, minRange, maxRange);\n\n const processedValues = Object.fromEntries(\n ordered.map((key, i) => [key, processed[i]])\n ) as Record<typeof ordered[number], number>;\n\n return { values, compensatedValues, processedValues, compensate };\n }, [preferences.settings.keys, fontLanguage]);\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\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 { useI18n } from \"@/i18n/useI18n\";\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { useLineHeight } from \"./hooks/useLineHeight\";\nimport { useSpacingPresets } from \"./hooks/useSpacingPresets\";\nimport { useReaderSetting } from \"../hooks/useReaderSetting\";\n\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 = useReaderSetting(\"publisherStyles\");\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.lineHeight];\n\n const { getEffectiveSpacingValue, setLineHeight } = useSpacingPresets();\n\n const lineHeight = getEffectiveSpacingValue(ThSpacingSettingsKeys.lineHeight);\n\n const { processedValues } = useLineHeight();\n\n // Build map from processed values for settings UI\n const processedPresets = useMemo(() => {\n const result = new Map<ThLineHeightOptions, number>();\n result.set(ThLineHeightOptions.small, processedValues[ThLineHeightOptions.small]);\n result.set(ThLineHeightOptions.medium, processedValues[ThLineHeightOptions.medium]);\n result.set(ThLineHeightOptions.large, processedValues[ThLineHeightOptions.large]);\n return result;\n }, [processedValues]);\n\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 => processedPresets.has(item.id));\n\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, processedPresets, t]);\n\n const updatePreference = useCallback(async (value: string) => {\n const submitValue = value === ThLineHeightOptions.publisher\n ? null\n : processedPresets.get(value as ThLineHeightOptions) ?? null;\n await submitPreferences({\n [prefKey]: submitValue\n });\n\n const storedLineHeight = getSetting(prefKey) as number | null;\n const currentDisplayLineHeightOption = [...processedPresets.entries()].find(([, v]) => v === storedLineHeight)?.[0] as ThLineHeightOptions;\n\n setLineHeight(currentDisplayLineHeightOption);\n }, [prefKey, submitPreferences, getSetting, setLineHeight, processedPresets]);\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\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.paragraphIndent];\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n [prefKey]: Array.isArray(value) ? value[0] : value\n });\n\n setParagraphIndent(getSetting(prefKey));\n }, [prefKey, 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\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.paragraphSpacing];\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n [prefKey]: Array.isArray(value) ? value[0] : value\n });\n\n setParagraphSpacing(getSetting(prefKey));\n }, [prefKey, 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, ThSettingsKeys } from \"@/preferences\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"./helpers/settingsKeyMapping\";\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\";\nimport { useSettingsComponentStatus } from \"./hooks/useSettingsComponentStatus\";\n\nimport { useReaderSetting } from \"./hooks/useReaderSetting\";\n\nexport const StatefulPublisherStyles = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n const publisherStyles = useReaderSetting(\"publisherStyles\");\n\n const { getEffectiveSpacingValue, setPublisherStyles } = useSpacingPresets();\n\n // Check if individual spacing setting plugins are being used\n const { isComponentUsed: isLineHeightUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.lineHeight,\n publicationType: \"reflow\"\n });\n const { isComponentUsed: isParagraphIndentUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.paragraphIndent,\n publicationType: \"reflow\"\n });\n const { isComponentUsed: isParagraphSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.paragraphSpacing,\n publicationType: \"reflow\"\n });\n const { isComponentUsed: isLetterSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.letterSpacing,\n publicationType: \"reflow\"\n });\n const { isComponentUsed: isWordSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.wordSpacing,\n publicationType: \"reflow\"\n });\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 { compensatedValues: lineHeightOptions } = useLineHeight();\n\n const { submitPreferences } = useNavigator().visual;\n\n const lineHeightPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.lineHeight];\n const paragraphIndentPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.paragraphIndent];\n const paragraphSpacingPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.paragraphSpacing];\n const letterSpacingPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.letterSpacing];\n const wordSpacingPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.wordSpacing];\n\n const updatePreference = useCallback(async (isSelected: boolean) => {\n const values: any = {};\n\n if (isSelected) {\n // Reset all spacing settings to null (publisher defaults)\n if (isLineHeightUsed) {\n values[lineHeightPrefKey] = null;\n }\n if (isParagraphIndentUsed) {\n values[paragraphIndentPrefKey] = null;\n }\n if (isParagraphSpacingUsed) {\n values[paragraphSpacingPrefKey] = null;\n }\n if (isLetterSpacingUsed) {\n values[letterSpacingPrefKey] = null;\n }\n if (isWordSpacingUsed) {\n values[wordSpacingPrefKey] = null;\n }\n } else {\n // Set spacing settings to current values\n if (isLineHeightUsed) {\n values[lineHeightPrefKey] = lineHeight === ThLineHeightOptions.publisher\n ? null\n : lineHeightOptions[lineHeight as keyof typeof ThLineHeightOptions];\n }\n if (isParagraphIndentUsed) {\n values[paragraphIndentPrefKey] = paragraphIndent;\n }\n if (isParagraphSpacingUsed) {\n values[paragraphSpacingPrefKey] = paragraphSpacing;\n }\n if (isLetterSpacingUsed) {\n values[letterSpacingPrefKey] = letterSpacing;\n }\n if (isWordSpacingUsed) {\n values[wordSpacingPrefKey] = wordSpacing;\n }\n }\n\n await submitPreferences(values);\n\n setPublisherStyles(isSelected ? true : false);\n }, [submitPreferences, setPublisherStyles, lineHeight, paragraphIndent, paragraphSpacing, letterSpacing, wordSpacing, lineHeightOptions, lineHeightPrefKey, paragraphIndentPrefKey, paragraphSpacingPrefKey, letterSpacingPrefKey, wordSpacingPrefKey, isLineHeightUsed, isParagraphIndentUsed, isParagraphSpacingUsed, isLetterSpacingUsed, isWordSpacingUsed]);\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 ThSettingsKeys,\n} from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 { useFilteredPreferenceKeys } from \"@/preferences/hooks/useFilteredPreferenceKeys\";\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useLineHeight } from \"./hooks/useLineHeight\";\nimport { useSettingsComponentStatus } from \"../hooks/useSettingsComponentStatus\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib\";\nimport { useReaderSetting } from \"../hooks/useReaderSetting\";\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 } = useFilteredPreferenceKeys();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n const spacing = useReaderSetting(\"spacing\");\n const isFXL = useAppSelector(state => state.publication.isFXL);\n\n const dispatch = useAppDispatch();\n\n const { submitPreferences } = useNavigator().visual;\n\n const letterSpacingPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.letterSpacing];\n const lineHeightPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.lineHeight];\n const paragraphIndentPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.paragraphIndent];\n const paragraphSpacingPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.paragraphSpacing];\n const wordSpacingPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.wordSpacing];\n\n const { values: lineHeightOptions, compensate: compensateLineHeight } = useLineHeight();\n\n const { getPresetValues } = useSpacingPresets();\n\n // Check if individual spacing setting plugins are being used\n const publicationType = isWebPub ? \"webpub\" : isFXL ? \"fxl\" : \"reflow\";\n const { isComponentUsed: isLetterSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.letterSpacing,\n publicationType\n });\n const { isComponentUsed: isLineHeightUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.lineHeight,\n publicationType\n });\n const { isComponentUsed: isParagraphIndentUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.paragraphIndent,\n publicationType\n });\n const { isComponentUsed: isParagraphSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.paragraphSpacing,\n publicationType\n });\n const { isComponentUsed: isWordSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSpacingSettingsKeys.wordSpacing,\n publicationType\n });\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 compensated number)\n const lineHeightValue = reduxValues[ThSpacingSettingsKeys.lineHeight];\n const lineHeightValueNumber = lineHeightValue && lineHeightValue !== ThLineHeightOptions.publisher\n ? compensateLineHeight(lineHeightOptions[lineHeightValue as ThLineHeightOptions])\n : null;\n\n // Only include spacing settings if their plugins are being used\n const preferencesToSubmit: any = {};\n if (isLetterSpacingUsed) {\n preferencesToSubmit[letterSpacingPrefKey] = reduxValues[ThSpacingSettingsKeys.letterSpacing];\n }\n if (isLineHeightUsed) {\n preferencesToSubmit[lineHeightPrefKey] = lineHeightValueNumber;\n }\n if (isParagraphIndentUsed) {\n preferencesToSubmit[paragraphIndentPrefKey] = reduxValues[ThSpacingSettingsKeys.paragraphIndent];\n }\n if (isParagraphSpacingUsed) {\n preferencesToSubmit[paragraphSpacingPrefKey] = reduxValues[ThSpacingSettingsKeys.paragraphSpacing];\n }\n if (isWordSpacingUsed) {\n preferencesToSubmit[wordSpacingPrefKey] = 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, compensateLineHeight, letterSpacingPrefKey, lineHeightPrefKey, paragraphIndentPrefKey, paragraphSpacingPrefKey, wordSpacingPrefKey, isLetterSpacingUsed, isLineHeightUsed, isParagraphIndentUsed, isParagraphSpacingUsed, isWordSpacingUsed]);\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, ThTextSettingsKeys, ThSettingsKeys } from \"@/preferences/models\";\nimport { StatefulSettingsItemProps } from \"../models/settings\";\nimport { TextAlignment } from \"@readium/navigator\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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\";\nimport { useSettingsComponentStatus } from \"../hooks/useSettingsComponentStatus\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { useReaderSetting } from \"../hooks/useReaderSetting\";\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 = useReaderSetting(\"textAlign\");\n const hyphens = useReaderSetting(\"hyphens\");\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const hyphensPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.hyphens];\n const textAlignPrefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.textAlign];\n\n // Check if hyphens plugin is being used\n const publicationType = isWebPub ? \"webpub\" : \"reflow\";\n const { isComponentUsed: isHyphensUsed } = useSettingsComponentStatus({\n settingsKey: ThTextSettingsKeys.hyphens,\n publicationType\n });\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 // Capture old textAlign value before any updates\n const oldTextAlign = textAlign;\n\n const navigatorTextAlign: TextAlignment | null = value === ThTextAlignOptions.publisher\n ? null\n : value === ThTextAlignOptions.start\n ? TextAlignment.start\n : TextAlignment.justify;\n\n const preferencesToSubmit: any = {\n [textAlignPrefKey]: navigatorTextAlign\n };\n\n await submitPreferences(preferencesToSubmit);\n\n const textAlignSetting = getSetting(textAlignPrefKey) as TextAlignment | null;\n const textAlignValue = textAlignSetting === null ? ThTextAlignOptions.publisher : textAlignSetting as unknown as ThTextAlignOptions;\n\n if (isWebPub) {\n dispatch(setWebPubTextAlign(textAlignValue));\n } else {\n dispatch(setTextAlign(textAlignValue));\n }\n\n // Handle hyphens after textAlign is submitted and processed\n if (isHyphensUsed) {\n if (navigatorTextAlign === null) {\n // Publisher mode: nullify hyphens for navigator, do NOT update store\n await submitPreferences({ [hyphensPrefKey]: null });\n } else {\n // Non-publisher: detect if transitioning from publisher\n const wasPublisher = oldTextAlign === ThTextAlignOptions.publisher;\n \n let hyphensToSubmit: boolean | null;\n if (wasPublisher && hyphens === null) {\n // Transitioning from publisher with never-set hyphens: auto-enable for justify, disable for start\n hyphensToSubmit = navigatorTextAlign === TextAlignment.justify;\n } else {\n // Not from publisher, or hyphens was already set: use stored value\n hyphensToSubmit = hyphens;\n }\n \n await submitPreferences({ [hyphensPrefKey]: hyphensToSubmit });\n const effectiveHyphens = getSetting(hyphensPrefKey);\n if (isWebPub) {\n dispatch(setWebPubHyphens(effectiveHyphens));\n } else {\n dispatch(setHyphens(effectiveHyphens));\n }\n }\n }\n }, [hyphensPrefKey, textAlignPrefKey, isWebPub, getSetting, submitPreferences, dispatch, isHyphensUsed, hyphens, textAlign]);\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 { ThSettingsKeys } from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 { useReaderSetting } from \"../hooks/useReaderSetting\";\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 = useReaderSetting(\"textNormalization\");\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.textNormalize];\n\n const updatePreference = useCallback(async (value: boolean) => {\n await submitPreferences({ [prefKey]: value });\n const effectiveSetting = getSetting(prefKey);\n\n if (isWebPub) {\n dispatch(setWebPubTextNormalization(effectiveSetting));\n } else {\n dispatch(setTextNormalization(effectiveSetting));\n }\n }, [prefKey, 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}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys } from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 { useReaderSetting } from \"../hooks/useReaderSetting\";\nimport { setLigatures } from \"@/lib/settingsReducer\";\nimport { setWebPubLigatures } from \"@/lib/webPubSettingsReducer\";\n\nexport const StatefulLigatures = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n\n const ligatures = useReaderSetting(\"ligatures\");\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.ligatures];\n\n const updatePreference = useCallback(async (value: boolean) => {\n await submitPreferences({ [prefKey]: value });\n const effectiveSetting = getSetting(prefKey);\n\n if (isWebPub) {\n dispatch(setWebPubLigatures(effectiveSetting));\n } else {\n dispatch(setLigatures(effectiveSetting));\n }\n }, [prefKey, isWebPub, submitPreferences, getSetting, dispatch]);\n\n return(\n <>\n <StatefulSwitch\n standalone={ standalone }\n heading={ t(\"reader.preferences.ligatures.title\") }\n label={ t(\"reader.preferences.ligatures.label\") }\n onChange={ async (isSelected: boolean) => await updatePreference(isSelected) }\n isSelected={ ligatures ?? true }\n />\n </>\n )\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { ThSettingsKeys } from \"@/preferences/models\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 { useReaderSetting } from \"../hooks/useReaderSetting\";\nimport { setNoRuby } from \"@/lib/settingsReducer\";\nimport { setWebPubNoRuby } from \"@/lib/webPubSettingsReducer\";\n\nexport const StatefulNoRuby = ({ standalone = true }: StatefulSettingsItemProps) => {\n const { t } = useI18n();\n\n const profile = useAppSelector(state => state.reader.profile);\n const isWebPub = profile === \"webPub\";\n\n const noRuby = useReaderSetting(\"noRuby\");\n const dispatch = useAppDispatch();\n\n const { getSetting, submitPreferences } = useNavigator().visual;\n\n const prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.noRuby];\n\n const updatePreference = useCallback(async (value: boolean) => {\n await submitPreferences({ [prefKey]: value });\n const effectiveSetting = getSetting(prefKey);\n\n if (isWebPub) {\n dispatch(setWebPubNoRuby(effectiveSetting));\n } else {\n dispatch(setNoRuby(effectiveSetting));\n }\n }, [prefKey, isWebPub, submitPreferences, getSetting, dispatch]);\n\n return(\n <>\n <StatefulSwitch\n standalone={ standalone }\n heading={ t(\"reader.preferences.noRuby.title\") }\n label={ t(\"reader.preferences.noRuby.label\") }\n onChange={ async (isSelected: boolean) => await updatePreference(isSelected) }\n isSelected={ noRuby ?? false }\n />\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 ?? \"auto\") : (isFXL ? (themeObject.fxl ?? \"auto\") : (themeObject.reflow ?? \"auto\"));\n const colorScheme = useAppSelector(state => state.theming.colorScheme);\n const coverTheme = useAppSelector(state => state.publication.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: () => {\n if (profile) {\n dispatch(setActionOpen({\n key: ThActionsKeys.settings,\n isOpen: false,\n profile\n }));\n }\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\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"../helpers/settingsKeyMapping\";\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 prefKey = SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.wordSpacing];\n\n const updatePreference = useCallback(async (value: number | number[] | null) => {\n await submitPreferences({\n [prefKey]: Array.isArray(value) ? value[0] : value\n });\n\n setWordSpacing(getSetting(prefKey));\n }, [prefKey, 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 { useCallback } from \"react\";\n\nimport { ThSettingsKeys, ThSettingsRangeVariant } from \"@/preferences\";\nimport { SETTINGS_KEY_TO_PREFERENCE } from \"./helpers/settingsKeyMapping\";\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 { useReaderSetting } from \"./hooks/useReaderSetting\";\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 derivedState = useReaderSetting(\"zoom\");\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 prefKey = readerProfile === \"webPub\"\n ? SETTINGS_KEY_TO_PREFERENCE[ThSettingsKeys.zoom]\n : \"fontSize\" as const;\n\n const updatePreference = useCallback(async (value: number | number[]) => {\n const normalizedValue = Array.isArray(value) ? value[0] : value;\n await submitPreferences({ [prefKey]: normalizedValue });\n if (readerProfile === \"webPub\") {\n dispatch(setWebPubZoom(getSetting(prefKey)));\n } else {\n dispatch(setFontSize(getSetting(prefKey)));\n }\n }, [readerProfile, prefKey, 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 { StatefulLigatures } from \"../../Settings/Text/StatefulLigatures\";\nimport { StatefulNoRuby } from \"../../Settings/Text/StatefulNoRuby\";\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.6.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.ligatures]: {\n Comp: StatefulLigatures,\n type: \"text\"\n },\n [ThSettingsKeys.noRuby]: {\n Comp: StatefulNoRuby,\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 classNames from \"classnames\";\nimport { useAppSelector } from \"@/lib/hooks\";\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 } = useSharedPreferences();\n const isRTL = useAppSelector(state => state.publication.isRTL);\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,\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 profile = useAppSelector(state => state.reader.profile);\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={ () => {\n if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false, profile }));\n }\n } }\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={ () => {\n if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false, profile }));\n }\n } }\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 profile = useAppSelector(state => state.reader.profile);\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={ () => {\n if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false, profile }));\n }\n } }\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={ () => {\n if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false, profile }));\n }\n } }\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 profile = useAppSelector(state => state.reader.profile);\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={ () => {\n if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false, profile }));\n }\n } }\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={ () => {\n if (profile) {\n dispatch(setActionOpen({ key: ThActionsKeys.settings, isOpen: false, profile }));\n }\n } }\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\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\n\nimport { isIOSish } from \"@/core/Helpers/getPlatform\";\n\nexport const StatefulAudioVolumeTrigger = ({ ref }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n const profile = useAppSelector(state => state.reader.profile);\n const { preferences } = useAudioPreferences();\n const { actionsKeys } = useActionsPreferences();\n \n const shortcut = actionsKeys[ThAudioActionKeys.volume]?.shortcut;\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 if (isIOSish()) return null;\n\n return (\n <StatefulActionIcon\n ref={ ref }\n tooltipLabel={ t(\"reader.playback.preferences.audio.volume\") }\n shortcut={ shortcut }\n placement=\"top\"\n onPress={ () => {\n if (profile) {\n dispatch(toggleActionOpen({ key: ThAudioActionKeys.volume, profile }));\n }\n } }\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\nimport { isIOSish } from \"@/core/Helpers/getPlatform\";\n\nexport const StatefulAudioVolumeContainer = ({ triggerRef, placement = \"top\" }: StatefulActionContainerProps) => {\n const volume = useAppSelector(state => state.audioSettings.volume);\n const profile = useAppSelector(state => state.reader.profile);\n const isOpen = useAppSelector(state => profile ? state.actions.keys[profile][ThAudioActionKeys.volume]?.isOpen ?? false : 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 if (profile) {\n dispatch(setActionOpen({ key: ThAudioActionKeys.volume, isOpen: open, profile }));\n }\n }, [dispatch, profile]);\n\n if (isIOSish()) return null;\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\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\n\nexport const StatefulAudioPlaybackRateTrigger = ({ ref }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n const profile = useAppSelector(state => state.reader.profile);\n const { actionsKeys } = useActionsPreferences();\n \n const shortcut = actionsKeys[ThAudioActionKeys.playbackRate]?.shortcut;\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 shortcut={ shortcut }\n placement=\"top\"\n onPress={ () => {\n if (profile) {\n dispatch(toggleActionOpen({ key: ThAudioActionKeys.playbackRate, profile }));\n }\n } }\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 profile = useAppSelector(state => state.reader.profile);\n const isOpen = useAppSelector(state => profile ? state.actions.keys[profile][ThAudioActionKeys.playbackRate]?.isOpen ?? false : 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 if (profile) {\n dispatch(setActionOpen({ key: ThAudioActionKeys.playbackRate, isOpen: open, profile }));\n }\n }, [dispatch, profile]);\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\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\n\nexport const StatefulAudioTocTrigger = ({ ref }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n const profile = useAppSelector(state => state.reader.profile);\n const { actionsKeys } = useActionsPreferences();\n \n const shortcut = actionsKeys[ThAudioActionKeys.toc]?.shortcut;\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 shortcut={ shortcut }\n placement=\"top\"\n onPress={ () => {\n if (profile) {\n dispatch(toggleActionOpen({ key: ThAudioActionKeys.toc, profile }));\n }\n } }\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 } 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 profile = useAppSelector(state => state.reader.profile);\n const { goLink } = useNavigator().unified;\n const dispatch = useAppDispatch();\n\n const isOpen = useAppSelector(state => profile ? state.actions.keys[profile][ThAudioActionKeys.toc]?.isOpen ?? false : false);\n const toc = useAppSelector(state => state.publication.toc);\n const tocEntry = toc?.currentEntry ?? undefined;\n const tocEntryId = tocEntry?.id;\n const tocTree = toc?.tree;\n\n const isRTL = useAppSelector(state => state.publication.isRTL);\n\n const docking = useDocking(ThAudioActionKeys.toc);\n const sheetType = docking.sheetType;\n\n const setOpen = useCallback((value: boolean) => {\n if (profile) {\n dispatch(setActionOpen({ key: ThAudioActionKeys.toc, isOpen: value, profile }));\n }\n }, [dispatch, profile]);\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] as string;\n const matched = findTocItemById(tocTree || [], key);\n\n if (!matched) return;\n\n const cb = isOpen && (sheetType === ThSheetTypes.dockedStart || sheetType === ThSheetTypes.dockedEnd)\n ? () => {\n dispatch(setTocEntry(matched));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n }\n : () => {\n dispatch(setTocEntry(matched));\n dispatch(setImmersive(true));\n dispatch(setUserNavigated(true));\n setOpen(false);\n };\n\n goLink(new Link({ href: matched.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\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\n\nexport const StatefulAudioSleepTimerTrigger = ({ ref }: StatefulActionTriggerProps) => {\n const { t } = useI18n();\n const profile = useAppSelector(state => state.reader.profile);\n const { actionsKeys } = useActionsPreferences();\n \n const shortcut = actionsKeys[ThAudioActionKeys.sleepTimer]?.shortcut;\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 shortcut={ shortcut }\n placement=\"top\"\n onPress={ () => {\n if (profile) {\n dispatch(toggleActionOpen({ key: ThAudioActionKeys.sleepTimer, profile }));\n }\n } }\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 profile = useAppSelector(state => state.reader.profile);\n const isOpen = useAppSelector(state => {\n if (!profile || !state.actions.keys[profile]) return false;\n return state.actions.keys[profile][ThAudioActionKeys.sleepTimer]?.isOpen ?? false;\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 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 if (profile) {\n dispatch(setActionOpen({ key: ThAudioActionKeys.sleepTimer, isOpen: false, profile }));\n }\n }, [dispatch, profile]);\n\n const handleStart = useCallback(() => {\n const totalSeconds = hours * 3600 + minutes * 60;\n if (totalSeconds <= 0) return;\n dispatch(setSleepTimerRemainingSeconds(totalSeconds));\n if (profile) {\n dispatch(setActionOpen({ key: ThAudioActionKeys.sleepTimer, isOpen: false, profile }));\n }\n }, [hours, minutes, dispatch, profile]);\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 if (profile) {\n dispatch(setActionOpen({ key: ThAudioActionKeys.sleepTimer, isOpen: false, profile }));\n }\n }, [dispatch, profile]);\n\n const docking = useDocking(ThAudioActionKeys.sleepTimer);\n\n const setOpen = useCallback((open: boolean) => {\n if (profile) {\n dispatch(setActionOpen({ key: ThAudioActionKeys.sleepTimer, isOpen: open, profile }));\n }\n }, [dispatch, profile]);\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.6.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","\"use client\";\n\nimport { ReactNode, useMemo } from \"react\";\nimport { useStore } from \"react-redux\";\n\nimport { ThGlobalPreferences } from \"@/preferences/globalPreferences\";\nimport { ThGlobalPreferencesProvider } from \"@/preferences/ThGlobalPreferencesProvider\";\nimport { ThReduxGlobalPreferencesAdapter } from \"@/lib/ThReduxGlobalPreferencesAdapter\";\n\nimport { RootState } from \"@/lib/store\";\n\nexport const StatefulGlobalPreferencesProvider = ({\n children,\n initialPreferences = {},\n}: {\n children: ReactNode;\n initialPreferences?: ThGlobalPreferences;\n}) => {\n const store = useStore<RootState>();\n\n const adapter = useMemo(\n () => new ThReduxGlobalPreferencesAdapter(store, initialPreferences),\n [store, initialPreferences]\n );\n\n return (\n <ThGlobalPreferencesProvider adapter={ adapter } initialPreferences={ initialPreferences }>\n { children }\n </ThGlobalPreferencesProvider>\n );\n};\n","export const NavPeripheralType = {\n progressForward: \"th_nav_progress_forward\",\n progressBackward: \"th_nav_progress_backward\",\n moveRight: \"th_nav_move_right\",\n moveLeft: \"th_nav_move_left\",\n moveUp: \"th_nav_move_up\",\n moveDown: \"th_nav_move_down\",\n moveHome: \"th_nav_move_home\",\n moveEnd: \"th_nav_move_end\",\n zoomIn: \"th_nav_zoom_in\",\n zoomOut: \"th_nav_zoom_out\",\n} as const;\n\n// Ctrl/Cmd + = or Numpad+, covering Blink (187) and Gecko (61) key codes\nexport const ZOOM_IN_KEY_COMBOS = [\n { keyCode: 187, ctrl: true },\n { keyCode: 61, ctrl: true },\n { keyCode: 107, ctrl: true },\n { keyCode: 187, meta: true },\n { keyCode: 61, meta: true },\n { keyCode: 107, meta: true },\n] as const;\n\n// Ctrl/Cmd + - or Numpad-, covering Blink (189) and Gecko (173) key codes\nexport const ZOOM_OUT_KEY_COMBOS = [\n { keyCode: 189, ctrl: true },\n { keyCode: 173, ctrl: true },\n { keyCode: 109, ctrl: true },\n { keyCode: 189, meta: true },\n { keyCode: 173, meta: true },\n { keyCode: 109, meta: true },\n] as const;\n\nexport const ACTION_PERIPHERAL_PREFIX = \"th_action_\" as const;\n\nexport const toActionPeripheralType = (key: string) => `${ ACTION_PERIPHERAL_PREFIX }${ key }`;\n\nexport const fromActionPeripheralType = (type: string): string | null =>\n type.startsWith(ACTION_PERIPHERAL_PREFIX) ? type.slice(ACTION_PERIPHERAL_PREFIX.length) : null;\n\nexport const DOCKING_PERIPHERAL_PREFIX = \"th_docking_\" as const;\n\nexport const toDockingPeripheralType = (key: string) => `${ DOCKING_PERIPHERAL_PREFIX }${ key }`;\n\nexport const fromDockingPeripheralType = (type: string): string | null =>\n type.startsWith(DOCKING_PERIPHERAL_PREFIX) ? type.slice(DOCKING_PERIPHERAL_PREFIX.length) : null;\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 { useEffect, useState } from \"react\";\n\nimport { ThActionsDockedPref, ThDockingSizeValue } from \"@/preferences\";\n\nimport { DockStateObject } from \"@/lib/actionsReducer\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nconst isNumericSize = (value: ThDockingSizeValue | undefined): value is number => {\n return typeof value === \"number\";\n};\n\n// A \"px\" string is a pixel value like a plain number and can be compared\n// against one directly; %/em/rem/vh/vw can't be without measuring the live\n// DOM node\nconst toPixels = (value: ThDockingSizeValue | undefined): number | undefined => {\n if (isNumericSize(value)) return value;\n if (typeof value === \"string\" && value.endsWith(\"px\")) return parseFloat(value);\n return undefined;\n};\n\nexport const useResizablePanel = (panel: DockStateObject | undefined) => {\n const preferences = useActionsPreferences();\n const { theming } = useSharedPreferences();\n const defaultWidth = theming.layout.defaults.dockingWidth;\n const [pref, setPref] = useState<ThActionsDockedPref | null>(\n panel?.actionKey ? preferences.actionsKeys[panel.actionKey]?.docked || null : null\n );\n\n const profile = useAppSelector(state => state.reader.profile);\n const actionsMap = useAppSelector(state => profile ? state.actions.keys[profile] : undefined);\n const actions = useActions(actionsMap || {});\n\n const previousWidth = actions.getDockedWidth(panel?.actionKey) || null;\n const width: ThDockingSizeValue = pref?.width ?? defaultWidth;\n\n // Ascending-range clamping against the shared default only makes sense\n // when comparing like-for-like pixel values; unit strings that aren't\n // pixels (%, rem, vw, ...) are used as configured, since they can't be\n // compared to a pixel default without measuring the live DOM node.\n // react-resizable-panels still enforces minSize/maxSize correctly at\n // runtime regardless.\n const widthPx = toPixels(width);\n const defaultWidthPx = toPixels(defaultWidth);\n\n const minWidthPx = toPixels(pref?.minWidth);\n const minWidth: ThDockingSizeValue = widthPx !== undefined && minWidthPx !== undefined && minWidthPx < widthPx\n ? minWidthPx\n : pref?.minWidth !== undefined && minWidthPx === undefined\n ? pref.minWidth\n : widthPx !== undefined && defaultWidthPx !== undefined && defaultWidthPx < widthPx\n ? defaultWidth\n : pref?.minWidth ?? width;\n\n const maxWidthPx = toPixels(pref?.maxWidth);\n const maxWidth: ThDockingSizeValue = widthPx !== undefined && maxWidthPx !== undefined && maxWidthPx > widthPx\n ? maxWidthPx\n : pref?.maxWidth !== undefined && maxWidthPx === undefined\n ? pref.maxWidth\n : widthPx !== undefined && defaultWidthPx !== undefined && defaultWidthPx > widthPx\n ? defaultWidth\n : pref?.maxWidth ?? width;\n\n const isPopulated = () => {\n return !!(panel?.active && actions.isOpen(panel?.actionKey));\n };\n\n const currentKey = () => {\n return panel?.actionKey ?? null;\n };\n\n // Occupancy, not openness: dragging the separator out is how a shut panel is\n // reopened, so its handle has to stay live. A slot holding nothing has none\n const isResizable = () => {\n if (!panel?.actionKey) return false;\n\n return isNumericSize(width) && isNumericSize(minWidth) && isNumericSize(maxWidth)\n ? Math.round(width) > Math.round(minWidth) && Math.round(width) < Math.round(maxWidth)\n : minWidth !== maxWidth;\n };\n\n const hasDragIndicator = () => {\n return pref?.dragIndicator || false;\n };\n\n // The size an expanding panel is restored to. Panels always mount shut, so\n // this is their only size source. Re-clamped against the current bounds:\n // a width saved before the config's min/max shrank must not ask the panel\n // to resize outside the bounds it's configured with now\n const getTargetWidth = (): ThDockingSizeValue => {\n if (previousWidth == null) return width;\n if (isNumericSize(minWidth) && previousWidth < minWidth) return minWidth;\n if (isNumericSize(maxWidth) && previousWidth > maxWidth) return maxWidth;\n return previousWidth;\n };\n\n const getMinWidth = (): ThDockingSizeValue => {\n return minWidth;\n };\n\n const getMaxWidth = (): ThDockingSizeValue => {\n return maxWidth;\n };\n\n // When the docked action changes, we need to update its preferences\n useEffect(() => {\n setPref(panel?.actionKey ? preferences.actionsKeys[panel.actionKey]?.docked || null : null);\n }, [panel?.actionKey, preferences]);\n\n return {\n currentKey,\n isPopulated,\n isResizable,\n hasDragIndicator,\n getTargetWidth,\n getMinWidth,\n getMaxWidth\n }\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 \"../../Actions/hooks/useActionComponentStatus\";\nimport { usePlugins } from \"../../Plugins/PluginProvider\";\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 // The registry is snapshotted into state and filled in as plugins register,\n // so an empty map means \"not loaded yet\", never \"these actions are gone\".\n // Undocking on it would drop a persisted docked action on every reload\n const { actionsComponentsMap, primaryAudioActionsMap } = usePlugins();\n const isRegistryPopulated = Object.keys(actionsComponentsMap || {}).length > 0\n || Object.keys(primaryAudioActionsMap || {}).length > 0;\n\n useEffect(() => {\n if (!profile || !dock || !isRegistryPopulated) 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, isRegistryPopulated, startActionKey, endActionKey, startStatus.isComponentRegistered, endStatus.isComponentRegistered, dispatch]);\n};\n","\"use client\";\n\nimport { ReactNode, RefObject, useCallback, useEffect, useMemo, 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 { Group, Layout, LayoutChangedMeta, Panel, PanelImperativeHandle, Separator } from \"react-resizable-panels\";\n\nimport { ThDockingTypes, ThDockingKeys, ThDockingSizeValue, 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, deactivateDockPanel, setActionOpen, setDockPanelWidth } from \"@/lib/actionsReducer\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport classNames from \"classnames\";\n\nexport interface DockPanelSizes {\n minWidth: ThDockingSizeValue;\n maxWidth: ThDockingSizeValue;\n}\n\nconst DockHandle = ({\n flow,\n isResizable,\n hasDragIndicator\n}: {\n flow: ThDockingKeys.start | ThDockingKeys.end;\n isResizable: 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 <Separator\n id={ handleID }\n className={ dockingStyles.resizeHandle }\n disabled={ !isResizable }\n >\n { isResizable && hasDragIndicator &&\n <div className={ classNames(dockingStyles.resizeHandleGrab, classFromFlow()) }></div>\n }\n </Separator>\n </>\n )\n};\n\nconst DockPanel = ({\n actionKey,\n flow,\n dockConfig,\n sizes,\n targetWidth,\n isResizable,\n isPopulated,\n hasDragIndicator,\n profile,\n panelRef\n}: {\n actionKey: ActionsStateKeys | null;\n flow: ThDockingKeys.start | ThDockingKeys.end;\n dockConfig: ThDockingTypes;\n sizes: DockPanelSizes;\n targetWidth: ThDockingSizeValue;\n isResizable: boolean;\n isPopulated: boolean;\n hasDragIndicator?: boolean;\n profile: string;\n panelRef: RefObject<PanelImperativeHandle | null>;\n}) => {\n const { t } = useI18n();\n\n const direction = useAppSelector(state => state.reader.direction);\n const dispatch = useAppDispatch();\n\n // Through a ref so a resize doesn’t change expandPanel’s identity and\n // re-trigger the sync effect\n const targetWidthRef = useRef(targetWidth);\n targetWidthRef.current = targetWidth;\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 // A shut slot still holds its action, so it announces what it contains\n if (!isPopulated) {\n label += ` – ${ t(\"reader.app.docking.dockingClosed\", { action: t(`reader.${ actionKey }.heading`) }) }`;\n }\n } else {\n label += ` – ${ t(\"reader.app.docking.dockingEmpty\") }`;\n }\n\n return label;\n }, [flow, direction, isPopulated, actionKey, t]);\n\n // The imperative Panel methods throw when the Panel's registration with its\n // Group is momentarily out of sync, e.g. a breakpoint change mounting panels\n // in the same render as this one's populated state changes. Best-effort UI\n // sync, not a source of truth, so a failure must not crash the reader\n const collapsePanel = useCallback(() => {\n try {\n panelRef.current?.collapse();\n } catch (error) {\n console.warn(`Failed to collapse ${ flow } dock panel`, error);\n }\n }, [panelRef, flow]);\n\n // resize() not expand(): expand() falls back to minSize when the library has\n // no remembered size, which is the case for every panel here as they mount shut\n const expandPanel = useCallback(() => {\n try {\n panelRef.current?.resize(targetWidthRef.current);\n } catch (error) {\n console.warn(`Failed to expand ${ flow } dock panel`, error);\n }\n }, [panelRef, flow]);\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 // The panel's size is asserted from occupancy, never read back from the DOM:\n // a slot whose action is open is at its width, any other is at zero. Shutting\n // a panel closes its action (see handleLayoutChanged), so there is no third\n // state to reconcile and no order in which these can disagree.\n //\n // `dockConfig` is a dependency because the Group caches layouts keyed by its\n // set of panel ids and restores one whenever a panel registers: a breakpoint\n // adding or removing the *other* slot resizes this one to whatever that set\n // last held, without this panel remounting or its own state changing.\n //\n // Deferred to the next animation frame: a breakpoint change can mount a\n // DockPanel in the same commit its populated state changes, racing the\n // Group's own panel registration and throwing (see collapsePanel/\n // expandPanel above). Running after that commit has settled avoids it\n useEffect(() => {\n const raf = requestAnimationFrame(() => {\n isPopulated ? expandPanel() : collapsePanel();\n });\n\n return () => cancelAnimationFrame(raf);\n }, [isPopulated, dockConfig, collapsePanel, expandPanel]);\n\n return(\n <>\n { flow === ThDockingKeys.end &&\n <DockHandle\n flow={ ThDockingKeys.end }\n isResizable={ isResizable }\n hasDragIndicator={ hasDragIndicator }\n />\n }\n <Panel\n id={ `${ flow }-panel` }\n collapsible={ true }\n collapsedSize={ 0 }\n panelRef={ panelRef }\n // A literal, never derived: `defaultSize` sits in the library's\n // registerPanel effect deps, so any change re-registers the Panel and\n // makes the Group emit a layout event. Panels mount shut and are sized by\n // the effect above, which also avoids a flash at full width\n defaultSize={ 0 }\n minSize={ sizes.minWidth }\n maxSize={ sizes.maxWidth }\n groupResizeBehavior=\"preserve-pixel-size\"\n // Occupancy, not the collapsed mirror, which can lag behind the DOM\n inert={ !isPopulated }\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 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 const dispatch = useAppDispatch();\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 startPanelRef = useRef<PanelImperativeHandle>(null);\n const endPanelRef = useRef<PanelImperativeHandle>(null);\n\n const startActionKey = startPanel.currentKey();\n const endActionKey = endPanel.currentKey();\n const isStartPopulated = startPanel.isPopulated();\n const isEndPopulated = endPanel.isPopulated();\n\n // Sole writer of the persisted widths and of a docked action's open state,\n // and it only ever records a drag. onLayoutChanged fires once per completed\n // interaction, not on every frame of one\n const handleLayoutChanged = useCallback((_layout: Layout, meta: LayoutChangedMeta) => {\n if (!profile) return;\n\n ([\n [ThDockingKeys.start, startPanelRef, startActionKey, isStartPopulated],\n [ThDockingKeys.end, endPanelRef, endActionKey, isEndPopulated]\n ] as const).forEach(([flow, ref, actionKey, isPopulated]) => {\n const panel = ref.current;\n if (!panel) return;\n\n // Same transient-registration caveat as collapsePanel/expandPanel:\n // a failure here must not crash the reader\n let inPixels: number;\n try {\n inPixels = panel.getSize().inPixels;\n } catch (error) {\n console.warn(`Failed to read ${ flow } dock panel size`, error);\n return;\n }\n\n // Everything that is not a drag: mounting, constraint recomputation, our\n // own imperative calls, and the Group's cached-layout restores. Those\n // restores are keyed on the set of panel ids, so a slot holding nothing\n // comes back at the width that set last had — clamp it, but write\n // nothing, or a panel the Group resized to zero would read as dismissed\n if (!meta.isUserInteraction) {\n if (!isPopulated && inPixels !== 0) {\n try {\n panel.collapse();\n } catch (error) {\n console.warn(`Failed to collapse ${ flow } dock panel`, error);\n }\n }\n return;\n }\n\n if (!actionKey) return;\n\n // Dragging a panel shut closes its action, dragging it back out reopens\n // it: the panel and its action are one thing, so the separator and the\n // trigger are two routes to the same state\n if (inPixels === 0) {\n dispatch(setActionOpen({ key: actionKey, isOpen: false, profile }));\n return;\n }\n\n if (!isPopulated) {\n dispatch(setActionOpen({ key: actionKey, isOpen: true, profile }));\n }\n\n dispatch(setDockPanelWidth({ key: flow, width: inPixels, profile }));\n });\n }, [profile, dispatch, startActionKey, endActionKey, isStartPopulated, isEndPopulated]);\n\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n const dockingPref = preferences.docking.dock;\n const dockingMap = useMemo(() => makeBreakpointsMap<ThDockingTypes>({\n defaultValue: ThDockingTypes.both,\n fromEnum: ThDockingTypes,\n pref: dockingPref,\n disabledValue: ThDockingTypes.none\n }), [dockingPref]);\n\n const dockConfig = breakpoint && dockingMap[breakpoint] || ThDockingTypes.both;\n const hasStartSlot = dockConfig === ThDockingTypes.both || dockConfig === ThDockingTypes.start;\n const hasEndSlot = dockConfig === ThDockingTypes.both || dockConfig === ThDockingTypes.end;\n\n if (!preferences.docking.dock) {\n return(\n <>\n { children }\n </>\n )\n } else {\n return (\n <>\n <Group id=\"docking-panel-group\" orientation=\"horizontal\" onLayoutChanged={ handleLayoutChanged }>\n {\n hasStartSlot\n && profile && <DockPanel\n actionKey={ startActionKey }\n flow={ ThDockingKeys.start }\n dockConfig={ dockConfig }\n sizes={{\n minWidth: startPanel.getMinWidth(),\n maxWidth: startPanel.getMaxWidth()\n }}\n targetWidth={ startPanel.getTargetWidth() }\n isResizable={ startPanel.isResizable() }\n isPopulated={ isStartPopulated }\n hasDragIndicator={ startPanel.hasDragIndicator() }\n profile={ profile }\n panelRef={ startPanelRef }\n />\n }\n\n <Panel id=\"main-panel\">\n { children }\n </Panel>\n\n {\n hasEndSlot\n && profile && <DockPanel\n actionKey={ endActionKey }\n flow={ ThDockingKeys.end }\n dockConfig={ dockConfig }\n sizes={{\n minWidth: endPanel.getMinWidth(),\n maxWidth: endPanel.getMaxWidth()\n }}\n targetWidth={ endPanel.getTargetWidth() }\n isResizable={ endPanel.isResizable() }\n isPopulated={ isEndPopulated }\n hasDragIndicator={ endPanel.hasDragIndicator() }\n profile={ profile }\n panelRef={ endPanelRef }\n />\n }\n </Group>\n </>\n )\n }\n}","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { ThDockingKeys, ThDockingTypes } from \"@/preferences/models\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { isReservedByPref } from \"../helpers/dockReservation\";\n\nexport interface FocusedDockableKey {\n key: string;\n reserved: boolean;\n}\n\nexport const useFocusedDockableKey = () => {\n const { actionsKeys } = useActionsPreferences();\n\n return useCallback((dockingKey: ThDockingKeys): FocusedDockableKey | null => {\n const active = document.activeElement;\n if (!active) return null;\n\n const checkKey = (key: string): boolean => {\n const dockable = actionsKeys[key]?.docked?.dockable;\n if (!dockable || dockable === ThDockingTypes.none) return false;\n return (\n dockingKey === ThDockingKeys.transient ||\n (dockingKey === ThDockingKeys.start && (dockable === ThDockingTypes.start || dockable === ThDockingTypes.both)) ||\n (dockingKey === ThDockingKeys.end && (dockable === ThDockingTypes.end || dockable === ThDockingTypes.both))\n );\n };\n\n // Needed here so the caller's dockAction dispatch keeps the action's\n // reservation intact\n const resolve = (key: string): FocusedDockableKey => {\n return { key, reserved: isReservedByPref(actionsKeys[key]) };\n };\n\n let el: Element | null = active;\n while (el) {\n const id = el.getAttribute(\"id\");\n if (id) {\n if (checkKey(id)) return resolve(id);\n\n // id like \"toc-docker-overflowMenu\" rendered outside the portal\n const keyFromId = Object.keys(actionsKeys).find(k => id.startsWith(`${ k }-`));\n if (keyFromId && checkKey(keyFromId)) return resolve(keyFromId);\n }\n\n // data-key like \"dockingStart-toc\" where the part after the last hyphen is the key\n const dataKey = el.getAttribute(\"data-key\");\n if (dataKey) {\n const key = dataKey.slice(dataKey.lastIndexOf(\"-\") + 1);\n if (key && checkKey(key)) return resolve(key);\n }\n\n el = el.parentElement;\n }\n\n return null;\n }, [actionsKeys]);\n};\n","import { useEffect } from \"react\";\n\nimport { Publication, Timeline } from \"@readium/shared\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setTocTree } from \"@/lib/publicationReducer\";\nimport { buildTocTreeFromTimeline } from \"@/helpers/buildTocTree\";\n\n// Builds and dispatches the TOC tree once, when the navigator reports it has\n// actually loaded. Per-format position/timestamp data is populated as a side\n// effect of accessing the navigator's own `timeline` getter (not\n// publication.timeline directly) — going through it here, gated on\n// navigatorReady, means this stays correct regardless of whether (or when) a\n// given format's navigator introduces or changes that timing dependency.\nexport const useTocTreeBuilder = (\n publication: Publication | null,\n navigatorReady: boolean,\n getNavigatorTimeline: () => Timeline | undefined\n) => {\n const dispatch = useAppDispatch();\n\n useEffect(() => {\n if (!navigatorReady || !publication) return;\n\n const navigatorTimeline = getNavigatorTimeline();\n if (!navigatorTimeline) return;\n\n const publicationTitle = publication.metadata.title.getTranslation(\"en\");\n dispatch(setTocTree(buildTocTreeFromTimeline(navigatorTimeline, publicationTitle)));\n }, [navigatorReady, publication, getNavigatorTimeline, dispatch]);\n};\n","import { useCallback, useEffect, useRef } from \"react\";\n\nimport { Timeline, TimelineItem } from \"@readium/shared\";\n\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport { setTocEntry } from \"@/lib/publicationReducer\";\nimport { findTocItemByHref, TocItem } from \"@/helpers/buildTocTree\";\n\n// Resolves the current TOC entry for a TimelineItem via Timeline.tocEntryFor\n// and maps it to our local tree's row id for highlighting.\n//\n// tocTreeRef: the navigator listeners are wired up once on mount, before the\n// tree exists, so we read it through a ref to keep the callback identity\n// stable without going stale.\n//\n// lastItemRef: the tree may still be empty on the very first event, so we\n// re-resolve the last-seen item once the tree lands.\nexport const useTocEntryTracking = (\n getNavigatorTimeline: () => Timeline | undefined,\n tocTree: TocItem[] | undefined\n) => {\n const dispatch = useAppDispatch();\n\n const tocTreeRef = useRef(tocTree);\n const lastItemRef = useRef<TimelineItem | undefined>(undefined);\n\n const resolve = useCallback((item: TimelineItem | undefined) => {\n const tl = getNavigatorTimeline();\n if (!item || !tl) {\n dispatch(setTocEntry(null));\n return;\n }\n const entry = tl.tocEntryFor(item);\n const matched = entry ? findTocItemByHref(tocTreeRef.current || [], entry.link.href) : undefined;\n dispatch(setTocEntry(matched || null));\n }, [dispatch, getNavigatorTimeline]);\n\n useEffect(() => {\n tocTreeRef.current = tocTree;\n if (tocTree && lastItemRef.current) {\n resolve(lastItemRef.current);\n }\n }, [tocTree, resolve]);\n\n const updateCurrentTocEntry = useCallback((item: TimelineItem) => {\n lastItemRef.current = item;\n resolve(item);\n }, [resolve]);\n\n const clearCurrentTocEntry = useCallback(() => {\n lastItemRef.current = undefined;\n dispatch(setTocEntry(null));\n }, [dispatch]);\n\n return { updateCurrentTocEntry, clearCurrentTocEntry };\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 min-width: 0;\n display: flex;\n align-items: center;\n justify-content: flex-end;\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 } 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 { useLocale } from \"react-aria\";\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 { theming } = useSharedPreferences();\n const { direction } = useLocale();\n const backLinkPref = theming.header?.backLink;\n const tooltipDelay = theming.icon.tooltipDelay;\n const isRTL = direction === \"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, useMemo, 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\";\nimport { useIsScroll } from \"@/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 overflowMap = useAppSelector(state => state.actions.overflow);\n const isScroll = useIsScroll();\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 const profile = useAppSelector(state => state.reader.profile);\n\n const profileActionsMap = useAppSelector(state => profile ? state.actions.keys[profile] : undefined);\n const mergedActionsMap = useMemo(() => ({ ...profileActionsMap, ...overflowMap }), [profileActionsMap, overflowMap]);\n const actions = useActions(mergedActionsMap);\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"]}