{"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/deserializePositions.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/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/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","dockingMap","backlinkWrapper","actionsWrapper","link"],"mappings":"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","file":"chunk-7A6UGSHQ.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 previous/next navigation\n  previousLocator(): Locator | null;\n  nextLocator(): Locator | null;\n\n  // Unified forward/backward navigation\n  goForward(animated: boolean, callback: NavigationCallback): void;\n  goBackward(animated: boolean, callback: NavigationCallback): void;\n\n  // Check if navigator is visual\n  isVisual(): boolean;\n\n  // 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      previousLocator: (): Locator | null => {\n        if (isVisual && navigator.previousLocator) {\n          return navigator.previousLocator() || null;\n        }\n        return null;\n      },\n\n      nextLocator: (): Locator | null => {\n        if (isVisual && navigator.nextLocator) {\n          return navigator.nextLocator() || null;\n        }\n        return null;\n      },\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\nexport const deserializePositions = (positionsList?: Locator[]) => {\n  return positionsList?.map((locator) => ({\n    href: locator.href,\n    type: locator.type,\n    locations: {\n      position: locator.locations.position,\n      progression: locator.locations.progression,\n      totalProgression: locator.locations.totalProgression\n    },\n  }));\n};","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Link } from \"@readium/shared\";\nimport {   \n  Manifest, \n  Publication, \n  Fetcher, \n  HttpFetcher, \n  Layout, \n  ReadingProgression,\n  Feature,\n  Profile\n} from \"@readium/shared\";\nimport { useAppDispatch } from \"@/lib/hooks\";\nimport {\n  setRTL,\n  setFXL,\n  setScriptMode,\n  setPositionsList,\n  setHasDisplayTransformability,\n  setTocTree,\n} from \"@/lib/publicationReducer\";\nimport { getScriptMode } from \"@readium/navigator\";\nimport { buildTocTree } from \"@/helpers/buildTocTree\";\nimport { setReaderProfile, ReaderProfile } from \"@/lib/readerReducer\";\nimport { deserializePositions } from \"@/helpers/deserializePositions\";\nimport { ErrorHandler, ProcessedError } from \"@/helpers/errorHandler\";\n\nexport interface UsePublicationOptions {\n  url: string;\n  onError?: (error: ProcessedError) => void;\n  fetcher?: Fetcher;\n}\n\nexport interface UsePublicationReturn {\n  // Loading states\n  isLoading: boolean;\n  error: ProcessedError | null;\n\n  // Publication data\n  publication: Publication | null;\n  manifest: object | null;\n  selfLink: string | null;\n  localDataKey: string | null;\n\n  // Profile detection\n  profile: ReaderProfile | null;\n\n  // Publication metadata\n  isRTL: boolean;\n  isFXL: boolean;\n  hasDisplayTransformability: boolean;\n}\n\nconst detectProfile = (manifest: Manifest): ReaderProfile => {\n  // Check conformsTo in manifest metadata to determine profile\n  const metadata = manifest.metadata;\n  if (!metadata) return \"webPub\"; // Default to webPub when no metadata\n  \n  const conformsTo = metadata.conformsTo;\n  if (!conformsTo) return \"webPub\"; // Default to webPub when no conformsTo\n  \n  // Handle both string and array formats\n  const profiles = Array.isArray(conformsTo) ? conformsTo : [conformsTo];\n  \n  // Check for audiobook profile first\n  if (profiles.some((profile: Profile) => \n    profile === Profile.AUDIOBOOK\n  )) {\n    return \"audio\";\n  }\n  \n  // Check for epub profile\n  if (profiles.some((profile: Profile) => \n    profile === Profile.EPUB\n  )) {\n    return \"epub\";\n  }\n  \n  // Default to webPub for any other profile or no specific profile\n  return \"webPub\";\n};\n\nexport const usePublication = ({\n  url,\n  onError = () => {},\n  fetcher: customFetcher\n}: UsePublicationOptions): UsePublicationReturn => {\n  const dispatch = useAppDispatch();\n\n  // Basic states\n  const [isLoading, setIsLoading] = useState(true);\n  const [error, setError] = useState<ProcessedError | null>(null);\n  const [manifest, setManifest] = useState<object | null>(null);\n  const [selfLink, setSelfLink] = useState<string | null>(null);\n  const [localDataKey, setLocalDataKey] = useState<string | null>(null);\n\n  // Publication states\n  const [publication, setPublication] = useState<Publication | null>(null);\n  const [profile, setProfile] = useState<ReaderProfile | null>(null);\n\n  // Metadata states\n  const [isRTL, setIsRTL] = useState(false);\n  const [isFXL, setIsFXL] = useState(false);\n  const [hasDisplayTransformability, setHasDisplayTransformabilityState] = useState(false);\n\n  const handleManifestError = (error: unknown, context: string) => {\n    console.error(`${ context }:`, error);\n    const processedError = ErrorHandler.process(error, context);\n    setError(processedError);\n    setIsLoading(false);\n  };\n\n  // Basic URL validation and loading\n  useEffect(() => {\n    if (!url) {\n      const validationError = ErrorHandler.process(new Error('Manifest URL is required'), 'Validation');\n      setError(validationError);\n      setIsLoading(false);\n      return;\n    }\n\n    setIsLoading(true);\n    setError(null);\n    \n    // Decode URL if needed\n    const decodedUrl = decodeURIComponent(url);\n    \n    const manifestLink = new Link({ href: decodedUrl });\n    const fetcher = customFetcher || new HttpFetcher(undefined);\n\n    try {\n      const fetched = fetcher.get(manifestLink);\n      \n      // Get self-link first\n      fetched.link().then(async (link) => {\n        try {\n          const selfHref = link.toURL(decodedUrl);\n          setSelfLink(selfHref || null);\n          if (selfHref) {\n            setLocalDataKey(`${ selfHref }-current-location`);\n            \n            // Create fetcher with selfHref for proper URL resolution\n            const manifestFetcher = customFetcher || new HttpFetcher(undefined, selfHref);\n            \n            // Fetch manifest with proper fetcher\n            const manifestFetched = manifestFetcher.get(manifestLink);\n            const manifestData = await manifestFetched.readAsJSON();\n            \n            setManifest(manifestData as object);\n            \n            // Create publication\n            const manifestObj = Manifest.deserialize(manifestData)!;\n            manifestObj.setSelfLink(selfHref);\n\n            // Detect profile from parsed manifest\n            const detectedProfile = detectProfile(manifestObj);\n            setProfile(detectedProfile);\n            dispatch(setReaderProfile(detectedProfile));\n\n            const pub = new Publication({\n              manifest: manifestObj,\n              fetcher: manifestFetcher\n            });\n            \n            // For EPUB, fetch positions before mounting reader\n            if (detectedProfile === \"epub\") {\n              try {\n                const rawPositions = await pub.positionsFromManifest();\n                const positionsList = deserializePositions(rawPositions);\n                dispatch(setPositionsList(positionsList));\n              } catch (error) {\n                console.error(\"Failed to fetch positions:\", error);\n                dispatch(setPositionsList([]));\n              }\n            }\n\n            // For audio, build the TOC tree from the publication\n            if (detectedProfile === \"audio\") {\n              const tocLinks = manifestObj.toc?.items && manifestObj.toc.items.length > 0\n                ? manifestObj.toc.items\n                : manifestObj.readingOrder?.items || [];\n              const publicationTitle = manifestObj.metadata.title.getTranslation(\"en\");\n              let idCounter = 0;\n              const idGenerator = () => `toc-${ ++idCounter }`;\n              dispatch(setTocTree(buildTocTree(tocLinks, idGenerator, undefined, publicationTitle)));\n            }\n\n            setPublication(pub);\n            setIsLoading(false);\n          }\n        } catch (error: unknown) {\n          handleManifestError(error, \"Error loading manifest\");\n        }\n      });\n    } catch (error: unknown) {\n      handleManifestError(error, \"Error loading manifest\");\n    }\n  }, [url, customFetcher, dispatch]);\n\n  // Process publication metadata when publication is ready\n  useEffect(() => {\n    if (!publication) return;\n\n    // 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 = deserializePositions(positionsList);\n          dispatch(setPositionsList(deserializedPositionsList));\n        } catch (error) {\n          console.error(\"Failed to fetch positions:\", error);\n          dispatch(setPositionsList([]));\n        }\n      };\n\n      fetchPositions();\n    }\n  }, [publication, profile, dispatch]);\n\n  // Call onError callback when error changes\n  useEffect(() => {\n    if (error) {\n      onError(error);\n    }\n  }, [error, onError]);\n\n  return {\n    isLoading,\n    error,\n    publication,\n    manifest,\n    selfLink,\n    localDataKey,\n    profile,\n    isRTL,\n    isFXL,\n    hasDisplayTransformability\n  };\n};\n","/* React Aria modal provides a visual viewport for mobile + keyboard: --visual-viewport-height \n   which should explain why it’s being used here while not mentioned anywhere else in the codebase */\n\n.fullscreen {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 10;\n  overflow-y: auto;\n  scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n  scroll-padding-bottom: var(--th-layout-spacing);\n  box-sizing: border-box;\n  width: 100%;\n  height: 100%;\n  max-height: var(--visual-viewport-height, 100dvh);\n  background-color: var(--th-theme-background);\n  color: var(--th-theme-text);\n  align-items: center;\n}\n\n.modal {\n  position: fixed;\n  inset: 0;\n  z-index: 10;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: var(--th-layout-spacing);\n  background-color: var(--th-layout-defaults-scrim, rgba(0, 0, 0, 0.2));\n  pointer-events: none;\n}\n\n.modalDialog {\n  pointer-events: auto;\n  overflow-y: auto;\n  scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n  scroll-padding-bottom: var(--th-layout-spacing);\n  box-sizing: border-box;\n  width: 100%;\n  max-width: var(--th-layout-constraints-modal, 600px);\n  max-height: 90dvh;\n  background-color: var(--th-theme-background);\n  color: var(--th-theme-text);\n  border-radius: var(--th-layout-radius);\n  border: 1px solid var(--th-theme-subdue);\n  filter: drop-shadow(var(--th-theme-elevate));\n}\n\n.popover {\n  overflow-y: auto;\n  scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n  scroll-padding-bottom: var(--th-layout-spacing);\n  box-sizing: border-box;\n  width: calc(340px + (2 * var(--th-layout-spacing)));\n  max-width: var(--th-layout-constraints-popover, 500px);\n  max-height: 100%;\n  max-height: var(--visual-viewport-height, 100dvh);\n  padding: 0;\n  background-color: var(--th-theme-background);\n  color: var(--th-theme-text);\n  border-radius: var(--th-layout-radius);\n  border: 1px solid var(--th-theme-subdue);\n  filter: drop-shadow(var(--th-theme-elevate));\n}\n\n.compactPopover {\n  overflow-y: auto;\n  scroll-padding-top: var(--th-layout-spacing);\n  scroll-padding-bottom: var(--th-layout-spacing);\n  box-sizing: border-box;\n  width: calc(340px + (2 * var(--th-layout-spacing)));\n  max-width: var(--th-layout-constraints-popover, 500px);\n  max-height: 100%;\n  max-height: var(--visual-viewport-height, 100dvh);\n  padding: 0;\n  background-color: var(--th-theme-background);\n  color: var(--th-theme-text);\n  border-radius: var(--th-layout-radius);\n  border: 1px solid var(--th-theme-subdue);\n  filter: drop-shadow(var(--th-theme-elevate));\n}\n\n/* React Modal Sheet handles scroll + sticky header so no need for scroll-padding here */\n.draggable {\n  box-sizing: border-box;\n  max-width: var(--th-layout-constraints-bottomSheet, 600px);\n  left: max(calc((100% - var(--th-layout-constraints-bottomSheet, 600px)) / 2), 0px) !important;\n  background-color: var(--th-theme-background) !important;\n  color: var(--th-theme-text) !important;\n  border: none;\n  /* Animating drop-shadow pretty much kills performance, hence why we use a pseudo-element */\n  filter: none !important;\n  box-shadow: none !important;\n  /* M3 = 28dp, see https://m3.material.io/components/bottom-sheets/overview */\n  border-top-left-radius: 28px !important;\n  border-top-right-radius: 28px !important;\n  transition: border-radius 500ms;\n}\n\n.draggable::after {\n  content: \"\";\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  /* important for performance */\n  transform: translateZ(0);\n  box-shadow: var(--th-theme-elevate);\n  border-top-left-radius: 28px;\n  border-top-right-radius: 28px;\n}\n\n.draggableFullHeightDetent {\n  height: calc(100% - env(safe-area-inset-top)) !important;\n}\n\n.draggableContentHeightDetent {\n  max-height: calc(100% - env(safe-area-inset-top)) !important;\n}\n\n.draggable[data-full-height] {\n  border-top-left-radius: 0 !important;\n  border-top-right-radius: 0 !important;\n  transition: border-radius 500ms;\n}\n\n.draggableBackdrop {\n  /* So that React Aria can use it to dismiss the sheet as it’s set to none by React Modal Sheet. */\n  pointer-events: auto !important;\n  background-color: transparent !important;\n}\n\n.draggableScrim {\n  background-color: var(--th-layout-defaults-scrim) !important;\n}\n\n.draggableContainer {\n  padding: 0;\n  background-color: var(--th-theme-background);\n  color: var(--th-theme-text);\n}\n\n.draggableScroller {\n  position: relative;\n  scroll-padding-bottom: calc(var(--th-layout-spacing) * 4);\n}\n\n.dragIndicator {\n  width: calc(var(--th-icon-size, 40px) * 1.5);\n  position: absolute;\n  top: 0;\n  left: 50%;\n  transform: translateX(-50%);\n}\n\n.dragIndicator[data-focus-visible] {\n  border-radius: var(--th-layout-radius);\n  outline: 2px solid var(--th-theme-focus);\n}\n\n.dragIndicator svg {\n  fill: var(--th-theme-subdue);\n  width: 100%;\n  height: auto;\n}\n\n.docked {\n  /* We need relative positioning so that RAC FocusScope scrolls properly on tabbing */\n  position: relative;\n  overflow-y: auto;\n  scroll-padding-top: calc(var(--th-sheet-sticky-header, 80px) + var(--th-layout-spacing));\n  scroll-padding-bottom: var(--th-layout-spacing);\n  box-sizing: border-box;\n  width: 100%;\n  max-width: 100%;\n  height: 100vh;\n  height: 100dvh;\n  background-color: var(--th-theme-background);\n  color: var(--th-theme-text);\n}\n\n.dockedLeftBorder {\n  border-right: 1px solid var(--th-theme-subdue);\n}\n\n.dockedRightBorder {\n  border-left: 1px solid var(--th-theme-subdue);\n}\n\n.dialog {\n  outline: none;\n}\n\n.header {\n  display: flex;\n  align-items: center;\n  position: sticky;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 10;\n  padding: calc(var(--th-layout-spacing) / 2) var(--th-layout-spacing);\n  background-color: var(--th-theme-background);\n  border-bottom: 1px solid var(--th-theme-subdue);\n}\n\n.draggableHeader {\n  box-sizing: border-box;\n  display: flex;\n  align-items: center;\n  background-color: var(--th-theme-background);\n  border-bottom: 1px solid var(--th-theme-subdue);\n  padding: var(--th-layout-spacing) var(--th-layout-spacing) calc(var(--th-layout-spacing) / 2) var(--th-layout-spacing);\n  /* Otherwise covers the modal’s */\n  border-top-left-radius: 28px !important;\n  border-top-right-radius: 28px !important;\n  transition: border-radius 500ms;\n}\n\n.draggable[data-full-height] .draggableHeader {\n  /* Otherwise covers the modal’s */\n  border-top-left-radius: 0 !important;\n  border-top-right-radius: 0 !important;\n  transition: border-radius 500ms;\n}\n\n.heading {\n  font-size: 1.25rem;\n  line-height: 1;\n  margin: 0;\n  padding: 0;\n}\n\n.compactHeader {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.body {\n  padding: var(--th-layout-spacing);\n}",".dockerWrapper {\n  margin-inline-start: auto;\n  margin-inline-end: calc(var(--th-icon-size, 24px) * (1 / 4) * -1); /* Optical alingment */\n  display: flex;\n  gap: 2px;\n  padding-inline-start: var(--th-layout-spacing);\n}\n\n.docker {\n  display: flex;\n  gap: 2px;\n}\n\n.resizeHandle {\n  position: relative;\n  width: 0;\n}\n\n.resizeHandle:focus-visible {\n  outline: 2px solid var(--th-theme-focus);\n}\n\n.resizeHandleGrab {\n  position: absolute;\n  z-index: 1000;\n  top: 50%;\n  transform: translateY(-50%);\n  width: 5px;\n  height: 50px;\n  border-radius: 5px;\n  background-color: var(--th-theme-subdue);\n}\n\n.resizeHandleGrabLeft {\n  left: 0;\n}\n\n.resizeHandleGrabRight {\n  left: -5px;\n}","import * as React from \"react\";\nconst SvgDockToRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm120-80v-560H200v560h120Zm80 0h360v-560H400v560Zm-80 0H200h120Z\" /></svg>;\nexport default SvgDockToRight;","import * as React from \"react\";\nconst SvgDockToLeft = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm440-80h120v-560H640v560Zm-80 0v-560H200v560h360Zm80 0h120-120Z\" /></svg>;\nexport default SvgDockToLeft;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\n\nimport DockToLeft from \"./assets/icons/dock_to_right.svg\";\nimport DocktoRight from \"./assets/icons/dock_to_left.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockStart = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n  const preferences = useActionsPreferences();\n  const { t } = useI18n();\n  const direction = useAppSelector(state => state.reader.direction);\n  const profile = useAppSelector(state => state.reader.profile);\n  const actionsMap = useAppSelector(state => profile ? state.actions.keys[profile] : undefined);\n  const actions = useActions(actionsMap || {});\n  const isRTL = direction === ThLayoutDirection.rtl;\n  const translationKey = isRTL \n    ? \"reader.app.docker.dockToRight\" \n    : \"reader.app.docker.dockToLeft\";\n  const localeKey = {\n    trigger: t(`${ translationKey }.trigger`),\n    tooltip: t(`${ translationKey }.tooltip`)\n  };\n\n  const isDisabled = actions.whichDocked(associatedKey) === ThDockingKeys.start;\n  \n  const dispatch = useAppDispatch();\n\n  const handlePress = useCallback(() => {\n    if (associatedKey && profile) {\n      dispatch(dockAction({\n        key: associatedKey,\n        dockingKey: ThDockingKeys.start,\n        profile: profile\n      }))\n    }\n  }, [dispatch, associatedKey, profile]);\n  \n  return(\n    <>\n    { (variant && variant === ThActionsTriggerVariant.menu) \n      ? <StatefulOverflowMenuItem \n          label={ localeKey.trigger }\n          SVGIcon={ isRTL ? DocktoRight : DockToLeft } \n          shortcut={ preferences.docking.keys[ThDockingKeys.start].shortcut }\n          onAction={ handlePress } \n          id={ `${ ThDockingKeys.start }-${ associatedKey }` }\n          isDisabled={ isDisabled }\n        />\n      : <StatefulActionIcon \n          className={ readerSharedUI.dockerButton }  \n          aria-label={ localeKey.trigger }\n          placement=\"bottom\" \n          tooltipLabel={ localeKey.tooltip } \n          onPress={ handlePress } \n          isDisabled={ isDisabled }\n        >\n          { isRTL \n            ? <DocktoRight aria-hidden=\"true\" focusable=\"false\" /> \n            : <DockToLeft aria-hidden=\"true\" focusable=\"false\" /> \n          }\n        </StatefulActionIcon>\n    }\n    </>\n  )\n}","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\n\nimport DockToLeft from \"./assets/icons/dock_to_right.svg\";\nimport DocktoRight from \"./assets/icons/dock_to_left.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockEnd = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n  const preferences = useActionsPreferences();\n  const { t } = useI18n();\n  const direction = useAppSelector(state => state.reader.direction);\n  const profile = useAppSelector(state => state.reader.profile);\n  const actionsMap = useAppSelector(state => profile ? state.actions.keys[profile] : undefined);\n  const actions = useActions(actionsMap || {});\n  const isRTL = direction === ThLayoutDirection.rtl;\n  const translationKey = isRTL \n    ? \"reader.app.docker.dockToLeft\" \n    : \"reader.app.docker.dockToRight\";\n  const localeKey = {\n    trigger: t(`${ translationKey }.trigger`),\n    tooltip: t(`${ translationKey }.tooltip`)\n  };\n\n  const isDisabled = actions.whichDocked(associatedKey) === ThDockingKeys.end;\n\n  const dispatch = useAppDispatch();\n  \n  const handlePress = useCallback(() => {\n    if (associatedKey && profile) {\n      dispatch(dockAction({\n        key: associatedKey,\n        dockingKey: ThDockingKeys.end,\n        profile: profile\n      }))\n    }\n  }, [dispatch, associatedKey, profile]);\n  \n  return(\n    <>\n    { (variant && variant === ThActionsTriggerVariant.menu) \n      ? <StatefulOverflowMenuItem \n          label={ localeKey.trigger }\n          SVGIcon={ isRTL ? DockToLeft : DocktoRight } \n          shortcut={ preferences.docking.keys[ThDockingKeys.end].shortcut }\n          onAction={ handlePress } \n          id={ `${ ThDockingKeys.end }-${ associatedKey }` }\n          isDisabled={ isDisabled }\n        />\n      : <StatefulActionIcon \n          className={ readerSharedUI.dockerButton }  \n          aria-label={ localeKey.trigger }\n          placement=\"bottom\" \n          tooltipLabel={ localeKey.tooltip } \n          onPress={ handlePress } \n          isDisabled={ isDisabled }\n        >\n          { isRTL \n            ? <DocktoRight aria-hidden=\"true\" focusable=\"false\" /> \n            : <DockToLeft aria-hidden=\"true\" focusable=\"false\" /> \n          }\n        </StatefulActionIcon>\n    }\n    </>\n  )\n}","import * as React from \"react\";\nconst SvgStack = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M240-400v80h-80q-33 0-56.5-23.5T80-400v-400q0-33 23.5-56.5T160-880h400q33 0 56.5 23.5T640-800v80h-80v-80H160v400h80ZM400-80q-33 0-56.5-23.5T320-160v-400q0-33 23.5-56.5T400-640h400q33 0 56.5 23.5T880-560v400q0 33-23.5 56.5T800-80H400Zm0-80h400v-400H400v400Zm200-200Z\" /></svg>;\nexport default SvgStack;","\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport readerSharedUI from \"../assets/styles/thorium-web.button.module.css\";\n\nimport { StatefulActionTriggerProps } from \"@/components/Actions/models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\nimport { ThDockingKeys } from \"@/preferences/models\";\n\nimport Stack from \"./assets/icons/stack.svg\";\n\nimport { StatefulActionIcon } from \"../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Actions/Triggers/StatefulOverflowMenuItem\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\n\nexport const StatefulDockTransientPopover = ({ variant, associatedKey }: StatefulActionTriggerProps) => {\n  const preferences = useActionsPreferences();\n  const { t } = useI18n();\n  const 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 } 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 dockPortal = flow && document.getElementById(flow);\n  const dockedSheetRef = useRef<HTMLDivElement | null>(null);\n  const dockedSheetHeaderRef = useRef<HTMLDivElement | null>(null);\n  const dockedSheetBodyRef = useRef<HTMLDivElement | null>(null);\n  const dockedSheetCloseRef = useRef<HTMLButtonElement | null>(null);\n\n  const direction = useAppSelector(state => state.reader.direction);\n\n  // Update the CSS variable when the sheet is open and header ref is available\n  useEffect(() => {\n    if (isOpen && dockedSheetRef.current && dockedSheetHeaderRef.current) {\n      dockedSheetRef.current.style.setProperty(\n        `--${ prefixString(\"sheet-sticky-header\") }`,\n        `${ dockedSheetHeaderRef.current.clientHeight }px`\n      );\n    }\n  }, [isOpen]);\n\n  const classFromFlow = useCallback(() => {\n    if (flow === ThDockingKeys.start) {\n      return direction === ThLayoutDirection.ltr ? sheetStyles.dockedLeftBorder : sheetStyles.dockedRightBorder;\n    } else if (flow === ThDockingKeys.end) {\n      return direction === ThLayoutDirection.ltr ? sheetStyles.dockedRightBorder : sheetStyles.dockedLeftBorder;\n    }\n  }, [flow, direction]);\n\n  if (React.Children.toArray(children).length > 0) {\n    return(\n      <>\n      <ThDockedPanel\n        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, useState } from \"react\";\n\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\nimport { ThDockingTypes, ThDockingKeys, ThSheetTypes } from \"@/preferences/models\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport { dockAction, setActionOpen } from \"@/lib/actionsReducer\";\n\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { useActionComponentStatus } from \"../../Actions/hooks/useActionComponentStatus\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\n\nlet dockingMap: Required<BreakpointsMap<ThDockingTypes>> | null = null;\n\nexport const useDocking = <T extends string>(key: T) => {\n  const preferences = useActionsPreferences();\n  const breakpoint = useAppSelector(state => state.theming.breakpoint);\n  const 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 = useAppSelector(state => profile ? state.actions.dock[profile] : undefined);\n  const dispatch = useAppDispatch();\n\n  const actions = useActions(actionsMap || {});\n  \n  // Check if docked actions still exist in plugin registry\n  const startActionKey = dock?.[ThDockingKeys.start]?.actionKey;\n  const endActionKey = dock?.[ThDockingKeys.end]?.actionKey;\n  const startStatus = useActionComponentStatus({ actionKey: startActionKey || \"\" });\n  const endStatus = useActionComponentStatus({ actionKey: endActionKey || \"\" });\n\n  if (!dockingMap) {\n    dockingMap = makeBreakpointsMap<ThDockingTypes>({\n      defaultValue: ThDockingTypes.both, \n      fromEnum: ThDockingTypes, \n      pref: preferences.docking.dock, \n      disabledValue: ThDockingTypes.none \n    });\n  }\n  const currentDockConfig = breakpoint && dockingMap[breakpoint];\n  \n  // Use type assertion to tell TypeScript that the key is valid\n  const dockablePref = (preferences.actionsKeys[key as keyof typeof preferences.actionsKeys])?.docked?.dockable || ThDockingTypes.none;\n\n  const defaultSheet = (preferences.actionsKeys[key as keyof typeof preferences.actionsKeys])?.sheet?.defaultSheet || ThSheetTypes.popover;\n\n  const sheetMap = makeBreakpointsMap<ThSheetTypes>({\n    defaultValue: (preferences.actionsKeys[key as keyof typeof preferences.actionsKeys])?.sheet?.defaultSheet || ThSheetTypes.popover,\n    fromEnum: ThSheetTypes,\n    pref: (preferences.actionsKeys[key as keyof typeof preferences.actionsKeys])?.sheet?.breakpoints\n  });\n  const sheetPref = breakpoint && sheetMap[breakpoint] || defaultSheet;\n\n  const [sheetType, setSheetType] = useState<ThSheetTypes>(defaultSheet);\n  const previousSheetType = usePrevious(sheetType);\n\n  // Checks whether the action can be docked: its pref should match the docking pref\n  const canBeDocked = useCallback((slot: ThDockingTypes.start | ThDockingTypes.end) => {\n      return (currentDockConfig === slot || currentDockConfig === ThDockingTypes.both) \n          && (dockablePref === slot || dockablePref === ThDockingTypes.both);\n  }, [currentDockConfig, dockablePref]);\n\n  // Checks whether the sheet pref is of Dock type \n  const isDockedSheetPref = useCallback((type?: ThSheetTypes.dockedStart | ThSheetTypes.dockedEnd) => {\n    if (type) {\n      return sheetPref === type;\n    } else {\n      return sheetPref === ThSheetTypes.dockedStart || sheetPref === ThSheetTypes.dockedEnd\n    }\n  }, [sheetPref]);\n  \n  // Builds the docker for the action based on all preferences\n  const getDocker = useCallback((): ThDockingKeys[] => {\n    // First let’s handle the cases where docker shouldn’t be used\n    // The sheet is not dockable, per key.docked.dockable pref\n    if (dockablePref === ThDockingTypes.none) return [];\n    // There’s no docking slot available, per docking.dock pref\n    if (currentDockConfig === ThDockingTypes.none) return [];\n    // The sheet type is not compatible with docking\n    if (sheetPref === ThSheetTypes.fullscreen || sheetPref === ThSheetTypes.bottomSheet) return [];\n\n    // We can now build the docker from the display order\n    let dockerKeys: ThDockingKeys[] = [];\n    // In order for an action to be dockable, the dock slot has to exist\n    // and the dockable preference of key.docked should match the values\n    preferences.docking.displayOrder.forEach((dockingKey: ThDockingKeys) => {\n      switch(dockingKey) {\n        case ThDockingKeys.transient:\n          // We already handled both cases for none \n          dockerKeys.push(dockingKey);\n          break;\n        case ThDockingKeys.start:\n          if (canBeDocked(ThDockingTypes.start)) {\n            dockerKeys.push(dockingKey);\n          }\n          break;\n        case ThDockingKeys.end:\n          if (canBeDocked(ThDockingTypes.end)) {\n            dockerKeys.push(dockingKey);\n          }\n          break;\n        default:\n          break;\n      }\n    });\n\n    // If the action can only be transient, then it can’t be docked\n    if (dockerKeys.length === 1 && dockerKeys[0] === ThDockingKeys.transient) return [];\n\n    return dockerKeys;\n  }, [preferences.docking.displayOrder, currentDockConfig, sheetPref, dockablePref, canBeDocked]);\n\n  const getSheetType = useCallback(() => {\n    // Protect against null breakpoint during initialization\n    if (!breakpoint) {\n      return sheetType;\n    }\n    \n    // First check the dockable pref is none to return early\n    if (dockablePref === ThDockingTypes.none) {\n      // Sheet is of docked type, we return the default\n      if (isDockedSheetPref()) {\n        return defaultSheet;\n      } else {\n        // Sheet pref is not of docked type, we can return it\n        return sheetPref;\n      }\n    };\n\n    // We now need to check whether the user has docked the action themselves\n    // ActionsReducer should has made sure there is no conflict to handle here \n    // by updating states of actions on docking\n    switch (actionState?.docking) {\n      \n      // if action.docking is transient we need to check the pref, \n      // it can be docked and in that case we need to pick the default\n      case ThDockingKeys.transient:\n        if (isDockedSheetPref()) {\n          return defaultSheet;\n        } else {\n          return sheetPref;\n        }\n      \n      // If action.docking is set to start/end then we check the docking slot is available\n      case ThDockingKeys.start:\n        if (canBeDocked(ThDockingTypes.start)) {\n          return ThSheetTypes.dockedStart;\n        } else {\n          // if the pref is not docked start, return the pref \n          // else return the default\n          if (!isDockedSheetPref(ThSheetTypes.dockedStart)) {\n            return sheetPref;\n          } else {\n            return defaultSheet;\n          }\n        }\n\n      case ThDockingKeys.end:\n        if (canBeDocked(ThDockingTypes.end)) {\n          return ThSheetTypes.dockedEnd;\n        } else {\n          // if the pref is not docked end, return the pref \n          // else return the default\n          if (!isDockedSheetPref(ThSheetTypes.dockedEnd)) {\n            return sheetPref;\n          } else {\n            return defaultSheet;\n          }\n        }\n      \n      // If action.docking is null or undefined then we rely on pref \n      // as it means the user did not pick another option\n      case null:\n      case undefined:\n        // We have to check sheetPref is compatible with docking prefs\n        if (isDockedSheetPref(ThSheetTypes.dockedStart)) {\n          if (canBeDocked(ThDockingTypes.start)) {\n            return ThSheetTypes.dockedStart;\n          } else {\n            return defaultSheet;\n          }\n        } else if (isDockedSheetPref(ThSheetTypes.dockedEnd)) {\n          if (canBeDocked(ThDockingTypes.end)) {\n            return ThSheetTypes.dockedEnd;\n          } else {\n            return defaultSheet;\n          }\n        } else {\n          return sheetPref;\n        }\n      default:\n        return defaultSheet;\n    }\n  }, [dockablePref, sheetPref, defaultSheet, actionState?.docking, canBeDocked, isDockedSheetPref, breakpoint, sheetType]);\n\n  // When docking or breakpoints-related prefs change, get the correct sheet type\n  useEffect(() => {\n    setSheetType(getSheetType());\n  }, [sheetPref, currentDockConfig, actionState?.docking, getSheetType]);\n\n  // Dismiss/Close when sheetType has changed from docked to transient\n  useEffect(() => {\n    // This was not dismissed on breakpoint change, but by the user\n    if (actionState?.docking === ThDockingKeys.transient) return;\n\n    if (sheetType !== ThSheetTypes.dockedStart && sheetType !== ThSheetTypes.dockedEnd) {\n      if (previousSheetType === ThSheetTypes.dockedStart || previousSheetType === ThSheetTypes.dockedEnd) {\n        if (profile) {\n          dispatch(setActionOpen({\n            key: key,\n            isOpen: false,\n            profile\n          }));\n        }\n      }\n    }\n  }, [dispatch, key, sheetType, previousSheetType, actionState?.docking, profile]);\n\n  // on mount, check whether we should update states for docked sheets from pref\n  useEffect(() => {\n    if (actionState?.isOpen == null && profile) {\n      if (sheetType === ThSheetTypes.dockedStart) {\n        dispatch(dockAction({\n          key: key,\n          dockingKey: ThDockingKeys.start,\n          profile: profile\n        }));\n        dispatch(setActionOpen({\n          key: key,\n          isOpen: true,\n          profile\n        }));\n      } else if (sheetType === ThSheetTypes.dockedEnd) {\n        dispatch(dockAction({\n          key: key,\n          dockingKey: ThDockingKeys.end,\n          profile: profile\n        }));\n        dispatch(setActionOpen({\n          key: key,\n          isOpen: true,\n          profile\n        }));\n      }\n    }\n  }, [actionState?.isOpen, sheetType, key, dispatch, profile]);\n\n  // Edge case where the sheet has been opened/closed and\n  // is of dockable type, but the dock panel is not populated\n  // e.g. action was mounted as a different type of sheet (breakpoint),\n  // and opened/closed. If the user resizes the window (another breakpoint) \n  // but we don’t dispatch docking, then it can’t be displayed \n  // since the docking slot has never been populated.\n  useEffect(() => {\n    // Action has been opened/closed by user\n    // but it’s not been manually docked, \n    // which means the pref is used but \n    // has not be instantiated yet, and \n    // couldn’t be on first mount because\n    // a different type was used in prefs\n    if (actionState?.isOpen != null && actionState?.docking == null && profile) {\n      if (sheetType === ThSheetTypes.dockedStart) {\n        // Check if the action is docked in practice\n        // if it isn’t dispatch docking of the action\n        const dockingKey = actions.whichDocked(key);\n        if (dockingKey !== ThDockingKeys.start) {\n          dispatch(dockAction({\n            key: key,\n            dockingKey: ThDockingKeys.start,\n            profile: profile\n          }));\n        }\n      } else if (sheetType === ThSheetTypes.dockedEnd) {\n        // Check if the action is docked in practice\n        // if it isn’t dispatch docking of the action\n        const dockingKey = actions.whichDocked(key);\n        if (dockingKey !== ThDockingKeys.end) {\n          dispatch(dockAction({\n            key: key,\n            dockingKey: ThDockingKeys.end,\n            profile: profile\n          }));\n        }\n      }\n    }\n  }, [dispatch, key, sheetType, actionState?.isOpen, actionState?.docking, actions, profile]);\n\n  // Sync action docking property with profile dock state when profile changes\n  useEffect(() => {\n    if (profile && dock) {\n      const isDockedInStart = dock[ThDockingKeys.start]?.actionKey === key;\n      const isDockedInEnd = dock[ThDockingKeys.end]?.actionKey === key;\n      \n      if (isDockedInStart && actionState?.docking !== ThDockingKeys.start) {\n        dispatch(dockAction({\n          key: key,\n          dockingKey: ThDockingKeys.start,\n          profile: profile\n        }));\n        // Restore isOpen state if action was docked\n        if (actionState?.isOpen === false) {\n          dispatch(setActionOpen({\n            key: key,\n            isOpen: true,\n            profile\n          }));\n        }\n      } else if (isDockedInEnd && actionState?.docking !== ThDockingKeys.end) {\n        dispatch(dockAction({\n          key: key,\n          dockingKey: ThDockingKeys.end,\n          profile: profile\n        }));\n        // Restore isOpen state if action was docked\n        if (actionState?.isOpen === false) {\n          dispatch(setActionOpen({\n            key: key,\n            isOpen: true,\n            profile\n          }));\n        }\n      }\n    }\n  }, [profile, dock, actionState?.docking, actionState?.isOpen, key, dispatch]);\n\n  // Clean up stale docked actions that no longer exist in plugin registry\n  useEffect(() => {\n    if (!profile || !dock) return;\n\n    if (startActionKey && !startStatus.isComponentRegistered) {\n      dispatch(dockAction({\n        key: startActionKey,\n        dockingKey: ThDockingKeys.transient,\n        profile\n      }));\n    }\n\n    if (endActionKey && !endStatus.isComponentRegistered) {\n      dispatch(dockAction({\n        key: endActionKey,\n        dockingKey: ThDockingKeys.transient,\n        profile\n      }));\n    }\n  }, [profile, dock, startActionKey, endActionKey, startStatus.isComponentRegistered, endStatus.isComponentRegistered, dispatch]);\n\n  return {\n    getDocker,\n    sheetType\n  }\n}",".wrapper {}\n\n.form {\n  display: flex;\n  gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.label {\n  margin-block: 0 var(--th-layout-spacing);\n  display: block;\n}\n\n.input {\n  display: block;\n  font-weight: bold;\n  padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n  border-radius: var(--th-layout-radius);\n  border: 2px solid var(--th-theme-subdue);\n}\n\n.button {\n  box-sizing: content-box;\n  border: 2px solid var(--th-theme-subdue);\n  padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-icon-size, 24px) * (1/2));\n  text-align: center;\n  border-radius: var(--th-layout-radius);\n  margin-inline-start: auto;\n  align-self: flex-end;\n}\n\n.button[data-hovered] {\n  background-color: var(--th-theme-hover);\n  color: var(--th-theme-onHover);\n}\n\n.input[data-focus-visible],\n.button[data-focus-visible] {\n  outline: 2px solid var(--th-theme-focus);\n}\n\n.numberField[data-disabled],\n.button[data-disabled] {\n  color: var(--th-theme-disable);\n} ","\"use client\";\n\nexport const isPositionsListValid = (positionsList: any[] | null | undefined): boolean => {\n  return !!(positionsList && positionsList.length > 0 && positionsList.some(item => item.locations?.position));\n};;\n","\"use client\";\n\nimport { FormEvent, useCallback, useEffect, useState } from \"react\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport jumpToPositionStyles from \"./assets/styles/thorium-web.jumpToPosition.module.css\";\n\nimport { StatefulSheetWrapper } from \"../../Sheets/StatefulSheetWrapper\";\nimport { ThForm } from \"@/core/Components/Form/ThForm\";\nimport { ThFormNumberField } from \"@/core/Components/Form/Fields/ThFormNumberField\";\n\nimport { useEpubNavigator } from \"@/core/Hooks/Epub/useEpubNavigator\";\nimport { useDocking } from \"../../Docking/hooks/useDocking\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setImmersive, setUserNavigated } from \"@/lib/readerReducer\";\n\nimport { isPositionsListValid } from \"./helpers/utils\";\n\nexport const StatefulJumpToPositionContainer = ({ \n  triggerRef \n}: StatefulActionContainerProps) => {\n  const { t } = useI18n();\n  const 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.unstableTimeline?.progression?.currentPositions);\n\n  const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n  const dispatch = useAppDispatch();\n\n  const docking = useDocking(ThActionsKeys.jumpToPosition);\n  const sheetType = docking.sheetType;\n\n  const { go } = useEpubNavigator();\n\n  // Component has to handle updates locally since EpubNavigator updates positions, \n  // so we use these as an intermediary\n  const [position, setPosition] = useState(0);\n  const [errorMessage, setErrorMessage] = useState<string>();\n\n  // Position Numbers can be a range so we must check position is in range\n  // And not only that the array simply includes the position\n  const positionInRange = useCallback(() => {\n    if (!positionNumbers) return false;\n    return positionNumbers.length === 2\n      ? position >= positionNumbers[0] && position <= positionNumbers[1]\n      : position === positionNumbers[0];\n  }, [position, positionNumbers]);\n\n  // Update the label to use react-i18next interpolation\n  const label = t(\"reader.jumpToPosition.label\", { positionStart: 1, positionEnd: positionsList.length });\n\n  const setOpen = useCallback((value: boolean) => {\n    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    if (positionInRange()) return setOpen(false);\n\n    const cb = () => {\n      setOpen(false);\n      dispatch(setImmersive(true));\n      dispatch(setUserNavigated(true));\n    };\n    \n    go(item, !reducedMotion, cb);\n  }, [position, positionsList, reducedMotion, t, positionInRange, go, setOpen, dispatch]);\n\n  // Since we are using an intermediary local state, we must keep track when positionNumbers changes\n  useEffect(() => {\n    positionNumbers && setPosition(positionNumbers[0]);\n  }, [positionNumbers]);\n\n  // In case there is no positions list or no valid positions we return\n  if (!isPositionsListValid(positionsList)) return null;\n\n  return (\n    <>\n      <StatefulSheetWrapper\n        sheetType={sheetType}\n        sheetProps={{\n          id: ThActionsKeys.jumpToPosition,\n          triggerRef: triggerRef,\n          heading: t(\"reader.actions.goToPosition.descriptive\"),\n          className: jumpToPositionStyles.wrapper,\n          placement: \"bottom\",\n          isOpen: actionState?.isOpen || false,\n          onOpenChange: setOpen,\n          onClosePress: () => setOpen(false),\n          docker: docking.getDocker()\n        }}\n      >\n        <ThForm\n          label={ t(\"reader.jumpToPosition.go\") }\n          className={ jumpToPositionStyles.form }\n          onSubmit={ handleAction }\n          compounds={{\n            button: {\n              className: jumpToPositionStyles.button,\n              isDisabled: !position || positionInRange()\n            }\n          }}\n        >\n          <ThFormNumberField\n            label={ label }\n            name=\"jumpToPosition\"\n            className={ jumpToPositionStyles.numberField }\n            onChange={ setPosition }\n            onInput={ handleInput }\n            value={ position }\n            minValue={ 1 }\n            maxValue={ positionsList.length }\n            step={ 1 }\n            formatOptions={{ style: \"decimal\" }}\n            isWheelDisabled={ true }\n            errorMessage={ errorMessage }\n            compounds={{\n              label: {\n                className: jumpToPositionStyles.label\n              },\n              input: {\n                className: jumpToPositionStyles.input,\n                inputMode: \"numeric\"\n              }\n            }}\n          />\n        </ThForm>\n      </StatefulSheetWrapper>\n    </>\n  )\n}","import * as React from \"react\";\nconst SvgPinDrop = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"Inherit\" {...props}><path d=\"M480-301q99-80 149.5-154T680-594q0-90-56-148t-144-58q-88 0-144 58t-56 148q0 65 50.5 139T480-301Zm0 101Q339-304 269.5-402T200-594q0-125 78-205.5T480-880q124 0 202 80.5T760-594q0 94-69.5 192T480-200Zm0-320q33 0 56.5-23.5T560-600q0-33-23.5-56.5T480-680q-33 0-56.5 23.5T400-600q0 33 23.5 56.5T480-520ZM200-80v-80h560v80H200Zm280-520Z\" /></svg>;\nexport default SvgPinDrop;","\"use client\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport TargetIcon from \"./assets/icons/pin_drop.svg\";\n\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setActionOpen, useAppDispatch, useAppSelector } from \"@/lib\";\nimport { isPositionsListValid } from \"./helpers/utils\";\n\nexport const StatefulJumpToPositionTrigger = ({ variant }: StatefulActionTriggerProps) => {\n  const preferences = useActionsPreferences();\n  const { t } = useI18n();\n  const 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 \"@/core/Hooks/useTimeline\";\n\ninterface UseTocContentOptions {\n  isOpen: boolean;\n  tocTree: TocItem[] | undefined;\n  tocEntry: string | undefined;\n}\n\nfunction filterTocTree(\n  items: TocItem[],\n  query: string,\n  contains: (string: string, substring: string) => boolean\n): TocItem[] {\n  if (!query) return items;\n  const recursiveFilter = (items: TocItem[]): TocItem[] =>\n    items.reduce((acc: TocItem[], item: TocItem) => {\n      if (item.title && contains(item.title, query)) acc.push({ ...item, children: undefined });\n      if (item.children) acc.push(...recursiveFilter(item.children));\n      return acc;\n    }, []);\n  return recursiveFilter(items).map((item, i) => ({ ...item, key: `${item.id}-${i}` }));\n}\n\nexport function useTocContent({ isOpen, tocTree, tocEntry }: UseTocContentOptions) {\n  const [expandedKeys, setExpandedKeys] = useState<Set<Key>>(new Set());\n  const [filterValue, setFilterValue] = useState(\"\");\n  const treeRef = useRef<HTMLDivElement>(null);\n  const searchInputRef = useRef<HTMLInputElement>(null);\n\n  const { contains } = useFilter({ sensitivity: \"base\" });\n\n  // Reset filter when closed\n  useEffect(() => {\n    if (!isOpen) setFilterValue(\"\");\n  }, [isOpen]);\n\n  // ESC clears filter and prevents container from dismissing\n  useEffect(() => {\n    if (!isOpen || !filterValue) return;\n    const handleEscape = (event: KeyboardEvent) => {\n      if (event.key === \"Escape\") {\n        event.stopPropagation();\n        setFilterValue(\"\");\n      }\n    };\n    document.addEventListener(\"keydown\", handleEscape, true);\n    return () => document.removeEventListener(\"keydown\", handleEscape, true);\n  }, [isOpen, filterValue]);\n\n  // Expand parents of current entry\n  useEffect(() => {\n    if (!tocEntry || !tocTree) return;\n    setExpandedKeys(prev => {\n      const next = new Set<Key>(prev);\n      let changed = false;\n      const expand = (items: TocItem[]): boolean =>\n        items.some(item => {\n          if (item.id === tocEntry) return true;\n          if (item.children) {\n            const found = expand(item.children);\n            if (found && !next.has(item.id)) { next.add(item.id); changed = true; }\n            return found;\n          }\n          return false;\n        });\n      expand(tocTree);\n      return changed ? next : prev;\n    });\n  }, [tocEntry, tocTree]);\n\n  const displayedTocTree = filterTocTree(tocTree || [], filterValue, contains);\n\n  return { expandedKeys, setExpandedKeys, filterValue, setFilterValue, displayedTocTree, treeRef, searchInputRef };\n}\n","import * as React from \"react\";\nconst SvgChevronRight = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" /></svg>;\nexport default SvgChevronRight;","\"use client\";\n\nimport { CSSProperties, RefObject } from \"react\";\n\nimport {\n  Button,\n  Collection,\n  Key,\n  Selection,\n  Tree,\n  TreeItem,\n  TreeItemContent\n} from \"react-aria-components\";\n\nimport { TocItem } from \"@/core/Hooks/useTimeline\";\nimport { ThFormSearchField } from \"@/core/Components\";\n\nimport Chevron from \"./assets/icons/chevron_right.svg\";\nimport tocStyles from \"./assets/styles/thorium-web.toc.module.css\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nexport interface TocContentProps {\n  filterValue: string;\n  onFilterChange: (value: string) => void;\n  displayedTocTree: TocItem[];\n  tocTree: TocItem[] | undefined;\n  tocEntry: Key | string | undefined;\n  expandedKeys: Set<Key>;\n  onExpandedChange: (keys: Set<Key>) => void;\n  onSelectionChange: (keys: Selection) => void;\n  isRTL?: boolean;\n  treeRef?: RefObject<HTMLDivElement | null>;\n  searchInputRef?: RefObject<HTMLInputElement | null>;\n  compounds?: {\n    tree?: { className?: string };\n    treeWrapper?: { className?: string };\n  };\n}\n\nexport const TocContent = ({\n  filterValue,\n  onFilterChange,\n  displayedTocTree,\n  tocTree,\n  tocEntry,\n  expandedKeys,\n  onExpandedChange,\n  onSelectionChange,\n  isRTL = false,\n  treeRef,\n  searchInputRef,\n  compounds,\n}: TocContentProps) => {\n  const { t } = useI18n();\n\n  if (!tocTree || tocTree.length === 0) {\n    return <div className={ tocStyles.empty }>{ t(\"reader.tableOfContents.emptyState.description\") }</div>;\n  }\n\n  return (\n    <>\n      <ThFormSearchField\n        aria-label={ t(\"common.actions.search\") }\n        value={ filterValue }\n        onChange={ onFilterChange }\n        onClear={ () => onFilterChange(\"\") }\n        className={ tocStyles.search }\n        compounds={ {\n          label: { className: tocStyles.searchLabel },\n          input: {\n            ref: searchInputRef,\n            className: tocStyles.searchInput,\n            placeholder: t(\"common.actions.search\")\n          },\n          searchIcon: { className: tocStyles.searchIcon, hidden: !!filterValue },\n          clearButton: {\n            className: tocStyles.clearButton,\n            isDisabled: !filterValue,\n            \"aria-label\": t(\"common.actions.clear\")\n          }\n        } }\n      />\n      <div { ...compounds?.treeWrapper }>\n      <Tree\n        ref={ treeRef }\n        aria-label={ t(\"reader.toc.entries\") }\n        selectionMode=\"single\"\n        items={ displayedTocTree }\n        className={ [tocStyles.tree, compounds?.tree?.className].filter(Boolean).join(\" \") }\n        onSelectionChange={ onSelectionChange }\n        selectedKeys={ tocEntry ? [tocEntry] : [] }\n        expandedKeys={ expandedKeys }\n        onExpandedChange={ onExpandedChange }\n        dir={ isRTL ? \"rtl\" : \"ltr\" }\n      >\n        { function renderItem(item) {\n          return (\n            <TreeItem\n              data-href={ item.href }\n              className={ tocStyles.treeItem }\n              textValue={ item.title || \"\" }\n            >\n              <TreeItemContent>\n                { item.children && (\n                  <Button\n                    slot=\"chevron\"\n                    className={ tocStyles.treeItemButton }\n                    style={ { transform: isRTL ? \"scaleX(-1)\" : \"none\" } as CSSProperties }\n                  >\n                    <Chevron aria-hidden=\"true\" focusable=\"false\" />\n                  </Button>\n                ) }\n                <div className={ tocStyles.treeItemText }>\n                  <div className={ tocStyles.treeItemTextTitle }>{ item.title }</div>\n                  { item.position && <div className={ tocStyles.treeItemTextPosition }>{ item.position }</div> }\n                </div>\n              </TreeItemContent>\n              <Collection items={ item.children }>\n                { renderItem }\n              </Collection>\n            </TreeItem>\n          );\n        } }\n      </Tree>\n      </div>\n    </>\n  );\n};\n","\"use client\";\n\nimport { useCallback, useEffect } from \"react\";\n\nimport { Link } from \"@readium/shared\";\nimport { ThActionsKeys, ThDockingKeys, ThSheetTypes } from \"@/preferences/models\";\nimport { StatefulActionContainerProps } from \"../models/actions\";\n\nimport tocStyles from \"./assets/styles/thorium-web.toc.module.css\";\n\nimport { StatefulSheetWrapper } from \"../../Sheets/StatefulSheetWrapper\";\nimport { Selection } from \"react-aria-components\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useDocking } from \"../../Docking/hooks/useDocking\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\nimport { setTocEntry } from \"@/lib/publicationReducer\";\nimport { findTocItemById } from \"@/helpers/buildTocTree\";\nimport { setImmersive, setUserNavigated } from \"@/lib/readerReducer\";\n\nimport { isActiveElement } from \"@/core/Helpers/focusUtilities\";\n\nimport { useTocContent } from \"./useTocContent\";\nimport { TocContent } from \"./TocContent\";\n\nexport const StatefulTocContainer = ({ triggerRef }: StatefulActionContainerProps) => {\n  const { t } = useI18n();\n\n  const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n  const tocEntry = unstableTimeline?.toc?.currentEntry ?? undefined;\n  const tocEntryId = tocEntry?.id;\n  const tocTree = unstableTimeline?.toc?.tree;\n\n  const { 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];\n    const el = document.querySelector(`[data-key=${key}]`);\n    const href = el?.getAttribute(\"data-href\");\n\n    if (!href) return;\n\n    const link: Link = new Link({ href: href });\n    const matched = findTocItemById(tocTree || [], key as string);\n\n    const cb = actionState?.isOpen &&\n      (sheetType === ThSheetTypes.dockedStart || sheetType === ThSheetTypes.dockedEnd)\n        ? () => {\n          dispatch(setTocEntry(matched || null));\n          dispatch(setImmersive(true));\n          dispatch(setUserNavigated(true));\n        }\n        : () => {\n          dispatch(setTocEntry(matched || null));\n          dispatch(setImmersive(true));\n          dispatch(setUserNavigated(true));\n          setOpen(false);\n        };\n\n    goLink(link, true, cb);\n  };\n\n  // Since React Aria components intercept keys and do not continue propagation\n  // we have to handle the escape key in capture phase\n  useEffect(() => {\n    if (actionState?.isOpen && (!actionState?.docking || actionState?.docking === ThDockingKeys.transient)) {\n      const handleEscape = (event: KeyboardEvent) => {\n        if ((!isActiveElement(searchInputRef.current) && !filterValue) && event.key === \"Escape\") {\n          setOpen(false);\n        }\n      };\n\n      document.addEventListener(\"keydown\", handleEscape, true);\n\n      return () => {\n        document.removeEventListener(\"keydown\", handleEscape, true);\n      };\n    }\n  }, [actionState, setOpen, filterValue, searchInputRef]);\n\n  return (\n    <StatefulSheetWrapper\n      sheetType={ sheetType }\n      sheetProps={ {\n        id: ThActionsKeys.toc,\n        triggerRef: triggerRef,\n        heading: t(\"reader.tableOfContents.title\"),\n        className: tocStyles.wrapper,\n        placement: \"bottom\",\n        isOpen: actionState?.isOpen || false,\n        onOpenChange: setOpen,\n        onClosePress: () => setOpen(false),\n        docker: docking.getDocker(),\n        resetFocus: tocEntryId,\n        focusWithinRef: treeRef\n      } }\n    >\n      <TocContent\n        filterValue={ filterValue }\n        onFilterChange={ setFilterValue }\n        displayedTocTree={ displayedTocTree }\n        tocTree={ tocTree }\n        tocEntry={ tocEntryId }\n        expandedKeys={ expandedKeys }\n        onExpandedChange={ setExpandedKeys }\n        onSelectionChange={ handleAction }\n        isRTL={ isRTL }\n        treeRef={ treeRef }\n        searchInputRef={ searchInputRef }\n      />\n    </StatefulSheetWrapper>\n  );\n};\n","import * as React from \"react\";\nconst SvgToc = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M120-280v-80h560v80H120Zm0-160v-80h560v80H120Zm0-160v-80h560v80H120Zm680 320q-17 0-28.5-11.5T760-320q0-17 11.5-28.5T800-360q17 0 28.5 11.5T840-320q0 17-11.5 28.5T800-280Zm0-160q-17 0-28.5-11.5T760-480q0-17 11.5-28.5T800-520q17 0 28.5 11.5T840-480q0 17-11.5 28.5T800-440Zm0-160q-17 0-28.5-11.5T760-640q0-17 11.5-28.5T800-680q17 0 28.5 11.5T840-640q0 17-11.5 28.5T800-600Z\" /></svg>;\nexport default SvgToc;","\"use client\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport TocIcon from \"./assets/icons/toc.svg\";\n\nimport { StatefulActionTriggerProps } from \"../models/actions\";\nimport { ThActionsTriggerVariant } from \"@/core/Components/Actions/ThActionsBar\";\n\nimport { StatefulActionIcon } from \"../Triggers/StatefulActionIcon\";\nimport { StatefulOverflowMenuItem } from \"../Triggers/StatefulOverflowMenuItem\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { setActionOpen } from \"@/lib/actionsReducer\";\n\nexport const StatefulTocTrigger = ({ variant }: StatefulActionTriggerProps) => {\n  const preferences = useActionsPreferences();\n  const { t } = useI18n();\n  const 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.5.5\",\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 unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n  const tocEntry = unstableTimeline?.toc?.currentEntry ?? undefined;\n  const tocEntryId = tocEntry?.id;\n  const tocTree = unstableTimeline?.toc?.tree;\n\n  const 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];\n    const el = document.querySelector(`[data-key=${key}]`);\n    const href = el?.getAttribute(\"data-href\");\n    if (!href) return;\n    const matched = findTocItemById(tocTree || [], key as string);\n\n    const cb = isOpen && (sheetType === ThSheetTypes.dockedStart || sheetType === ThSheetTypes.dockedEnd)\n      ? () => {\n          dispatch(setTocEntry(matched || null));\n          dispatch(setImmersive(true));\n          dispatch(setUserNavigated(true));\n        }\n      : () => {\n          dispatch(setTocEntry(matched || null));\n          dispatch(setImmersive(true));\n          dispatch(setUserNavigated(true));\n          setOpen(false);\n        };\n\n    goLink(new Link({ href }), true, cb);\n  };\n\n  return (\n    <StatefulSheetWrapper\n      sheetType={ sheetType }\n      sheetProps={ {\n        id: ThAudioActionKeys.toc,\n        triggerRef,\n        heading: t(\"reader.tableOfContents.title\"),\n        className: \"\",\n        isOpen,\n        onOpenChange: setOpen,\n        onClosePress: () => setOpen(false),\n        docker: docking.getDocker(),\n        resetFocus: tocEntryId,\n        focusWithinRef: treeRef,\n      } }\n    >\n      <TocContent\n        filterValue={ filterValue }\n        onFilterChange={ setFilterValue }\n        displayedTocTree={ displayedTocTree }\n        tocTree={ tocTree }\n        tocEntry={ tocEntryId }\n        expandedKeys={ expandedKeys }\n        onExpandedChange={ setExpandedKeys }\n        onSelectionChange={ handleAction }\n        isRTL={ isRTL }\n        treeRef={ treeRef }\n        searchInputRef={ searchInputRef }\n      />\n    </StatefulSheetWrapper>\n  );\n};\n","import * as React from \"react\";\nconst SvgSnooze = props => <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"inherit\" {...props}><path d=\"M380-334h200v-60H468l112-126v-54H380v60h114L380-386v52Zm-40.5 225.5q-65.5-28.5-114-77t-77-114Q120-365 120-440t28.5-140.5q28.5-65.5 77-114t114-77Q405-800 480-800t140.5 28.5q65.5 28.5 114 77t77 114Q840-515 840-440t-28.5 140.5q-28.5 65.5-77 114t-114 77Q555-80 480-80t-140.5-28.5ZM480-440ZM224-866l56 56-170 170-56-56 170-170Zm512 0 170 170-56 56-170-170 56-56ZM480-160q117 0 198.5-81.5T760-440q0-117-81.5-198.5T480-720q-117 0-198.5 81.5T200-440q0 117 81.5 198.5T480-160Z\" /></svg>;\nexport default SvgSnooze;",".wrapper {}\n\n.button {\n  --th-icon-size: calc(var(--audio-icon-base) * (5/4));\n  padding: calc(var(--th-icon-size) * (1/4));\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  outline: none;\n}\n\n.button[data-focus-visible] {\n  outline: 2px solid var(--th-theme-focus);\n}\n\n.button[data-disabled] {\n  color: var(--th-theme-disable);\n}\n\n.button:has(.label) {\n  padding-bottom: calc(var(--th-icon-size) * (2/3));\n}\n\n.label {\n  position: absolute;\n  bottom: calc(var(--th-icon-size) * (1/4));\n  left: 50%;\n  transform: translateX(-50%);\n  white-space: nowrap;\n  line-height: 1;\n  font-size: calc(var(--th-icon-size, 24px) * (5/12));\n  font-variant-numeric: tabular-nums;\n  font-weight: bold;\n}\n\n.listbox {\n  display: flex;\n  flex-direction: column;\n  gap: calc(var(--th-layout-spacing) / 2);\n}\n\n.listboxItem {\n  padding: calc(var(--th-layout-spacing) / 4);\n  border-radius: var(--th-layout-radius);\n  outline: none;\n  cursor: default;\n}\n\n.listboxItem[data-selected] {\n  background-color: var(--th-theme-hover);\n  font-weight: bold;\n}\n\n.listboxItem[data-hovered]:not([data-selected]) {\n  background-color: var(--th-theme-hover);\n  color: var(--th-theme-onHover);\n}\n\n.listboxItem[data-focus-visible] {\n  outline: 2px solid var(--th-theme-focus);\n}\n\n/* Sleep timer duration field */\n\n.durationField {\n  display: flex;\n  flex-direction: column;\n}\n\n.instruction {\n  display: block;\n  margin: 0 0 var(--th-layout-spacing) 0;\n}\n\n.inputs {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: calc(var(--th-layout-spacing) / 4);\n  margin-bottom: var(--th-layout-spacing);\n}\n\n.fieldGroup {\n  display: contents;\n}\n\n.fieldInput {\n  width: 4ch;\n  text-align: center;\n  background: transparent;\n  border: 2px solid var(--th-theme-subdue);\n  border-radius: var(--th-layout-radius);\n  padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n  color: var(--th-theme-text);\n  font-variant-numeric: tabular-nums;\n  font-weight: bold;\n  outline: none;\n}\n\n.fieldInput[data-focus-visible] {\n  outline: 2px solid var(--th-theme-focus);\n}\n\n.unitLabel {\n  margin-inline-end: calc(var(--th-layout-spacing) / 4);\n}\n\n.remaining {\n  font-variant-numeric: tabular-nums;\n  font-weight: bold;\n  margin: 0 0 var(--th-layout-spacing) 0;\n}\n\n.cancelButton {\n  margin-top: var(--th-layout-spacing);\n}\n\n/* Start button */\n\n.startButton {\n  padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-icon-size, 24px) * (1/2));\n  border-radius: var(--th-layout-radius);\n  border: 2px solid var(--th-theme-subdue);\n  background: transparent;\n  color: var(--th-theme-text);\n  cursor: default;\n  width: 100%;\n  box-sizing: border-box;\n  text-align: center;\n}\n\n.startButton[data-hovered] {\n  background-color: var(--th-theme-hover);\n  color: var(--th-theme-onHover)\n}\n\n.startButton[data-focus-visible] {\n  outline: 2px solid var(--th-theme-focus);\n}\n\n.startButton[data-disabled] {\n  color: var(--th-theme-disable);\n}","\"use client\";\n\nimport SnoozeIcon from \"./assets/icons/snooze.svg\";\n\nimport { ThAudioActionKeys } from \"@/preferences/models\";\nimport { StatefulActionIcon } from \"../../../Actions/Triggers/StatefulActionIcon\";\nimport { StatefulActionTriggerProps } from \"../../../Actions/models/actions\";\n\nimport timerStyles from \"./assets/styles/thorium-web.sleepTimer.module.css\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { toggleActionOpen } from \"@/lib/actionsReducer\";\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.5.5\",\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 { useCallback, useEffect, useState } from \"react\";\n\nimport { ThActionsDockedPref } from \"@/preferences\";\n\nimport { DockStateObject } from \"@/lib/actionsReducer\";\n\nimport { useActions } from \"@/core/Components/Actions/hooks/useActions\";\nimport { usePrevious } from \"@/core/Hooks/usePrevious\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useSharedPreferences } from \"@/preferences/hooks/useSharedPreferences\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\n// TODO: Responsive.\n// When resizing the window, all widths should be recalculated.\n// There is no guarantee that the panel group is the same size as the window,\n// so we have to rewrite this hook to observe the panel group, and push the new\n// widths to the StatefulDockingWrapper so that it can update panels.\n// Note that the StatefulDockingWrapper cannot pass PanelGroup as a ref,\n// it requires using a utility method: getPanelGroupElement(id)\n// See https://github.com/bvaughn/react-resizable-panels/tree/main/packages/react-resizable-panels#can-a-attach-a-ref-to-the-dom-elements\nexport const useResizablePanel = (panel: DockStateObject | undefined) => {\n  const 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  const previouslyCollapsed = usePrevious(panel?.collapsed);\n\n  const previousWidth = actions.getDockedWidth(panel?.actionKey) || null;\n  const width = pref?.width || defaultWidth;\n  const minWidth = pref?.minWidth && pref.minWidth < width \n    ? pref.minWidth \n    : defaultWidth < width \n      ? defaultWidth\n      : width;\n  const maxWidth = pref?.maxWidth && pref.maxWidth > width \n    ? pref.maxWidth \n    : defaultWidth > width\n      ? defaultWidth\n      : width;\n\n  const isPopulated = () => {\n    return !!(panel?.active && actions.isOpen(panel?.actionKey));\n  };\n\n  const isCollapsed = () => {\n    return !!panel?.collapsed;\n  }\n\n  const forceExpand = () => {\n    return !!(isPopulated() && previouslyCollapsed && !panel?.collapsed);\n  }\n\n  const currentKey = () => {\n    return panel?.actionKey ?? null;\n  };\n\n  const isResizable = () => {\n    return isPopulated() ? Math.round(width) > Math.round(minWidth) && Math.round(width) < Math.round(maxWidth) : false;\n  };\n\n  const hasDragIndicator = () => {\n    return pref?.dragIndicator || false;\n  };\n\n  const getWidth = useCallback(() => {\n    return previousWidth \n        ? Math.round((previousWidth / window.innerWidth) * 100) \n        : Math.round((width / window.innerWidth) * 100);\n  }, [previousWidth, width]);\n\n  const getMinWidth = useCallback(() => {\n    return Math.round((minWidth / window.innerWidth) * 100);\n  }, [minWidth]);\n\n  const getMaxWidth = useCallback(() => {\n    return Math.round((maxWidth / window.innerWidth) * 100);\n  }, [maxWidth]);\n\n  const getCurrentPxWidth = useCallback((percentage: number) => {\n    let current = Math.round((percentage * window.innerWidth) / 100);\n    \n    if (current < minWidth) {\n      current = minWidth;\n    }\n    \n    if (current > maxWidth) {\n      current = maxWidth;\n    }\n    \n    return current;\n  }, [minWidth, maxWidth]);\n\n  // When the docked action changes, we need to update its preferences \n  useEffect(() => {\n    setPref(panel?.actionKey ? preferences.actionsKeys[panel.actionKey]?.docked || null : null);\n  }, [panel?.actionKey, preferences]);\n\n  return {\n    currentKey, \n    isPopulated, \n    isCollapsed, \n    forceExpand, \n    isResizable,\n    hasDragIndicator, \n    getWidth,\n    getMinWidth,\n    getMaxWidth,\n    getCurrentPxWidth\n  }\n}","\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { ThDockingKeys } from \"@/preferences/models\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { dockAction } from \"@/lib/actionsReducer\";\nimport { useActionComponentStatus } from \"../../Actions/hooks/useActionComponentStatus\";\n\n/**\n * Reusable hook to clean up stale docked actions.\n * Compares docked actionKeys to available actions and clears any that don't exist.\n */\nexport const useDockCleanup = (profile: string | undefined) => {\n  const dispatch = useAppDispatch();\n  const dock = useAppSelector(state => profile ? state.actions.dock[profile] : undefined);\n\n  const startActionKey = dock?.[ThDockingKeys.start]?.actionKey;\n  const endActionKey = dock?.[ThDockingKeys.end]?.actionKey;\n  \n  const startStatus = useActionComponentStatus({ actionKey: startActionKey || \"\" });\n  const endStatus = useActionComponentStatus({ actionKey: endActionKey || \"\" });\n\n  useEffect(() => {\n    if (!profile || !dock) return;\n\n    if (startActionKey && !startStatus.isComponentRegistered) {\n      dispatch(dockAction({\n        key: startActionKey,\n        dockingKey: ThDockingKeys.transient,\n        profile\n      }));\n    }\n\n    if (endActionKey && !endStatus.isComponentRegistered) {\n      dispatch(dockAction({\n        key: endActionKey,\n        dockingKey: ThDockingKeys.transient,\n        profile\n      }));\n    }\n  }, [profile, dock, startActionKey, endActionKey, startStatus.isComponentRegistered, endStatus.isComponentRegistered, dispatch]);\n};\n","\"use client\";\n\nimport { ReactNode, useCallback, useEffect, useRef } from \"react\";\n\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport dockingStyles from \"./assets/styles/thorium-web.docking.module.css\";\n\nimport { ImperativePanelHandle, Panel, PanelGroup, PanelResizeHandle } from \"react-resizable-panels\";\n\nimport { ThDockingTypes, ThDockingKeys, ThLayoutDirection } from \"@/preferences/models\";\nimport { ActionsStateKeys } from \"@/lib/actionsReducer\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useResizablePanel } from \"./hooks/useResizablePanel\";\nimport { useDockCleanup } from \"./hooks/useDockCleanup\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { activateDockPanel, collapseDockPanel, deactivateDockPanel, expandDockPanel, setDockPanelWidth } from \"@/lib/actionsReducer\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport classNames from \"classnames\";\n\nexport interface DockPanelSizes {\n  width: number;\n  minWidth: number;\n  maxWidth: number;\n  getCurrentPxWidth: (percentage: number) => number;\n}\n\nconst DockHandle = ({\n  flow,\n  isResizable,\n  isPopulated, \n  hasDragIndicator\n}: { \n  flow: ThDockingKeys.start | ThDockingKeys.end;\n  isResizable: boolean;\n  isPopulated: boolean;\n  hasDragIndicator?: boolean;\n}) => {\n  const handleID = `${ flow }-resize-handle`;\n\n  const direction = useAppSelector(state => state.reader.direction);\n\n  const classFromFlow = useCallback(() => {\n    if (flow === ThDockingKeys.start) {\n      return direction === ThLayoutDirection.ltr ? dockingStyles.resizeHandleGrabLeft : dockingStyles.resizeHandleGrabRight;\n    } else if (flow === ThDockingKeys.end) {\n      return direction === ThLayoutDirection.ltr ? dockingStyles.resizeHandleGrabRight : dockingStyles.resizeHandleGrabLeft;\n    }\n  }, [flow, direction]);\n\n  return(\n    <>\n    <PanelResizeHandle \n      id={ handleID } \n      className={ dockingStyles.resizeHandle }\n      disabled={ !isResizable }\n      tabIndex={ isPopulated ? 0 : -1 }\n    >\n      { isResizable && hasDragIndicator && \n        <div className={ classNames(dockingStyles.resizeHandleGrab, classFromFlow()) }></div> \n      }\n    </PanelResizeHandle>\n    </>\n  )\n};\n\nconst DockPanel = ({\n  actionKey,\n  flow,\n  sizes,\n  isResizable,\n  isPopulated,\n  isCollapsed,\n  forceExpand,\n  hasDragIndicator,\n  profile\n}: { \n  actionKey: ActionsStateKeys | null;\n  flow: ThDockingKeys.start | ThDockingKeys.end;\n  sizes: DockPanelSizes;\n  isResizable: boolean;\n  isPopulated: boolean;\n  isCollapsed: boolean;\n  forceExpand: boolean;\n  hasDragIndicator?: boolean;\n  profile: string;\n}) => {\n  const { t } = useI18n();\n\n  const panelRef = useRef<ImperativePanelHandle>(null);\n  const direction = useAppSelector(state => state.reader.direction);\n  const dispatch = useAppDispatch();\n\n  const dockClassName = flow === ThDockingKeys.end && direction === ThLayoutDirection.ltr ? readerStyles.rightDock : readerStyles.leftDock;\n\n  const makeDockLabel = useCallback(() => {    \n    let label = \"\";\n    if (flow === ThDockingKeys.end && direction === ThLayoutDirection.ltr) {\n      label += t(\"reader.app.docking.dockingRight\");\n    } else {\n      label += t(\"reader.app.docking.dockingLeft\")\n    }\n\n    if (actionKey) {\n      if (!isPopulated) {\n        label += ` – ${ t(\"reader.app.docking.dockingClosed\", { action: t(`reader.${ actionKey }.heading`) }) }`;\n      } else if (isCollapsed) {\n        label += ` – ${ t(\"reader.app.docking.dockingCollapsed\", { action: t(`reader.${ actionKey }.heading`) }) }`;\n      }\n    } else {\n      label += ` – ${ t(\"reader.app.docking.dockingEmpty\") }`;\n    }\n\n    return label;\n  }, [flow, direction, isPopulated, isCollapsed, actionKey, t]);\n\n  const collapsePanel = useCallback(() => {\n    if (panelRef.current) {\n      panelRef.current.collapse();\n      dispatch(collapseDockPanel({ slot: flow, profile }));\n    }\n  }, [dispatch, flow, profile]);\n\n  const expandPanel = useCallback(() => {\n    if (panelRef.current) {\n      panelRef.current.expand();\n      dispatch(expandDockPanel({ slot: flow, profile }));\n    }\n  }, [dispatch, flow, profile]);\n\n  useEffect(() => {\n    dispatch(activateDockPanel({ slot: flow, profile }));\n\n    return () => {\n      dispatch(deactivateDockPanel({ slot: flow, profile }));\n    }\n  }, [dispatch, flow, profile]);\n\n  useEffect(() => {\n    isPopulated || forceExpand ? expandPanel() : collapsePanel();\n  }, [isPopulated, forceExpand, collapsePanel, expandPanel]);\n\n  return(\n    <>\n    { flow === ThDockingKeys.end &&\n      <DockHandle \n        flow={ ThDockingKeys.end } \n        isResizable={ isResizable } \n        isPopulated={ isPopulated }\n        hasDragIndicator={ hasDragIndicator } \n      /> \n    } \n    <Panel \n      id={ `${ flow }-panel` } \n      order={ flow === ThDockingKeys.end ? 3 : 1 } \n      collapsible={ true }\n      collapsedSize={ 0 }\n      ref={ panelRef }\n      defaultSize={ isPopulated ? sizes.width : 0 } \n      minSize={ sizes.minWidth } \n      maxSize={ sizes.maxWidth }\n      onCollapse={ collapsePanel }\n      onExpand={ expandPanel }\n      onResize={ (size: number) => size !== 0 && dispatch(setDockPanelWidth({\n        key: flow,\n        width: sizes.getCurrentPxWidth(size),\n        profile: profile\n      }))}\n      inert={ isCollapsed } \n    >\n      <div \n        id={ flow } \n        aria-label={ makeDockLabel() }\n        className={ classNames(dockingStyles.panelContainer, dockClassName) }\n      ></div>\n    </Panel>\n    { flow === ThDockingKeys.start && \n      <DockHandle \n        flow={ ThDockingKeys.start } \n        isResizable={ isResizable } \n        isPopulated={ isPopulated } \n        hasDragIndicator={ hasDragIndicator } \n      /> \n    } \n  </>\n  );\n};\n\nexport const StatefulDockingWrapper = ({ \n  children\n}: { \n  children: ReactNode; \n}) => {\n  const preferences = useActionsPreferences();\n  const profile = useAppSelector(state => state.reader.profile);\n  \n  // Clean up stale docked actions\n  useDockCleanup(profile);\n  \n  const dockingStart = useAppSelector(state => profile && state.actions.dock[profile] ? state.actions.dock[profile][ThDockingKeys.start] : undefined);\n  const dockingEnd = useAppSelector(state => profile && state.actions.dock[profile] ? state.actions.dock[profile][ThDockingKeys.end] : undefined)\n  const startPanel = useResizablePanel(dockingStart);\n  const endPanel = useResizablePanel(dockingEnd);\n\n  const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n  if (!preferences.docking.dock) {\n    return(\n      <>\n      { children }\n      </>\n    )\n  } else {\n    const dockingMap = makeBreakpointsMap<ThDockingTypes>({\n      defaultValue: ThDockingTypes.both, \n      fromEnum: ThDockingTypes, \n      pref: preferences.docking.dock, \n      disabledValue: ThDockingTypes.none\n    });\n\n    const dockConfig = breakpoint && dockingMap[breakpoint] || ThDockingTypes.both;\n\n    return (\n      <>\n      <PanelGroup direction=\"horizontal\">\n        { \n          (dockConfig === ThDockingTypes.both || dockConfig === ThDockingTypes.start) \n          && profile && <DockPanel \n            actionKey={ startPanel.currentKey() }\n            flow={ ThDockingKeys.start } \n            sizes={{\n              width: startPanel.getWidth(),\n              minWidth: startPanel.getMinWidth(),\n              maxWidth: startPanel.getMaxWidth(),\n              getCurrentPxWidth: startPanel.getCurrentPxWidth\n            }} \n            isResizable={ startPanel.isResizable() }\n            isPopulated={ startPanel.isPopulated() }\n            isCollapsed={ startPanel.isCollapsed() } \n            forceExpand={ startPanel.forceExpand() }\n            hasDragIndicator={ startPanel.hasDragIndicator() }\n            profile={ profile }\n          />\n        }\n    \n        <Panel id=\"main-panel\" order={ 2 }>\n          { children }\n        </Panel>\n    \n        { \n          (dockConfig === ThDockingTypes.both || dockConfig === ThDockingTypes.end) \n          && profile && <DockPanel \n            actionKey={ endPanel.currentKey() }\n            flow={ ThDockingKeys.end } \n            sizes={{\n              width: endPanel.getWidth(),\n              minWidth: endPanel.getMinWidth(),\n              maxWidth: endPanel.getMaxWidth(),\n              getCurrentPxWidth: endPanel.getCurrentPxWidth\n            }} \n            isResizable={ endPanel.isResizable() }\n            isPopulated={ endPanel.isPopulated() }\n            isCollapsed={ endPanel.isCollapsed() } \n            forceExpand={ endPanel.forceExpand() }\n            hasDragIndicator={ endPanel.hasDragIndicator() }\n            profile={ profile }\n          />\n        }\n      </PanelGroup>\n    </>\n    )\n  }\n}","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { ThDockingKeys, ThDockingTypes } from \"@/preferences/models\";\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\n\nexport const useFocusedDockableKey = () => {\n  const { actionsKeys } = useActionsPreferences();\n\n  return useCallback((dockingKey: ThDockingKeys): string | 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    let el: Element | null = active;\n    while (el) {\n      const id = el.getAttribute(\"id\");\n      if (id) {\n        if (checkKey(id)) return 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 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 key;\n      }\n\n      el = el.parentElement;\n    }\n\n    return null;\n  }, [actionsKeys]);\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"]}