@prose-reader/react-reader 1.179.0 → 1.181.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/index.js +556 -252
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +1 -1
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/{ReactReader.d.ts → src/ReactReader.d.ts} +2 -2
  6. package/dist/src/components/ui/accordion.d.ts +12 -0
  7. package/dist/{context → src/context}/ReactReaderProvider.d.ts +3 -1
  8. package/dist/src/context/context.d.ts +9 -0
  9. package/dist/src/navigation/QuickMenu/BottomBar.d.ts +5 -0
  10. package/dist/{navigation → src/navigation}/QuickMenu/QuickMenu.d.ts +3 -2
  11. package/dist/src/navigation/QuickMenu/useQuickMenu.d.ts +1 -0
  12. package/dist/src/navigation/help/HelpDialog.d.ts +4 -0
  13. package/dist/src/navigation/toc/TableOfContentsDialog.d.ts +5 -0
  14. package/dist/src/navigation/toc/TableOfContentsDialogContent.d.ts +4 -0
  15. package/package.json +2 -2
  16. package/dist/context/context.d.ts +0 -3
  17. package/dist/navigation/QuickMenu/BottomBar.d.ts +0 -3
  18. /package/dist/{common → src/common}/useFullscreen.d.ts +0 -0
  19. /package/dist/{components → src/components}/ui/avatar.d.ts +0 -0
  20. /package/dist/{components → src/components}/ui/checkbox.d.ts +0 -0
  21. /package/dist/{components → src/components}/ui/close-button.d.ts +0 -0
  22. /package/dist/{components → src/components}/ui/color-mode.d.ts +0 -0
  23. /package/dist/{components → src/components}/ui/dialog.d.ts +0 -0
  24. /package/dist/{components → src/components}/ui/drawer.d.ts +0 -0
  25. /package/dist/{components → src/components}/ui/field.d.ts +0 -0
  26. /package/dist/{components → src/components}/ui/input-group.d.ts +0 -0
  27. /package/dist/{components → src/components}/ui/popover.d.ts +0 -0
  28. /package/dist/{components → src/components}/ui/progress.d.ts +0 -0
  29. /package/dist/{components → src/components}/ui/provider.d.ts +0 -0
  30. /package/dist/{components → src/components}/ui/radio.d.ts +0 -0
  31. /package/dist/{components → src/components}/ui/slider.d.ts +0 -0
  32. /package/dist/{components → src/components}/ui/toggle-tip.d.ts +0 -0
  33. /package/dist/{components → src/components}/ui/tooltip.d.ts +0 -0
  34. /package/dist/{context → src/context}/useReader.d.ts +0 -0
  35. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  36. /package/dist/{navigation → src/navigation}/FloatingProgress.d.ts +0 -0
  37. /package/dist/{navigation → src/navigation}/FloatingTime.d.ts +0 -0
  38. /package/dist/{navigation → src/navigation}/QuickMenu/PaginationInfoSection.d.ts +0 -0
  39. /package/dist/{navigation → src/navigation}/QuickMenu/QuickBar.d.ts +0 -0
  40. /package/dist/{navigation → src/navigation}/QuickMenu/Scrubber.d.ts +0 -0
  41. /package/dist/{navigation → src/navigation}/QuickMenu/ThemedSlider.d.ts +0 -0
  42. /package/dist/{navigation → src/navigation}/QuickMenu/TimeIndicator.d.ts +0 -0
  43. /package/dist/{navigation → src/navigation}/QuickMenu/TopBar.d.ts +0 -0
  44. /package/dist/{navigation → src/navigation}/useNavigationContext.d.ts +0 -0
  45. /package/dist/{pagination → src/pagination}/usePagination.d.ts +0 -0
  46. /package/dist/{settings → src/settings}/useSettings.d.ts +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/context/useReader.ts","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/navigation/QuickMenu/TimeIndicator.tsx","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/navigation/QuickMenu/PaginationInfoSection.tsx","../src/navigation/QuickMenu/QuickBar.tsx","../src/navigation/QuickMenu/ThemedSlider.tsx","../src/navigation/QuickMenu/Scrubber.tsx","../src/navigation/QuickMenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/navigation/QuickMenu/TopBar.tsx","../src/navigation/QuickMenu/QuickMenu.tsx","../src/ReactReader.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\n\nexport const ReaderContext: Context<Reader | undefined> = createContext<\n Reader | undefined\n>(undefined)\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n }: { children?: React.ReactNode; reader: Reader | undefined }) => {\n return (\n <ReaderContext.Provider value={reader}>{children}</ReaderContext.Provider>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReader = (): Reader | undefined => {\n const context = useContext(ReaderContext)\n\n return context\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { NEVER, combineLatest, map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context.state$]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, Text } from \"@chakra-ui/react\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const FloatingProgress = () => {\n const pagination = usePagination()\n const roundedProgress = Math.floor(\n (pagination?.percentageEstimateOfBook ?? 0) * 100,\n )\n const displayableProgress = roundedProgress > 0 ? roundedProgress : 1\n\n if (pagination?.percentageEstimateOfBook === undefined) return null\n\n return (\n <Box position=\"absolute\" right={0} bottom={0} p={2}>\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n )\n}\n","import { Text, type TextProps } from \"@chakra-ui/react\"\nimport { useEffect, useState } from \"react\"\n\nexport const useTime = () => {\n const [time, setTime] = useState(new Date())\n\n useEffect(() => {\n const interval = setInterval(() => {\n setTime(new Date())\n }, 1000 * 60)\n\n return () => clearInterval(interval)\n }, [])\n\n return time\n}\n\nexport const TimeIndicator = (props: TextProps) => {\n const time = useTime()\n\n return (\n <Text fontSize=\"xs\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { TimeIndicator } from \"./QuickMenu/TimeIndicator\"\n\nexport const FloatingTime = () => {\n return (\n <Box position=\"absolute\" left={0} bottom={0} p={2}>\n <TimeIndicator />\n </Box>\n )\n}\n","import { Popover as ChakraPopover, IconButton, Portal } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { HiOutlineInformationCircle } from \"react-icons/hi\"\n\nexport interface ToggleTipProps extends ChakraPopover.RootProps {\n showArrow?: boolean\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n content?: React.ReactNode\n}\n\nexport const ToggleTip = React.forwardRef<HTMLDivElement, ToggleTipProps>(\n function ToggleTip(props, ref) {\n const {\n showArrow,\n children,\n portalled = true,\n content,\n portalRef,\n ...rest\n } = props\n\n return (\n <ChakraPopover.Root\n {...rest}\n positioning={{ ...rest.positioning, gutter: 4 }}\n >\n <ChakraPopover.Trigger asChild>{children}</ChakraPopover.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraPopover.Positioner>\n <ChakraPopover.Content\n width=\"auto\"\n px=\"2\"\n py=\"1\"\n textStyle=\"xs\"\n rounded=\"sm\"\n ref={ref}\n >\n {showArrow && (\n <ChakraPopover.Arrow>\n <ChakraPopover.ArrowTip />\n </ChakraPopover.Arrow>\n )}\n {content}\n </ChakraPopover.Content>\n </ChakraPopover.Positioner>\n </Portal>\n </ChakraPopover.Root>\n )\n },\n)\n\nexport const InfoTip = React.forwardRef<\n HTMLDivElement,\n Partial<ToggleTipProps>\n>(function InfoTip(props, ref) {\n const { children, ...rest } = props\n return (\n <ToggleTip content={children} {...rest} ref={ref}>\n <IconButton\n variant=\"ghost\"\n aria-label=\"info\"\n size=\"2xs\"\n colorPalette=\"gray\"\n >\n <HiOutlineInformationCircle />\n </IconButton>\n </ToggleTip>\n )\n})\n","import { Progress as ChakraProgress } from \"@chakra-ui/react\"\nimport { InfoTip } from \"./toggle-tip\"\nimport * as React from \"react\"\n\nexport const ProgressBar = React.forwardRef<\n HTMLDivElement,\n ChakraProgress.TrackProps\n>(function ProgressBar(props, ref) {\n return (\n <ChakraProgress.Track {...props} ref={ref}>\n <ChakraProgress.Range />\n </ChakraProgress.Track>\n )\n})\n\nexport interface ProgressLabelProps extends ChakraProgress.LabelProps {\n info?: React.ReactNode\n}\n\nexport const ProgressLabel = React.forwardRef<\n HTMLDivElement,\n ProgressLabelProps\n>(function ProgressLabel(props, ref) {\n const { children, info, ...rest } = props\n return (\n <ChakraProgress.Label {...rest} ref={ref}>\n {children}\n {info && <InfoTip>{info}</InfoTip>}\n </ChakraProgress.Label>\n )\n})\n\nexport const ProgressRoot = ChakraProgress.Root\nexport const ProgressValueText = ChakraProgress.ValueText\n","import { usePagination } from \"../pagination/usePagination\"\n\nexport const useNavigationContext = () => {\n const pagination = usePagination()\n const hasOnlyOnePage = pagination?.numberOfTotalPages === 1\n\n const isBeginWithinChapter =\n (pagination?.beginNumberOfPagesInSpineItem ?? 0) > 1\n\n const isEndWithinChapter = (pagination?.endNumberOfPagesInSpineItem ?? 0) > 1\n\n const beginPageIndex =\n (pagination?.hasChapters\n ? pagination?.beginPageIndexInSpineItem\n : pagination?.beginAbsolutePageIndex) ?? 0\n const endPageIndex =\n (pagination?.hasChapters\n ? pagination?.endPageIndexInSpineItem\n : pagination?.endAbsolutePageIndex) ?? 0\n\n const [leftPageIndex = 0, rightPageIndex = 0] = [\n beginPageIndex,\n endPageIndex,\n ].sort((a, b) => a - b)\n\n const beginAndEndAreDifferent =\n pagination?.beginPageIndexInSpineItem !==\n pagination?.endPageIndexInSpineItem ||\n pagination?.beginSpineItemIndex !== pagination?.endSpineItemIndex\n\n const totalApproximatePages = pagination?.hasChapters\n ? pagination?.beginNumberOfPagesInSpineItem\n : pagination?.numberOfTotalPages\n\n return {\n hasOnlyOnePage,\n beginPageIndex,\n endPageIndex,\n isBeginWithinChapter,\n isEndWithinChapter,\n beginAndEndAreDifferent,\n totalApproximatePages,\n leftPageIndex,\n rightPageIndex,\n }\n}\n","import { HStack, Stack, Text } from \"@chakra-ui/react\"\nimport {\n ProgressBar,\n ProgressRoot,\n ProgressValueText,\n} from \"../../components/ui/progress\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\n\nexport const PaginationInfoSection = () => {\n const pagination = usePagination()\n const {\n hasOnlyOnePage,\n leftPageIndex,\n rightPageIndex,\n totalApproximatePages,\n beginAndEndAreDifferent,\n } = useNavigationContext()\n const progress = Math.round((pagination?.percentageEstimateOfBook ?? 0) * 100)\n\n const buildTitleChain = (\n chapterInfo: NonNullable<typeof pagination>[\"beginChapterInfo\"],\n ): string => {\n if (chapterInfo?.subChapter) {\n return `${chapterInfo.title} / ${buildTitleChain(chapterInfo.subChapter)}`\n }\n return chapterInfo?.title || \"\"\n }\n\n const chapterTitle = buildTitleChain(pagination?.beginChapterInfo)\n\n return (\n <Stack alignItems=\"center\" gap={1} maxW=\"100%\" overflow=\"auto\">\n <ProgressRoot value={progress} size=\"xs\" width={150}>\n <HStack justifyContent=\"space-between\">\n <ProgressBar width={110} />\n <ProgressValueText>{`${progress}%`}</ProgressValueText>\n </HStack>\n </ProgressRoot>\n <Text truncate maxWidth=\"100%\" fontSize=\"sm\" mt={1}>\n {chapterTitle ? `Chapter: ${chapterTitle}` : `\\u00A0`}\n </Text>\n {!hasOnlyOnePage && (\n <HStack>\n <Text fontSize=\"xs\">\n {beginAndEndAreDifferent\n ? `${leftPageIndex + 1} - ${rightPageIndex + 1} of ${totalApproximatePages}`\n : `${leftPageIndex + 1} of ${totalApproximatePages}`}\n </Text>\n {!!pagination?.hasChapters && (\n <>\n <Text>-</Text>\n <Text fontSize=\"xs\">\n ({(pagination?.beginAbsolutePageIndex ?? 0) + 1})\n </Text>\n </>\n )}\n </HStack>\n )}\n </Stack>\n )\n}\n","import { Presence, type PresenceProps } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const QuickBar = memo(\n ({\n children,\n position,\n ...rest\n }: { position: \"top\" | \"bottom\" } & PresenceProps) => {\n return (\n <Presence\n display=\"flex\"\n flexDirection=\"row\"\n width=\"100%\"\n position=\"absolute\"\n {...(position === \"bottom\" ? { bottom: 0 } : { top: 0 })}\n animationName={\n position === \"bottom\"\n ? {\n _open: \"slide-from-bottom, fade-in\",\n _closed: \"slide-to-bottom, fade-out\",\n }\n : {\n _open: \"slide-from-top, fade-in\",\n _closed: \"slide-to-top, fade-out\",\n }\n }\n animationDuration=\"moderate\"\n bgColor=\"bg.panel\"\n alignItems=\"center\"\n justifyContent=\"center\"\n shadow=\"md\"\n px={4}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\n)\n","import RcSlider from \"rc-slider\"\nimport { type ComponentProps, memo } from \"react\"\nimport \"rc-slider/assets/index.css\"\nimport { Box, chakra } from \"@chakra-ui/react\"\n\nconst ChakraRcSlider = chakra(RcSlider)\n\nexport const ThemedSlider = memo((props: ComponentProps<typeof RcSlider>) => {\n return (\n <Box\n display=\"contents\"\n css={{\n \"--bg\": \"colors.bg\",\n \"--bg-emphasized\": \"colors.bg.emphasized\",\n \"--color-solid\": \"colors.colorPalette.solid\",\n }}\n >\n <ChakraRcSlider\n keyboard={false}\n style={{\n padding: 0,\n }}\n css={{\n \"& > .rc-slider-handle:focus-visible\": {\n boxShadow: \"0 0 0 2px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle:active\": {\n boxShadow: \"0 0 5px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle.rc-slider-handle-dragging\": {\n boxShadow: \"0 0 0 3px var(--color-solid) !important\",\n },\n }}\n styles={{\n rail: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--bg-emphasized)\",\n },\n track: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--color-solid)\",\n },\n handle: {\n width: \"24px\",\n height: \"24px\",\n top: \"50%\",\n borderColor: \"var(--color-solid)\",\n transform: `translate(${props.reverse ? \"50%\" : \"-50%\"}, -50%)`,\n backgroundColor: \"var(--bg)\",\n marginTop: \"0px\",\n },\n }}\n {...props}\n />\n </Box>\n )\n})\n","import { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { useObserve, useSignal, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\nimport { ThemedSlider } from \"./ThemedSlider\"\n\nconst useSliderValues = () => {\n const pagination = usePagination()\n const isUsingSpread = pagination?.isUsingSpread\n const { beginPageIndex: currentRealPage, totalApproximatePages = 0 } =\n useNavigationContext()\n const currentPage = isUsingSpread\n ? Math.floor((currentRealPage || 0) / 2)\n : currentRealPage\n const [value, valueSignal] = useSignal({\n default: currentPage || 0,\n })\n const min = 0\n const max = Math.max(\n 0,\n isUsingSpread\n ? Math.floor((totalApproximatePages - 1) / 2)\n : totalApproximatePages - 1,\n )\n\n useEffect(() => {\n valueSignal.setValue(currentPage || 0)\n }, [currentPage, valueSignal])\n\n return {\n value,\n valueSignal,\n min,\n max,\n }\n}\n\nexport const Scrubber = () => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, []) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.setValue(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.getState().beginSpineItemIndex ?? 0,\n animation: false,\n })\n }\n },\n [reader, isUsingSpread, valueSignal, isScrubberWithinChapter],\n )\n\n /**\n * @note\n * Scrubber can navigate fast and without lock we may end up with\n * slowness due to the reader\n * paginating and loading items in between.\n * This is good practice (but not required) to throttle it.\n */\n useSubscribe(\n () =>\n reader?.navigation.throttleLock({\n duration: 100,\n trigger: valueSignal.subject,\n }),\n [reader, valueSignal],\n )\n\n // const marks =\n // max > 1\n // ? Array.from({ length: max + 1 }, (_, i) => i).reduce(\n // (acc: number[], val) => [...acc, val],\n // [],\n // )\n // : []\n\n if (\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n ) {\n return null\n }\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\n />\n )\n // return (\n // <Slider\n // value={[value]}\n // max={max}\n // min={min}\n // marks={marks}\n // onChange={e => {\n // debugger\n // }}\n // onValueChange={onChange}\n // // reverse={reverse}\n // orientation=\"horizontal\"\n // step={step}\n // />\n // )\n}\n","import { Box, IconButton, Stack } from \"@chakra-ui/react\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = ({ open }: { open: boolean }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection = settings?.computedPageTurnDirection === \"vertical\"\n\n return (\n <QuickBar present={open} position=\"bottom\" height={130}>\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"visible\"\n px={4}\n >\n <PaginationInfoSection />\n <Box height={5} maxW={300} width=\"100%\" overflow=\"visible\">\n <Scrubber />\n </Box>\n </Stack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n disabled={\n !navigation?.canGoRightSpineItem && !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? <RxDoubleArrowDown /> : <RxDoubleArrowRight />}\n </IconButton>\n </QuickBar>\n )\n}\n","import { useEffect } from \"react\"\n\nimport { useCallback } from \"react\"\n\nimport { useState } from \"react\"\n\nexport const useFullscreen = () => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const onToggleFullscreenClick = useCallback(() => {\n if (document.fullscreenElement) {\n return document\n .exitFullscreen()\n .catch(console.error)\n .then(() => {\n setIsFullscreen(false)\n })\n }\n\n return document.documentElement\n .requestFullscreen({ navigationUI: \"hide\" })\n .catch(console.error)\n .then(() => {\n setIsFullscreen(true)\n })\n }, [])\n\n useEffect(() => {\n function fullscreenchangeHandler() {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n document.addEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n }\n }, [])\n\n return {\n isFullscreen,\n onToggleFullscreenClick,\n }\n}\n","import { HStack, IconButton, Stack, Text } from \"@chakra-ui/react\"\nimport { IoIosArrowBack, IoMdMore } from \"react-icons/io\"\nimport { MdFullscreen, MdFullscreenExit } from \"react-icons/md\"\nimport { useObserve } from \"reactjrx\"\nimport { useFullscreen } from \"../../common/useFullscreen\"\nimport { useReader } from \"../../context/useReader\"\nimport { QuickBar } from \"./QuickBar\"\n\nexport const TopBar = ({\n open,\n onBackClick,\n onMoreClick,\n}: {\n open: boolean\n onBackClick: () => void\n onMoreClick: () => void\n}) => {\n const reader = useReader()\n const manifest = useObserve(() => reader?.context.manifest$, [reader])\n const { isFullscreen, onToggleFullscreenClick } = useFullscreen()\n\n return (\n <QuickBar\n present={open}\n position=\"top\"\n height=\"80px\"\n justifyContent=\"space-between\"\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={onBackClick}\n >\n <IoIosArrowBack />\n </IconButton>\n <Stack\n flex={1}\n maxW={600}\n gap={1}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <Text truncate maxWidth=\"100%\">\n {manifest?.title}\n </Text>\n </Stack>\n <HStack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onMoreClick}\n >\n <IoMdMore />\n </IconButton>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onToggleFullscreenClick}\n >\n {isFullscreen ? <MdFullscreenExit /> : <MdFullscreen />}\n </IconButton>\n </HStack>\n </QuickBar>\n )\n}\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\n\nexport const QuickMenu = memo(\n ({\n open,\n onBackClick,\n onMoreClick,\n }: { open: boolean; onBackClick: () => void; onMoreClick: () => void }) => {\n return (\n <>\n <TopBar\n open={open}\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n />\n <BottomBar open={open} />\n </>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport type { ComponentProps } from \"react\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./navigation/QuickMenu/QuickMenu\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n open,\n ...rest\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n} & ComponentProps<typeof QuickMenu>) => {\n return (\n <>\n {enableFloatingProgress && (\n <Presence\n present={!open}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <FloatingProgress />\n </Presence>\n )}\n <QuickMenu open={open} {...rest} />\n <Presence\n present={enableFloatingTime || open}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n </>\n )\n}\n"],"names":["ReaderContext","createContext","ReactReaderProvider","memo","children","reader","useReader","useContext","usePagination","useObserve","combineLatest","map","state","context","isOnlyImages","_a","item","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","jsx","Box","jsxs","Text","useTime","time","setTime","useState","useEffect","interval","TimeIndicator","props","FloatingTime","ToggleTip","React","ref","showArrow","portalled","content","portalRef","rest","ChakraPopover","Portal","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","Stack","HStack","Fragment","QuickBar","position","Presence","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","value","valueSignal","useSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","useSubscribe","BottomBar","open","navigation","settings","isVerticalDirection","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","onBackClick","onMoreClick","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","ReactReader","enableFloatingTime","enableFloatingProgress"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/context/useReader.ts","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/navigation/QuickMenu/TimeIndicator.tsx","../src/navigation/QuickMenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/navigation/QuickMenu/PaginationInfoSection.tsx","../src/navigation/QuickMenu/QuickBar.tsx","../src/navigation/QuickMenu/ThemedSlider.tsx","../src/navigation/QuickMenu/Scrubber.tsx","../src/navigation/QuickMenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/navigation/QuickMenu/TopBar.tsx","../src/navigation/QuickMenu/QuickMenu.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/navigation/help/HelpDialog.tsx","../src/navigation/toc/TableOfContentsDialogContent.tsx","../src/navigation/toc/TableOfContentsDialog.tsx","../src/ReactReader.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\n\ntype ContextType = {\n reader: Reader | undefined\n quickMenuSignal: Signal<boolean, boolean, undefined>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport { useLiveRef, useSignal, useSubscribe } from \"reactjrx\"\nimport { tap } from \"rxjs\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n quickMenuOpen,\n onQuickMenuOpenChange,\n }: {\n children?: React.ReactNode\n reader: Reader | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const [, quickMenuSignal] = useSignal({\n default: quickMenuOpen,\n })\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n }),\n [quickMenuSignal, reader],\n )\n\n useEffect(() => {\n quickMenuSignal.setValue(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () =>\n quickMenuSignal.subject.pipe(tap(onQuickMenuOpenChangeLiveRef.current)),\n [quickMenuSignal, onQuickMenuOpenChangeLiveRef],\n )\n\n return (\n <ReaderContext.Provider value={value}>{children}</ReaderContext.Provider>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReader = (): Reader | undefined => {\n const { reader } = useContext(ReaderContext)\n\n return reader\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { NEVER, combineLatest, map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context.state$]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, Text } from \"@chakra-ui/react\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const FloatingProgress = () => {\n const pagination = usePagination()\n const roundedProgress = Math.floor(\n (pagination?.percentageEstimateOfBook ?? 0) * 100,\n )\n const displayableProgress = roundedProgress > 0 ? roundedProgress : 1\n\n if (pagination?.percentageEstimateOfBook === undefined) return null\n\n return (\n <Box position=\"absolute\" right={0} bottom={0} p={2} color={\"black\"}>\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n )\n}\n","import { Text, type TextProps } from \"@chakra-ui/react\"\nimport { useEffect, useState } from \"react\"\n\nexport const useTime = () => {\n const [time, setTime] = useState(new Date())\n\n useEffect(() => {\n const interval = setInterval(() => {\n setTime(new Date())\n }, 1000 * 60)\n\n return () => clearInterval(interval)\n }, [])\n\n return time\n}\n\nexport const TimeIndicator = (props: TextProps) => {\n const time = useTime()\n\n return (\n <Text fontSize=\"xs\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { useContext } from \"react\"\nimport { useSignalValue } from \"reactjrx\"\nimport { ReaderContext } from \"../../context/context\"\n\nexport const useQuickMenu = () => {\n const { quickMenuSignal } = useContext(ReaderContext)\n\n const quickMenu = useSignalValue(quickMenuSignal)\n\n return [quickMenu, quickMenuSignal.setValue, quickMenuSignal] as const\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { TimeIndicator } from \"./QuickMenu/TimeIndicator\"\nimport { useQuickMenu } from \"./QuickMenu/useQuickMenu\"\n\nexport const FloatingTime = () => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <Box\n position=\"absolute\"\n left={0}\n bottom={0}\n p={2}\n color={quickMenuOpen ? undefined : \"colorPalette.contrast\"}\n >\n <TimeIndicator />\n </Box>\n )\n}\n","import { Popover as ChakraPopover, IconButton, Portal } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { HiOutlineInformationCircle } from \"react-icons/hi\"\n\nexport interface ToggleTipProps extends ChakraPopover.RootProps {\n showArrow?: boolean\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n content?: React.ReactNode\n}\n\nexport const ToggleTip = React.forwardRef<HTMLDivElement, ToggleTipProps>(\n function ToggleTip(props, ref) {\n const {\n showArrow,\n children,\n portalled = true,\n content,\n portalRef,\n ...rest\n } = props\n\n return (\n <ChakraPopover.Root\n {...rest}\n positioning={{ ...rest.positioning, gutter: 4 }}\n >\n <ChakraPopover.Trigger asChild>{children}</ChakraPopover.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraPopover.Positioner>\n <ChakraPopover.Content\n width=\"auto\"\n px=\"2\"\n py=\"1\"\n textStyle=\"xs\"\n rounded=\"sm\"\n ref={ref}\n >\n {showArrow && (\n <ChakraPopover.Arrow>\n <ChakraPopover.ArrowTip />\n </ChakraPopover.Arrow>\n )}\n {content}\n </ChakraPopover.Content>\n </ChakraPopover.Positioner>\n </Portal>\n </ChakraPopover.Root>\n )\n },\n)\n\nexport const InfoTip = React.forwardRef<\n HTMLDivElement,\n Partial<ToggleTipProps>\n>(function InfoTip(props, ref) {\n const { children, ...rest } = props\n return (\n <ToggleTip content={children} {...rest} ref={ref}>\n <IconButton\n variant=\"ghost\"\n aria-label=\"info\"\n size=\"2xs\"\n colorPalette=\"gray\"\n >\n <HiOutlineInformationCircle />\n </IconButton>\n </ToggleTip>\n )\n})\n","import { Progress as ChakraProgress } from \"@chakra-ui/react\"\nimport { InfoTip } from \"./toggle-tip\"\nimport * as React from \"react\"\n\nexport const ProgressBar = React.forwardRef<\n HTMLDivElement,\n ChakraProgress.TrackProps\n>(function ProgressBar(props, ref) {\n return (\n <ChakraProgress.Track {...props} ref={ref}>\n <ChakraProgress.Range />\n </ChakraProgress.Track>\n )\n})\n\nexport interface ProgressLabelProps extends ChakraProgress.LabelProps {\n info?: React.ReactNode\n}\n\nexport const ProgressLabel = React.forwardRef<\n HTMLDivElement,\n ProgressLabelProps\n>(function ProgressLabel(props, ref) {\n const { children, info, ...rest } = props\n return (\n <ChakraProgress.Label {...rest} ref={ref}>\n {children}\n {info && <InfoTip>{info}</InfoTip>}\n </ChakraProgress.Label>\n )\n})\n\nexport const ProgressRoot = ChakraProgress.Root\nexport const ProgressValueText = ChakraProgress.ValueText\n","import { usePagination } from \"../pagination/usePagination\"\n\nexport const useNavigationContext = () => {\n const pagination = usePagination()\n const hasOnlyOnePage = pagination?.numberOfTotalPages === 1\n\n const isBeginWithinChapter =\n (pagination?.beginNumberOfPagesInSpineItem ?? 0) > 1\n\n const isEndWithinChapter = (pagination?.endNumberOfPagesInSpineItem ?? 0) > 1\n\n const beginPageIndex =\n (pagination?.hasChapters\n ? pagination?.beginPageIndexInSpineItem\n : pagination?.beginAbsolutePageIndex) ?? 0\n const endPageIndex =\n (pagination?.hasChapters\n ? pagination?.endPageIndexInSpineItem\n : pagination?.endAbsolutePageIndex) ?? 0\n\n const [leftPageIndex = 0, rightPageIndex = 0] = [\n beginPageIndex,\n endPageIndex,\n ].sort((a, b) => a - b)\n\n const beginAndEndAreDifferent =\n pagination?.beginPageIndexInSpineItem !==\n pagination?.endPageIndexInSpineItem ||\n pagination?.beginSpineItemIndex !== pagination?.endSpineItemIndex\n\n const totalApproximatePages = pagination?.hasChapters\n ? pagination?.beginNumberOfPagesInSpineItem\n : pagination?.numberOfTotalPages\n\n return {\n hasOnlyOnePage,\n beginPageIndex,\n endPageIndex,\n isBeginWithinChapter,\n isEndWithinChapter,\n beginAndEndAreDifferent,\n totalApproximatePages,\n leftPageIndex,\n rightPageIndex,\n }\n}\n","import { HStack, Stack, Text } from \"@chakra-ui/react\"\nimport {\n ProgressBar,\n ProgressRoot,\n ProgressValueText,\n} from \"../../components/ui/progress\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\n\nexport const PaginationInfoSection = () => {\n const pagination = usePagination()\n const {\n hasOnlyOnePage,\n leftPageIndex,\n rightPageIndex,\n totalApproximatePages,\n beginAndEndAreDifferent,\n } = useNavigationContext()\n const progress = Math.round((pagination?.percentageEstimateOfBook ?? 0) * 100)\n\n const buildTitleChain = (\n chapterInfo: NonNullable<typeof pagination>[\"beginChapterInfo\"],\n ): string => {\n if (chapterInfo?.subChapter) {\n return `${chapterInfo.title} / ${buildTitleChain(chapterInfo.subChapter)}`\n }\n return chapterInfo?.title || \"\"\n }\n\n const chapterTitle = buildTitleChain(pagination?.beginChapterInfo)\n\n return (\n <Stack alignItems=\"center\" gap={1} maxW=\"100%\" overflow=\"auto\">\n <ProgressRoot value={progress} size=\"xs\" width={150}>\n <HStack justifyContent=\"space-between\">\n <ProgressBar width={110} />\n <ProgressValueText>{`${progress}%`}</ProgressValueText>\n </HStack>\n </ProgressRoot>\n <Text truncate maxWidth=\"100%\" fontSize=\"sm\" mt={1}>\n {chapterTitle ? `Chapter: ${chapterTitle}` : `\\u00A0`}\n </Text>\n {!hasOnlyOnePage && (\n <HStack>\n <Text fontSize=\"xs\">\n {beginAndEndAreDifferent\n ? `${leftPageIndex + 1} - ${rightPageIndex + 1} of ${totalApproximatePages}`\n : `${leftPageIndex + 1} of ${totalApproximatePages}`}\n </Text>\n {!!pagination?.hasChapters && (\n <>\n <Text>-</Text>\n <Text fontSize=\"xs\">\n ({(pagination?.beginAbsolutePageIndex ?? 0) + 1})\n </Text>\n </>\n )}\n </HStack>\n )}\n </Stack>\n )\n}\n","import { Presence, type PresenceProps } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const QuickBar = memo(\n ({\n children,\n position,\n ...rest\n }: { position: \"top\" | \"bottom\" } & PresenceProps) => {\n return (\n <Presence\n display=\"flex\"\n flexDirection=\"row\"\n width=\"100%\"\n position=\"absolute\"\n {...(position === \"bottom\" ? { bottom: 0 } : { top: 0 })}\n animationName={\n position === \"bottom\"\n ? {\n _open: \"slide-from-bottom, fade-in\",\n _closed: \"slide-to-bottom, fade-out\",\n }\n : {\n _open: \"slide-from-top, fade-in\",\n _closed: \"slide-to-top, fade-out\",\n }\n }\n animationDuration=\"moderate\"\n bgColor=\"bg.panel\"\n alignItems=\"center\"\n justifyContent=\"center\"\n shadow=\"md\"\n p={4}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\n)\n","import RcSlider from \"rc-slider\"\nimport { type ComponentProps, memo } from \"react\"\nimport \"rc-slider/assets/index.css\"\nimport { Box, chakra } from \"@chakra-ui/react\"\n\nconst ChakraRcSlider = chakra(RcSlider)\n\nexport const ThemedSlider = memo((props: ComponentProps<typeof RcSlider>) => {\n return (\n <Box\n display=\"contents\"\n css={{\n \"--bg\": \"colors.bg\",\n \"--bg-emphasized\": \"colors.bg.emphasized\",\n \"--color-solid\": \"colors.colorPalette.solid\",\n }}\n >\n <ChakraRcSlider\n keyboard={false}\n style={{\n padding: 0,\n }}\n css={{\n \"& > .rc-slider-handle:focus-visible\": {\n boxShadow: \"0 0 0 2px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle:active\": {\n boxShadow: \"0 0 5px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle.rc-slider-handle-dragging\": {\n boxShadow: \"0 0 0 3px var(--color-solid) !important\",\n },\n }}\n styles={{\n rail: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--bg-emphasized)\",\n },\n track: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--color-solid)\",\n },\n handle: {\n width: \"24px\",\n height: \"24px\",\n top: \"50%\",\n borderColor: \"var(--color-solid)\",\n transform: `translate(${props.reverse ? \"50%\" : \"-50%\"}, -50%)`,\n backgroundColor: \"var(--bg)\",\n marginTop: \"0px\",\n },\n }}\n {...props}\n />\n </Box>\n )\n})\n","import { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { useObserve, useSignal, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\nimport { ThemedSlider } from \"./ThemedSlider\"\n\nconst useSliderValues = () => {\n const pagination = usePagination()\n const isUsingSpread = pagination?.isUsingSpread\n const { beginPageIndex: currentRealPage, totalApproximatePages = 0 } =\n useNavigationContext()\n const currentPage = isUsingSpread\n ? Math.floor((currentRealPage || 0) / 2)\n : currentRealPage\n const [value, valueSignal] = useSignal({\n default: currentPage || 0,\n })\n const min = 0\n const max = Math.max(\n 0,\n isUsingSpread\n ? Math.floor((totalApproximatePages - 1) / 2)\n : totalApproximatePages - 1,\n )\n\n useEffect(() => {\n valueSignal.setValue(currentPage || 0)\n }, [currentPage, valueSignal])\n\n return {\n value,\n valueSignal,\n min,\n max,\n }\n}\n\nexport const Scrubber = () => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, []) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.setValue(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.getState().beginSpineItemIndex ?? 0,\n animation: false,\n })\n }\n },\n [reader, isUsingSpread, valueSignal, isScrubberWithinChapter],\n )\n\n /**\n * @note\n * Scrubber can navigate fast and without lock we may end up with\n * slowness due to the reader\n * paginating and loading items in between.\n * This is good practice (but not required) to throttle it.\n */\n useSubscribe(\n () =>\n reader?.navigation.throttleLock({\n duration: 100,\n trigger: valueSignal.subject,\n }),\n [reader, valueSignal],\n )\n\n // const marks =\n // max > 1\n // ? Array.from({ length: max + 1 }, (_, i) => i).reduce(\n // (acc: number[], val) => [...acc, val],\n // [],\n // )\n // : []\n\n if (\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n ) {\n return null\n }\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\n />\n )\n // return (\n // <Slider\n // value={[value]}\n // max={max}\n // min={min}\n // marks={marks}\n // onChange={e => {\n // debugger\n // }}\n // onValueChange={onChange}\n // // reverse={reverse}\n // orientation=\"horizontal\"\n // step={step}\n // />\n // )\n}\n","import { Box, Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { LuChevronDown } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp } from \"react-icons/lu\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onTableOfContentsClick,\n onHelpClick,\n }: {\n open: boolean\n onTableOfContentsClick: () => void\n onHelpClick: () => void\n }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection =\n settings?.computedPageTurnDirection === \"vertical\"\n const [isExtraOpen, setIsExtraOpen] = useState(true)\n\n return (\n <QuickBar\n present={open}\n position=\"bottom\"\n // height={130}\n >\n <Stack\n // border=\"1px solid red\"\n flex={1}\n >\n <HStack flex={1} alignItems=\"center\" justifyContent=\"center\">\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem &&\n !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? (\n <RxDoubleArrowUp />\n ) : (\n <RxDoubleArrowLeft />\n )}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"visible\"\n px={4}\n >\n <PaginationInfoSection />\n <Box height={5} maxW={300} width=\"100%\" overflow=\"visible\">\n <Scrubber />\n </Box>\n </Stack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n disabled={\n !navigation?.canGoRightSpineItem &&\n !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? (\n <RxDoubleArrowDown />\n ) : (\n <RxDoubleArrowRight />\n )}\n </IconButton>\n </HStack>\n <HStack\n alignItems=\"center\"\n justifyContent=\"center\"\n // border=\"1px solid blue\"\n >\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\n // border=\"1px solid green\"\n width=\"100%\"\n display=\"flex\"\n justifyContent=\"center\"\n >\n <LuChevronDown\n style={{\n transform: isExtraOpen ? \"rotate(0deg)\" : \"rotate(180deg)\",\n }}\n />\n </Collapsible.Trigger>\n <Collapsible.Content\n display=\"flex\"\n justifyContent=\"center\"\n gap={2}\n >\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onHelpClick}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onTableOfContentsClick}\n >\n <LuTableOfContents />\n </IconButton>\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\n </Stack>\n </QuickBar>\n )\n },\n)\n","import { useEffect } from \"react\"\n\nimport { useCallback } from \"react\"\n\nimport { useState } from \"react\"\n\nexport const useFullscreen = () => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const onToggleFullscreenClick = useCallback(() => {\n if (document.fullscreenElement) {\n return document\n .exitFullscreen()\n .catch(console.error)\n .then(() => {\n setIsFullscreen(false)\n })\n }\n\n return document.documentElement\n .requestFullscreen({ navigationUI: \"hide\" })\n .catch(console.error)\n .then(() => {\n setIsFullscreen(true)\n })\n }, [])\n\n useEffect(() => {\n function fullscreenchangeHandler() {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n document.addEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n }\n }, [])\n\n return {\n isFullscreen,\n onToggleFullscreenClick,\n }\n}\n","import { HStack, IconButton, Stack, Text } from \"@chakra-ui/react\"\nimport { IoIosArrowBack, IoMdMore } from \"react-icons/io\"\nimport { MdFullscreen, MdFullscreenExit } from \"react-icons/md\"\nimport { useObserve } from \"reactjrx\"\nimport { useFullscreen } from \"../../common/useFullscreen\"\nimport { useReader } from \"../../context/useReader\"\nimport { QuickBar } from \"./QuickBar\"\n\nexport const TopBar = ({\n open,\n onBackClick,\n onMoreClick,\n}: {\n open: boolean\n onBackClick: () => void\n onMoreClick: () => void\n}) => {\n const reader = useReader()\n const manifest = useObserve(() => reader?.context.manifest$, [reader])\n const { isFullscreen, onToggleFullscreenClick } = useFullscreen()\n\n return (\n <QuickBar\n present={open}\n position=\"top\"\n height=\"80px\"\n justifyContent=\"space-between\"\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={onBackClick}\n >\n <IoIosArrowBack />\n </IconButton>\n <Stack\n flex={1}\n maxW={600}\n gap={1}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <Text truncate maxWidth=\"100%\">\n {manifest?.title}\n </Text>\n </Stack>\n <HStack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onMoreClick}\n >\n <IoMdMore />\n </IconButton>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onToggleFullscreenClick}\n >\n {isFullscreen ? <MdFullscreenExit /> : <MdFullscreen />}\n </IconButton>\n </HStack>\n </QuickBar>\n )\n}\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onBackClick,\n onMoreClick,\n onTableOfContentsClick,\n onHelpClick,\n }: {\n onBackClick: () => void\n onMoreClick: () => void\n onTableOfContentsClick: () => void\n onHelpClick: () => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar\n open={quickMenuOpen}\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n />\n <BottomBar\n open={quickMenuOpen}\n onTableOfContentsClick={onTableOfContentsClick}\n onHelpClick={onHelpClick}\n />\n </>\n )\n },\n)\n","import type { ButtonProps } from \"@chakra-ui/react\"\nimport { IconButton as ChakraIconButton } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { LuX } from \"react-icons/lu\"\n\nexport type CloseButtonProps = ButtonProps\n\nexport const CloseButton = React.forwardRef<\n HTMLButtonElement,\n CloseButtonProps\n>(function CloseButton(props, ref) {\n return (\n <ChakraIconButton variant=\"ghost\" aria-label=\"Close\" ref={ref} {...props}>\n {props.children ?? <LuX />}\n </ChakraIconButton>\n )\n})\n","import { Dialog as ChakraDialog, Portal } from \"@chakra-ui/react\"\nimport { CloseButton } from \"./close-button\"\nimport * as React from \"react\"\n\ninterface DialogContentProps extends ChakraDialog.ContentProps {\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n backdrop?: boolean\n}\n\nexport const DialogContent = React.forwardRef<\n HTMLDivElement,\n DialogContentProps\n>(function DialogContent(props, ref) {\n const {\n children,\n portalled = true,\n portalRef,\n backdrop = true,\n ...rest\n } = props\n\n return (\n <Portal disabled={!portalled} container={portalRef}>\n {backdrop && <ChakraDialog.Backdrop />}\n <ChakraDialog.Positioner>\n <ChakraDialog.Content ref={ref} {...rest} asChild={false}>\n {children}\n </ChakraDialog.Content>\n </ChakraDialog.Positioner>\n </Portal>\n )\n})\n\nexport const DialogCloseTrigger = React.forwardRef<\n HTMLButtonElement,\n ChakraDialog.CloseTriggerProps\n>(function DialogCloseTrigger(props, ref) {\n return (\n <ChakraDialog.CloseTrigger\n position=\"absolute\"\n top=\"2\"\n insetEnd=\"2\"\n {...props}\n asChild\n >\n <CloseButton size=\"sm\" ref={ref}>\n {props.children}\n </CloseButton>\n </ChakraDialog.CloseTrigger>\n )\n})\n\nexport const DialogRoot = ChakraDialog.Root\nexport const DialogFooter = ChakraDialog.Footer\nexport const DialogHeader = ChakraDialog.Header\nexport const DialogBody = ChakraDialog.Body\nexport const DialogBackdrop = ChakraDialog.Backdrop\nexport const DialogTitle = ChakraDialog.Title\nexport const DialogDescription = ChakraDialog.Description\nexport const DialogTrigger = ChakraDialog.Trigger\nexport const DialogActionTrigger = ChakraDialog.ActionTrigger\n","import { Button, HStack, Heading, Kbd, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuArrowBigLeft, LuArrowBigRight } from \"react-icons/lu\"\nimport { name, version } from \"../../../package.json\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../../components/ui/dialog\"\n\nexport const HelpDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Help</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Shortcuts\n </Heading>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigRight />\n </Kbd>{\" \"}\n <Text>Navigate to right page</Text>\n </HStack>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigLeft />\n </Kbd>{\" \"}\n <Text>Navigate to left page</Text>\n </HStack>\n <Heading mb={2} mt={4} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Link, Stack, Text } from \"@chakra-ui/react\"\n\nimport { List } from \"@chakra-ui/react\"\nimport React, { memo } from \"react\"\nimport { LuCircleCheck } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\n\nexport const TableOfContentsDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context.state$, [reader]) ?? {}\n const { nav } = manifest ?? {}\n const pagination = usePagination()\n const toc = nav?.toc || []\n const { beginSpineItemIndex, beginPageIndexInSpineItem } = pagination ?? {}\n const currentSpineItemOrChapterPageIndex =\n (assumedRenditionLayout === \"reflowable\"\n ? beginPageIndexInSpineItem\n : beginSpineItemIndex) || 0\n\n console.log({ assumedRenditionLayout, currentSpineItemOrChapterPageIndex })\n\n let currentSubChapter = pagination?.beginChapterInfo\n\n while (currentSubChapter?.subChapter) {\n currentSubChapter = currentSubChapter?.subChapter\n }\n\n const buildTocForItem = (\n tocItem: (typeof toc)[number],\n index: number,\n lvl: number,\n ) => (\n <React.Fragment key={index}>\n <List.Item\n pl={4 * (lvl + 1)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Link\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToUrl(tocItem.href)\n }}\n href=\"#\"\n >\n {currentSubChapter?.path === tocItem.path && (\n <List.Indicator asChild>\n <LuCircleCheck />\n </List.Indicator>\n )}\n {currentSubChapter?.path !== tocItem.path && (\n <List.Indicator asChild visibility=\"hidden\">\n <LuCircleCheck />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text fontSize=\"md\">{tocItem.title || tocItem.path}</Text>\n {currentSubChapter?.path === tocItem.path && (\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Currently on page ${\n currentSpineItemOrChapterPageIndex + 1\n }`}</Text>\n )}\n </Stack>\n </Link>\n </List.Item>\n {tocItem.contents.length > 0 && (\n <List.Root as=\"div\" gap={2}>\n {tocItem.contents.map((tocItem, index) =>\n buildTocForItem(tocItem, index, lvl + 1),\n )}\n </List.Root>\n )}\n </React.Fragment>\n )\n\n return (\n <List.Root gap={3} overflowY=\"auto\" py={4} flex={1}>\n {nav?.toc.map((tocItem, index) => buildTocForItem(tocItem, index, 0))}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../../components/ui/dialog\"\nimport { TableOfContentsDialogContent } from \"./TableOfContentsDialogContent\"\n\nexport const TableOfContentsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Table of Contents</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <TableOfContentsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport { type ComponentProps, useState } from \"react\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./navigation/QuickMenu/QuickMenu\"\nimport { useQuickMenu } from \"./navigation/QuickMenu/useQuickMenu\"\nimport { HelpDialog } from \"./navigation/help/HelpDialog\"\nimport { TableOfContentsDialog } from \"./navigation/toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n ...rest\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n} & Omit<\n ComponentProps<typeof QuickMenu>,\n \"onTableOfContentsClick\" | \"open\"\n>) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n return (\n <>\n {enableFloatingProgress && (\n <Presence\n present={!quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <FloatingProgress />\n </Presence>\n )}\n <QuickMenu\n {...rest}\n onTableOfContentsClick={() => setIsTableOfContentsOpen(true)}\n onHelpClick={() => setIsHelpOpen(true)}\n />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={() => {\n setIsTableOfContentsOpen(false)\n setQuickMenuOpen(false)\n }}\n />\n <Presence\n present={enableFloatingTime || quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n </>\n )\n}\n"],"names":["ReaderContext","createContext","signal","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useSignal","onQuickMenuOpenChangeLiveRef","useLiveRef","value","useMemo","useEffect","useSubscribe","tap","jsx","useReader","useContext","usePagination","useObserve","combineLatest","map","state","context","isOnlyImages","_a","item","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","Box","jsxs","Text","useTime","time","setTime","useState","interval","TimeIndicator","props","useQuickMenu","useSignalValue","FloatingTime","ToggleTip","React","ref","showArrow","portalled","content","portalRef","rest","ChakraPopover","Portal","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","Stack","HStack","Fragment","QuickBar","position","Presence","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","open","onTableOfContentsClick","onHelpClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","onBackClick","onMoreClick","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","CloseButton","ChakraIconButton","LuX","DialogContent","backdrop","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","HelpDialog","setOpen","e","Heading","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","Button","TableOfContentsDialogContent","onNavigate","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","index","lvl","List","Link","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","setQuickMenuOpen"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(i,r){typeof exports=="object"&&typeof module<"u"?r(exports,require("react/jsx-runtime"),require("react"),require("@chakra-ui/react"),require("reactjrx"),require("rxjs"),require("react-icons/rx"),require("react-icons/hi"),require("rc-slider"),require("rc-slider/assets/index.css"),require("react-icons/io"),require("react-icons/md")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","@chakra-ui/react","reactjrx","rxjs","react-icons/rx","react-icons/hi","rc-slider","rc-slider/assets/index.css","react-icons/io","react-icons/md"],r):(i=typeof globalThis<"u"?globalThis:i||self,r(i["prose-react-reader"]={},i.jsxRuntime,i.React,i.react,i.reactjrx,i.rxjs,i.rx,i.hi,i.RcSlider,null,i.io,i.md))})(this,function(i,r,a,s,f,I,p,A,D,re,k,w){"use strict";function E(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:()=>e[o]})}}return t.default=e,Object.freeze(t)}const m=E(a),O=a.createContext(void 0),z=a.memo(({children:e,reader:t})=>r.jsx(O.Provider,{value:t,children:e})),P=()=>a.useContext(O),b=()=>{const e=P();return f.useObserve(()=>e?I.combineLatest([e.pagination.state$,e.context.state$]).pipe(I.map(([t,o])=>{var l;const n=(l=o.manifest)==null?void 0:l.spineItems.every(c=>{var d;return(d=c.mediaType)==null?void 0:d.startsWith("image/")});return{...t,hasChapters:!o.isFullyPrePaginated&&!n}})):I.NEVER,[e])},F=()=>{const e=b(),t=Math.floor(((e==null?void 0:e.percentageEstimateOfBook)??0)*100),o=t>0?t:1;return(e==null?void 0:e.percentageEstimateOfBook)===void 0?null:r.jsx(s.Box,{position:"absolute",right:0,bottom:0,p:2,children:r.jsxs(s.Text,{fontSize:"sm",children:[o," %"]})})},$=()=>{const[e,t]=a.useState(new Date);return a.useEffect(()=>{const o=setInterval(()=>{t(new Date)},6e4);return()=>clearInterval(o)},[]),e},M=e=>{const t=$();return r.jsx(s.Text,{fontSize:"xs",...e,children:t.toLocaleTimeString(navigator.language,{hour:"2-digit",minute:"2-digit"})})},q=()=>r.jsx(s.Box,{position:"absolute",left:0,bottom:0,p:2,children:r.jsx(M,{})}),_=m.forwardRef(function(t,o){const{showArrow:n,children:l,portalled:c=!0,content:d,portalRef:g,...h}=t;return r.jsxs(s.Popover.Root,{...h,positioning:{...h.positioning,gutter:4},children:[r.jsx(s.Popover.Trigger,{asChild:!0,children:l}),r.jsx(s.Portal,{disabled:!c,container:g,children:r.jsx(s.Popover.Positioner,{children:r.jsxs(s.Popover.Content,{width:"auto",px:"2",py:"1",textStyle:"xs",rounded:"sm",ref:o,children:[n&&r.jsx(s.Popover.Arrow,{children:r.jsx(s.Popover.ArrowTip,{})}),d]})})})]})}),W=m.forwardRef(function(t,o){const{children:n,...l}=t;return r.jsx(_,{content:n,...l,ref:o,children:r.jsx(s.IconButton,{variant:"ghost","aria-label":"info",size:"2xs",colorPalette:"gray",children:r.jsx(A.HiOutlineInformationCircle,{})})})}),L=m.forwardRef(function(t,o){return r.jsx(s.Progress.Track,{...t,ref:o,children:r.jsx(s.Progress.Range,{})})});m.forwardRef(function(t,o){const{children:n,info:l,...c}=t;return r.jsxs(s.Progress.Label,{...c,ref:o,children:[n,l&&r.jsx(W,{children:l})]})});const j=s.Progress.Root,N=s.Progress.ValueText,S=()=>{const e=b(),t=(e==null?void 0:e.numberOfTotalPages)===1,o=((e==null?void 0:e.beginNumberOfPagesInSpineItem)??0)>1,n=((e==null?void 0:e.endNumberOfPagesInSpineItem)??0)>1,l=(e!=null&&e.hasChapters?e==null?void 0:e.beginPageIndexInSpineItem:e==null?void 0:e.beginAbsolutePageIndex)??0,c=(e!=null&&e.hasChapters?e==null?void 0:e.endPageIndexInSpineItem:e==null?void 0:e.endAbsolutePageIndex)??0,[d=0,g=0]=[l,c].sort((x,v)=>x-v),h=(e==null?void 0:e.beginPageIndexInSpineItem)!==(e==null?void 0:e.endPageIndexInSpineItem)||(e==null?void 0:e.beginSpineItemIndex)!==(e==null?void 0:e.endSpineItemIndex),u=e!=null&&e.hasChapters?e==null?void 0:e.beginNumberOfPagesInSpineItem:e==null?void 0:e.numberOfTotalPages;return{hasOnlyOnePage:t,beginPageIndex:l,endPageIndex:c,isBeginWithinChapter:o,isEndWithinChapter:n,beginAndEndAreDifferent:h,totalApproximatePages:u,leftPageIndex:d,rightPageIndex:g}},V=()=>{const e=b(),{hasOnlyOnePage:t,leftPageIndex:o,rightPageIndex:n,totalApproximatePages:l,beginAndEndAreDifferent:c}=S(),d=Math.round(((e==null?void 0:e.percentageEstimateOfBook)??0)*100),g=u=>u!=null&&u.subChapter?`${u.title} / ${g(u.subChapter)}`:(u==null?void 0:u.title)||"",h=g(e==null?void 0:e.beginChapterInfo);return r.jsxs(s.Stack,{alignItems:"center",gap:1,maxW:"100%",overflow:"auto",children:[r.jsx(j,{value:d,size:"xs",width:150,children:r.jsxs(s.HStack,{justifyContent:"space-between",children:[r.jsx(L,{width:110}),r.jsx(N,{children:`${d}%`})]})}),r.jsx(s.Text,{truncate:!0,maxWidth:"100%",fontSize:"sm",mt:1,children:h?`Chapter: ${h}`:" "}),!t&&r.jsxs(s.HStack,{children:[r.jsx(s.Text,{fontSize:"xs",children:c?`${o+1} - ${n+1} of ${l}`:`${o+1} of ${l}`}),!!(e!=null&&e.hasChapters)&&r.jsxs(r.Fragment,{children:[r.jsx(s.Text,{children:"-"}),r.jsxs(s.Text,{fontSize:"xs",children:["(",((e==null?void 0:e.beginAbsolutePageIndex)??0)+1,")"]})]})]})]})},y=a.memo(({children:e,position:t,...o})=>r.jsx(s.Presence,{display:"flex",flexDirection:"row",width:"100%",position:"absolute",...t==="bottom"?{bottom:0}:{top:0},animationName:t==="bottom"?{_open:"slide-from-bottom, fade-in",_closed:"slide-to-bottom, fade-out"}:{_open:"slide-from-top, fade-in",_closed:"slide-to-top, fade-out"},animationDuration:"moderate",bgColor:"bg.panel",alignItems:"center",justifyContent:"center",shadow:"md",px:4,...o,children:e})),U=s.chakra(D),H=a.memo(e=>r.jsx(s.Box,{display:"contents",css:{"--bg":"colors.bg","--bg-emphasized":"colors.bg.emphasized","--color-solid":"colors.colorPalette.solid"},children:r.jsx(U,{keyboard:!1,style:{padding:0},css:{"& > .rc-slider-handle:focus-visible":{boxShadow:"0 0 0 2px var(--color-solid) !important"},"& > .rc-slider-handle:active":{boxShadow:"0 0 5px var(--color-solid) !important"},"& > .rc-slider-handle.rc-slider-handle-dragging":{boxShadow:"0 0 0 3px var(--color-solid) !important"}},styles:{rail:{height:"8px",top:"50%",transform:"translateY(-50%)",backgroundColor:"var(--bg-emphasized)"},track:{height:"8px",top:"50%",transform:"translateY(-50%)",backgroundColor:"var(--color-solid)"},handle:{width:"24px",height:"24px",top:"50%",borderColor:"var(--color-solid)",transform:`translate(${e.reverse?"50%":"-50%"}, -50%)`,backgroundColor:"var(--bg)",marginTop:"0px"}},...e})})),G=()=>{const e=b(),t=e==null?void 0:e.isUsingSpread,{beginPageIndex:o,totalApproximatePages:n=0}=S(),l=t?Math.floor((o||0)/2):o,[c,d]=f.useSignal({default:l||0}),g=0,h=Math.max(0,t?Math.floor((n-1)/2):n-1);return a.useEffect(()=>{d.setValue(l||0)},[l,d]),{value:c,valueSignal:d,min:g,max:h}},Q=()=>{const e=P(),t=b(),{manifest:o}=f.useObserve(()=>e==null?void 0:e.context.state$,[])??{},n=(o==null?void 0:o.readingDirection)==="rtl",l=t==null?void 0:t.isUsingSpread,{totalApproximatePages:c=0,isBeginWithinChapter:d}=S(),g=1,h=d,{value:u,valueSignal:x,min:v,max:R}=G(),ee=a.useCallback(T=>{const[C=0]=Array.isArray(T)?T:[T];x.setValue(C);const B=l?Math.floor(C)*2:Math.floor(C);h?e==null||e.navigation.goToPageOfSpineItem({pageIndex:B,spineItemId:e.pagination.getState().beginSpineItemIndex??0,animation:!1}):e==null||e.navigation.goToAbsolutePageIndex({absolutePageIndex:B,animation:!1})},[e,l,x,h]);return f.useSubscribe(()=>e==null?void 0:e.navigation.throttleLock({duration:100,trigger:x.subject}),[e,x]),c===1||l&&c===2?null:r.jsx(H,{value:[u],max:R,min:v,reverse:n,step:g,onChange:ee})},Y=({open:e})=>{const t=P(),o=f.useObserve(()=>t==null?void 0:t.navigation.state$,[t]),n=f.useObserve(()=>t==null?void 0:t.settings.values$,[t]),l=(n==null?void 0:n.computedPageTurnDirection)==="vertical";return r.jsxs(y,{present:e,position:"bottom",height:130,children:[r.jsx(s.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:()=>t==null?void 0:t.navigation.goToLeftOrTopSpineItem(),disabled:!(o!=null&&o.canGoLeftSpineItem)&&!(o!=null&&o.canGoTopSpineItem),children:l?r.jsx(p.RxDoubleArrowUp,{}):r.jsx(p.RxDoubleArrowLeft,{})}),r.jsxs(s.Stack,{flex:1,maxW:400,gap:2,alignItems:"center",overflow:"visible",px:4,children:[r.jsx(V,{}),r.jsx(s.Box,{height:5,maxW:300,width:"100%",overflow:"visible",children:r.jsx(Q,{})})]}),r.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",disabled:!(o!=null&&o.canGoRightSpineItem)&&!(o!=null&&o.canGoBottomSpineItem),onClick:()=>{t==null||t.navigation.goToRightOrBottomSpineItem()},children:l?r.jsx(p.RxDoubleArrowDown,{}):r.jsx(p.RxDoubleArrowRight,{})})]})},J=()=>{const[e,t]=a.useState(!1),o=a.useCallback(()=>document.fullscreenElement?document.exitFullscreen().catch(console.error).then(()=>{t(!1)}):document.documentElement.requestFullscreen({navigationUI:"hide"}).catch(console.error).then(()=>{t(!0)}),[]);return a.useEffect(()=>{function n(){t(!!document.fullscreenElement)}return document.addEventListener("fullscreenchange",n),()=>{document.removeEventListener("fullscreenchange",n)}},[]),{isFullscreen:e,onToggleFullscreenClick:o}},K=({open:e,onBackClick:t,onMoreClick:o})=>{const n=P(),l=f.useObserve(()=>n==null?void 0:n.context.manifest$,[n]),{isFullscreen:c,onToggleFullscreenClick:d}=J();return r.jsxs(y,{present:e,position:"top",height:"80px",justifyContent:"space-between",children:[r.jsx(s.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:t,children:r.jsx(k.IoIosArrowBack,{})}),r.jsx(s.Stack,{flex:1,maxW:600,gap:1,alignItems:"center",overflow:"auto",px:4,children:r.jsx(s.Text,{truncate:!0,maxWidth:"100%",children:l==null?void 0:l.title})}),r.jsxs(s.HStack,{children:[r.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:o,children:r.jsx(k.IoMdMore,{})}),r.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:d,children:c?r.jsx(w.MdFullscreenExit,{}):r.jsx(w.MdFullscreen,{})})]})]})},X=a.memo(({open:e,onBackClick:t,onMoreClick:o})=>r.jsxs(r.Fragment,{children:[r.jsx(K,{open:e,onBackClick:t,onMoreClick:o}),r.jsx(Y,{open:e})]})),Z=({enableFloatingTime:e=!0,enableFloatingProgress:t=!0,open:o,...n})=>r.jsxs(r.Fragment,{children:[t&&r.jsx(s.Presence,{present:!o,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"moderate",children:r.jsx(F,{})}),r.jsx(X,{open:o,...n}),r.jsx(s.Presence,{present:e||o,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"slow",overflow:"hidden",children:r.jsx(q,{})})]});i.ReactReader=Z,i.ReactReaderProvider=z,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});
1
+ (function(f,o){typeof exports=="object"&&typeof module<"u"?o(exports,require("react/jsx-runtime"),require("react"),require("reactjrx"),require("rxjs"),require("@chakra-ui/react"),require("react-icons/lu"),require("react-icons/rx"),require("react-icons/hi"),require("rc-slider"),require("rc-slider/assets/index.css"),require("react-icons/io"),require("react-icons/md")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","reactjrx","rxjs","@chakra-ui/react","react-icons/lu","react-icons/rx","react-icons/hi","rc-slider","rc-slider/assets/index.css","react-icons/io","react-icons/md"],o):(f=typeof globalThis<"u"?globalThis:f||self,o(f["prose-react-reader"]={},f.jsxRuntime,f.React,f.reactjrx,f.rxjs,f.react,f.lu,f.rx,f.hi,f.RcSlider,null,f.io,f.md))})(this,function(f,o,a,p,k,n,x,w,_,V,xe,m,L){"use strict";function j(e){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const l=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(s,r,l.get?l:{enumerable:!0,get:()=>e[r]})}}return s.default=e,Object.freeze(s)}const C=j(a),D=a.createContext({reader:void 0,quickMenuSignal:p.signal({default:!1})}),U=a.memo(({children:e,reader:s,quickMenuOpen:r,onQuickMenuOpenChange:l})=>{const[,t]=p.useSignal({default:r}),i=p.useLiveRef(l),d=a.useMemo(()=>({quickMenuSignal:t,reader:s}),[t,s]);return a.useEffect(()=>{t.setValue(r)},[r,t]),p.useSubscribe(()=>t.subject.pipe(k.tap(i.current)),[t,i]),o.jsx(D.Provider,{value:d,children:e})}),I=()=>{const{reader:e}=a.useContext(D);return e},v=()=>{const e=I();return p.useObserve(()=>e?k.combineLatest([e.pagination.state$,e.context.state$]).pipe(k.map(([s,r])=>{var t;const l=(t=r.manifest)==null?void 0:t.spineItems.every(i=>{var d;return(d=i.mediaType)==null?void 0:d.startsWith("image/")});return{...s,hasChapters:!r.isFullyPrePaginated&&!l}})):k.NEVER,[e])},Y=()=>{const e=v(),s=Math.floor(((e==null?void 0:e.percentageEstimateOfBook)??0)*100),r=s>0?s:1;return(e==null?void 0:e.percentageEstimateOfBook)===void 0?null:o.jsx(n.Box,{position:"absolute",right:0,bottom:0,p:2,color:"black",children:o.jsxs(n.Text,{fontSize:"sm",children:[r," %"]})})},Q=()=>{const[e,s]=a.useState(new Date);return a.useEffect(()=>{const r=setInterval(()=>{s(new Date)},6e4);return()=>clearInterval(r)},[]),e},G=e=>{const s=Q();return o.jsx(n.Text,{fontSize:"xs",...e,children:s.toLocaleTimeString(navigator.language,{hour:"2-digit",minute:"2-digit"})})},y=()=>{const{quickMenuSignal:e}=a.useContext(D);return[p.useSignalValue(e),e.setValue,e]},K=()=>{const[e]=y();return o.jsx(n.Box,{position:"absolute",left:0,bottom:0,p:2,color:e?void 0:"colorPalette.contrast",children:o.jsx(G,{})})},X=C.forwardRef(function(s,r){const{showArrow:l,children:t,portalled:i=!0,content:d,portalRef:h,...g}=s;return o.jsxs(n.Popover.Root,{...g,positioning:{...g.positioning,gutter:4},children:[o.jsx(n.Popover.Trigger,{asChild:!0,children:t}),o.jsx(n.Portal,{disabled:!i,container:h,children:o.jsx(n.Popover.Positioner,{children:o.jsxs(n.Popover.Content,{width:"auto",px:"2",py:"1",textStyle:"xs",rounded:"sm",ref:r,children:[l&&o.jsx(n.Popover.Arrow,{children:o.jsx(n.Popover.ArrowTip,{})}),d]})})})]})}),J=C.forwardRef(function(s,r){const{children:l,...t}=s;return o.jsx(X,{content:l,...t,ref:r,children:o.jsx(n.IconButton,{variant:"ghost","aria-label":"info",size:"2xs",colorPalette:"gray",children:o.jsx(_.HiOutlineInformationCircle,{})})})}),Z=C.forwardRef(function(s,r){return o.jsx(n.Progress.Track,{...s,ref:r,children:o.jsx(n.Progress.Range,{})})});C.forwardRef(function(s,r){const{children:l,info:t,...i}=s;return o.jsxs(n.Progress.Label,{...i,ref:r,children:[l,t&&o.jsx(J,{children:t})]})});const R=n.Progress.Root,ee=n.Progress.ValueText,B=()=>{const e=v(),s=(e==null?void 0:e.numberOfTotalPages)===1,r=((e==null?void 0:e.beginNumberOfPagesInSpineItem)??0)>1,l=((e==null?void 0:e.endNumberOfPagesInSpineItem)??0)>1,t=(e!=null&&e.hasChapters?e==null?void 0:e.beginPageIndexInSpineItem:e==null?void 0:e.beginAbsolutePageIndex)??0,i=(e!=null&&e.hasChapters?e==null?void 0:e.endPageIndexInSpineItem:e==null?void 0:e.endAbsolutePageIndex)??0,[d=0,h=0]=[t,i].sort((b,u)=>b-u),g=(e==null?void 0:e.beginPageIndexInSpineItem)!==(e==null?void 0:e.endPageIndexInSpineItem)||(e==null?void 0:e.beginSpineItemIndex)!==(e==null?void 0:e.endSpineItemIndex),c=e!=null&&e.hasChapters?e==null?void 0:e.beginNumberOfPagesInSpineItem:e==null?void 0:e.numberOfTotalPages;return{hasOnlyOnePage:s,beginPageIndex:t,endPageIndex:i,isBeginWithinChapter:r,isEndWithinChapter:l,beginAndEndAreDifferent:g,totalApproximatePages:c,leftPageIndex:d,rightPageIndex:h}},oe=()=>{const e=v(),{hasOnlyOnePage:s,leftPageIndex:r,rightPageIndex:l,totalApproximatePages:t,beginAndEndAreDifferent:i}=B(),d=Math.round(((e==null?void 0:e.percentageEstimateOfBook)??0)*100),h=c=>c!=null&&c.subChapter?`${c.title} / ${h(c.subChapter)}`:(c==null?void 0:c.title)||"",g=h(e==null?void 0:e.beginChapterInfo);return o.jsxs(n.Stack,{alignItems:"center",gap:1,maxW:"100%",overflow:"auto",children:[o.jsx(R,{value:d,size:"xs",width:150,children:o.jsxs(n.HStack,{justifyContent:"space-between",children:[o.jsx(Z,{width:110}),o.jsx(ee,{children:`${d}%`})]})}),o.jsx(n.Text,{truncate:!0,maxWidth:"100%",fontSize:"sm",mt:1,children:g?`Chapter: ${g}`:" "}),!s&&o.jsxs(n.HStack,{children:[o.jsx(n.Text,{fontSize:"xs",children:i?`${r+1} - ${l+1} of ${t}`:`${r+1} of ${t}`}),!!(e!=null&&e.hasChapters)&&o.jsxs(o.Fragment,{children:[o.jsx(n.Text,{children:"-"}),o.jsxs(n.Text,{fontSize:"xs",children:["(",((e==null?void 0:e.beginAbsolutePageIndex)??0)+1,")"]})]})]})]})},z=a.memo(({children:e,position:s,...r})=>o.jsx(n.Presence,{display:"flex",flexDirection:"row",width:"100%",position:"absolute",...s==="bottom"?{bottom:0}:{top:0},animationName:s==="bottom"?{_open:"slide-from-bottom, fade-in",_closed:"slide-to-bottom, fade-out"}:{_open:"slide-from-top, fade-in",_closed:"slide-to-top, fade-out"},animationDuration:"moderate",bgColor:"bg.panel",alignItems:"center",justifyContent:"center",shadow:"md",p:4,...r,children:e})),ne=n.chakra(V),se=a.memo(e=>o.jsx(n.Box,{display:"contents",css:{"--bg":"colors.bg","--bg-emphasized":"colors.bg.emphasized","--color-solid":"colors.colorPalette.solid"},children:o.jsx(ne,{keyboard:!1,style:{padding:0},css:{"& > .rc-slider-handle:focus-visible":{boxShadow:"0 0 0 2px var(--color-solid) !important"},"& > .rc-slider-handle:active":{boxShadow:"0 0 5px var(--color-solid) !important"},"& > .rc-slider-handle.rc-slider-handle-dragging":{boxShadow:"0 0 0 3px var(--color-solid) !important"}},styles:{rail:{height:"8px",top:"50%",transform:"translateY(-50%)",backgroundColor:"var(--bg-emphasized)"},track:{height:"8px",top:"50%",transform:"translateY(-50%)",backgroundColor:"var(--color-solid)"},handle:{width:"24px",height:"24px",top:"50%",borderColor:"var(--color-solid)",transform:`translate(${e.reverse?"50%":"-50%"}, -50%)`,backgroundColor:"var(--bg)",marginTop:"0px"}},...e})})),te=()=>{const e=v(),s=e==null?void 0:e.isUsingSpread,{beginPageIndex:r,totalApproximatePages:l=0}=B(),t=s?Math.floor((r||0)/2):r,[i,d]=p.useSignal({default:t||0}),h=0,g=Math.max(0,s?Math.floor((l-1)/2):l-1);return a.useEffect(()=>{d.setValue(t||0)},[t,d]),{value:i,valueSignal:d,min:h,max:g}},re=()=>{const e=I(),s=v(),{manifest:r}=p.useObserve(()=>e==null?void 0:e.context.state$,[])??{},l=(r==null?void 0:r.readingDirection)==="rtl",t=s==null?void 0:s.isUsingSpread,{totalApproximatePages:i=0,isBeginWithinChapter:d}=B(),h=1,g=d,{value:c,valueSignal:b,min:u,max:S}=te(),O=a.useCallback(P=>{const[T=0]=Array.isArray(P)?P:[P];b.setValue(T);const W=t?Math.floor(T)*2:Math.floor(T);g?e==null||e.navigation.goToPageOfSpineItem({pageIndex:W,spineItemId:e.pagination.getState().beginSpineItemIndex??0,animation:!1}):e==null||e.navigation.goToAbsolutePageIndex({absolutePageIndex:W,animation:!1})},[e,t,b,g]);return p.useSubscribe(()=>e==null?void 0:e.navigation.throttleLock({duration:100,trigger:b.subject}),[e,b]),i===1||t&&i===2?null:o.jsx(se,{value:[c],max:S,min:u,reverse:l,step:h,onChange:O})},le=a.memo(({open:e,onTableOfContentsClick:s,onHelpClick:r})=>{const l=I(),t=p.useObserve(()=>l==null?void 0:l.navigation.state$,[l]),i=p.useObserve(()=>l==null?void 0:l.settings.values$,[l]),d=(i==null?void 0:i.computedPageTurnDirection)==="vertical",[h,g]=a.useState(!0);return o.jsx(z,{present:e,position:"bottom",children:o.jsxs(n.Stack,{flex:1,children:[o.jsxs(n.HStack,{flex:1,alignItems:"center",justifyContent:"center",children:[o.jsx(n.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:()=>l==null?void 0:l.navigation.goToLeftOrTopSpineItem(),disabled:!(t!=null&&t.canGoLeftSpineItem)&&!(t!=null&&t.canGoTopSpineItem),children:d?o.jsx(w.RxDoubleArrowUp,{}):o.jsx(w.RxDoubleArrowLeft,{})}),o.jsxs(n.Stack,{flex:1,maxW:400,gap:2,alignItems:"center",overflow:"visible",px:4,children:[o.jsx(oe,{}),o.jsx(n.Box,{height:5,maxW:300,width:"100%",overflow:"visible",children:o.jsx(re,{})})]}),o.jsx(n.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",disabled:!(t!=null&&t.canGoRightSpineItem)&&!(t!=null&&t.canGoBottomSpineItem),onClick:()=>{l==null||l.navigation.goToRightOrBottomSpineItem()},children:d?o.jsx(w.RxDoubleArrowDown,{}):o.jsx(w.RxDoubleArrowRight,{})})]}),o.jsx(n.HStack,{alignItems:"center",justifyContent:"center",children:o.jsxs(n.Collapsible.Root,{open:h,flex:1,onOpenChange:({open:c})=>{g(c)},children:[o.jsx(n.Collapsible.Trigger,{paddingY:"3",width:"100%",display:"flex",justifyContent:"center",children:o.jsx(x.LuChevronDown,{style:{transform:h?"rotate(0deg)":"rotate(180deg)"}})}),o.jsxs(n.Collapsible.Content,{display:"flex",justifyContent:"center",gap:2,children:[o.jsx(n.IconButton,{"aria-label":"Help",size:"lg",variant:"ghost",onClick:r,children:o.jsx(x.LuCircleHelp,{})}),o.jsx(n.IconButton,{"aria-label":"Table of contents",size:"lg",variant:"ghost",onClick:s,children:o.jsx(x.LuTableOfContents,{})})]})]})})]})})}),ie=()=>{const[e,s]=a.useState(!1),r=a.useCallback(()=>document.fullscreenElement?document.exitFullscreen().catch(console.error).then(()=>{s(!1)}):document.documentElement.requestFullscreen({navigationUI:"hide"}).catch(console.error).then(()=>{s(!0)}),[]);return a.useEffect(()=>{function l(){s(!!document.fullscreenElement)}return document.addEventListener("fullscreenchange",l),()=>{document.removeEventListener("fullscreenchange",l)}},[]),{isFullscreen:e,onToggleFullscreenClick:r}},ce=({open:e,onBackClick:s,onMoreClick:r})=>{const l=I(),t=p.useObserve(()=>l==null?void 0:l.context.manifest$,[l]),{isFullscreen:i,onToggleFullscreenClick:d}=ie();return o.jsxs(z,{present:e,position:"top",height:"80px",justifyContent:"space-between",children:[o.jsx(n.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:s,children:o.jsx(m.IoIosArrowBack,{})}),o.jsx(n.Stack,{flex:1,maxW:600,gap:1,alignItems:"center",overflow:"auto",px:4,children:o.jsx(n.Text,{truncate:!0,maxWidth:"100%",children:t==null?void 0:t.title})}),o.jsxs(n.HStack,{children:[o.jsx(n.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:r,children:o.jsx(m.IoMdMore,{})}),o.jsx(n.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:d,children:i?o.jsx(L.MdFullscreenExit,{}):o.jsx(L.MdFullscreen,{})})]})]})},de=a.memo(({onBackClick:e,onMoreClick:s,onTableOfContentsClick:r,onHelpClick:l})=>{const[t]=y();return o.jsxs(o.Fragment,{children:[o.jsx(ce,{open:t,onBackClick:e,onMoreClick:s}),o.jsx(le,{open:t,onTableOfContentsClick:r,onHelpClick:l})]})}),ae="@prose-reader/react-reader",he="1.180.0",ge=C.forwardRef(function(s,r){return o.jsx(n.IconButton,{variant:"ghost","aria-label":"Close",ref:r,...s,children:s.children??o.jsx(x.LuX,{})})}),A=C.forwardRef(function(s,r){const{children:l,portalled:t=!0,portalRef:i,backdrop:d=!0,...h}=s;return o.jsxs(n.Portal,{disabled:!t,container:i,children:[d&&o.jsx(n.Dialog.Backdrop,{}),o.jsx(n.Dialog.Positioner,{children:o.jsx(n.Dialog.Content,{ref:r,...h,asChild:!1,children:l})})]})}),M=C.forwardRef(function(s,r){return o.jsx(n.Dialog.CloseTrigger,{position:"absolute",top:"2",insetEnd:"2",...s,asChild:!0,children:o.jsx(ge,{size:"sm",ref:r,children:s.children})})}),E=n.Dialog.Root,F=n.Dialog.Footer,H=n.Dialog.Header,q=n.Dialog.Body;n.Dialog.Backdrop;const $=n.Dialog.Title;n.Dialog.Description,n.Dialog.Trigger;const N=n.Dialog.ActionTrigger,fe=a.memo(({open:e,setOpen:s})=>o.jsx(E,{lazyMount:!0,placement:"center",open:e,onOpenChange:r=>s(r.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:o.jsxs(A,{children:[o.jsx(H,{children:o.jsx($,{children:"Help"})}),o.jsxs(q,{overflowY:"auto",flex:1,children:[o.jsx(n.Heading,{mb:2,as:"h3",size:"lg",children:"Shortcuts"}),o.jsxs(n.HStack,{mb:1,children:[o.jsx(n.Kbd,{children:o.jsx(x.LuArrowBigRight,{})})," ",o.jsx(n.Text,{children:"Navigate to right page"})]}),o.jsxs(n.HStack,{mb:1,children:[o.jsx(n.Kbd,{children:o.jsx(x.LuArrowBigLeft,{})})," ",o.jsx(n.Text,{children:"Navigate to left page"})]}),o.jsx(n.Heading,{mb:2,mt:4,as:"h3",size:"lg",children:"About"}),o.jsxs(n.Text,{children:[ae," version: ",he]})]}),o.jsx(F,{children:o.jsx(N,{asChild:!0,children:o.jsx(n.Button,{variant:"outline",children:"Cancel"})})}),o.jsx(M,{})]})})),ue=a.memo(({onNavigate:e})=>{const s=I(),{manifest:r,assumedRenditionLayout:l}=p.useObserve(()=>s==null?void 0:s.context.state$,[s])??{},{nav:t}=r??{},i=v();t!=null&&t.toc;const{beginSpineItemIndex:d,beginPageIndexInSpineItem:h}=i??{},g=(l==="reflowable"?h:d)||0;console.log({assumedRenditionLayout:l,currentSpineItemOrChapterPageIndex:g});let c=i==null?void 0:i.beginChapterInfo;for(;c!=null&&c.subChapter;)c=c==null?void 0:c.subChapter;const b=(u,S,O)=>o.jsxs(a.Fragment,{children:[o.jsx(n.List.Item,{pl:4*(O+1),style:{display:"flex",alignItems:"center"},children:o.jsxs(n.Link,{onClick:()=>{e(),s==null||s.navigation.goToUrl(u.href)},href:"#",children:[(c==null?void 0:c.path)===u.path&&o.jsx(n.List.Indicator,{asChild:!0,children:o.jsx(x.LuCircleCheck,{})}),(c==null?void 0:c.path)!==u.path&&o.jsx(n.List.Indicator,{asChild:!0,visibility:"hidden",children:o.jsx(x.LuCircleCheck,{})}),o.jsxs(n.Stack,{gap:0,children:[o.jsx(n.Text,{fontSize:"md",children:u.title||u.path}),(c==null?void 0:c.path)===u.path&&o.jsx(n.Text,{fontStyle:"italic",fontWeight:"bold",fontSize:"sm",children:`Currently on page ${g+1}`})]})]})}),u.contents.length>0&&o.jsx(n.List.Root,{as:"div",gap:2,children:u.contents.map((P,T)=>b(P,T,O+1))})]},S);return o.jsx(n.List.Root,{gap:3,overflowY:"auto",py:4,flex:1,children:t==null?void 0:t.toc.map((u,S)=>b(u,S,0))})}),pe=a.memo(({open:e,setOpen:s,onNavigate:r})=>o.jsx(E,{lazyMount:!0,placement:"center",open:e,onOpenChange:l=>s(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:o.jsxs(A,{children:[o.jsx(H,{children:o.jsx($,{children:"Table of Contents"})}),o.jsx(q,{overflowY:"auto",flex:1,children:o.jsx(ue,{onNavigate:r})}),o.jsx(F,{children:o.jsx(N,{asChild:!0,children:o.jsx(n.Button,{variant:"outline",children:"Cancel"})})}),o.jsx(M,{})]})})),be=({enableFloatingTime:e=!0,enableFloatingProgress:s=!0,...r})=>{const[l,t]=a.useState(!1),[i,d]=a.useState(!1),[h,g]=y();return o.jsxs(o.Fragment,{children:[s&&o.jsx(n.Presence,{present:!h,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"moderate",children:o.jsx(Y,{})}),o.jsx(de,{...r,onTableOfContentsClick:()=>t(!0),onHelpClick:()=>d(!0)}),o.jsx(fe,{open:i,setOpen:d}),o.jsx(pe,{open:l,setOpen:t,onNavigate:()=>{t(!1),g(!1)}}),o.jsx(n.Presence,{present:e||h,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"slow",overflow:"hidden",children:o.jsx(K,{})})]})};f.ReactReader=be,f.ReactReaderProvider=U,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
2
2
  //# sourceMappingURL=index.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/context/useReader.ts","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/navigation/QuickMenu/TimeIndicator.tsx","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/navigation/QuickMenu/PaginationInfoSection.tsx","../src/navigation/QuickMenu/QuickBar.tsx","../src/navigation/QuickMenu/ThemedSlider.tsx","../src/navigation/QuickMenu/Scrubber.tsx","../src/navigation/QuickMenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/navigation/QuickMenu/TopBar.tsx","../src/navigation/QuickMenu/QuickMenu.tsx","../src/ReactReader.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\n\nexport const ReaderContext: Context<Reader | undefined> = createContext<\n Reader | undefined\n>(undefined)\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n }: { children?: React.ReactNode; reader: Reader | undefined }) => {\n return (\n <ReaderContext.Provider value={reader}>{children}</ReaderContext.Provider>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReader = (): Reader | undefined => {\n const context = useContext(ReaderContext)\n\n return context\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { NEVER, combineLatest, map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context.state$]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, Text } from \"@chakra-ui/react\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const FloatingProgress = () => {\n const pagination = usePagination()\n const roundedProgress = Math.floor(\n (pagination?.percentageEstimateOfBook ?? 0) * 100,\n )\n const displayableProgress = roundedProgress > 0 ? roundedProgress : 1\n\n if (pagination?.percentageEstimateOfBook === undefined) return null\n\n return (\n <Box position=\"absolute\" right={0} bottom={0} p={2}>\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n )\n}\n","import { Text, type TextProps } from \"@chakra-ui/react\"\nimport { useEffect, useState } from \"react\"\n\nexport const useTime = () => {\n const [time, setTime] = useState(new Date())\n\n useEffect(() => {\n const interval = setInterval(() => {\n setTime(new Date())\n }, 1000 * 60)\n\n return () => clearInterval(interval)\n }, [])\n\n return time\n}\n\nexport const TimeIndicator = (props: TextProps) => {\n const time = useTime()\n\n return (\n <Text fontSize=\"xs\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { TimeIndicator } from \"./QuickMenu/TimeIndicator\"\n\nexport const FloatingTime = () => {\n return (\n <Box position=\"absolute\" left={0} bottom={0} p={2}>\n <TimeIndicator />\n </Box>\n )\n}\n","import { Popover as ChakraPopover, IconButton, Portal } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { HiOutlineInformationCircle } from \"react-icons/hi\"\n\nexport interface ToggleTipProps extends ChakraPopover.RootProps {\n showArrow?: boolean\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n content?: React.ReactNode\n}\n\nexport const ToggleTip = React.forwardRef<HTMLDivElement, ToggleTipProps>(\n function ToggleTip(props, ref) {\n const {\n showArrow,\n children,\n portalled = true,\n content,\n portalRef,\n ...rest\n } = props\n\n return (\n <ChakraPopover.Root\n {...rest}\n positioning={{ ...rest.positioning, gutter: 4 }}\n >\n <ChakraPopover.Trigger asChild>{children}</ChakraPopover.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraPopover.Positioner>\n <ChakraPopover.Content\n width=\"auto\"\n px=\"2\"\n py=\"1\"\n textStyle=\"xs\"\n rounded=\"sm\"\n ref={ref}\n >\n {showArrow && (\n <ChakraPopover.Arrow>\n <ChakraPopover.ArrowTip />\n </ChakraPopover.Arrow>\n )}\n {content}\n </ChakraPopover.Content>\n </ChakraPopover.Positioner>\n </Portal>\n </ChakraPopover.Root>\n )\n },\n)\n\nexport const InfoTip = React.forwardRef<\n HTMLDivElement,\n Partial<ToggleTipProps>\n>(function InfoTip(props, ref) {\n const { children, ...rest } = props\n return (\n <ToggleTip content={children} {...rest} ref={ref}>\n <IconButton\n variant=\"ghost\"\n aria-label=\"info\"\n size=\"2xs\"\n colorPalette=\"gray\"\n >\n <HiOutlineInformationCircle />\n </IconButton>\n </ToggleTip>\n )\n})\n","import { Progress as ChakraProgress } from \"@chakra-ui/react\"\nimport { InfoTip } from \"./toggle-tip\"\nimport * as React from \"react\"\n\nexport const ProgressBar = React.forwardRef<\n HTMLDivElement,\n ChakraProgress.TrackProps\n>(function ProgressBar(props, ref) {\n return (\n <ChakraProgress.Track {...props} ref={ref}>\n <ChakraProgress.Range />\n </ChakraProgress.Track>\n )\n})\n\nexport interface ProgressLabelProps extends ChakraProgress.LabelProps {\n info?: React.ReactNode\n}\n\nexport const ProgressLabel = React.forwardRef<\n HTMLDivElement,\n ProgressLabelProps\n>(function ProgressLabel(props, ref) {\n const { children, info, ...rest } = props\n return (\n <ChakraProgress.Label {...rest} ref={ref}>\n {children}\n {info && <InfoTip>{info}</InfoTip>}\n </ChakraProgress.Label>\n )\n})\n\nexport const ProgressRoot = ChakraProgress.Root\nexport const ProgressValueText = ChakraProgress.ValueText\n","import { usePagination } from \"../pagination/usePagination\"\n\nexport const useNavigationContext = () => {\n const pagination = usePagination()\n const hasOnlyOnePage = pagination?.numberOfTotalPages === 1\n\n const isBeginWithinChapter =\n (pagination?.beginNumberOfPagesInSpineItem ?? 0) > 1\n\n const isEndWithinChapter = (pagination?.endNumberOfPagesInSpineItem ?? 0) > 1\n\n const beginPageIndex =\n (pagination?.hasChapters\n ? pagination?.beginPageIndexInSpineItem\n : pagination?.beginAbsolutePageIndex) ?? 0\n const endPageIndex =\n (pagination?.hasChapters\n ? pagination?.endPageIndexInSpineItem\n : pagination?.endAbsolutePageIndex) ?? 0\n\n const [leftPageIndex = 0, rightPageIndex = 0] = [\n beginPageIndex,\n endPageIndex,\n ].sort((a, b) => a - b)\n\n const beginAndEndAreDifferent =\n pagination?.beginPageIndexInSpineItem !==\n pagination?.endPageIndexInSpineItem ||\n pagination?.beginSpineItemIndex !== pagination?.endSpineItemIndex\n\n const totalApproximatePages = pagination?.hasChapters\n ? pagination?.beginNumberOfPagesInSpineItem\n : pagination?.numberOfTotalPages\n\n return {\n hasOnlyOnePage,\n beginPageIndex,\n endPageIndex,\n isBeginWithinChapter,\n isEndWithinChapter,\n beginAndEndAreDifferent,\n totalApproximatePages,\n leftPageIndex,\n rightPageIndex,\n }\n}\n","import { HStack, Stack, Text } from \"@chakra-ui/react\"\nimport {\n ProgressBar,\n ProgressRoot,\n ProgressValueText,\n} from \"../../components/ui/progress\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\n\nexport const PaginationInfoSection = () => {\n const pagination = usePagination()\n const {\n hasOnlyOnePage,\n leftPageIndex,\n rightPageIndex,\n totalApproximatePages,\n beginAndEndAreDifferent,\n } = useNavigationContext()\n const progress = Math.round((pagination?.percentageEstimateOfBook ?? 0) * 100)\n\n const buildTitleChain = (\n chapterInfo: NonNullable<typeof pagination>[\"beginChapterInfo\"],\n ): string => {\n if (chapterInfo?.subChapter) {\n return `${chapterInfo.title} / ${buildTitleChain(chapterInfo.subChapter)}`\n }\n return chapterInfo?.title || \"\"\n }\n\n const chapterTitle = buildTitleChain(pagination?.beginChapterInfo)\n\n return (\n <Stack alignItems=\"center\" gap={1} maxW=\"100%\" overflow=\"auto\">\n <ProgressRoot value={progress} size=\"xs\" width={150}>\n <HStack justifyContent=\"space-between\">\n <ProgressBar width={110} />\n <ProgressValueText>{`${progress}%`}</ProgressValueText>\n </HStack>\n </ProgressRoot>\n <Text truncate maxWidth=\"100%\" fontSize=\"sm\" mt={1}>\n {chapterTitle ? `Chapter: ${chapterTitle}` : `\\u00A0`}\n </Text>\n {!hasOnlyOnePage && (\n <HStack>\n <Text fontSize=\"xs\">\n {beginAndEndAreDifferent\n ? `${leftPageIndex + 1} - ${rightPageIndex + 1} of ${totalApproximatePages}`\n : `${leftPageIndex + 1} of ${totalApproximatePages}`}\n </Text>\n {!!pagination?.hasChapters && (\n <>\n <Text>-</Text>\n <Text fontSize=\"xs\">\n ({(pagination?.beginAbsolutePageIndex ?? 0) + 1})\n </Text>\n </>\n )}\n </HStack>\n )}\n </Stack>\n )\n}\n","import { Presence, type PresenceProps } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const QuickBar = memo(\n ({\n children,\n position,\n ...rest\n }: { position: \"top\" | \"bottom\" } & PresenceProps) => {\n return (\n <Presence\n display=\"flex\"\n flexDirection=\"row\"\n width=\"100%\"\n position=\"absolute\"\n {...(position === \"bottom\" ? { bottom: 0 } : { top: 0 })}\n animationName={\n position === \"bottom\"\n ? {\n _open: \"slide-from-bottom, fade-in\",\n _closed: \"slide-to-bottom, fade-out\",\n }\n : {\n _open: \"slide-from-top, fade-in\",\n _closed: \"slide-to-top, fade-out\",\n }\n }\n animationDuration=\"moderate\"\n bgColor=\"bg.panel\"\n alignItems=\"center\"\n justifyContent=\"center\"\n shadow=\"md\"\n px={4}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\n)\n","import RcSlider from \"rc-slider\"\nimport { type ComponentProps, memo } from \"react\"\nimport \"rc-slider/assets/index.css\"\nimport { Box, chakra } from \"@chakra-ui/react\"\n\nconst ChakraRcSlider = chakra(RcSlider)\n\nexport const ThemedSlider = memo((props: ComponentProps<typeof RcSlider>) => {\n return (\n <Box\n display=\"contents\"\n css={{\n \"--bg\": \"colors.bg\",\n \"--bg-emphasized\": \"colors.bg.emphasized\",\n \"--color-solid\": \"colors.colorPalette.solid\",\n }}\n >\n <ChakraRcSlider\n keyboard={false}\n style={{\n padding: 0,\n }}\n css={{\n \"& > .rc-slider-handle:focus-visible\": {\n boxShadow: \"0 0 0 2px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle:active\": {\n boxShadow: \"0 0 5px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle.rc-slider-handle-dragging\": {\n boxShadow: \"0 0 0 3px var(--color-solid) !important\",\n },\n }}\n styles={{\n rail: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--bg-emphasized)\",\n },\n track: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--color-solid)\",\n },\n handle: {\n width: \"24px\",\n height: \"24px\",\n top: \"50%\",\n borderColor: \"var(--color-solid)\",\n transform: `translate(${props.reverse ? \"50%\" : \"-50%\"}, -50%)`,\n backgroundColor: \"var(--bg)\",\n marginTop: \"0px\",\n },\n }}\n {...props}\n />\n </Box>\n )\n})\n","import { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { useObserve, useSignal, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\nimport { ThemedSlider } from \"./ThemedSlider\"\n\nconst useSliderValues = () => {\n const pagination = usePagination()\n const isUsingSpread = pagination?.isUsingSpread\n const { beginPageIndex: currentRealPage, totalApproximatePages = 0 } =\n useNavigationContext()\n const currentPage = isUsingSpread\n ? Math.floor((currentRealPage || 0) / 2)\n : currentRealPage\n const [value, valueSignal] = useSignal({\n default: currentPage || 0,\n })\n const min = 0\n const max = Math.max(\n 0,\n isUsingSpread\n ? Math.floor((totalApproximatePages - 1) / 2)\n : totalApproximatePages - 1,\n )\n\n useEffect(() => {\n valueSignal.setValue(currentPage || 0)\n }, [currentPage, valueSignal])\n\n return {\n value,\n valueSignal,\n min,\n max,\n }\n}\n\nexport const Scrubber = () => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, []) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.setValue(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.getState().beginSpineItemIndex ?? 0,\n animation: false,\n })\n }\n },\n [reader, isUsingSpread, valueSignal, isScrubberWithinChapter],\n )\n\n /**\n * @note\n * Scrubber can navigate fast and without lock we may end up with\n * slowness due to the reader\n * paginating and loading items in between.\n * This is good practice (but not required) to throttle it.\n */\n useSubscribe(\n () =>\n reader?.navigation.throttleLock({\n duration: 100,\n trigger: valueSignal.subject,\n }),\n [reader, valueSignal],\n )\n\n // const marks =\n // max > 1\n // ? Array.from({ length: max + 1 }, (_, i) => i).reduce(\n // (acc: number[], val) => [...acc, val],\n // [],\n // )\n // : []\n\n if (\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n ) {\n return null\n }\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\n />\n )\n // return (\n // <Slider\n // value={[value]}\n // max={max}\n // min={min}\n // marks={marks}\n // onChange={e => {\n // debugger\n // }}\n // onValueChange={onChange}\n // // reverse={reverse}\n // orientation=\"horizontal\"\n // step={step}\n // />\n // )\n}\n","import { Box, IconButton, Stack } from \"@chakra-ui/react\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = ({ open }: { open: boolean }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection = settings?.computedPageTurnDirection === \"vertical\"\n\n return (\n <QuickBar present={open} position=\"bottom\" height={130}>\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"visible\"\n px={4}\n >\n <PaginationInfoSection />\n <Box height={5} maxW={300} width=\"100%\" overflow=\"visible\">\n <Scrubber />\n </Box>\n </Stack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n disabled={\n !navigation?.canGoRightSpineItem && !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? <RxDoubleArrowDown /> : <RxDoubleArrowRight />}\n </IconButton>\n </QuickBar>\n )\n}\n","import { useEffect } from \"react\"\n\nimport { useCallback } from \"react\"\n\nimport { useState } from \"react\"\n\nexport const useFullscreen = () => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const onToggleFullscreenClick = useCallback(() => {\n if (document.fullscreenElement) {\n return document\n .exitFullscreen()\n .catch(console.error)\n .then(() => {\n setIsFullscreen(false)\n })\n }\n\n return document.documentElement\n .requestFullscreen({ navigationUI: \"hide\" })\n .catch(console.error)\n .then(() => {\n setIsFullscreen(true)\n })\n }, [])\n\n useEffect(() => {\n function fullscreenchangeHandler() {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n document.addEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n }\n }, [])\n\n return {\n isFullscreen,\n onToggleFullscreenClick,\n }\n}\n","import { HStack, IconButton, Stack, Text } from \"@chakra-ui/react\"\nimport { IoIosArrowBack, IoMdMore } from \"react-icons/io\"\nimport { MdFullscreen, MdFullscreenExit } from \"react-icons/md\"\nimport { useObserve } from \"reactjrx\"\nimport { useFullscreen } from \"../../common/useFullscreen\"\nimport { useReader } from \"../../context/useReader\"\nimport { QuickBar } from \"./QuickBar\"\n\nexport const TopBar = ({\n open,\n onBackClick,\n onMoreClick,\n}: {\n open: boolean\n onBackClick: () => void\n onMoreClick: () => void\n}) => {\n const reader = useReader()\n const manifest = useObserve(() => reader?.context.manifest$, [reader])\n const { isFullscreen, onToggleFullscreenClick } = useFullscreen()\n\n return (\n <QuickBar\n present={open}\n position=\"top\"\n height=\"80px\"\n justifyContent=\"space-between\"\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={onBackClick}\n >\n <IoIosArrowBack />\n </IconButton>\n <Stack\n flex={1}\n maxW={600}\n gap={1}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <Text truncate maxWidth=\"100%\">\n {manifest?.title}\n </Text>\n </Stack>\n <HStack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onMoreClick}\n >\n <IoMdMore />\n </IconButton>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onToggleFullscreenClick}\n >\n {isFullscreen ? <MdFullscreenExit /> : <MdFullscreen />}\n </IconButton>\n </HStack>\n </QuickBar>\n )\n}\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\n\nexport const QuickMenu = memo(\n ({\n open,\n onBackClick,\n onMoreClick,\n }: { open: boolean; onBackClick: () => void; onMoreClick: () => void }) => {\n return (\n <>\n <TopBar\n open={open}\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n />\n <BottomBar open={open} />\n </>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport type { ComponentProps } from \"react\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./navigation/QuickMenu/QuickMenu\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n open,\n ...rest\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n} & ComponentProps<typeof QuickMenu>) => {\n return (\n <>\n {enableFloatingProgress && (\n <Presence\n present={!open}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <FloatingProgress />\n </Presence>\n )}\n <QuickMenu open={open} {...rest} />\n <Presence\n present={enableFloatingTime || open}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n </>\n )\n}\n"],"names":["ReaderContext","createContext","ReactReaderProvider","memo","children","reader","useReader","useContext","usePagination","useObserve","combineLatest","map","state","context","isOnlyImages","_a","item","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","jsx","Box","jsxs","Text","useTime","time","setTime","useState","useEffect","interval","TimeIndicator","props","FloatingTime","ToggleTip","React","ref","showArrow","portalled","content","portalRef","rest","ChakraPopover","Portal","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","React__namespace","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","Stack","HStack","Fragment","QuickBar","position","Presence","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","value","valueSignal","useSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","useSubscribe","BottomBar","open","navigation","settings","isVerticalDirection","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","onBackClick","onMoreClick","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","ReactReader","enableFloatingTime","enableFloatingProgress"],"mappings":"gjCAGaA,EAA6CC,gBAExD,MAAS,ECDEC,EAAsBC,EAAA,KACjC,CAAC,CACC,SAAAC,EACA,OAAAC,CAAA,UAGGL,EAAc,SAAd,CAAuB,MAAOK,EAAS,SAAAD,EAAS,CAGvD,ECTaE,EAAY,IACPC,aAAWP,CAAa,ECA7BQ,EAAgB,IAEZ,CACf,MAAMH,EAASC,EAAU,EAElB,OAAAG,EAAA,WACL,IACGJ,EAEGK,EAAAA,cAAc,CAACL,EAAO,WAAW,OAAQA,EAAO,QAAQ,MAAM,CAAC,EAAE,KAC/DM,EAAAA,IAAI,CAAC,CAACC,EAAOC,CAAO,IAAM,OAClB,MAAAC,GAAeC,EAAAF,EAAQ,WAAR,YAAAE,EAAkB,WAAW,MAAOC,GACvD,OAAA,OAAAD,EAAAC,EAAK,YAAL,YAAAD,EAAgB,WAAW,YAGtB,MAAA,CACL,GAAGH,EACH,YAAa,CAACC,EAAQ,qBAAuB,CAACC,CAChD,CACD,CAAA,CACH,EAZAG,QAaN,CAACZ,CAAM,CACT,CACF,ECzBaa,EAAmB,IAAM,CACpC,MAAMC,EAAaX,EAAc,EAC3BY,EAAkB,KAAK,QAC1BD,GAAA,YAAAA,EAAY,2BAA4B,GAAK,GAChD,EACME,EAAsBD,EAAkB,EAAIA,EAAkB,EAEhE,OAAAD,GAAA,YAAAA,EAAY,4BAA6B,OAAkB,KAG5DG,EAAAA,IAAAC,EAAAA,IAAA,CAAI,SAAS,WAAW,MAAO,EAAG,OAAQ,EAAG,EAAG,EAC/C,SAACC,EAAA,KAAAC,EAAA,KAAA,CAAK,SAAS,KAAM,SAAA,CAAAJ,EAAoB,IAAA,CAAA,CAAE,CAC7C,CAAA,CAEJ,ECdaK,EAAU,IAAM,CAC3B,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAS,IAAI,IAAM,EAE3CC,OAAAA,EAAAA,UAAU,IAAM,CACR,MAAAC,EAAW,YAAY,IAAM,CACzBH,EAAA,IAAI,IAAM,CAAA,EACjB,GAAS,EAEL,MAAA,IAAM,cAAcG,CAAQ,CACrC,EAAG,EAAE,EAEEJ,CACT,EAEaK,EAAiBC,GAAqB,CACjD,MAAMN,EAAOD,EAAQ,EAGnB,OAAAJ,MAACG,EAAAA,MAAK,SAAS,KAAM,GAAGQ,EACrB,SAAAN,EAAK,mBAAmB,UAAU,SAAU,CAC3C,KAAM,UACN,OAAQ,SACT,CAAA,EACH,CAEJ,ECzBaO,EAAe,IAEvBZ,EAAAA,IAAAC,EAAAA,IAAA,CAAI,SAAS,WAAW,KAAM,EAAG,OAAQ,EAAG,EAAG,EAC9C,SAACD,EAAA,IAAAU,EAAA,CAAc,CAAA,EACjB,ECISG,EAAYC,EAAM,WAC7B,SAAmBH,EAAOI,EAAK,CACvB,KAAA,CACJ,UAAAC,EACA,SAAAlC,EACA,UAAAmC,EAAY,GACZ,QAAAC,EACA,UAAAC,EACA,GAAGC,CAAA,EACDT,EAGF,OAAAT,EAAA,KAACmB,EAAAA,QAAc,KAAd,CACE,GAAGD,EACJ,YAAa,CAAE,GAAGA,EAAK,YAAa,OAAQ,CAAE,EAE9C,SAAA,CAAApB,EAAA,IAACqB,EAAc,QAAA,QAAd,CAAsB,QAAO,GAAE,SAAAvC,EAAS,EACzCkB,EAAAA,IAACsB,EAAAA,OAAO,CAAA,SAAU,CAACL,EAAW,UAAWE,EACvC,SAAAnB,EAAAA,IAACqB,EAAAA,QAAc,WAAd,CACC,SAAAnB,EAAA,KAACmB,EAAAA,QAAc,QAAd,CACC,MAAM,OACN,GAAG,IACH,GAAG,IACH,UAAU,KACV,QAAQ,KACR,IAAAN,EAEC,SAAA,CACCC,GAAAhB,EAAA,IAACqB,UAAc,MAAd,CACC,eAACA,UAAc,SAAd,CAAuB,CAAA,EAC1B,EAEDH,CAAA,CAAA,GAEL,CACF,CAAA,CAAA,CAAA,CACF,CAAA,CAGN,EAEaK,EAAUT,EAAM,WAG3B,SAAiBH,EAAOI,EAAK,CAC7B,KAAM,CAAE,SAAAjC,EAAU,GAAGsC,CAAA,EAAST,EAC9B,aACGE,EAAU,CAAA,QAAS/B,EAAW,GAAGsC,EAAM,IAAAL,EACtC,SAAAf,EAAA,IAACwB,EAAA,WAAA,CACC,QAAQ,QACR,aAAW,OACX,KAAK,MACL,aAAa,OAEb,eAACC,EAAAA,2BAA2B,CAAA,CAAA,CAAA,CAAA,EAEhC,CAEJ,CAAC,ECjEYC,EAAcZ,EAAM,WAG/B,SAAqBH,EAAOI,EAAK,CAE/B,OAAAf,EAAA,IAAC2B,EAAe,SAAA,MAAf,CAAsB,GAAGhB,EAAO,IAAAI,EAC/B,SAACf,EAAA,IAAA2B,EAAA,SAAe,MAAf,CAAA,CAAqB,CACxB,CAAA,CAEJ,CAAC,EAMkCC,EAAA,WAGjC,SAAuBjB,EAAOI,EAAK,CACnC,KAAM,CAAE,SAAAjC,EAAU,KAAA+C,EAAM,GAAGT,CAAS,EAAAT,EACpC,cACGgB,EAAAA,SAAe,MAAf,CAAsB,GAAGP,EAAM,IAAAL,EAC7B,SAAA,CAAAjC,EACA+C,GAAS7B,EAAAA,IAAAuB,EAAA,CAAS,SAAKM,CAAA,CAAA,CAAA,EAC1B,CAEJ,CAAC,EAEM,MAAMC,EAAeH,EAAe,SAAA,KAC9BI,EAAoBJ,EAAe,SAAA,UC/BnCK,EAAuB,IAAM,CACxC,MAAMnC,EAAaX,EAAc,EAC3B+C,GAAiBpC,GAAA,YAAAA,EAAY,sBAAuB,EAEpDqC,IACHrC,GAAA,YAAAA,EAAY,gCAAiC,GAAK,EAE/CsC,IAAsBtC,GAAA,YAAAA,EAAY,8BAA+B,GAAK,EAEtEuC,GACHvC,GAAA,MAAAA,EAAY,YACTA,GAAA,YAAAA,EAAY,0BACZA,GAAA,YAAAA,EAAY,yBAA2B,EACvCwC,GACHxC,GAAA,MAAAA,EAAY,YACTA,GAAA,YAAAA,EAAY,wBACZA,GAAA,YAAAA,EAAY,uBAAyB,EAErC,CAACyC,EAAgB,EAAGC,EAAiB,CAAC,EAAI,CAC9CH,EACAC,GACA,KAAK,CAACG,EAAGC,IAAMD,EAAIC,CAAC,EAEhBC,GACJ7C,GAAA,YAAAA,EAAY,8BACVA,GAAA,YAAAA,EAAY,2BACdA,GAAA,YAAAA,EAAY,wBAAwBA,GAAA,YAAAA,EAAY,mBAE5C8C,EAAwB9C,GAAA,MAAAA,EAAY,YACtCA,GAAA,YAAAA,EAAY,8BACZA,GAAA,YAAAA,EAAY,mBAET,MAAA,CACL,eAAAoC,EACA,eAAAG,EACA,aAAAC,EACA,qBAAAH,EACA,mBAAAC,EACA,wBAAAO,EACA,sBAAAC,EACA,cAAAL,EACA,eAAAC,CACF,CACF,ECpCaK,EAAwB,IAAM,CACzC,MAAM/C,EAAaX,EAAc,EAC3B,CACJ,eAAA+C,EACA,cAAAK,EACA,eAAAC,EACA,sBAAAI,EACA,wBAAAD,GACEV,EAAqB,EACnBa,EAAW,KAAK,QAAOhD,GAAA,YAAAA,EAAY,2BAA4B,GAAK,GAAG,EAEvEiD,EACJC,GAEIA,GAAA,MAAAA,EAAa,WACR,GAAGA,EAAY,KAAK,MAAMD,EAAgBC,EAAY,UAAU,CAAC,IAEnEA,GAAA,YAAAA,EAAa,QAAS,GAGzBC,EAAeF,EAAgBjD,GAAA,YAAAA,EAAY,gBAAgB,EAG/D,OAAAK,OAAC+C,EAAAA,OAAM,WAAW,SAAS,IAAK,EAAG,KAAK,OAAO,SAAS,OACtD,SAAA,CAACjD,EAAA,IAAA8B,EAAA,CAAa,MAAOe,EAAU,KAAK,KAAK,MAAO,IAC9C,SAAA3C,EAAAA,KAACgD,EAAAA,OAAO,CAAA,eAAe,gBACrB,SAAA,CAAClD,EAAAA,IAAA0B,EAAA,CAAY,MAAO,GAAK,CAAA,EACxB1B,EAAA,IAAA+B,EAAA,CAAmB,SAAG,GAAAc,CAAQ,GAAI,CAAA,CAAA,CAAA,CACrC,CACF,CAAA,EACC7C,MAAAG,EAAAA,KAAA,CAAK,SAAQ,GAAC,SAAS,OAAO,SAAS,KAAK,GAAI,EAC9C,SAAA6C,EAAe,YAAYA,CAAY,GAAK,IAC/C,EACC,CAACf,GACA/B,EAAAA,KAACgD,EACC,OAAA,CAAA,SAAA,CAAAlD,MAACG,EAAAA,MAAK,SAAS,KACZ,WACG,GAAGmC,EAAgB,CAAC,MAAMC,EAAiB,CAAC,OAAOI,CAAqB,GACxE,GAAGL,EAAgB,CAAC,OAAOK,CAAqB,GACtD,EACC,CAAC,EAAC9C,GAAA,MAAAA,EAAY,cAEXK,EAAA,KAAAiD,EAAA,SAAA,CAAA,SAAA,CAAAnD,EAAAA,IAACG,QAAK,SAAC,GAAA,CAAA,EACPD,EAAAA,KAACC,EAAAA,KAAK,CAAA,SAAS,KAAK,SAAA,CAAA,MACfN,GAAA,YAAAA,EAAY,yBAA0B,GAAK,EAAE,GAAA,CAClD,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,EAEJ,CAEJ,EC1DauD,EAAWvE,EAAA,KACtB,CAAC,CACC,SAAAC,EACA,SAAAuE,EACA,GAAGjC,CAAA,IAGDpB,EAAA,IAACsD,EAAA,SAAA,CACC,QAAQ,OACR,cAAc,MACd,MAAM,OACN,SAAS,WACR,GAAID,IAAa,SAAW,CAAE,OAAQ,GAAM,CAAE,IAAK,CAAE,EACtD,cACEA,IAAa,SACT,CACE,MAAO,6BACP,QAAS,2BAAA,EAEX,CACE,MAAO,0BACP,QAAS,wBACX,EAEN,kBAAkB,WAClB,QAAQ,WACR,WAAW,SACX,eAAe,SACf,OAAO,KACP,GAAI,EACH,GAAGjC,EAEH,SAAAtC,CAAA,CACH,CAGN,EClCMyE,EAAiBC,SAAOC,CAAQ,EAEzBC,EAAe7E,EAAAA,KAAM8B,GAE9BX,EAAA,IAACC,EAAA,IAAA,CACC,QAAQ,WACR,IAAK,CACH,OAAQ,YACR,kBAAmB,uBACnB,gBAAiB,2BACnB,EAEA,SAAAD,EAAA,IAACuD,EAAA,CACC,SAAU,GACV,MAAO,CACL,QAAS,CACX,EACA,IAAK,CACH,sCAAuC,CACrC,UAAW,yCACb,EACA,+BAAgC,CAC9B,UAAW,uCACb,EACA,kDAAmD,CACjD,UAAW,yCAAA,CAEf,EACA,OAAQ,CACN,KAAM,CACJ,OAAQ,MACR,IAAK,MACL,UAAW,mBACX,gBAAiB,sBACnB,EACA,MAAO,CACL,OAAQ,MACR,IAAK,MACL,UAAW,mBACX,gBAAiB,oBACnB,EACA,OAAQ,CACN,MAAO,OACP,OAAQ,OACR,IAAK,MACL,YAAa,qBACb,UAAW,aAAa5C,EAAM,QAAU,MAAQ,MAAM,UACtD,gBAAiB,YACjB,UAAW,KAAA,CAEf,EACC,GAAGA,CAAA,CAAA,CACN,CACF,CAEH,ECrDKgD,EAAkB,IAAM,CAC5B,MAAM9D,EAAaX,EAAc,EAC3B0E,EAAgB/D,GAAA,YAAAA,EAAY,cAC5B,CAAE,eAAgBgE,EAAiB,sBAAAlB,EAAwB,CAAA,EAC/DX,EAAqB,EACjB8B,EAAcF,EAChB,KAAK,OAAOC,GAAmB,GAAK,CAAC,EACrCA,EACE,CAACE,EAAOC,CAAW,EAAIC,YAAU,CACrC,QAASH,GAAe,CAAA,CACzB,EACKI,EAAM,EACNC,EAAM,KAAK,IACf,EACAP,EACI,KAAK,OAAOjB,EAAwB,GAAK,CAAC,EAC1CA,EAAwB,CAC9B,EAEAnC,OAAAA,EAAAA,UAAU,IAAM,CACFwD,EAAA,SAASF,GAAe,CAAC,CAAA,EACpC,CAACA,EAAaE,CAAW,CAAC,EAEtB,CACL,MAAAD,EACA,YAAAC,EACA,IAAAE,EACA,IAAAC,CACF,CACF,EAEaC,EAAW,IAAM,CAC5B,MAAMrF,EAASC,EAAU,EACnBa,EAAaX,EAAc,EAC3B,CAAE,SAAAmF,CAAS,EAAIlF,aAAW,IAAMJ,GAAA,YAAAA,EAAQ,QAAQ,OAAQ,CAAE,CAAA,GAAK,CAAC,EAChEuF,GAAUD,GAAA,YAAAA,EAAU,oBAAqB,MACzCT,EAAgB/D,GAAA,YAAAA,EAAY,cAC5B,CAAE,sBAAA8C,EAAwB,EAAG,qBAAAT,CAAA,EACjCF,EAAqB,EACjBuC,EAAO,EACPC,EAA0BtC,EAC1B,CAAE,MAAA6B,EAAO,YAAAC,EAAa,IAAAE,EAAK,IAAAC,CAAA,EAAQR,EAAgB,EAEnDc,GACJC,EAAA,YACGC,GAAW,CACJ,KAAA,CAACZ,EAAQ,CAAC,EAAI,MAAM,QAAQY,CAAM,EAAIA,EAAS,CAACA,CAAM,EAE5DX,EAAY,SAASD,CAAK,EAEpB,MAAAa,EAAYhB,EACd,KAAK,MAAMG,CAAK,EAAI,EACpB,KAAK,MAAMA,CAAK,EAEfS,EAMHzF,GAAA,MAAAA,EAAQ,WAAW,oBAAoB,CACrC,UAAA6F,EACA,YAAa7F,EAAO,WAAW,WAAW,qBAAuB,EACjE,UAAW,EAAA,GARbA,GAAA,MAAAA,EAAQ,WAAW,sBAAsB,CACvC,kBAAmB6F,EACnB,UAAW,EAAA,EASjB,EACA,CAAC7F,EAAQ6E,EAAeI,EAAaQ,CAAuB,CAC9D,EA0BF,OAjBAK,EAAA,aACE,IACE9F,GAAA,YAAAA,EAAQ,WAAW,aAAa,CAC9B,SAAU,IACV,QAASiF,EAAY,OAAA,GAEzB,CAACjF,EAAQiF,CAAW,CACtB,EAWErB,IAA0B,GACzBiB,GAAiBjB,IAA0B,EAErC,KAOP3C,EAAA,IAAC0D,EAAA,CACC,MAAO,CAACK,CAAK,EACb,IAAAI,EACA,IAAAD,EACA,QAAAI,EACA,KAAAC,EACA,SAAAE,EAAA,CACF,CAiBJ,EC3HaK,EAAY,CAAC,CAAE,KAAAC,KAA8B,CACxD,MAAMhG,EAASC,EAAU,EACnBgG,EAAa7F,EAAAA,WAAW,IAAMJ,GAAA,YAAAA,EAAQ,WAAW,OAAQ,CAACA,CAAM,CAAC,EACjEkG,EAAW9F,EAAAA,WAAW,IAAMJ,GAAA,YAAAA,EAAQ,SAAS,QAAS,CAACA,CAAM,CAAC,EAC9DmG,GAAsBD,GAAA,YAAAA,EAAU,6BAA8B,WAEpE,cACG7B,EAAS,CAAA,QAAS2B,EAAM,SAAS,SAAS,OAAQ,IACjD,SAAA,CAAA/E,EAAA,IAACwB,EAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,WAAY,EACZ,QAAS,IAAMzC,GAAA,YAAAA,EAAQ,WAAW,yBAClC,SACE,EAACiG,GAAA,MAAAA,EAAY,qBAAsB,EAACA,GAAA,MAAAA,EAAY,mBAGjD,SAAsBE,EAAAlF,MAACmF,EAAAA,gBAAgB,CAAA,CAAA,QAAMC,EAAAA,kBAAkB,CAAA,CAAA,CAAA,CAClE,EACAlF,EAAA,KAAC+C,EAAA,MAAA,CACC,KAAM,EACN,KAAM,IACN,IAAK,EACL,WAAW,SACX,SAAS,UACT,GAAI,EAEJ,SAAA,CAAAjD,EAAA,IAAC4C,EAAsB,EAAA,EACtB5C,EAAA,IAAAC,EAAA,IAAA,CAAI,OAAQ,EAAG,KAAM,IAAK,MAAM,OAAO,SAAS,UAC/C,SAACD,EAAAA,IAAAoE,EAAA,CAAA,CAAS,CACZ,CAAA,CAAA,CAAA,CACF,EACApE,EAAA,IAACwB,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,SACE,EAACwD,GAAA,MAAAA,EAAY,sBAAuB,EAACA,GAAA,MAAAA,EAAY,sBAEnD,QAAS,IAAM,CACbjG,GAAA,MAAAA,EAAQ,WAAW,4BACrB,EAEC,SAAsBmG,EAAAlF,MAACqF,EAAAA,kBAAkB,CAAA,CAAA,QAAMC,EAAAA,mBAAmB,CAAA,CAAA,CAAA,CAAA,CACrE,EACF,CAEJ,ECxDaC,EAAgB,IAAM,CACjC,KAAM,CAACC,EAAcC,CAAe,EAAIlF,EAAAA,SAAS,EAAK,EAEhDmF,EAA0BhB,EAAAA,YAAY,IACtC,SAAS,kBACJ,SACJ,iBACA,MAAM,QAAQ,KAAK,EACnB,KAAK,IAAM,CACVe,EAAgB,EAAK,CAAA,CACtB,EAGE,SAAS,gBACb,kBAAkB,CAAE,aAAc,OAAQ,EAC1C,MAAM,QAAQ,KAAK,EACnB,KAAK,IAAM,CACVA,EAAgB,EAAI,CAAA,CACrB,EACF,EAAE,EAELjF,OAAAA,EAAAA,UAAU,IAAM,CACd,SAASmF,GAA0B,CACjBF,EAAA,CAAC,CAAC,SAAS,iBAAiB,CAAA,CAGrC,gBAAA,iBAAiB,mBAAoBE,CAAuB,EAE9D,IAAM,CACF,SAAA,oBAAoB,mBAAoBA,CAAuB,CAC1E,CACF,EAAG,EAAE,EAEE,CACL,aAAAH,EACA,wBAAAE,CACF,CACF,ECnCaE,EAAS,CAAC,CACrB,KAAAb,EACA,YAAAc,EACA,YAAAC,CACF,IAIM,CACJ,MAAM/G,EAASC,EAAU,EACnBqF,EAAWlF,EAAAA,WAAW,IAAMJ,GAAA,YAAAA,EAAQ,QAAQ,UAAW,CAACA,CAAM,CAAC,EAC/D,CAAE,aAAAyG,EAAc,wBAAAE,CAAwB,EAAIH,EAAc,EAG9D,OAAArF,EAAA,KAACkD,EAAA,CACC,QAAS2B,EACT,SAAS,MACT,OAAO,OACP,eAAe,gBAEf,SAAA,CAAA/E,EAAA,IAACwB,EAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,WAAY,EACZ,QAASqE,EAET,eAACE,EAAAA,eAAe,CAAA,CAAA,CAAA,CAClB,EACA/F,EAAA,IAACiD,EAAA,MAAA,CACC,KAAM,EACN,KAAM,IACN,IAAK,EACL,WAAW,SACX,SAAS,OACT,GAAI,EAEJ,eAAC9C,OAAK,CAAA,SAAQ,GAAC,SAAS,OACrB,0BAAU,KACb,CAAA,CAAA,CACF,SACC+C,EAAAA,OACC,CAAA,SAAA,CAAAlD,EAAA,IAACwB,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,QAASsE,EAET,eAACE,EAAAA,SAAS,CAAA,CAAA,CAAA,CACZ,EACAhG,EAAA,IAACwB,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,QAASkE,EAER,SAAeF,EAAAxF,MAACiG,EAAAA,iBAAiB,CAAA,CAAA,QAAMC,EAAAA,aAAa,CAAA,CAAA,CAAA,CAAA,CACvD,CACF,CAAA,CAAA,CAAA,CACF,CAEJ,ECnEaC,EAAYtH,EAAA,KACvB,CAAC,CACC,KAAAkG,EACA,YAAAc,EACA,YAAAC,CAAA,IAII5F,EAAA,KAAAiD,WAAA,CAAA,SAAA,CAAAnD,EAAA,IAAC4F,EAAA,CACC,KAAAb,EACA,YAAAc,EACA,YAAAC,CAAA,CACF,EACA9F,MAAC8E,GAAU,KAAAC,CAAY,CAAA,CAAA,EACzB,CAGN,ECfaqB,EAAc,CAAC,CAC1B,mBAAAC,EAAqB,GACrB,uBAAAC,EAAyB,GACzB,KAAAvB,EACA,GAAG3D,CACL,IAMOlB,EAAA,KAAAiD,WAAA,CAAA,SAAA,CACCmD,GAAAtG,EAAA,IAACsD,EAAA,SAAA,CACC,QAAS,CAACyB,EACV,cAAe,CAAE,MAAO,UAAW,QAAS,UAAW,EACvD,kBAAkB,WAElB,eAACnF,EAAiB,CAAA,CAAA,CAAA,CACpB,EAEDI,EAAAA,IAAAmG,EAAA,CAAU,KAAApB,EAAa,GAAG3D,CAAM,CAAA,EACjCpB,EAAA,IAACsD,EAAA,SAAA,CACC,QAAS+C,GAAsBtB,EAC/B,cAAe,CAAE,MAAO,UAAW,QAAS,UAAW,EACvD,kBAAkB,OAClB,SAAS,SAET,eAACnE,EAAa,CAAA,CAAA,CAAA,CAAA,CAChB,EACF"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/context/useReader.ts","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/navigation/QuickMenu/TimeIndicator.tsx","../src/navigation/QuickMenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/navigation/QuickMenu/PaginationInfoSection.tsx","../src/navigation/QuickMenu/QuickBar.tsx","../src/navigation/QuickMenu/ThemedSlider.tsx","../src/navigation/QuickMenu/Scrubber.tsx","../src/navigation/QuickMenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/navigation/QuickMenu/TopBar.tsx","../src/navigation/QuickMenu/QuickMenu.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/navigation/help/HelpDialog.tsx","../src/navigation/toc/TableOfContentsDialogContent.tsx","../src/navigation/toc/TableOfContentsDialog.tsx","../src/ReactReader.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\n\ntype ContextType = {\n reader: Reader | undefined\n quickMenuSignal: Signal<boolean, boolean, undefined>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport { useLiveRef, useSignal, useSubscribe } from \"reactjrx\"\nimport { tap } from \"rxjs\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n quickMenuOpen,\n onQuickMenuOpenChange,\n }: {\n children?: React.ReactNode\n reader: Reader | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const [, quickMenuSignal] = useSignal({\n default: quickMenuOpen,\n })\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n }),\n [quickMenuSignal, reader],\n )\n\n useEffect(() => {\n quickMenuSignal.setValue(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () =>\n quickMenuSignal.subject.pipe(tap(onQuickMenuOpenChangeLiveRef.current)),\n [quickMenuSignal, onQuickMenuOpenChangeLiveRef],\n )\n\n return (\n <ReaderContext.Provider value={value}>{children}</ReaderContext.Provider>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReader = (): Reader | undefined => {\n const { reader } = useContext(ReaderContext)\n\n return reader\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { NEVER, combineLatest, map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context.state$]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, Text } from \"@chakra-ui/react\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const FloatingProgress = () => {\n const pagination = usePagination()\n const roundedProgress = Math.floor(\n (pagination?.percentageEstimateOfBook ?? 0) * 100,\n )\n const displayableProgress = roundedProgress > 0 ? roundedProgress : 1\n\n if (pagination?.percentageEstimateOfBook === undefined) return null\n\n return (\n <Box position=\"absolute\" right={0} bottom={0} p={2} color={\"black\"}>\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n )\n}\n","import { Text, type TextProps } from \"@chakra-ui/react\"\nimport { useEffect, useState } from \"react\"\n\nexport const useTime = () => {\n const [time, setTime] = useState(new Date())\n\n useEffect(() => {\n const interval = setInterval(() => {\n setTime(new Date())\n }, 1000 * 60)\n\n return () => clearInterval(interval)\n }, [])\n\n return time\n}\n\nexport const TimeIndicator = (props: TextProps) => {\n const time = useTime()\n\n return (\n <Text fontSize=\"xs\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { useContext } from \"react\"\nimport { useSignalValue } from \"reactjrx\"\nimport { ReaderContext } from \"../../context/context\"\n\nexport const useQuickMenu = () => {\n const { quickMenuSignal } = useContext(ReaderContext)\n\n const quickMenu = useSignalValue(quickMenuSignal)\n\n return [quickMenu, quickMenuSignal.setValue, quickMenuSignal] as const\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { TimeIndicator } from \"./QuickMenu/TimeIndicator\"\nimport { useQuickMenu } from \"./QuickMenu/useQuickMenu\"\n\nexport const FloatingTime = () => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <Box\n position=\"absolute\"\n left={0}\n bottom={0}\n p={2}\n color={quickMenuOpen ? undefined : \"colorPalette.contrast\"}\n >\n <TimeIndicator />\n </Box>\n )\n}\n","import { Popover as ChakraPopover, IconButton, Portal } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { HiOutlineInformationCircle } from \"react-icons/hi\"\n\nexport interface ToggleTipProps extends ChakraPopover.RootProps {\n showArrow?: boolean\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n content?: React.ReactNode\n}\n\nexport const ToggleTip = React.forwardRef<HTMLDivElement, ToggleTipProps>(\n function ToggleTip(props, ref) {\n const {\n showArrow,\n children,\n portalled = true,\n content,\n portalRef,\n ...rest\n } = props\n\n return (\n <ChakraPopover.Root\n {...rest}\n positioning={{ ...rest.positioning, gutter: 4 }}\n >\n <ChakraPopover.Trigger asChild>{children}</ChakraPopover.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraPopover.Positioner>\n <ChakraPopover.Content\n width=\"auto\"\n px=\"2\"\n py=\"1\"\n textStyle=\"xs\"\n rounded=\"sm\"\n ref={ref}\n >\n {showArrow && (\n <ChakraPopover.Arrow>\n <ChakraPopover.ArrowTip />\n </ChakraPopover.Arrow>\n )}\n {content}\n </ChakraPopover.Content>\n </ChakraPopover.Positioner>\n </Portal>\n </ChakraPopover.Root>\n )\n },\n)\n\nexport const InfoTip = React.forwardRef<\n HTMLDivElement,\n Partial<ToggleTipProps>\n>(function InfoTip(props, ref) {\n const { children, ...rest } = props\n return (\n <ToggleTip content={children} {...rest} ref={ref}>\n <IconButton\n variant=\"ghost\"\n aria-label=\"info\"\n size=\"2xs\"\n colorPalette=\"gray\"\n >\n <HiOutlineInformationCircle />\n </IconButton>\n </ToggleTip>\n )\n})\n","import { Progress as ChakraProgress } from \"@chakra-ui/react\"\nimport { InfoTip } from \"./toggle-tip\"\nimport * as React from \"react\"\n\nexport const ProgressBar = React.forwardRef<\n HTMLDivElement,\n ChakraProgress.TrackProps\n>(function ProgressBar(props, ref) {\n return (\n <ChakraProgress.Track {...props} ref={ref}>\n <ChakraProgress.Range />\n </ChakraProgress.Track>\n )\n})\n\nexport interface ProgressLabelProps extends ChakraProgress.LabelProps {\n info?: React.ReactNode\n}\n\nexport const ProgressLabel = React.forwardRef<\n HTMLDivElement,\n ProgressLabelProps\n>(function ProgressLabel(props, ref) {\n const { children, info, ...rest } = props\n return (\n <ChakraProgress.Label {...rest} ref={ref}>\n {children}\n {info && <InfoTip>{info}</InfoTip>}\n </ChakraProgress.Label>\n )\n})\n\nexport const ProgressRoot = ChakraProgress.Root\nexport const ProgressValueText = ChakraProgress.ValueText\n","import { usePagination } from \"../pagination/usePagination\"\n\nexport const useNavigationContext = () => {\n const pagination = usePagination()\n const hasOnlyOnePage = pagination?.numberOfTotalPages === 1\n\n const isBeginWithinChapter =\n (pagination?.beginNumberOfPagesInSpineItem ?? 0) > 1\n\n const isEndWithinChapter = (pagination?.endNumberOfPagesInSpineItem ?? 0) > 1\n\n const beginPageIndex =\n (pagination?.hasChapters\n ? pagination?.beginPageIndexInSpineItem\n : pagination?.beginAbsolutePageIndex) ?? 0\n const endPageIndex =\n (pagination?.hasChapters\n ? pagination?.endPageIndexInSpineItem\n : pagination?.endAbsolutePageIndex) ?? 0\n\n const [leftPageIndex = 0, rightPageIndex = 0] = [\n beginPageIndex,\n endPageIndex,\n ].sort((a, b) => a - b)\n\n const beginAndEndAreDifferent =\n pagination?.beginPageIndexInSpineItem !==\n pagination?.endPageIndexInSpineItem ||\n pagination?.beginSpineItemIndex !== pagination?.endSpineItemIndex\n\n const totalApproximatePages = pagination?.hasChapters\n ? pagination?.beginNumberOfPagesInSpineItem\n : pagination?.numberOfTotalPages\n\n return {\n hasOnlyOnePage,\n beginPageIndex,\n endPageIndex,\n isBeginWithinChapter,\n isEndWithinChapter,\n beginAndEndAreDifferent,\n totalApproximatePages,\n leftPageIndex,\n rightPageIndex,\n }\n}\n","import { HStack, Stack, Text } from \"@chakra-ui/react\"\nimport {\n ProgressBar,\n ProgressRoot,\n ProgressValueText,\n} from \"../../components/ui/progress\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\n\nexport const PaginationInfoSection = () => {\n const pagination = usePagination()\n const {\n hasOnlyOnePage,\n leftPageIndex,\n rightPageIndex,\n totalApproximatePages,\n beginAndEndAreDifferent,\n } = useNavigationContext()\n const progress = Math.round((pagination?.percentageEstimateOfBook ?? 0) * 100)\n\n const buildTitleChain = (\n chapterInfo: NonNullable<typeof pagination>[\"beginChapterInfo\"],\n ): string => {\n if (chapterInfo?.subChapter) {\n return `${chapterInfo.title} / ${buildTitleChain(chapterInfo.subChapter)}`\n }\n return chapterInfo?.title || \"\"\n }\n\n const chapterTitle = buildTitleChain(pagination?.beginChapterInfo)\n\n return (\n <Stack alignItems=\"center\" gap={1} maxW=\"100%\" overflow=\"auto\">\n <ProgressRoot value={progress} size=\"xs\" width={150}>\n <HStack justifyContent=\"space-between\">\n <ProgressBar width={110} />\n <ProgressValueText>{`${progress}%`}</ProgressValueText>\n </HStack>\n </ProgressRoot>\n <Text truncate maxWidth=\"100%\" fontSize=\"sm\" mt={1}>\n {chapterTitle ? `Chapter: ${chapterTitle}` : `\\u00A0`}\n </Text>\n {!hasOnlyOnePage && (\n <HStack>\n <Text fontSize=\"xs\">\n {beginAndEndAreDifferent\n ? `${leftPageIndex + 1} - ${rightPageIndex + 1} of ${totalApproximatePages}`\n : `${leftPageIndex + 1} of ${totalApproximatePages}`}\n </Text>\n {!!pagination?.hasChapters && (\n <>\n <Text>-</Text>\n <Text fontSize=\"xs\">\n ({(pagination?.beginAbsolutePageIndex ?? 0) + 1})\n </Text>\n </>\n )}\n </HStack>\n )}\n </Stack>\n )\n}\n","import { Presence, type PresenceProps } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const QuickBar = memo(\n ({\n children,\n position,\n ...rest\n }: { position: \"top\" | \"bottom\" } & PresenceProps) => {\n return (\n <Presence\n display=\"flex\"\n flexDirection=\"row\"\n width=\"100%\"\n position=\"absolute\"\n {...(position === \"bottom\" ? { bottom: 0 } : { top: 0 })}\n animationName={\n position === \"bottom\"\n ? {\n _open: \"slide-from-bottom, fade-in\",\n _closed: \"slide-to-bottom, fade-out\",\n }\n : {\n _open: \"slide-from-top, fade-in\",\n _closed: \"slide-to-top, fade-out\",\n }\n }\n animationDuration=\"moderate\"\n bgColor=\"bg.panel\"\n alignItems=\"center\"\n justifyContent=\"center\"\n shadow=\"md\"\n p={4}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\n)\n","import RcSlider from \"rc-slider\"\nimport { type ComponentProps, memo } from \"react\"\nimport \"rc-slider/assets/index.css\"\nimport { Box, chakra } from \"@chakra-ui/react\"\n\nconst ChakraRcSlider = chakra(RcSlider)\n\nexport const ThemedSlider = memo((props: ComponentProps<typeof RcSlider>) => {\n return (\n <Box\n display=\"contents\"\n css={{\n \"--bg\": \"colors.bg\",\n \"--bg-emphasized\": \"colors.bg.emphasized\",\n \"--color-solid\": \"colors.colorPalette.solid\",\n }}\n >\n <ChakraRcSlider\n keyboard={false}\n style={{\n padding: 0,\n }}\n css={{\n \"& > .rc-slider-handle:focus-visible\": {\n boxShadow: \"0 0 0 2px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle:active\": {\n boxShadow: \"0 0 5px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle.rc-slider-handle-dragging\": {\n boxShadow: \"0 0 0 3px var(--color-solid) !important\",\n },\n }}\n styles={{\n rail: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--bg-emphasized)\",\n },\n track: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--color-solid)\",\n },\n handle: {\n width: \"24px\",\n height: \"24px\",\n top: \"50%\",\n borderColor: \"var(--color-solid)\",\n transform: `translate(${props.reverse ? \"50%\" : \"-50%\"}, -50%)`,\n backgroundColor: \"var(--bg)\",\n marginTop: \"0px\",\n },\n }}\n {...props}\n />\n </Box>\n )\n})\n","import { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { useObserve, useSignal, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\nimport { ThemedSlider } from \"./ThemedSlider\"\n\nconst useSliderValues = () => {\n const pagination = usePagination()\n const isUsingSpread = pagination?.isUsingSpread\n const { beginPageIndex: currentRealPage, totalApproximatePages = 0 } =\n useNavigationContext()\n const currentPage = isUsingSpread\n ? Math.floor((currentRealPage || 0) / 2)\n : currentRealPage\n const [value, valueSignal] = useSignal({\n default: currentPage || 0,\n })\n const min = 0\n const max = Math.max(\n 0,\n isUsingSpread\n ? Math.floor((totalApproximatePages - 1) / 2)\n : totalApproximatePages - 1,\n )\n\n useEffect(() => {\n valueSignal.setValue(currentPage || 0)\n }, [currentPage, valueSignal])\n\n return {\n value,\n valueSignal,\n min,\n max,\n }\n}\n\nexport const Scrubber = () => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, []) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.setValue(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.getState().beginSpineItemIndex ?? 0,\n animation: false,\n })\n }\n },\n [reader, isUsingSpread, valueSignal, isScrubberWithinChapter],\n )\n\n /**\n * @note\n * Scrubber can navigate fast and without lock we may end up with\n * slowness due to the reader\n * paginating and loading items in between.\n * This is good practice (but not required) to throttle it.\n */\n useSubscribe(\n () =>\n reader?.navigation.throttleLock({\n duration: 100,\n trigger: valueSignal.subject,\n }),\n [reader, valueSignal],\n )\n\n // const marks =\n // max > 1\n // ? Array.from({ length: max + 1 }, (_, i) => i).reduce(\n // (acc: number[], val) => [...acc, val],\n // [],\n // )\n // : []\n\n if (\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n ) {\n return null\n }\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\n />\n )\n // return (\n // <Slider\n // value={[value]}\n // max={max}\n // min={min}\n // marks={marks}\n // onChange={e => {\n // debugger\n // }}\n // onValueChange={onChange}\n // // reverse={reverse}\n // orientation=\"horizontal\"\n // step={step}\n // />\n // )\n}\n","import { Box, Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { LuChevronDown } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp } from \"react-icons/lu\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onTableOfContentsClick,\n onHelpClick,\n }: {\n open: boolean\n onTableOfContentsClick: () => void\n onHelpClick: () => void\n }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection =\n settings?.computedPageTurnDirection === \"vertical\"\n const [isExtraOpen, setIsExtraOpen] = useState(true)\n\n return (\n <QuickBar\n present={open}\n position=\"bottom\"\n // height={130}\n >\n <Stack\n // border=\"1px solid red\"\n flex={1}\n >\n <HStack flex={1} alignItems=\"center\" justifyContent=\"center\">\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem &&\n !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? (\n <RxDoubleArrowUp />\n ) : (\n <RxDoubleArrowLeft />\n )}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"visible\"\n px={4}\n >\n <PaginationInfoSection />\n <Box height={5} maxW={300} width=\"100%\" overflow=\"visible\">\n <Scrubber />\n </Box>\n </Stack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n disabled={\n !navigation?.canGoRightSpineItem &&\n !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? (\n <RxDoubleArrowDown />\n ) : (\n <RxDoubleArrowRight />\n )}\n </IconButton>\n </HStack>\n <HStack\n alignItems=\"center\"\n justifyContent=\"center\"\n // border=\"1px solid blue\"\n >\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\n // border=\"1px solid green\"\n width=\"100%\"\n display=\"flex\"\n justifyContent=\"center\"\n >\n <LuChevronDown\n style={{\n transform: isExtraOpen ? \"rotate(0deg)\" : \"rotate(180deg)\",\n }}\n />\n </Collapsible.Trigger>\n <Collapsible.Content\n display=\"flex\"\n justifyContent=\"center\"\n gap={2}\n >\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onHelpClick}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onTableOfContentsClick}\n >\n <LuTableOfContents />\n </IconButton>\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\n </Stack>\n </QuickBar>\n )\n },\n)\n","import { useEffect } from \"react\"\n\nimport { useCallback } from \"react\"\n\nimport { useState } from \"react\"\n\nexport const useFullscreen = () => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const onToggleFullscreenClick = useCallback(() => {\n if (document.fullscreenElement) {\n return document\n .exitFullscreen()\n .catch(console.error)\n .then(() => {\n setIsFullscreen(false)\n })\n }\n\n return document.documentElement\n .requestFullscreen({ navigationUI: \"hide\" })\n .catch(console.error)\n .then(() => {\n setIsFullscreen(true)\n })\n }, [])\n\n useEffect(() => {\n function fullscreenchangeHandler() {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n document.addEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n }\n }, [])\n\n return {\n isFullscreen,\n onToggleFullscreenClick,\n }\n}\n","import { HStack, IconButton, Stack, Text } from \"@chakra-ui/react\"\nimport { IoIosArrowBack, IoMdMore } from \"react-icons/io\"\nimport { MdFullscreen, MdFullscreenExit } from \"react-icons/md\"\nimport { useObserve } from \"reactjrx\"\nimport { useFullscreen } from \"../../common/useFullscreen\"\nimport { useReader } from \"../../context/useReader\"\nimport { QuickBar } from \"./QuickBar\"\n\nexport const TopBar = ({\n open,\n onBackClick,\n onMoreClick,\n}: {\n open: boolean\n onBackClick: () => void\n onMoreClick: () => void\n}) => {\n const reader = useReader()\n const manifest = useObserve(() => reader?.context.manifest$, [reader])\n const { isFullscreen, onToggleFullscreenClick } = useFullscreen()\n\n return (\n <QuickBar\n present={open}\n position=\"top\"\n height=\"80px\"\n justifyContent=\"space-between\"\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={onBackClick}\n >\n <IoIosArrowBack />\n </IconButton>\n <Stack\n flex={1}\n maxW={600}\n gap={1}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <Text truncate maxWidth=\"100%\">\n {manifest?.title}\n </Text>\n </Stack>\n <HStack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onMoreClick}\n >\n <IoMdMore />\n </IconButton>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onToggleFullscreenClick}\n >\n {isFullscreen ? <MdFullscreenExit /> : <MdFullscreen />}\n </IconButton>\n </HStack>\n </QuickBar>\n )\n}\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onBackClick,\n onMoreClick,\n onTableOfContentsClick,\n onHelpClick,\n }: {\n onBackClick: () => void\n onMoreClick: () => void\n onTableOfContentsClick: () => void\n onHelpClick: () => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar\n open={quickMenuOpen}\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n />\n <BottomBar\n open={quickMenuOpen}\n onTableOfContentsClick={onTableOfContentsClick}\n onHelpClick={onHelpClick}\n />\n </>\n )\n },\n)\n","import type { ButtonProps } from \"@chakra-ui/react\"\nimport { IconButton as ChakraIconButton } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { LuX } from \"react-icons/lu\"\n\nexport type CloseButtonProps = ButtonProps\n\nexport const CloseButton = React.forwardRef<\n HTMLButtonElement,\n CloseButtonProps\n>(function CloseButton(props, ref) {\n return (\n <ChakraIconButton variant=\"ghost\" aria-label=\"Close\" ref={ref} {...props}>\n {props.children ?? <LuX />}\n </ChakraIconButton>\n )\n})\n","import { Dialog as ChakraDialog, Portal } from \"@chakra-ui/react\"\nimport { CloseButton } from \"./close-button\"\nimport * as React from \"react\"\n\ninterface DialogContentProps extends ChakraDialog.ContentProps {\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n backdrop?: boolean\n}\n\nexport const DialogContent = React.forwardRef<\n HTMLDivElement,\n DialogContentProps\n>(function DialogContent(props, ref) {\n const {\n children,\n portalled = true,\n portalRef,\n backdrop = true,\n ...rest\n } = props\n\n return (\n <Portal disabled={!portalled} container={portalRef}>\n {backdrop && <ChakraDialog.Backdrop />}\n <ChakraDialog.Positioner>\n <ChakraDialog.Content ref={ref} {...rest} asChild={false}>\n {children}\n </ChakraDialog.Content>\n </ChakraDialog.Positioner>\n </Portal>\n )\n})\n\nexport const DialogCloseTrigger = React.forwardRef<\n HTMLButtonElement,\n ChakraDialog.CloseTriggerProps\n>(function DialogCloseTrigger(props, ref) {\n return (\n <ChakraDialog.CloseTrigger\n position=\"absolute\"\n top=\"2\"\n insetEnd=\"2\"\n {...props}\n asChild\n >\n <CloseButton size=\"sm\" ref={ref}>\n {props.children}\n </CloseButton>\n </ChakraDialog.CloseTrigger>\n )\n})\n\nexport const DialogRoot = ChakraDialog.Root\nexport const DialogFooter = ChakraDialog.Footer\nexport const DialogHeader = ChakraDialog.Header\nexport const DialogBody = ChakraDialog.Body\nexport const DialogBackdrop = ChakraDialog.Backdrop\nexport const DialogTitle = ChakraDialog.Title\nexport const DialogDescription = ChakraDialog.Description\nexport const DialogTrigger = ChakraDialog.Trigger\nexport const DialogActionTrigger = ChakraDialog.ActionTrigger\n","import { Button, HStack, Heading, Kbd, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuArrowBigLeft, LuArrowBigRight } from \"react-icons/lu\"\nimport { name, version } from \"../../../package.json\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../../components/ui/dialog\"\n\nexport const HelpDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Help</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Shortcuts\n </Heading>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigRight />\n </Kbd>{\" \"}\n <Text>Navigate to right page</Text>\n </HStack>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigLeft />\n </Kbd>{\" \"}\n <Text>Navigate to left page</Text>\n </HStack>\n <Heading mb={2} mt={4} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Link, Stack, Text } from \"@chakra-ui/react\"\n\nimport { List } from \"@chakra-ui/react\"\nimport React, { memo } from \"react\"\nimport { LuCircleCheck } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\n\nexport const TableOfContentsDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context.state$, [reader]) ?? {}\n const { nav } = manifest ?? {}\n const pagination = usePagination()\n const toc = nav?.toc || []\n const { beginSpineItemIndex, beginPageIndexInSpineItem } = pagination ?? {}\n const currentSpineItemOrChapterPageIndex =\n (assumedRenditionLayout === \"reflowable\"\n ? beginPageIndexInSpineItem\n : beginSpineItemIndex) || 0\n\n console.log({ assumedRenditionLayout, currentSpineItemOrChapterPageIndex })\n\n let currentSubChapter = pagination?.beginChapterInfo\n\n while (currentSubChapter?.subChapter) {\n currentSubChapter = currentSubChapter?.subChapter\n }\n\n const buildTocForItem = (\n tocItem: (typeof toc)[number],\n index: number,\n lvl: number,\n ) => (\n <React.Fragment key={index}>\n <List.Item\n pl={4 * (lvl + 1)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Link\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToUrl(tocItem.href)\n }}\n href=\"#\"\n >\n {currentSubChapter?.path === tocItem.path && (\n <List.Indicator asChild>\n <LuCircleCheck />\n </List.Indicator>\n )}\n {currentSubChapter?.path !== tocItem.path && (\n <List.Indicator asChild visibility=\"hidden\">\n <LuCircleCheck />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text fontSize=\"md\">{tocItem.title || tocItem.path}</Text>\n {currentSubChapter?.path === tocItem.path && (\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Currently on page ${\n currentSpineItemOrChapterPageIndex + 1\n }`}</Text>\n )}\n </Stack>\n </Link>\n </List.Item>\n {tocItem.contents.length > 0 && (\n <List.Root as=\"div\" gap={2}>\n {tocItem.contents.map((tocItem, index) =>\n buildTocForItem(tocItem, index, lvl + 1),\n )}\n </List.Root>\n )}\n </React.Fragment>\n )\n\n return (\n <List.Root gap={3} overflowY=\"auto\" py={4} flex={1}>\n {nav?.toc.map((tocItem, index) => buildTocForItem(tocItem, index, 0))}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../../components/ui/dialog\"\nimport { TableOfContentsDialogContent } from \"./TableOfContentsDialogContent\"\n\nexport const TableOfContentsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Table of Contents</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <TableOfContentsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport { type ComponentProps, useState } from \"react\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./navigation/QuickMenu/QuickMenu\"\nimport { useQuickMenu } from \"./navigation/QuickMenu/useQuickMenu\"\nimport { HelpDialog } from \"./navigation/help/HelpDialog\"\nimport { TableOfContentsDialog } from \"./navigation/toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n ...rest\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n} & Omit<\n ComponentProps<typeof QuickMenu>,\n \"onTableOfContentsClick\" | \"open\"\n>) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n return (\n <>\n {enableFloatingProgress && (\n <Presence\n present={!quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <FloatingProgress />\n </Presence>\n )}\n <QuickMenu\n {...rest}\n onTableOfContentsClick={() => setIsTableOfContentsOpen(true)}\n onHelpClick={() => setIsHelpOpen(true)}\n />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={() => {\n setIsTableOfContentsOpen(false)\n setQuickMenuOpen(false)\n }}\n />\n <Presence\n present={enableFloatingTime || quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n </>\n )\n}\n"],"names":["ReaderContext","createContext","signal","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useSignal","onQuickMenuOpenChangeLiveRef","useLiveRef","value","useMemo","useEffect","useSubscribe","tap","jsx","useReader","useContext","usePagination","useObserve","combineLatest","map","state","context","isOnlyImages","_a","item","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","Box","jsxs","Text","useTime","time","setTime","useState","interval","TimeIndicator","props","useQuickMenu","useSignalValue","FloatingTime","ToggleTip","React","ref","showArrow","portalled","content","portalRef","rest","ChakraPopover","Portal","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","React__namespace","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","Stack","HStack","Fragment","QuickBar","position","Presence","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","open","onTableOfContentsClick","onHelpClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","onBackClick","onMoreClick","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","CloseButton","ChakraIconButton","LuX","DialogContent","backdrop","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","HelpDialog","setOpen","e","Heading","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","Button","TableOfContentsDialogContent","onNavigate","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","index","lvl","List","Link","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","setQuickMenuOpen"],"mappings":"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"}