@prose-reader/react-reader 1.193.0 → 1.194.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -285,7 +285,7 @@ const Y = k.ActionTrigger, T = () => {
285
285
  ] })
286
286
  }
287
287
  )
288
- ), en = "@prose-reader/react-reader", nn = "1.192.0", tn = f(
288
+ ), en = "@prose-reader/react-reader", nn = "1.193.0", tn = f(
289
289
  ({
290
290
  open: n,
291
291
  setOpen: t
@@ -582,7 +582,7 @@ const hn = _.Root, un = _.ValueText, ne = () => {
582
582
  max: u
583
583
  };
584
584
  }, bn = (n) => {
585
- const t = T(), o = B(), { manifest: r } = b(() => t == null ? void 0 : t.context.state$, []) ?? {}, l = (r == null ? void 0 : r.readingDirection) === "rtl", i = o == null ? void 0 : o.isUsingSpread, { totalApproximatePages: a = 0, isBeginWithinChapter: h } = ne(), u = 1, s = h, { value: g, valueSignal: d, min: x, max: C } = mn(), w = M(
585
+ const t = T(), o = B(), { manifest: r } = b(() => t == null ? void 0 : t.context.state$, [t]) ?? {}, l = (r == null ? void 0 : r.readingDirection) === "rtl", i = o == null ? void 0 : o.isUsingSpread, { totalApproximatePages: a = 0, isBeginWithinChapter: h } = ne(), u = 1, s = h, { value: g, valueSignal: d, min: x, max: C } = mn(), w = M(
586
586
  (v) => {
587
587
  const [R = 0] = Array.isArray(v) ? v : [v];
588
588
  d.setValue(R);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/useReader.ts","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/bookmarks/Bookmarks.tsx","../src/bookmarks/BookmarksDialogContent.tsx","../src/bookmarks/BookmarksDialog.tsx","../src/help/HelpDialog.tsx","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/quickmenu/TimeIndicator.tsx","../src/quickmenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/quickmenu/PaginationInfoSection.tsx","../src/quickmenu/QuickBar.tsx","../src/quickmenu/ThemedSlider.tsx","../src/quickmenu/Scrubber.tsx","../src/quickmenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/quickmenu/TopBar.tsx","../src/quickmenu/QuickMenu.tsx","../src/search/SearchListItem.tsx","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/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 { 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 type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { BookmarksEnhancerAPI } from \"@prose-reader/enhancer-bookmarks\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\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\nexport const hasSearchEnhancer = (\n reader?: Reader,\n): reader is Reader & SearchEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_SEARCH\" in reader\n}\n\nexport const hasBookmarksEnhancer = (\n reader?: Reader,\n): reader is Reader & BookmarksEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_BOOKMARKS\" in reader\n}\n\nexport const hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const AnnotationsDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.highlights$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.pagination.locate(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedHighlights>[number],\n index: number,\n ) => (\n <List.Item key={index}>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.cfi ?? \"\")\n }}\n >\n {(item.contents ?? [])[0] ? (\n <List.Indicator asChild>\n <LuNotebookPen />\n </List.Indicator>\n ) : (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text lineClamp={2} fontSize=\"md\">\n {item.selectionAsText ? (\n (item.selectionAsText ?? \"\")\n ) : (\n <i>\n <b>unknown (not loaded)</b>\n </i>\n )}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {consolidatedHighlights?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\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 { AnnotationsDialogContent } from \"./AnnotationsDialogContent\"\n\nexport const AnnotationsDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Annotations</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <AnnotationsDialogContent 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 { Box, IconButton, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { BsBookmarkPlus, BsBookmarkXFill } from \"react-icons/bs\"\nimport { useObserve } from \"reactjrx\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const Bookmarks = memo(() => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader) ? reader : undefined\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n const pages = useObserve(\n () => readerWithBookmarks?.bookmarks.pages$,\n [readerWithBookmarks],\n )\n const bookmarks = useObserve(\n () => readerWithBookmarks?.bookmarks.bookmarks$,\n [readerWithBookmarks],\n )\n const consolidatedBookmarks = useObserve(\n () => reader?.pagination.locate(bookmarks ?? []),\n [reader, bookmarks],\n )\n\n if (!spineElement) return null\n\n return (\n <>\n {createPortal(\n pages?.map(\n (\n { isBookmarkable, absolutePosition: { left, top, width } },\n index,\n ) => {\n const bookmarkForPage = consolidatedBookmarks?.find(\n (bookmark) => bookmark.meta?.absolutePageIndex === index,\n )\n\n /**\n * Stale bookmarks means we cannot assert at the moment whether the page is marked or not.\n * In this case we just hide the bookmark button. You may want to have different UX to handle\n * this case.\n *\n * This also avoid having a flash where you show an non bookmarked icon and right away change it with\n * a valid marked page icon.\n */\n if (!isBookmarkable) return null\n\n return (\n <Presence\n key={index}\n present={true}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n top={top}\n p={2}\n >\n {!bookmarkForPage ? (\n <IconButton\n aria-label=\"bookmark\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.bookmark(index)\n }}\n size=\"lg\"\n bgColor=\"white\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkPlus />\n </IconButton>\n ) : (\n <IconButton\n aria-label=\"bookmark\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n onClick={() => {\n bookmarkForPage &&\n readerWithBookmarks?.bookmarks.delete(\n bookmarkForPage?.id,\n )\n }}\n size=\"lg\"\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkXFill />\n </IconButton>\n )}\n </Box>\n </Presence>\n )\n },\n ),\n spineElement,\n )}\n </>\n )\n})\n","import { Button, Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const BookmarksDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedBookmarks = useObserve(\n () =>\n readerWithBookmarks?.bookmarks.bookmarks$.pipe(\n switchMap((items) => readerWithBookmarks.pagination.locate(items)),\n ),\n [readerWithBookmarks],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedBookmarks>[number],\n index: number,\n ) => (\n <List.Item key={index} justifyContent=\"space-between\" alignItems=\"center\">\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.cfi ?? \"\")\n }}\n >\n <Stack gap={0}>\n <Text fontSize=\"md\">\n {`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown\"\n }`}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n truncate\n lineClamp={2}\n >\n {item.meta?.startNode?.textContent\n ? item.meta?.startNode?.textContent\n : \"...\"}\n </Text>\n </Stack>\n </Link>\n <Button\n colorPalette=\"red\"\n variant=\"solid\"\n size=\"xs\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.delete(item.id)\n }}\n >\n Delete\n </Button>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} variant=\"plain\" overflow=\"auto\">\n {consolidatedBookmarks?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\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 { BookmarksDialogContent } from \"./BookmarksDialogContent\"\n\nexport const BookmarksDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Bookmarks</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <BookmarksDialogContent 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 { 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 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 { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\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 { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\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 = (props: ComponentProps<typeof ThemedSlider>) => {\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 {...props}\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 { Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport { LuChevronDown, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp, LuNotebookPen } from \"react-icons/lu\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasBookmarksEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (\n item: \"annotations\" | \"search\" | \"help\" | \"toc\" | \"bookmarks\",\n ) => 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 present={open} position=\"bottom\">\n <Stack flex={1} overflow=\"auto\">\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=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <Scrubber\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"35px\",\n }}\n />\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 alignItems=\"center\" justifyContent=\"center\">\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\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 display=\"flex\" justifyContent=\"center\">\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"help\")}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"toc\")}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"search\")}\n >\n <LuSearch />\n </IconButton>\n )}\n {hasBookmarksEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\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 { memo } from \"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 = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (item: \"more\" | \"back\") => 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={() => onItemClick(\"back\")}\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={() => onItemClick(\"more\")}\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)\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onItemClick,\n }: {\n onItemClick: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\",\n ) => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar open={quickMenuOpen} onItemClick={onItemClick} />\n <BottomBar open={quickMenuOpen} onItemClick={onItemClick} />\n </>\n )\n },\n)\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { Box, Heading, Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback, useState } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { map, startWith } from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\n\nexport const SearchDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const [text, setText] = useState(\"\")\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setText(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const search = useObserve(\n () =>\n readerWithSearch?.search.search(text).pipe(\n map((data) => ({ type: `end` as const, data })),\n startWith({ type: `start` as const }),\n ),\n [reader, text],\n )\n const searching = search?.type === \"start\"\n const results = search?.type === \"end\" ? search.data : []\n const consolidatedResults = useObserve(\n () => reader?.pagination.locate(results.slice(0, 100)),\n [results],\n )\n\n return (\n <Stack flex={1} height=\"100%\">\n <Box px={4}>\n <Input\n placeholder=\"Type something...\"\n value={text}\n onChange={onValueChange}\n borderRadius={0}\n />\n </Box>\n <Box\n px={4}\n pb={4}\n mt={2}\n flex={1}\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n >\n {searching && <Text>Searching ...</Text>}\n {!searching && results.length === 0 && <p>There are no results</p>}\n {!searching && results.length >= 0 && (\n <Stack>\n <Heading as=\"h2\" size=\"md\">\n {results.length} result(s)\n </Heading>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={text}\n cfi={result.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Box>\n </Stack>\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 { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <SearchDialogContent 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 { 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 { useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { Bookmarks } from \"./bookmarks/Bookmarks\"\nimport { BookmarksDialog } from \"./bookmarks/BookmarksDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./quickmenu/QuickMenu\"\nimport { useQuickMenu } from \"./quickmenu/useQuickMenu\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onItemClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onItemClick?: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpen, setIsAnnotationsOpen] = useState(false)\n const [isBookmarksOpen, setIsBookmarksOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n const onNavigate = useCallback(() => {\n setIsTableOfContentsOpen(false)\n setIsHelpOpen(false)\n setIsSearchOpen(false)\n setIsAnnotationsOpen(false)\n setIsBookmarksOpen(false)\n setQuickMenuOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpen(true)\n } else if (item === \"search\") {\n setIsSearchOpen(true)\n } else if (item === \"help\") {\n setIsHelpOpen(true)\n } else if (item === \"toc\") {\n setIsTableOfContentsOpen(true)\n } else if (item === \"bookmarks\") {\n setIsBookmarksOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\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 onItemClick={_onItemClick} />\n <Bookmarks />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={onNavigate}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={onNavigate}\n />\n <AnnotationsDialog\n open={isAnnotationsOpen}\n setOpen={setIsAnnotationsOpen}\n onNavigate={onNavigate}\n />\n <BookmarksDialog\n open={isBookmarksOpen}\n setOpen={setIsBookmarksOpen}\n onNavigate={onNavigate}\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","CloseButton","React","props","ref","ChakraIconButton","LuX","DialogContent","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useReader","useContext","hasSearchEnhancer","hasBookmarksEnhancer","hasAnnotationsEnhancer","AnnotationsDialogContent","onNavigate","readerWithAnnotations","consolidatedHighlights","useObserve","switchMap","highlights","mapItemToListEntry","item","index","List","jsxs","Link","LuNotebookPen","Stack","Text","_a","AnnotationsDialog","open","setOpen","e","Button","Bookmarks","readerWithBookmarks","spineElement","pages","bookmarks","consolidatedBookmarks","Fragment","createPortal","isBookmarkable","left","top","width","bookmarkForPage","bookmark","Presence","Box","IconButton","BsBookmarkXFill","BsBookmarkPlus","BookmarksDialogContent","items","_e","_d","BookmarksDialog","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","map","state","context","isOnlyImages","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","useState","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","ToggleTip","showArrow","content","ChakraPopover","InfoTip","HiOutlineInformationCircle","ProgressBar","ChakraProgress","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","onItemClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","absolutePageIndex","before","after","SearchDialogContent","setText","readerWithSearch","onValueChange","search","data","startWith","searching","results","consolidatedResults","Input","result","j","_c","_b","_f","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpen","setIsAnnotationsOpen","isBookmarksOpen","setIsBookmarksOpen","setQuickMenuOpen","_onItemClick"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/useReader.ts","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/bookmarks/Bookmarks.tsx","../src/bookmarks/BookmarksDialogContent.tsx","../src/bookmarks/BookmarksDialog.tsx","../src/help/HelpDialog.tsx","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/quickmenu/TimeIndicator.tsx","../src/quickmenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/quickmenu/PaginationInfoSection.tsx","../src/quickmenu/QuickBar.tsx","../src/quickmenu/ThemedSlider.tsx","../src/quickmenu/Scrubber.tsx","../src/quickmenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/quickmenu/TopBar.tsx","../src/quickmenu/QuickMenu.tsx","../src/search/SearchListItem.tsx","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/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 { 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 type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { BookmarksEnhancerAPI } from \"@prose-reader/enhancer-bookmarks\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\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\nexport const hasSearchEnhancer = (\n reader?: Reader,\n): reader is Reader & SearchEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_SEARCH\" in reader\n}\n\nexport const hasBookmarksEnhancer = (\n reader?: Reader,\n): reader is Reader & BookmarksEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_BOOKMARKS\" in reader\n}\n\nexport const hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const AnnotationsDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.highlights$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.pagination.locate(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedHighlights>[number],\n index: number,\n ) => (\n <List.Item key={index}>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.cfi ?? \"\")\n }}\n >\n {(item.contents ?? [])[0] ? (\n <List.Indicator asChild>\n <LuNotebookPen />\n </List.Indicator>\n ) : (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text lineClamp={2} fontSize=\"md\">\n {item.selectionAsText ? (\n (item.selectionAsText ?? \"\")\n ) : (\n <i>\n <b>unknown (not loaded)</b>\n </i>\n )}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {consolidatedHighlights?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\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 { AnnotationsDialogContent } from \"./AnnotationsDialogContent\"\n\nexport const AnnotationsDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Annotations</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <AnnotationsDialogContent 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 { Box, IconButton, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { BsBookmarkPlus, BsBookmarkXFill } from \"react-icons/bs\"\nimport { useObserve } from \"reactjrx\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const Bookmarks = memo(() => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader) ? reader : undefined\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n const pages = useObserve(\n () => readerWithBookmarks?.bookmarks.pages$,\n [readerWithBookmarks],\n )\n const bookmarks = useObserve(\n () => readerWithBookmarks?.bookmarks.bookmarks$,\n [readerWithBookmarks],\n )\n const consolidatedBookmarks = useObserve(\n () => reader?.pagination.locate(bookmarks ?? []),\n [reader, bookmarks],\n )\n\n if (!spineElement) return null\n\n return (\n <>\n {createPortal(\n pages?.map(\n (\n { isBookmarkable, absolutePosition: { left, top, width } },\n index,\n ) => {\n const bookmarkForPage = consolidatedBookmarks?.find(\n (bookmark) => bookmark.meta?.absolutePageIndex === index,\n )\n\n /**\n * Stale bookmarks means we cannot assert at the moment whether the page is marked or not.\n * In this case we just hide the bookmark button. You may want to have different UX to handle\n * this case.\n *\n * This also avoid having a flash where you show an non bookmarked icon and right away change it with\n * a valid marked page icon.\n */\n if (!isBookmarkable) return null\n\n return (\n <Presence\n key={index}\n present={true}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n top={top}\n p={2}\n >\n {!bookmarkForPage ? (\n <IconButton\n aria-label=\"bookmark\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.bookmark(index)\n }}\n size=\"lg\"\n bgColor=\"white\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkPlus />\n </IconButton>\n ) : (\n <IconButton\n aria-label=\"bookmark\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n onClick={() => {\n bookmarkForPage &&\n readerWithBookmarks?.bookmarks.delete(\n bookmarkForPage?.id,\n )\n }}\n size=\"lg\"\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkXFill />\n </IconButton>\n )}\n </Box>\n </Presence>\n )\n },\n ),\n spineElement,\n )}\n </>\n )\n})\n","import { Button, Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const BookmarksDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedBookmarks = useObserve(\n () =>\n readerWithBookmarks?.bookmarks.bookmarks$.pipe(\n switchMap((items) => readerWithBookmarks.pagination.locate(items)),\n ),\n [readerWithBookmarks],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedBookmarks>[number],\n index: number,\n ) => (\n <List.Item key={index} justifyContent=\"space-between\" alignItems=\"center\">\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.cfi ?? \"\")\n }}\n >\n <Stack gap={0}>\n <Text fontSize=\"md\">\n {`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown\"\n }`}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n truncate\n lineClamp={2}\n >\n {item.meta?.startNode?.textContent\n ? item.meta?.startNode?.textContent\n : \"...\"}\n </Text>\n </Stack>\n </Link>\n <Button\n colorPalette=\"red\"\n variant=\"solid\"\n size=\"xs\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.delete(item.id)\n }}\n >\n Delete\n </Button>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} variant=\"plain\" overflow=\"auto\">\n {consolidatedBookmarks?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\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 { BookmarksDialogContent } from \"./BookmarksDialogContent\"\n\nexport const BookmarksDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Bookmarks</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <BookmarksDialogContent 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 { 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 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 { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\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 { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\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 = (props: ComponentProps<typeof ThemedSlider>) => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, [reader]) ?? {}\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 {...props}\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 { Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport { LuChevronDown, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp, LuNotebookPen } from \"react-icons/lu\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasBookmarksEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (\n item: \"annotations\" | \"search\" | \"help\" | \"toc\" | \"bookmarks\",\n ) => 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 present={open} position=\"bottom\">\n <Stack flex={1} overflow=\"auto\">\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=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <Scrubber\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"35px\",\n }}\n />\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 alignItems=\"center\" justifyContent=\"center\">\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\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 display=\"flex\" justifyContent=\"center\">\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"help\")}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"toc\")}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"search\")}\n >\n <LuSearch />\n </IconButton>\n )}\n {hasBookmarksEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\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 { memo } from \"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 = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (item: \"more\" | \"back\") => 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={() => onItemClick(\"back\")}\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={() => onItemClick(\"more\")}\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)\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onItemClick,\n }: {\n onItemClick: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\",\n ) => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar open={quickMenuOpen} onItemClick={onItemClick} />\n <BottomBar open={quickMenuOpen} onItemClick={onItemClick} />\n </>\n )\n },\n)\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { Box, Heading, Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback, useState } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { map, startWith } from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\n\nexport const SearchDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const [text, setText] = useState(\"\")\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setText(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const search = useObserve(\n () =>\n readerWithSearch?.search.search(text).pipe(\n map((data) => ({ type: `end` as const, data })),\n startWith({ type: `start` as const }),\n ),\n [reader, text],\n )\n const searching = search?.type === \"start\"\n const results = search?.type === \"end\" ? search.data : []\n const consolidatedResults = useObserve(\n () => reader?.pagination.locate(results.slice(0, 100)),\n [results],\n )\n\n return (\n <Stack flex={1} height=\"100%\">\n <Box px={4}>\n <Input\n placeholder=\"Type something...\"\n value={text}\n onChange={onValueChange}\n borderRadius={0}\n />\n </Box>\n <Box\n px={4}\n pb={4}\n mt={2}\n flex={1}\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n >\n {searching && <Text>Searching ...</Text>}\n {!searching && results.length === 0 && <p>There are no results</p>}\n {!searching && results.length >= 0 && (\n <Stack>\n <Heading as=\"h2\" size=\"md\">\n {results.length} result(s)\n </Heading>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={text}\n cfi={result.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Box>\n </Stack>\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 { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <SearchDialogContent 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 { 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 { useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { Bookmarks } from \"./bookmarks/Bookmarks\"\nimport { BookmarksDialog } from \"./bookmarks/BookmarksDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./quickmenu/QuickMenu\"\nimport { useQuickMenu } from \"./quickmenu/useQuickMenu\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onItemClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onItemClick?: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpen, setIsAnnotationsOpen] = useState(false)\n const [isBookmarksOpen, setIsBookmarksOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n const onNavigate = useCallback(() => {\n setIsTableOfContentsOpen(false)\n setIsHelpOpen(false)\n setIsSearchOpen(false)\n setIsAnnotationsOpen(false)\n setIsBookmarksOpen(false)\n setQuickMenuOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpen(true)\n } else if (item === \"search\") {\n setIsSearchOpen(true)\n } else if (item === \"help\") {\n setIsHelpOpen(true)\n } else if (item === \"toc\") {\n setIsTableOfContentsOpen(true)\n } else if (item === \"bookmarks\") {\n setIsBookmarksOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\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 onItemClick={_onItemClick} />\n <Bookmarks />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={onNavigate}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={onNavigate}\n />\n <AnnotationsDialog\n open={isAnnotationsOpen}\n setOpen={setIsAnnotationsOpen}\n onNavigate={onNavigate}\n />\n <BookmarksDialog\n open={isBookmarksOpen}\n setOpen={setIsBookmarksOpen}\n onNavigate={onNavigate}\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","CloseButton","React","props","ref","ChakraIconButton","LuX","DialogContent","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useReader","useContext","hasSearchEnhancer","hasBookmarksEnhancer","hasAnnotationsEnhancer","AnnotationsDialogContent","onNavigate","readerWithAnnotations","consolidatedHighlights","useObserve","switchMap","highlights","mapItemToListEntry","item","index","List","jsxs","Link","LuNotebookPen","Stack","Text","_a","AnnotationsDialog","open","setOpen","e","Button","Bookmarks","readerWithBookmarks","spineElement","pages","bookmarks","consolidatedBookmarks","Fragment","createPortal","isBookmarkable","left","top","width","bookmarkForPage","bookmark","Presence","Box","IconButton","BsBookmarkXFill","BsBookmarkPlus","BookmarksDialogContent","items","_e","_d","BookmarksDialog","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","map","state","context","isOnlyImages","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","useState","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","ToggleTip","showArrow","content","ChakraPopover","InfoTip","HiOutlineInformationCircle","ProgressBar","ChakraProgress","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","onItemClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","absolutePageIndex","before","after","SearchDialogContent","setText","readerWithSearch","onValueChange","search","data","startWith","searching","results","consolidatedResults","Input","result","j","_c","_b","_f","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpen","setIsAnnotationsOpen","isBookmarksOpen","setIsBookmarksOpen","setQuickMenuOpen","_onItemClick"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(b,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react"),require("reactjrx"),require("rxjs"),require("@chakra-ui/react"),require("react-icons/lu"),require("react-dom"),require("react-icons/bs"),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-dom","react-icons/bs","react-icons/rx","react-icons/hi","rc-slider","rc-slider/assets/index.css","react-icons/io","react-icons/md"],e):(b=typeof globalThis<"u"?globalThis:b||self,e(b["prose-react-reader"]={},b.jsxRuntime,b.React,b.reactjrx,b.rxjs,b.react,b.lu,b.reactDom,b.bs,b.rx,b.hi,b.RcSlider,null,b.io,b.md))})(this,function(b,e,d,f,T,s,k,X,N,m,J,Z,Le,V,Y){"use strict";function j(o){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const t in o)if(t!=="default"){const l=Object.getOwnPropertyDescriptor(o,t);Object.defineProperty(n,t,l.get?l:{enumerable:!0,get:()=>o[t]})}}return n.default=o,Object.freeze(n)}const y=j(d),$=d.createContext({reader:void 0,quickMenuSignal:f.signal({default:!1})}),R=d.memo(({children:o,reader:n,quickMenuOpen:t,onQuickMenuOpenChange:l})=>{const[,i]=f.useSignal({default:t}),r=f.useLiveRef(l),c=d.useMemo(()=>({quickMenuSignal:i,reader:n}),[i,n]);return d.useEffect(()=>{i.setValue(t)},[t,i]),f.useSubscribe(()=>i.subject.pipe(T.tap(r.current)),[i,r]),e.jsx($.Provider,{value:c,children:o})}),ee=y.forwardRef(function(n,t){return e.jsx(s.IconButton,{variant:"ghost","aria-label":"Close",ref:t,...n,children:n.children??e.jsx(k.LuX,{})})}),D=y.forwardRef(function(n,t){const{children:l,portalled:i=!0,portalRef:r,backdrop:c=!0,...g}=n;return e.jsxs(s.Portal,{disabled:!i,container:r,children:[c&&e.jsx(s.Dialog.Backdrop,{}),e.jsx(s.Dialog.Positioner,{children:e.jsx(s.Dialog.Content,{ref:t,...g,asChild:!1,children:l})})]})}),B=y.forwardRef(function(n,t){return e.jsx(s.Dialog.CloseTrigger,{position:"absolute",top:"2",insetEnd:"2",...n,asChild:!0,children:e.jsx(ee,{size:"sm",ref:t,children:n.children})})}),z=s.Dialog.Root,A=s.Dialog.Footer,E=s.Dialog.Header,L=s.Dialog.Body;s.Dialog.Backdrop;const M=s.Dialog.Title;s.Dialog.Description,s.Dialog.Trigger;const _=s.Dialog.ActionTrigger,I=()=>{const{reader:o}=d.useContext($);return o},U=o=>!!o&&"__PROSE_READER_ENHANCER_SEARCH"in o,H=o=>!!o&&"__PROSE_READER_ENHANCER_BOOKMARKS"in o,Q=o=>!!o&&"__PROSE_READER_ENHANCER_ANNOTATIONS"in o,oe=d.memo(({onNavigate:o})=>{const n=I(),t=Q(n)?n:void 0,l=f.useObserve(()=>t==null?void 0:t.annotations.highlights$.pipe(T.switchMap(r=>t.pagination.locate(r))),[t]),i=(r,c)=>{var g;return e.jsx(s.List.Item,{children:e.jsxs(s.Link,{href:"#",onClick:()=>{o(),n==null||n.navigation.goToCfi(r.cfi??"")},children:[(r.contents??[])[0]?e.jsx(s.List.Indicator,{asChild:!0,children:e.jsx(k.LuNotebookPen,{})}):e.jsx(s.List.Indicator,{asChild:!0,visibility:"hidden",children:e.jsx(k.LuNotebookPen,{})}),e.jsxs(s.Stack,{gap:0,children:[e.jsx(s.Text,{lineClamp:2,fontSize:"md",children:r.selectionAsText?r.selectionAsText??"":e.jsx("i",{children:e.jsx("b",{children:"unknown (not loaded)"})})}),e.jsx(s.Text,{fontStyle:"italic",fontWeight:"bold",fontSize:"sm",children:`Book page: ${((g=r.meta)==null?void 0:g.absolutePageIndex)!==void 0?r.meta.absolutePageIndex+1:"unknown (not loaded)"}`})]})]})},c)};return e.jsx(s.List.Root,{overflowY:"auto",gap:3,pt:4,variant:"plain",children:l==null?void 0:l.map((r,c)=>i(r,c))})}),ne=d.memo(({open:o,setOpen:n,onNavigate:t})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:l=>n(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{height:"100%",children:[e.jsx(E,{children:e.jsx(M,{children:"Annotations"})}),e.jsx(L,{flex:1,children:e.jsx(oe,{onNavigate:t})}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),se=d.memo(()=>{const o=I(),n=H(o)?o:void 0,t=f.useObserve(()=>o==null?void 0:o.spine.element$,[o]),l=f.useObserve(()=>n==null?void 0:n.bookmarks.pages$,[n]),i=f.useObserve(()=>n==null?void 0:n.bookmarks.bookmarks$,[n]),r=f.useObserve(()=>o==null?void 0:o.pagination.locate(i??[]),[o,i]);return t?e.jsx(e.Fragment,{children:X.createPortal(l==null?void 0:l.map(({isBookmarkable:c,absolutePosition:{left:g,top:p,width:a}},u)=>{const h=r==null?void 0:r.find(x=>{var v;return((v=x.meta)==null?void 0:v.absolutePageIndex)===u});return c?e.jsx(s.Presence,{present:!0,lazyMount:!0,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"moderate",children:e.jsx(s.Box,{"data-bookmark-area":!0,position:"absolute",left:g+a,transform:"translateX(-100%)",top:p,p:2,children:h?e.jsx(s.IconButton,{"aria-label":"bookmark",opacity:.5,_hover:{opacity:1},onClick:()=>{h&&(n==null||n.bookmarks.delete(h==null?void 0:h.id))},size:"lg",variant:"ghost",_icon:{boxSize:"36px"},children:e.jsx(N.BsBookmarkXFill,{})}):e.jsx(s.IconButton,{"aria-label":"bookmark",onClick:()=>{n==null||n.bookmarks.bookmark(u)},size:"lg",bgColor:"white",opacity:.5,_hover:{opacity:1},variant:"ghost",_icon:{boxSize:"36px"},children:e.jsx(N.BsBookmarkPlus,{})})})},u):null}),t)}):null}),te=d.memo(({onNavigate:o})=>{const n=I(),t=H(n)?n:void 0,l=f.useObserve(()=>t==null?void 0:t.bookmarks.bookmarks$.pipe(T.switchMap(r=>t.pagination.locate(r))),[t]),i=(r,c)=>{var g,p,a,u,h;return e.jsxs(s.List.Item,{justifyContent:"space-between",alignItems:"center",children:[e.jsx(s.Link,{href:"#",onClick:()=>{o(),n==null||n.navigation.goToCfi(r.cfi??"")},children:e.jsxs(s.Stack,{gap:0,children:[e.jsx(s.Text,{fontSize:"md",children:`Book page: ${((g=r.meta)==null?void 0:g.absolutePageIndex)!==void 0?r.meta.absolutePageIndex+1:"unknown"}`}),e.jsx(s.Text,{fontStyle:"italic",fontWeight:"bold",fontSize:"sm",truncate:!0,lineClamp:2,children:(a=(p=r.meta)==null?void 0:p.startNode)!=null&&a.textContent?(h=(u=r.meta)==null?void 0:u.startNode)==null?void 0:h.textContent:"..."})]})}),e.jsx(s.Button,{colorPalette:"red",variant:"solid",size:"xs",onClick:()=>{t==null||t.bookmarks.delete(r.id)},children:"Delete"})]},c)};return e.jsx(s.List.Root,{overflowY:"auto",gap:3,variant:"plain",overflow:"auto",children:l==null?void 0:l.map((r,c)=>i(r,c))})}),le=d.memo(({open:o,setOpen:n,onNavigate:t})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:l=>n(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{height:"100%",children:[e.jsx(E,{children:e.jsx(M,{children:"Bookmarks"})}),e.jsx(L,{children:e.jsx(te,{onNavigate:t})}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),re="@prose-reader/react-reader",ie="1.192.0",ae=d.memo(({open:o,setOpen:n})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:t=>n(t.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{children:[e.jsx(E,{children:e.jsx(M,{children:"Help"})}),e.jsxs(L,{overflowY:"auto",flex:1,children:[e.jsx(s.Heading,{mb:2,as:"h3",size:"lg",children:"Shortcuts"}),e.jsxs(s.HStack,{mb:1,children:[e.jsx(s.Kbd,{children:e.jsx(k.LuArrowBigRight,{})})," ",e.jsx(s.Text,{children:"Navigate to right page"})]}),e.jsxs(s.HStack,{mb:1,children:[e.jsx(s.Kbd,{children:e.jsx(k.LuArrowBigLeft,{})})," ",e.jsx(s.Text,{children:"Navigate to left page"})]}),e.jsx(s.Heading,{mb:2,mt:4,as:"h3",size:"lg",children:"About"}),e.jsxs(s.Text,{children:[re," version: ",ie]})]}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),w=()=>{const o=I();return f.useObserve(()=>o?T.combineLatest([o.pagination.state$,o.context.state$]).pipe(T.map(([n,t])=>{var i;const l=(i=t.manifest)==null?void 0:i.spineItems.every(r=>{var c;return(c=r.mediaType)==null?void 0:c.startsWith("image/")});return{...n,hasChapters:!t.isFullyPrePaginated&&!l}})):T.NEVER,[o])},ce=()=>{const o=w(),n=Math.floor(((o==null?void 0:o.percentageEstimateOfBook)??0)*100),t=n>0?n:1;return(o==null?void 0:o.percentageEstimateOfBook)===void 0?null:e.jsx(s.Box,{position:"absolute",right:0,bottom:0,p:2,color:"black",children:e.jsxs(s.Text,{fontSize:"sm",children:[t," %"]})})},de=()=>{const[o,n]=d.useState(new Date);return d.useEffect(()=>{const t=setInterval(()=>{n(new Date)},6e4);return()=>clearInterval(t)},[]),o},he=o=>{const n=de();return e.jsx(s.Text,{fontSize:"xs",...o,children:n.toLocaleTimeString(navigator.language,{hour:"2-digit",minute:"2-digit"})})},q=()=>{const{quickMenuSignal:o}=d.useContext($);return[f.useSignalValue(o),o.setValue,o]},ge=()=>{const[o]=q();return e.jsx(s.Box,{position:"absolute",left:0,bottom:0,p:2,color:o?void 0:"colorPalette.contrast",children:e.jsx(he,{})})},pe=y.forwardRef(function(n,t){const{showArrow:l,children:i,portalled:r=!0,content:c,portalRef:g,...p}=n;return e.jsxs(s.Popover.Root,{...p,positioning:{...p.positioning,gutter:4},children:[e.jsx(s.Popover.Trigger,{asChild:!0,children:i}),e.jsx(s.Portal,{disabled:!r,container:g,children:e.jsx(s.Popover.Positioner,{children:e.jsxs(s.Popover.Content,{width:"auto",px:"2",py:"1",textStyle:"xs",rounded:"sm",ref:t,children:[l&&e.jsx(s.Popover.Arrow,{children:e.jsx(s.Popover.ArrowTip,{})}),c]})})})]})}),fe=y.forwardRef(function(n,t){const{children:l,...i}=n;return e.jsx(pe,{content:l,...i,ref:t,children:e.jsx(s.IconButton,{variant:"ghost","aria-label":"info",size:"2xs",colorPalette:"gray",children:e.jsx(J.HiOutlineInformationCircle,{})})})}),ue=y.forwardRef(function(n,t){return e.jsx(s.Progress.Track,{...n,ref:t,children:e.jsx(s.Progress.Range,{})})});y.forwardRef(function(n,t){const{children:l,info:i,...r}=n;return e.jsxs(s.Progress.Label,{...r,ref:t,children:[l,i&&e.jsx(fe,{children:i})]})});const be=s.Progress.Root,xe=s.Progress.ValueText,F=()=>{const o=w(),n=(o==null?void 0:o.numberOfTotalPages)===1,t=((o==null?void 0:o.beginNumberOfPagesInSpineItem)??0)>1,l=((o==null?void 0:o.endNumberOfPagesInSpineItem)??0)>1,i=(o!=null&&o.hasChapters?o==null?void 0:o.beginPageIndexInSpineItem:o==null?void 0:o.beginAbsolutePageIndex)??0,r=(o!=null&&o.hasChapters?o==null?void 0:o.endPageIndexInSpineItem:o==null?void 0:o.endAbsolutePageIndex)??0,[c=0,g=0]=[i,r].sort((u,h)=>u-h),p=(o==null?void 0:o.beginPageIndexInSpineItem)!==(o==null?void 0:o.endPageIndexInSpineItem)||(o==null?void 0:o.beginSpineItemIndex)!==(o==null?void 0:o.endSpineItemIndex),a=o!=null&&o.hasChapters?o==null?void 0:o.beginNumberOfPagesInSpineItem:o==null?void 0:o.numberOfTotalPages;return{hasOnlyOnePage:n,beginPageIndex:i,endPageIndex:r,isBeginWithinChapter:t,isEndWithinChapter:l,beginAndEndAreDifferent:p,totalApproximatePages:a,leftPageIndex:c,rightPageIndex:g}},ve=()=>{const o=w(),{hasOnlyOnePage:n,leftPageIndex:t,rightPageIndex:l,totalApproximatePages:i,beginAndEndAreDifferent:r}=F(),c=Math.round(((o==null?void 0:o.percentageEstimateOfBook)??0)*100),g=a=>a!=null&&a.subChapter?`${a.title} / ${g(a.subChapter)}`:(a==null?void 0:a.title)||"",p=g(o==null?void 0:o.beginChapterInfo);return e.jsxs(s.Stack,{alignItems:"center",gap:1,maxW:"100%",overflow:"auto",children:[e.jsx(be,{value:c,size:"xs",width:150,children:e.jsxs(s.HStack,{justifyContent:"space-between",children:[e.jsx(ue,{width:110}),e.jsx(xe,{children:`${c}%`})]})}),e.jsx(s.Text,{truncate:!0,maxWidth:"100%",fontSize:"sm",mt:1,children:p?`Chapter: ${p}`:" "}),!n&&e.jsxs(s.HStack,{children:[e.jsx(s.Text,{fontSize:"xs",children:r?`${t+1} - ${l+1} of ${i}`:`${t+1} of ${i}`}),!!(o!=null&&o.hasChapters)&&e.jsxs(e.Fragment,{children:[e.jsx(s.Text,{children:"-"}),e.jsxs(s.Text,{fontSize:"xs",children:["(",((o==null?void 0:o.beginAbsolutePageIndex)??0)+1,")"]})]})]})]})},G=d.memo(({children:o,position:n,...t})=>e.jsx(s.Presence,{display:"flex",flexDirection:"row",width:"100%",position:"absolute",...n==="bottom"?{bottom:0}:{top:0},animationName:n==="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,...t,children:o})),Ce=s.chakra(Z),ke=d.memo(o=>e.jsx(s.Box,{display:"contents",css:{"--bg":"colors.bg","--bg-emphasized":"colors.bg.emphasized","--color-solid":"colors.colorPalette.solid"},children:e.jsx(Ce,{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(${o.reverse?"50%":"-50%"}, -50%)`,backgroundColor:"var(--bg)",marginTop:"0px"}},...o})})),Se=()=>{const o=w(),n=o==null?void 0:o.isUsingSpread,{beginPageIndex:t,totalApproximatePages:l=0}=F(),i=n?Math.floor((t||0)/2):t,[r,c]=f.useSignal({default:i||0}),g=0,p=Math.max(0,n?Math.floor((l-1)/2):l-1);return d.useEffect(()=>{c.setValue(i||0)},[i,c]),{value:r,valueSignal:c,min:g,max:p}},Ie=o=>{const n=I(),t=w(),{manifest:l}=f.useObserve(()=>n==null?void 0:n.context.state$,[])??{},i=(l==null?void 0:l.readingDirection)==="rtl",r=t==null?void 0:t.isUsingSpread,{totalApproximatePages:c=0,isBeginWithinChapter:g}=F(),p=1,a=g,{value:u,valueSignal:h,min:x,max:v}=Se(),P=d.useCallback(C=>{const[O=0]=Array.isArray(C)?C:[C];h.setValue(O);const S=r?Math.floor(O)*2:Math.floor(O);a?n==null||n.navigation.goToPageOfSpineItem({pageIndex:S,spineItemId:n.pagination.getState().beginSpineItemIndex??0,animation:!1}):n==null||n.navigation.goToAbsolutePageIndex({absolutePageIndex:S,animation:!1})},[n,r,h,a]);return f.useSubscribe(()=>n==null?void 0:n.navigation.throttleLock({duration:100,trigger:h.subject}),[n,h]),c===1||r&&c===2?null:e.jsx(ke,{value:[u],max:v,min:x,reverse:i,step:p,onChange:P,...o})},Pe=d.memo(({open:o,onItemClick:n})=>{const t=I(),l=f.useObserve(()=>t==null?void 0:t.navigation.state$,[t]),i=f.useObserve(()=>t==null?void 0:t.settings.values$,[t]),r=(i==null?void 0:i.computedPageTurnDirection)==="vertical",[c,g]=d.useState(!0);return e.jsx(G,{present:o,position:"bottom",children:e.jsxs(s.Stack,{flex:1,overflow:"auto",children:[e.jsxs(s.HStack,{flex:1,alignItems:"center",justifyContent:"center",children:[e.jsx(s.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:()=>t==null?void 0:t.navigation.goToLeftOrTopSpineItem(),disabled:!(l!=null&&l.canGoLeftSpineItem)&&!(l!=null&&l.canGoTopSpineItem),children:r?e.jsx(m.RxDoubleArrowUp,{}):e.jsx(m.RxDoubleArrowLeft,{})}),e.jsxs(s.Stack,{flex:1,maxW:400,gap:2,alignItems:"center",overflow:"auto",px:4,children:[e.jsx(ve,{}),e.jsx(Ie,{style:{width:"100%",maxWidth:"300px",height:"35px"}})]}),e.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",disabled:!(l!=null&&l.canGoRightSpineItem)&&!(l!=null&&l.canGoBottomSpineItem),onClick:()=>{t==null||t.navigation.goToRightOrBottomSpineItem()},children:r?e.jsx(m.RxDoubleArrowDown,{}):e.jsx(m.RxDoubleArrowRight,{})})]}),e.jsx(s.HStack,{alignItems:"center",justifyContent:"center",children:e.jsxs(s.Collapsible.Root,{open:c,flex:1,onOpenChange:({open:p})=>{g(p)},children:[e.jsx(s.Collapsible.Trigger,{paddingY:"3",width:"100%",display:"flex",justifyContent:"center",children:e.jsx(k.LuChevronDown,{style:{transform:c?"rotate(0deg)":"rotate(180deg)"}})}),e.jsxs(s.Collapsible.Content,{display:"flex",justifyContent:"center",children:[e.jsx(s.IconButton,{"aria-label":"Help",size:"lg",variant:"ghost",onClick:()=>n("help"),children:e.jsx(k.LuCircleHelp,{})}),e.jsx(s.IconButton,{"aria-label":"Table of contents",size:"lg",variant:"ghost",onClick:()=>n("toc"),children:e.jsx(k.LuTableOfContents,{})}),U(t)&&e.jsx(s.IconButton,{"aria-label":"Search",size:"lg",variant:"ghost",onClick:()=>n("search"),children:e.jsx(k.LuSearch,{})}),H(t)&&e.jsx(s.IconButton,{"aria-label":"Search",size:"lg",variant:"ghost",onClick:()=>n("bookmarks"),children:e.jsx(N.BsBookmarks,{})}),Q(t)&&e.jsx(s.IconButton,{"aria-label":"Search",size:"lg",variant:"ghost",onClick:()=>n("annotations"),children:e.jsx(k.LuNotebookPen,{})})]})]})})]})})}),Te=()=>{const[o,n]=d.useState(!1),t=d.useCallback(()=>document.fullscreenElement?document.exitFullscreen().catch(console.error).then(()=>{n(!1)}):document.documentElement.requestFullscreen({navigationUI:"hide"}).catch(console.error).then(()=>{n(!0)}),[]);return d.useEffect(()=>{function l(){n(!!document.fullscreenElement)}return document.addEventListener("fullscreenchange",l),()=>{document.removeEventListener("fullscreenchange",l)}},[]),{isFullscreen:o,onToggleFullscreenClick:t}},Oe=d.memo(({open:o,onItemClick:n})=>{const t=I(),l=f.useObserve(()=>t==null?void 0:t.context.manifest$,[t]),{isFullscreen:i,onToggleFullscreenClick:r}=Te();return e.jsxs(G,{present:o,position:"top",height:"80px",justifyContent:"space-between",children:[e.jsx(s.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:()=>n("back"),children:e.jsx(V.IoIosArrowBack,{})}),e.jsx(s.Stack,{flex:1,maxW:600,gap:1,alignItems:"center",overflow:"auto",px:4,children:e.jsx(s.Text,{truncate:!0,maxWidth:"100%",children:l==null?void 0:l.title})}),e.jsxs(s.HStack,{children:[e.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:()=>n("more"),children:e.jsx(V.IoMdMore,{})}),e.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:r,children:i?e.jsx(Y.MdFullscreenExit,{}):e.jsx(Y.MdFullscreen,{})})]})]})}),ye=d.memo(({onItemClick:o})=>{const[n]=q();return e.jsxs(e.Fragment,{children:[e.jsx(Oe,{open:n,onItemClick:o}),e.jsx(Pe,{open:n,onItemClick:o})]})}),we=d.memo(({contextText:o="",startOffset:n=0,text:t,cfi:l="#",onClick:i,absolutePageIndex:r})=>{const g=o.substring(Math.max(n-15,0),Math.max(n,0)),p=o.substring(Math.min(n+t.length,o.length-1),Math.min(n+t.length+15,o.length-1));return e.jsxs(s.Link,{href:l,style:{margin:5,overflow:"hidden"},onClick:a=>{a.preventDefault(),i(l)},display:"flex",flexDirection:"column",alignItems:"flex-start",gap:0,children:[e.jsxs(s.Text,{lineClamp:1,as:"cite",style:{display:"block"},children:['"',g,e.jsx("b",{children:t}),p,'"']}),e.jsx(s.Text,{fontSize:"sm",color:"gray.500",style:{textDecoration:"none"},children:`Book page: ${r!==void 0?r+1:"unknown (not loaded)"}`})]})}),De=d.memo(({onNavigate:o})=>{const[n,t]=d.useState(""),l=I(),i=U(l)?l:void 0,r=h=>{t(h.target.value)},c=d.useCallback(h=>{o(),l==null||l.navigation.goToCfi(h)},[l,o]),g=f.useObserve(()=>i==null?void 0:i.search.search(n).pipe(T.map(h=>({type:"end",data:h})),T.startWith({type:"start"})),[l,n]),p=(g==null?void 0:g.type)==="start",a=(g==null?void 0:g.type)==="end"?g.data:[],u=f.useObserve(()=>l==null?void 0:l.pagination.locate(a.slice(0,100)),[a]);return e.jsxs(s.Stack,{flex:1,height:"100%",children:[e.jsx(s.Box,{px:4,children:e.jsx(s.Input,{placeholder:"Type something...",value:n,onChange:r,borderRadius:0})}),e.jsxs(s.Box,{px:4,pb:4,mt:2,flex:1,style:{overflow:"hidden",overflowY:"auto"},children:[p&&e.jsx(s.Text,{children:"Searching ..."}),!p&&a.length===0&&e.jsx("p",{children:"There are no results"}),!p&&a.length>=0&&e.jsxs(s.Stack,{children:[e.jsxs(s.Heading,{as:"h2",size:"md",children:[a.length," result(s)"]}),e.jsx(s.Stack,{gap:0,children:u==null?void 0:u.map((h,x)=>{var v,P,C,O,S,K,W;return e.jsx(we,{contextText:((C=(P=(v=h.meta)==null?void 0:v.range)==null?void 0:P.startContainer.parentElement)==null?void 0:C.textContent)??"",pageIndex:(O=h.meta)==null?void 0:O.itemPageIndex,startOffset:((K=(S=h.meta)==null?void 0:S.range)==null?void 0:K.startOffset)??0,text:n,cfi:h.cfi,onClick:c,absolutePageIndex:(W=h.meta)==null?void 0:W.absolutePageIndex},x)})})]})]})]})}),Be=d.memo(({open:o,setOpen:n,onNavigate:t})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:l=>n(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{height:"100%",children:[e.jsx(E,{children:e.jsx(M,{children:"Search"})}),e.jsx(L,{flex:1,children:e.jsx(De,{onNavigate:t})}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),ze=d.memo(({onNavigate:o})=>{const n=I(),{manifest:t,assumedRenditionLayout:l}=f.useObserve(()=>n==null?void 0:n.context.state$,[n])??{},{nav:i}=t??{},r=w();i!=null&&i.toc;const{beginSpineItemIndex:c,beginPageIndexInSpineItem:g}=r??{},p=(l==="reflowable"?g:c)||0;console.log({assumedRenditionLayout:l,currentSpineItemOrChapterPageIndex:p});let a=r==null?void 0:r.beginChapterInfo;for(;a!=null&&a.subChapter;)a=a==null?void 0:a.subChapter;const u=(h,x,v)=>e.jsxs(d.Fragment,{children:[e.jsx(s.List.Item,{pl:4*(v+1),style:{display:"flex",alignItems:"center"},children:e.jsxs(s.Link,{onClick:()=>{o(),n==null||n.navigation.goToUrl(h.href)},href:"#",children:[(a==null?void 0:a.path)===h.path&&e.jsx(s.List.Indicator,{asChild:!0,children:e.jsx(k.LuCircleCheck,{})}),(a==null?void 0:a.path)!==h.path&&e.jsx(s.List.Indicator,{asChild:!0,visibility:"hidden",children:e.jsx(k.LuCircleCheck,{})}),e.jsxs(s.Stack,{gap:0,children:[e.jsx(s.Text,{fontSize:"md",children:h.title||h.path}),(a==null?void 0:a.path)===h.path&&e.jsx(s.Text,{fontStyle:"italic",fontWeight:"bold",fontSize:"sm",children:`Currently on page ${p+1}`})]})]})}),h.contents.length>0&&e.jsx(s.List.Root,{as:"div",gap:2,children:h.contents.map((P,C)=>u(P,C,v+1))})]},x);return e.jsx(s.List.Root,{gap:3,overflowY:"auto",py:4,flex:1,children:i==null?void 0:i.toc.map((h,x)=>u(h,x,0))})}),Ae=d.memo(({open:o,setOpen:n,onNavigate:t})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:l=>n(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{children:[e.jsx(E,{children:e.jsx(M,{children:"Table of Contents"})}),e.jsx(L,{overflowY:"auto",flex:1,children:e.jsx(ze,{onNavigate:t})}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),Ee=({enableFloatingTime:o=!0,enableFloatingProgress:n=!0,onItemClick:t})=>{const[l,i]=d.useState(!1),[r,c]=d.useState(!1),[g,p]=d.useState(!1),[a,u]=d.useState(!1),[h,x]=d.useState(!1),[v,P]=q(),C=d.useCallback(()=>{i(!1),c(!1),p(!1),u(!1),x(!1),P(!1)},[P]),O=d.useCallback(S=>{S==="annotations"?u(!0):S==="search"?p(!0):S==="help"?c(!0):S==="toc"?i(!0):S==="bookmarks"&&x(!0),t==null||t(S)},[t]);return e.jsxs(e.Fragment,{children:[n&&e.jsx(s.Presence,{present:!v,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"moderate",children:e.jsx(ce,{})}),e.jsx(ye,{onItemClick:O}),e.jsx(se,{}),e.jsx(ae,{open:r,setOpen:c}),e.jsx(Ae,{open:l,setOpen:i,onNavigate:C}),e.jsx(Be,{open:g,setOpen:p,onNavigate:C}),e.jsx(ne,{open:a,setOpen:u,onNavigate:C}),e.jsx(le,{open:h,setOpen:x,onNavigate:C}),e.jsx(s.Presence,{present:o||v,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"slow",overflow:"hidden",children:e.jsx(ge,{})})]})};b.ReactReader=Ee,b.ReactReaderProvider=R,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
1
+ (function(b,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react"),require("reactjrx"),require("rxjs"),require("@chakra-ui/react"),require("react-icons/lu"),require("react-dom"),require("react-icons/bs"),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-dom","react-icons/bs","react-icons/rx","react-icons/hi","rc-slider","rc-slider/assets/index.css","react-icons/io","react-icons/md"],e):(b=typeof globalThis<"u"?globalThis:b||self,e(b["prose-react-reader"]={},b.jsxRuntime,b.React,b.reactjrx,b.rxjs,b.react,b.lu,b.reactDom,b.bs,b.rx,b.hi,b.RcSlider,null,b.io,b.md))})(this,function(b,e,d,f,T,s,k,X,N,m,J,Z,Le,V,Y){"use strict";function j(o){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const t in o)if(t!=="default"){const l=Object.getOwnPropertyDescriptor(o,t);Object.defineProperty(n,t,l.get?l:{enumerable:!0,get:()=>o[t]})}}return n.default=o,Object.freeze(n)}const y=j(d),$=d.createContext({reader:void 0,quickMenuSignal:f.signal({default:!1})}),R=d.memo(({children:o,reader:n,quickMenuOpen:t,onQuickMenuOpenChange:l})=>{const[,i]=f.useSignal({default:t}),r=f.useLiveRef(l),c=d.useMemo(()=>({quickMenuSignal:i,reader:n}),[i,n]);return d.useEffect(()=>{i.setValue(t)},[t,i]),f.useSubscribe(()=>i.subject.pipe(T.tap(r.current)),[i,r]),e.jsx($.Provider,{value:c,children:o})}),ee=y.forwardRef(function(n,t){return e.jsx(s.IconButton,{variant:"ghost","aria-label":"Close",ref:t,...n,children:n.children??e.jsx(k.LuX,{})})}),D=y.forwardRef(function(n,t){const{children:l,portalled:i=!0,portalRef:r,backdrop:c=!0,...g}=n;return e.jsxs(s.Portal,{disabled:!i,container:r,children:[c&&e.jsx(s.Dialog.Backdrop,{}),e.jsx(s.Dialog.Positioner,{children:e.jsx(s.Dialog.Content,{ref:t,...g,asChild:!1,children:l})})]})}),B=y.forwardRef(function(n,t){return e.jsx(s.Dialog.CloseTrigger,{position:"absolute",top:"2",insetEnd:"2",...n,asChild:!0,children:e.jsx(ee,{size:"sm",ref:t,children:n.children})})}),z=s.Dialog.Root,A=s.Dialog.Footer,E=s.Dialog.Header,L=s.Dialog.Body;s.Dialog.Backdrop;const M=s.Dialog.Title;s.Dialog.Description,s.Dialog.Trigger;const _=s.Dialog.ActionTrigger,I=()=>{const{reader:o}=d.useContext($);return o},U=o=>!!o&&"__PROSE_READER_ENHANCER_SEARCH"in o,H=o=>!!o&&"__PROSE_READER_ENHANCER_BOOKMARKS"in o,Q=o=>!!o&&"__PROSE_READER_ENHANCER_ANNOTATIONS"in o,oe=d.memo(({onNavigate:o})=>{const n=I(),t=Q(n)?n:void 0,l=f.useObserve(()=>t==null?void 0:t.annotations.highlights$.pipe(T.switchMap(r=>t.pagination.locate(r))),[t]),i=(r,c)=>{var g;return e.jsx(s.List.Item,{children:e.jsxs(s.Link,{href:"#",onClick:()=>{o(),n==null||n.navigation.goToCfi(r.cfi??"")},children:[(r.contents??[])[0]?e.jsx(s.List.Indicator,{asChild:!0,children:e.jsx(k.LuNotebookPen,{})}):e.jsx(s.List.Indicator,{asChild:!0,visibility:"hidden",children:e.jsx(k.LuNotebookPen,{})}),e.jsxs(s.Stack,{gap:0,children:[e.jsx(s.Text,{lineClamp:2,fontSize:"md",children:r.selectionAsText?r.selectionAsText??"":e.jsx("i",{children:e.jsx("b",{children:"unknown (not loaded)"})})}),e.jsx(s.Text,{fontStyle:"italic",fontWeight:"bold",fontSize:"sm",children:`Book page: ${((g=r.meta)==null?void 0:g.absolutePageIndex)!==void 0?r.meta.absolutePageIndex+1:"unknown (not loaded)"}`})]})]})},c)};return e.jsx(s.List.Root,{overflowY:"auto",gap:3,pt:4,variant:"plain",children:l==null?void 0:l.map((r,c)=>i(r,c))})}),ne=d.memo(({open:o,setOpen:n,onNavigate:t})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:l=>n(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{height:"100%",children:[e.jsx(E,{children:e.jsx(M,{children:"Annotations"})}),e.jsx(L,{flex:1,children:e.jsx(oe,{onNavigate:t})}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),se=d.memo(()=>{const o=I(),n=H(o)?o:void 0,t=f.useObserve(()=>o==null?void 0:o.spine.element$,[o]),l=f.useObserve(()=>n==null?void 0:n.bookmarks.pages$,[n]),i=f.useObserve(()=>n==null?void 0:n.bookmarks.bookmarks$,[n]),r=f.useObserve(()=>o==null?void 0:o.pagination.locate(i??[]),[o,i]);return t?e.jsx(e.Fragment,{children:X.createPortal(l==null?void 0:l.map(({isBookmarkable:c,absolutePosition:{left:g,top:p,width:a}},u)=>{const h=r==null?void 0:r.find(x=>{var v;return((v=x.meta)==null?void 0:v.absolutePageIndex)===u});return c?e.jsx(s.Presence,{present:!0,lazyMount:!0,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"moderate",children:e.jsx(s.Box,{"data-bookmark-area":!0,position:"absolute",left:g+a,transform:"translateX(-100%)",top:p,p:2,children:h?e.jsx(s.IconButton,{"aria-label":"bookmark",opacity:.5,_hover:{opacity:1},onClick:()=>{h&&(n==null||n.bookmarks.delete(h==null?void 0:h.id))},size:"lg",variant:"ghost",_icon:{boxSize:"36px"},children:e.jsx(N.BsBookmarkXFill,{})}):e.jsx(s.IconButton,{"aria-label":"bookmark",onClick:()=>{n==null||n.bookmarks.bookmark(u)},size:"lg",bgColor:"white",opacity:.5,_hover:{opacity:1},variant:"ghost",_icon:{boxSize:"36px"},children:e.jsx(N.BsBookmarkPlus,{})})})},u):null}),t)}):null}),te=d.memo(({onNavigate:o})=>{const n=I(),t=H(n)?n:void 0,l=f.useObserve(()=>t==null?void 0:t.bookmarks.bookmarks$.pipe(T.switchMap(r=>t.pagination.locate(r))),[t]),i=(r,c)=>{var g,p,a,u,h;return e.jsxs(s.List.Item,{justifyContent:"space-between",alignItems:"center",children:[e.jsx(s.Link,{href:"#",onClick:()=>{o(),n==null||n.navigation.goToCfi(r.cfi??"")},children:e.jsxs(s.Stack,{gap:0,children:[e.jsx(s.Text,{fontSize:"md",children:`Book page: ${((g=r.meta)==null?void 0:g.absolutePageIndex)!==void 0?r.meta.absolutePageIndex+1:"unknown"}`}),e.jsx(s.Text,{fontStyle:"italic",fontWeight:"bold",fontSize:"sm",truncate:!0,lineClamp:2,children:(a=(p=r.meta)==null?void 0:p.startNode)!=null&&a.textContent?(h=(u=r.meta)==null?void 0:u.startNode)==null?void 0:h.textContent:"..."})]})}),e.jsx(s.Button,{colorPalette:"red",variant:"solid",size:"xs",onClick:()=>{t==null||t.bookmarks.delete(r.id)},children:"Delete"})]},c)};return e.jsx(s.List.Root,{overflowY:"auto",gap:3,variant:"plain",overflow:"auto",children:l==null?void 0:l.map((r,c)=>i(r,c))})}),le=d.memo(({open:o,setOpen:n,onNavigate:t})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:l=>n(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{height:"100%",children:[e.jsx(E,{children:e.jsx(M,{children:"Bookmarks"})}),e.jsx(L,{children:e.jsx(te,{onNavigate:t})}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),re="@prose-reader/react-reader",ie="1.193.0",ae=d.memo(({open:o,setOpen:n})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:t=>n(t.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{children:[e.jsx(E,{children:e.jsx(M,{children:"Help"})}),e.jsxs(L,{overflowY:"auto",flex:1,children:[e.jsx(s.Heading,{mb:2,as:"h3",size:"lg",children:"Shortcuts"}),e.jsxs(s.HStack,{mb:1,children:[e.jsx(s.Kbd,{children:e.jsx(k.LuArrowBigRight,{})})," ",e.jsx(s.Text,{children:"Navigate to right page"})]}),e.jsxs(s.HStack,{mb:1,children:[e.jsx(s.Kbd,{children:e.jsx(k.LuArrowBigLeft,{})})," ",e.jsx(s.Text,{children:"Navigate to left page"})]}),e.jsx(s.Heading,{mb:2,mt:4,as:"h3",size:"lg",children:"About"}),e.jsxs(s.Text,{children:[re," version: ",ie]})]}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),w=()=>{const o=I();return f.useObserve(()=>o?T.combineLatest([o.pagination.state$,o.context.state$]).pipe(T.map(([n,t])=>{var i;const l=(i=t.manifest)==null?void 0:i.spineItems.every(r=>{var c;return(c=r.mediaType)==null?void 0:c.startsWith("image/")});return{...n,hasChapters:!t.isFullyPrePaginated&&!l}})):T.NEVER,[o])},ce=()=>{const o=w(),n=Math.floor(((o==null?void 0:o.percentageEstimateOfBook)??0)*100),t=n>0?n:1;return(o==null?void 0:o.percentageEstimateOfBook)===void 0?null:e.jsx(s.Box,{position:"absolute",right:0,bottom:0,p:2,color:"black",children:e.jsxs(s.Text,{fontSize:"sm",children:[t," %"]})})},de=()=>{const[o,n]=d.useState(new Date);return d.useEffect(()=>{const t=setInterval(()=>{n(new Date)},6e4);return()=>clearInterval(t)},[]),o},he=o=>{const n=de();return e.jsx(s.Text,{fontSize:"xs",...o,children:n.toLocaleTimeString(navigator.language,{hour:"2-digit",minute:"2-digit"})})},q=()=>{const{quickMenuSignal:o}=d.useContext($);return[f.useSignalValue(o),o.setValue,o]},ge=()=>{const[o]=q();return e.jsx(s.Box,{position:"absolute",left:0,bottom:0,p:2,color:o?void 0:"colorPalette.contrast",children:e.jsx(he,{})})},pe=y.forwardRef(function(n,t){const{showArrow:l,children:i,portalled:r=!0,content:c,portalRef:g,...p}=n;return e.jsxs(s.Popover.Root,{...p,positioning:{...p.positioning,gutter:4},children:[e.jsx(s.Popover.Trigger,{asChild:!0,children:i}),e.jsx(s.Portal,{disabled:!r,container:g,children:e.jsx(s.Popover.Positioner,{children:e.jsxs(s.Popover.Content,{width:"auto",px:"2",py:"1",textStyle:"xs",rounded:"sm",ref:t,children:[l&&e.jsx(s.Popover.Arrow,{children:e.jsx(s.Popover.ArrowTip,{})}),c]})})})]})}),fe=y.forwardRef(function(n,t){const{children:l,...i}=n;return e.jsx(pe,{content:l,...i,ref:t,children:e.jsx(s.IconButton,{variant:"ghost","aria-label":"info",size:"2xs",colorPalette:"gray",children:e.jsx(J.HiOutlineInformationCircle,{})})})}),ue=y.forwardRef(function(n,t){return e.jsx(s.Progress.Track,{...n,ref:t,children:e.jsx(s.Progress.Range,{})})});y.forwardRef(function(n,t){const{children:l,info:i,...r}=n;return e.jsxs(s.Progress.Label,{...r,ref:t,children:[l,i&&e.jsx(fe,{children:i})]})});const be=s.Progress.Root,xe=s.Progress.ValueText,F=()=>{const o=w(),n=(o==null?void 0:o.numberOfTotalPages)===1,t=((o==null?void 0:o.beginNumberOfPagesInSpineItem)??0)>1,l=((o==null?void 0:o.endNumberOfPagesInSpineItem)??0)>1,i=(o!=null&&o.hasChapters?o==null?void 0:o.beginPageIndexInSpineItem:o==null?void 0:o.beginAbsolutePageIndex)??0,r=(o!=null&&o.hasChapters?o==null?void 0:o.endPageIndexInSpineItem:o==null?void 0:o.endAbsolutePageIndex)??0,[c=0,g=0]=[i,r].sort((u,h)=>u-h),p=(o==null?void 0:o.beginPageIndexInSpineItem)!==(o==null?void 0:o.endPageIndexInSpineItem)||(o==null?void 0:o.beginSpineItemIndex)!==(o==null?void 0:o.endSpineItemIndex),a=o!=null&&o.hasChapters?o==null?void 0:o.beginNumberOfPagesInSpineItem:o==null?void 0:o.numberOfTotalPages;return{hasOnlyOnePage:n,beginPageIndex:i,endPageIndex:r,isBeginWithinChapter:t,isEndWithinChapter:l,beginAndEndAreDifferent:p,totalApproximatePages:a,leftPageIndex:c,rightPageIndex:g}},ve=()=>{const o=w(),{hasOnlyOnePage:n,leftPageIndex:t,rightPageIndex:l,totalApproximatePages:i,beginAndEndAreDifferent:r}=F(),c=Math.round(((o==null?void 0:o.percentageEstimateOfBook)??0)*100),g=a=>a!=null&&a.subChapter?`${a.title} / ${g(a.subChapter)}`:(a==null?void 0:a.title)||"",p=g(o==null?void 0:o.beginChapterInfo);return e.jsxs(s.Stack,{alignItems:"center",gap:1,maxW:"100%",overflow:"auto",children:[e.jsx(be,{value:c,size:"xs",width:150,children:e.jsxs(s.HStack,{justifyContent:"space-between",children:[e.jsx(ue,{width:110}),e.jsx(xe,{children:`${c}%`})]})}),e.jsx(s.Text,{truncate:!0,maxWidth:"100%",fontSize:"sm",mt:1,children:p?`Chapter: ${p}`:" "}),!n&&e.jsxs(s.HStack,{children:[e.jsx(s.Text,{fontSize:"xs",children:r?`${t+1} - ${l+1} of ${i}`:`${t+1} of ${i}`}),!!(o!=null&&o.hasChapters)&&e.jsxs(e.Fragment,{children:[e.jsx(s.Text,{children:"-"}),e.jsxs(s.Text,{fontSize:"xs",children:["(",((o==null?void 0:o.beginAbsolutePageIndex)??0)+1,")"]})]})]})]})},G=d.memo(({children:o,position:n,...t})=>e.jsx(s.Presence,{display:"flex",flexDirection:"row",width:"100%",position:"absolute",...n==="bottom"?{bottom:0}:{top:0},animationName:n==="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,...t,children:o})),Ce=s.chakra(Z),ke=d.memo(o=>e.jsx(s.Box,{display:"contents",css:{"--bg":"colors.bg","--bg-emphasized":"colors.bg.emphasized","--color-solid":"colors.colorPalette.solid"},children:e.jsx(Ce,{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(${o.reverse?"50%":"-50%"}, -50%)`,backgroundColor:"var(--bg)",marginTop:"0px"}},...o})})),Se=()=>{const o=w(),n=o==null?void 0:o.isUsingSpread,{beginPageIndex:t,totalApproximatePages:l=0}=F(),i=n?Math.floor((t||0)/2):t,[r,c]=f.useSignal({default:i||0}),g=0,p=Math.max(0,n?Math.floor((l-1)/2):l-1);return d.useEffect(()=>{c.setValue(i||0)},[i,c]),{value:r,valueSignal:c,min:g,max:p}},Ie=o=>{const n=I(),t=w(),{manifest:l}=f.useObserve(()=>n==null?void 0:n.context.state$,[n])??{},i=(l==null?void 0:l.readingDirection)==="rtl",r=t==null?void 0:t.isUsingSpread,{totalApproximatePages:c=0,isBeginWithinChapter:g}=F(),p=1,a=g,{value:u,valueSignal:h,min:x,max:v}=Se(),P=d.useCallback(C=>{const[O=0]=Array.isArray(C)?C:[C];h.setValue(O);const S=r?Math.floor(O)*2:Math.floor(O);a?n==null||n.navigation.goToPageOfSpineItem({pageIndex:S,spineItemId:n.pagination.getState().beginSpineItemIndex??0,animation:!1}):n==null||n.navigation.goToAbsolutePageIndex({absolutePageIndex:S,animation:!1})},[n,r,h,a]);return f.useSubscribe(()=>n==null?void 0:n.navigation.throttleLock({duration:100,trigger:h.subject}),[n,h]),c===1||r&&c===2?null:e.jsx(ke,{value:[u],max:v,min:x,reverse:i,step:p,onChange:P,...o})},Pe=d.memo(({open:o,onItemClick:n})=>{const t=I(),l=f.useObserve(()=>t==null?void 0:t.navigation.state$,[t]),i=f.useObserve(()=>t==null?void 0:t.settings.values$,[t]),r=(i==null?void 0:i.computedPageTurnDirection)==="vertical",[c,g]=d.useState(!0);return e.jsx(G,{present:o,position:"bottom",children:e.jsxs(s.Stack,{flex:1,overflow:"auto",children:[e.jsxs(s.HStack,{flex:1,alignItems:"center",justifyContent:"center",children:[e.jsx(s.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:()=>t==null?void 0:t.navigation.goToLeftOrTopSpineItem(),disabled:!(l!=null&&l.canGoLeftSpineItem)&&!(l!=null&&l.canGoTopSpineItem),children:r?e.jsx(m.RxDoubleArrowUp,{}):e.jsx(m.RxDoubleArrowLeft,{})}),e.jsxs(s.Stack,{flex:1,maxW:400,gap:2,alignItems:"center",overflow:"auto",px:4,children:[e.jsx(ve,{}),e.jsx(Ie,{style:{width:"100%",maxWidth:"300px",height:"35px"}})]}),e.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",disabled:!(l!=null&&l.canGoRightSpineItem)&&!(l!=null&&l.canGoBottomSpineItem),onClick:()=>{t==null||t.navigation.goToRightOrBottomSpineItem()},children:r?e.jsx(m.RxDoubleArrowDown,{}):e.jsx(m.RxDoubleArrowRight,{})})]}),e.jsx(s.HStack,{alignItems:"center",justifyContent:"center",children:e.jsxs(s.Collapsible.Root,{open:c,flex:1,onOpenChange:({open:p})=>{g(p)},children:[e.jsx(s.Collapsible.Trigger,{paddingY:"3",width:"100%",display:"flex",justifyContent:"center",children:e.jsx(k.LuChevronDown,{style:{transform:c?"rotate(0deg)":"rotate(180deg)"}})}),e.jsxs(s.Collapsible.Content,{display:"flex",justifyContent:"center",children:[e.jsx(s.IconButton,{"aria-label":"Help",size:"lg",variant:"ghost",onClick:()=>n("help"),children:e.jsx(k.LuCircleHelp,{})}),e.jsx(s.IconButton,{"aria-label":"Table of contents",size:"lg",variant:"ghost",onClick:()=>n("toc"),children:e.jsx(k.LuTableOfContents,{})}),U(t)&&e.jsx(s.IconButton,{"aria-label":"Search",size:"lg",variant:"ghost",onClick:()=>n("search"),children:e.jsx(k.LuSearch,{})}),H(t)&&e.jsx(s.IconButton,{"aria-label":"Search",size:"lg",variant:"ghost",onClick:()=>n("bookmarks"),children:e.jsx(N.BsBookmarks,{})}),Q(t)&&e.jsx(s.IconButton,{"aria-label":"Search",size:"lg",variant:"ghost",onClick:()=>n("annotations"),children:e.jsx(k.LuNotebookPen,{})})]})]})})]})})}),Te=()=>{const[o,n]=d.useState(!1),t=d.useCallback(()=>document.fullscreenElement?document.exitFullscreen().catch(console.error).then(()=>{n(!1)}):document.documentElement.requestFullscreen({navigationUI:"hide"}).catch(console.error).then(()=>{n(!0)}),[]);return d.useEffect(()=>{function l(){n(!!document.fullscreenElement)}return document.addEventListener("fullscreenchange",l),()=>{document.removeEventListener("fullscreenchange",l)}},[]),{isFullscreen:o,onToggleFullscreenClick:t}},Oe=d.memo(({open:o,onItemClick:n})=>{const t=I(),l=f.useObserve(()=>t==null?void 0:t.context.manifest$,[t]),{isFullscreen:i,onToggleFullscreenClick:r}=Te();return e.jsxs(G,{present:o,position:"top",height:"80px",justifyContent:"space-between",children:[e.jsx(s.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:()=>n("back"),children:e.jsx(V.IoIosArrowBack,{})}),e.jsx(s.Stack,{flex:1,maxW:600,gap:1,alignItems:"center",overflow:"auto",px:4,children:e.jsx(s.Text,{truncate:!0,maxWidth:"100%",children:l==null?void 0:l.title})}),e.jsxs(s.HStack,{children:[e.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:()=>n("more"),children:e.jsx(V.IoMdMore,{})}),e.jsx(s.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:r,children:i?e.jsx(Y.MdFullscreenExit,{}):e.jsx(Y.MdFullscreen,{})})]})]})}),ye=d.memo(({onItemClick:o})=>{const[n]=q();return e.jsxs(e.Fragment,{children:[e.jsx(Oe,{open:n,onItemClick:o}),e.jsx(Pe,{open:n,onItemClick:o})]})}),we=d.memo(({contextText:o="",startOffset:n=0,text:t,cfi:l="#",onClick:i,absolutePageIndex:r})=>{const g=o.substring(Math.max(n-15,0),Math.max(n,0)),p=o.substring(Math.min(n+t.length,o.length-1),Math.min(n+t.length+15,o.length-1));return e.jsxs(s.Link,{href:l,style:{margin:5,overflow:"hidden"},onClick:a=>{a.preventDefault(),i(l)},display:"flex",flexDirection:"column",alignItems:"flex-start",gap:0,children:[e.jsxs(s.Text,{lineClamp:1,as:"cite",style:{display:"block"},children:['"',g,e.jsx("b",{children:t}),p,'"']}),e.jsx(s.Text,{fontSize:"sm",color:"gray.500",style:{textDecoration:"none"},children:`Book page: ${r!==void 0?r+1:"unknown (not loaded)"}`})]})}),De=d.memo(({onNavigate:o})=>{const[n,t]=d.useState(""),l=I(),i=U(l)?l:void 0,r=h=>{t(h.target.value)},c=d.useCallback(h=>{o(),l==null||l.navigation.goToCfi(h)},[l,o]),g=f.useObserve(()=>i==null?void 0:i.search.search(n).pipe(T.map(h=>({type:"end",data:h})),T.startWith({type:"start"})),[l,n]),p=(g==null?void 0:g.type)==="start",a=(g==null?void 0:g.type)==="end"?g.data:[],u=f.useObserve(()=>l==null?void 0:l.pagination.locate(a.slice(0,100)),[a]);return e.jsxs(s.Stack,{flex:1,height:"100%",children:[e.jsx(s.Box,{px:4,children:e.jsx(s.Input,{placeholder:"Type something...",value:n,onChange:r,borderRadius:0})}),e.jsxs(s.Box,{px:4,pb:4,mt:2,flex:1,style:{overflow:"hidden",overflowY:"auto"},children:[p&&e.jsx(s.Text,{children:"Searching ..."}),!p&&a.length===0&&e.jsx("p",{children:"There are no results"}),!p&&a.length>=0&&e.jsxs(s.Stack,{children:[e.jsxs(s.Heading,{as:"h2",size:"md",children:[a.length," result(s)"]}),e.jsx(s.Stack,{gap:0,children:u==null?void 0:u.map((h,x)=>{var v,P,C,O,S,K,W;return e.jsx(we,{contextText:((C=(P=(v=h.meta)==null?void 0:v.range)==null?void 0:P.startContainer.parentElement)==null?void 0:C.textContent)??"",pageIndex:(O=h.meta)==null?void 0:O.itemPageIndex,startOffset:((K=(S=h.meta)==null?void 0:S.range)==null?void 0:K.startOffset)??0,text:n,cfi:h.cfi,onClick:c,absolutePageIndex:(W=h.meta)==null?void 0:W.absolutePageIndex},x)})})]})]})]})}),Be=d.memo(({open:o,setOpen:n,onNavigate:t})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:l=>n(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{height:"100%",children:[e.jsx(E,{children:e.jsx(M,{children:"Search"})}),e.jsx(L,{flex:1,children:e.jsx(De,{onNavigate:t})}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),ze=d.memo(({onNavigate:o})=>{const n=I(),{manifest:t,assumedRenditionLayout:l}=f.useObserve(()=>n==null?void 0:n.context.state$,[n])??{},{nav:i}=t??{},r=w();i!=null&&i.toc;const{beginSpineItemIndex:c,beginPageIndexInSpineItem:g}=r??{},p=(l==="reflowable"?g:c)||0;console.log({assumedRenditionLayout:l,currentSpineItemOrChapterPageIndex:p});let a=r==null?void 0:r.beginChapterInfo;for(;a!=null&&a.subChapter;)a=a==null?void 0:a.subChapter;const u=(h,x,v)=>e.jsxs(d.Fragment,{children:[e.jsx(s.List.Item,{pl:4*(v+1),style:{display:"flex",alignItems:"center"},children:e.jsxs(s.Link,{onClick:()=>{o(),n==null||n.navigation.goToUrl(h.href)},href:"#",children:[(a==null?void 0:a.path)===h.path&&e.jsx(s.List.Indicator,{asChild:!0,children:e.jsx(k.LuCircleCheck,{})}),(a==null?void 0:a.path)!==h.path&&e.jsx(s.List.Indicator,{asChild:!0,visibility:"hidden",children:e.jsx(k.LuCircleCheck,{})}),e.jsxs(s.Stack,{gap:0,children:[e.jsx(s.Text,{fontSize:"md",children:h.title||h.path}),(a==null?void 0:a.path)===h.path&&e.jsx(s.Text,{fontStyle:"italic",fontWeight:"bold",fontSize:"sm",children:`Currently on page ${p+1}`})]})]})}),h.contents.length>0&&e.jsx(s.List.Root,{as:"div",gap:2,children:h.contents.map((P,C)=>u(P,C,v+1))})]},x);return e.jsx(s.List.Root,{gap:3,overflowY:"auto",py:4,flex:1,children:i==null?void 0:i.toc.map((h,x)=>u(h,x,0))})}),Ae=d.memo(({open:o,setOpen:n,onNavigate:t})=>e.jsx(z,{lazyMount:!0,placement:"center",open:o,onOpenChange:l=>n(l.open),size:{mdDown:"full",md:"lg"},scrollBehavior:"inside",children:e.jsxs(D,{children:[e.jsx(E,{children:e.jsx(M,{children:"Table of Contents"})}),e.jsx(L,{overflowY:"auto",flex:1,children:e.jsx(ze,{onNavigate:t})}),e.jsx(A,{children:e.jsx(_,{asChild:!0,children:e.jsx(s.Button,{variant:"outline",children:"Cancel"})})}),e.jsx(B,{})]})})),Ee=({enableFloatingTime:o=!0,enableFloatingProgress:n=!0,onItemClick:t})=>{const[l,i]=d.useState(!1),[r,c]=d.useState(!1),[g,p]=d.useState(!1),[a,u]=d.useState(!1),[h,x]=d.useState(!1),[v,P]=q(),C=d.useCallback(()=>{i(!1),c(!1),p(!1),u(!1),x(!1),P(!1)},[P]),O=d.useCallback(S=>{S==="annotations"?u(!0):S==="search"?p(!0):S==="help"?c(!0):S==="toc"?i(!0):S==="bookmarks"&&x(!0),t==null||t(S)},[t]);return e.jsxs(e.Fragment,{children:[n&&e.jsx(s.Presence,{present:!v,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"moderate",children:e.jsx(ce,{})}),e.jsx(ye,{onItemClick:O}),e.jsx(se,{}),e.jsx(ae,{open:r,setOpen:c}),e.jsx(Ae,{open:l,setOpen:i,onNavigate:C}),e.jsx(Be,{open:g,setOpen:p,onNavigate:C}),e.jsx(ne,{open:a,setOpen:u,onNavigate:C}),e.jsx(le,{open:h,setOpen:x,onNavigate:C}),e.jsx(s.Presence,{present:o||v,animationName:{_open:"fade-in",_closed:"fade-out"},animationDuration:"slow",overflow:"hidden",children:e.jsx(ge,{})})]})};b.ReactReader=Ee,b.ReactReaderProvider=R,Object.defineProperty(b,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/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/useReader.ts","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/bookmarks/Bookmarks.tsx","../src/bookmarks/BookmarksDialogContent.tsx","../src/bookmarks/BookmarksDialog.tsx","../src/help/HelpDialog.tsx","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/quickmenu/TimeIndicator.tsx","../src/quickmenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/quickmenu/PaginationInfoSection.tsx","../src/quickmenu/QuickBar.tsx","../src/quickmenu/ThemedSlider.tsx","../src/quickmenu/Scrubber.tsx","../src/quickmenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/quickmenu/TopBar.tsx","../src/quickmenu/QuickMenu.tsx","../src/search/SearchListItem.tsx","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/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 { 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 type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { BookmarksEnhancerAPI } from \"@prose-reader/enhancer-bookmarks\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\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\nexport const hasSearchEnhancer = (\n reader?: Reader,\n): reader is Reader & SearchEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_SEARCH\" in reader\n}\n\nexport const hasBookmarksEnhancer = (\n reader?: Reader,\n): reader is Reader & BookmarksEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_BOOKMARKS\" in reader\n}\n\nexport const hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const AnnotationsDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.highlights$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.pagination.locate(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedHighlights>[number],\n index: number,\n ) => (\n <List.Item key={index}>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.cfi ?? \"\")\n }}\n >\n {(item.contents ?? [])[0] ? (\n <List.Indicator asChild>\n <LuNotebookPen />\n </List.Indicator>\n ) : (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text lineClamp={2} fontSize=\"md\">\n {item.selectionAsText ? (\n (item.selectionAsText ?? \"\")\n ) : (\n <i>\n <b>unknown (not loaded)</b>\n </i>\n )}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {consolidatedHighlights?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\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 { AnnotationsDialogContent } from \"./AnnotationsDialogContent\"\n\nexport const AnnotationsDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Annotations</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <AnnotationsDialogContent 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 { Box, IconButton, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { BsBookmarkPlus, BsBookmarkXFill } from \"react-icons/bs\"\nimport { useObserve } from \"reactjrx\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const Bookmarks = memo(() => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader) ? reader : undefined\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n const pages = useObserve(\n () => readerWithBookmarks?.bookmarks.pages$,\n [readerWithBookmarks],\n )\n const bookmarks = useObserve(\n () => readerWithBookmarks?.bookmarks.bookmarks$,\n [readerWithBookmarks],\n )\n const consolidatedBookmarks = useObserve(\n () => reader?.pagination.locate(bookmarks ?? []),\n [reader, bookmarks],\n )\n\n if (!spineElement) return null\n\n return (\n <>\n {createPortal(\n pages?.map(\n (\n { isBookmarkable, absolutePosition: { left, top, width } },\n index,\n ) => {\n const bookmarkForPage = consolidatedBookmarks?.find(\n (bookmark) => bookmark.meta?.absolutePageIndex === index,\n )\n\n /**\n * Stale bookmarks means we cannot assert at the moment whether the page is marked or not.\n * In this case we just hide the bookmark button. You may want to have different UX to handle\n * this case.\n *\n * This also avoid having a flash where you show an non bookmarked icon and right away change it with\n * a valid marked page icon.\n */\n if (!isBookmarkable) return null\n\n return (\n <Presence\n key={index}\n present={true}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n top={top}\n p={2}\n >\n {!bookmarkForPage ? (\n <IconButton\n aria-label=\"bookmark\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.bookmark(index)\n }}\n size=\"lg\"\n bgColor=\"white\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkPlus />\n </IconButton>\n ) : (\n <IconButton\n aria-label=\"bookmark\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n onClick={() => {\n bookmarkForPage &&\n readerWithBookmarks?.bookmarks.delete(\n bookmarkForPage?.id,\n )\n }}\n size=\"lg\"\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkXFill />\n </IconButton>\n )}\n </Box>\n </Presence>\n )\n },\n ),\n spineElement,\n )}\n </>\n )\n})\n","import { Button, Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const BookmarksDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedBookmarks = useObserve(\n () =>\n readerWithBookmarks?.bookmarks.bookmarks$.pipe(\n switchMap((items) => readerWithBookmarks.pagination.locate(items)),\n ),\n [readerWithBookmarks],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedBookmarks>[number],\n index: number,\n ) => (\n <List.Item key={index} justifyContent=\"space-between\" alignItems=\"center\">\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.cfi ?? \"\")\n }}\n >\n <Stack gap={0}>\n <Text fontSize=\"md\">\n {`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown\"\n }`}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n truncate\n lineClamp={2}\n >\n {item.meta?.startNode?.textContent\n ? item.meta?.startNode?.textContent\n : \"...\"}\n </Text>\n </Stack>\n </Link>\n <Button\n colorPalette=\"red\"\n variant=\"solid\"\n size=\"xs\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.delete(item.id)\n }}\n >\n Delete\n </Button>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} variant=\"plain\" overflow=\"auto\">\n {consolidatedBookmarks?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\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 { BookmarksDialogContent } from \"./BookmarksDialogContent\"\n\nexport const BookmarksDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Bookmarks</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <BookmarksDialogContent 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 { 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 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 { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\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 { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\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 = (props: ComponentProps<typeof ThemedSlider>) => {\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 {...props}\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 { Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport { LuChevronDown, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp, LuNotebookPen } from \"react-icons/lu\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasBookmarksEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (\n item: \"annotations\" | \"search\" | \"help\" | \"toc\" | \"bookmarks\",\n ) => 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 present={open} position=\"bottom\">\n <Stack flex={1} overflow=\"auto\">\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=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <Scrubber\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"35px\",\n }}\n />\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 alignItems=\"center\" justifyContent=\"center\">\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\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 display=\"flex\" justifyContent=\"center\">\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"help\")}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"toc\")}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"search\")}\n >\n <LuSearch />\n </IconButton>\n )}\n {hasBookmarksEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\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 { memo } from \"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 = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (item: \"more\" | \"back\") => 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={() => onItemClick(\"back\")}\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={() => onItemClick(\"more\")}\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)\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onItemClick,\n }: {\n onItemClick: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\",\n ) => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar open={quickMenuOpen} onItemClick={onItemClick} />\n <BottomBar open={quickMenuOpen} onItemClick={onItemClick} />\n </>\n )\n },\n)\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { Box, Heading, Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback, useState } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { map, startWith } from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\n\nexport const SearchDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const [text, setText] = useState(\"\")\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setText(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const search = useObserve(\n () =>\n readerWithSearch?.search.search(text).pipe(\n map((data) => ({ type: `end` as const, data })),\n startWith({ type: `start` as const }),\n ),\n [reader, text],\n )\n const searching = search?.type === \"start\"\n const results = search?.type === \"end\" ? search.data : []\n const consolidatedResults = useObserve(\n () => reader?.pagination.locate(results.slice(0, 100)),\n [results],\n )\n\n return (\n <Stack flex={1} height=\"100%\">\n <Box px={4}>\n <Input\n placeholder=\"Type something...\"\n value={text}\n onChange={onValueChange}\n borderRadius={0}\n />\n </Box>\n <Box\n px={4}\n pb={4}\n mt={2}\n flex={1}\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n >\n {searching && <Text>Searching ...</Text>}\n {!searching && results.length === 0 && <p>There are no results</p>}\n {!searching && results.length >= 0 && (\n <Stack>\n <Heading as=\"h2\" size=\"md\">\n {results.length} result(s)\n </Heading>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={text}\n cfi={result.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Box>\n </Stack>\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 { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <SearchDialogContent 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 { 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 { useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { Bookmarks } from \"./bookmarks/Bookmarks\"\nimport { BookmarksDialog } from \"./bookmarks/BookmarksDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./quickmenu/QuickMenu\"\nimport { useQuickMenu } from \"./quickmenu/useQuickMenu\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onItemClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onItemClick?: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpen, setIsAnnotationsOpen] = useState(false)\n const [isBookmarksOpen, setIsBookmarksOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n const onNavigate = useCallback(() => {\n setIsTableOfContentsOpen(false)\n setIsHelpOpen(false)\n setIsSearchOpen(false)\n setIsAnnotationsOpen(false)\n setIsBookmarksOpen(false)\n setQuickMenuOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpen(true)\n } else if (item === \"search\") {\n setIsSearchOpen(true)\n } else if (item === \"help\") {\n setIsHelpOpen(true)\n } else if (item === \"toc\") {\n setIsTableOfContentsOpen(true)\n } else if (item === \"bookmarks\") {\n setIsBookmarksOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\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 onItemClick={_onItemClick} />\n <Bookmarks />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={onNavigate}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={onNavigate}\n />\n <AnnotationsDialog\n open={isAnnotationsOpen}\n setOpen={setIsAnnotationsOpen}\n onNavigate={onNavigate}\n />\n <BookmarksDialog\n open={isBookmarksOpen}\n setOpen={setIsBookmarksOpen}\n onNavigate={onNavigate}\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","CloseButton","React","props","ref","ChakraIconButton","LuX","DialogContent","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useReader","useContext","hasSearchEnhancer","hasBookmarksEnhancer","hasAnnotationsEnhancer","AnnotationsDialogContent","onNavigate","readerWithAnnotations","consolidatedHighlights","useObserve","switchMap","highlights","mapItemToListEntry","item","index","List","jsxs","Link","LuNotebookPen","Stack","Text","_a","AnnotationsDialog","open","setOpen","e","Button","Bookmarks","readerWithBookmarks","spineElement","pages","bookmarks","consolidatedBookmarks","Fragment","createPortal","isBookmarkable","left","top","width","bookmarkForPage","bookmark","Presence","Box","IconButton","BsBookmarkXFill","BsBookmarkPlus","BookmarksDialogContent","items","_e","_d","BookmarksDialog","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","map","state","context","isOnlyImages","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","useState","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","ToggleTip","showArrow","content","ChakraPopover","InfoTip","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","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","onItemClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","absolutePageIndex","before","after","SearchDialogContent","setText","readerWithSearch","onValueChange","search","data","startWith","searching","results","consolidatedResults","Input","result","j","_c","_b","_f","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpen","setIsAnnotationsOpen","isBookmarksOpen","setIsBookmarksOpen","setQuickMenuOpen","_onItemClick"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/useReader.ts","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/bookmarks/Bookmarks.tsx","../src/bookmarks/BookmarksDialogContent.tsx","../src/bookmarks/BookmarksDialog.tsx","../src/help/HelpDialog.tsx","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/quickmenu/TimeIndicator.tsx","../src/quickmenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/quickmenu/PaginationInfoSection.tsx","../src/quickmenu/QuickBar.tsx","../src/quickmenu/ThemedSlider.tsx","../src/quickmenu/Scrubber.tsx","../src/quickmenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/quickmenu/TopBar.tsx","../src/quickmenu/QuickMenu.tsx","../src/search/SearchListItem.tsx","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/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 { 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 type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { BookmarksEnhancerAPI } from \"@prose-reader/enhancer-bookmarks\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\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\nexport const hasSearchEnhancer = (\n reader?: Reader,\n): reader is Reader & SearchEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_SEARCH\" in reader\n}\n\nexport const hasBookmarksEnhancer = (\n reader?: Reader,\n): reader is Reader & BookmarksEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_BOOKMARKS\" in reader\n}\n\nexport const hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const AnnotationsDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.highlights$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.pagination.locate(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedHighlights>[number],\n index: number,\n ) => (\n <List.Item key={index}>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.cfi ?? \"\")\n }}\n >\n {(item.contents ?? [])[0] ? (\n <List.Indicator asChild>\n <LuNotebookPen />\n </List.Indicator>\n ) : (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text lineClamp={2} fontSize=\"md\">\n {item.selectionAsText ? (\n (item.selectionAsText ?? \"\")\n ) : (\n <i>\n <b>unknown (not loaded)</b>\n </i>\n )}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {consolidatedHighlights?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\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 { AnnotationsDialogContent } from \"./AnnotationsDialogContent\"\n\nexport const AnnotationsDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Annotations</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <AnnotationsDialogContent 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 { Box, IconButton, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { BsBookmarkPlus, BsBookmarkXFill } from \"react-icons/bs\"\nimport { useObserve } from \"reactjrx\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const Bookmarks = memo(() => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader) ? reader : undefined\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n const pages = useObserve(\n () => readerWithBookmarks?.bookmarks.pages$,\n [readerWithBookmarks],\n )\n const bookmarks = useObserve(\n () => readerWithBookmarks?.bookmarks.bookmarks$,\n [readerWithBookmarks],\n )\n const consolidatedBookmarks = useObserve(\n () => reader?.pagination.locate(bookmarks ?? []),\n [reader, bookmarks],\n )\n\n if (!spineElement) return null\n\n return (\n <>\n {createPortal(\n pages?.map(\n (\n { isBookmarkable, absolutePosition: { left, top, width } },\n index,\n ) => {\n const bookmarkForPage = consolidatedBookmarks?.find(\n (bookmark) => bookmark.meta?.absolutePageIndex === index,\n )\n\n /**\n * Stale bookmarks means we cannot assert at the moment whether the page is marked or not.\n * In this case we just hide the bookmark button. You may want to have different UX to handle\n * this case.\n *\n * This also avoid having a flash where you show an non bookmarked icon and right away change it with\n * a valid marked page icon.\n */\n if (!isBookmarkable) return null\n\n return (\n <Presence\n key={index}\n present={true}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n top={top}\n p={2}\n >\n {!bookmarkForPage ? (\n <IconButton\n aria-label=\"bookmark\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.bookmark(index)\n }}\n size=\"lg\"\n bgColor=\"white\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkPlus />\n </IconButton>\n ) : (\n <IconButton\n aria-label=\"bookmark\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n onClick={() => {\n bookmarkForPage &&\n readerWithBookmarks?.bookmarks.delete(\n bookmarkForPage?.id,\n )\n }}\n size=\"lg\"\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkXFill />\n </IconButton>\n )}\n </Box>\n </Presence>\n )\n },\n ),\n spineElement,\n )}\n </>\n )\n})\n","import { Button, Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const BookmarksDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedBookmarks = useObserve(\n () =>\n readerWithBookmarks?.bookmarks.bookmarks$.pipe(\n switchMap((items) => readerWithBookmarks.pagination.locate(items)),\n ),\n [readerWithBookmarks],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedBookmarks>[number],\n index: number,\n ) => (\n <List.Item key={index} justifyContent=\"space-between\" alignItems=\"center\">\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.cfi ?? \"\")\n }}\n >\n <Stack gap={0}>\n <Text fontSize=\"md\">\n {`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown\"\n }`}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n truncate\n lineClamp={2}\n >\n {item.meta?.startNode?.textContent\n ? item.meta?.startNode?.textContent\n : \"...\"}\n </Text>\n </Stack>\n </Link>\n <Button\n colorPalette=\"red\"\n variant=\"solid\"\n size=\"xs\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.delete(item.id)\n }}\n >\n Delete\n </Button>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} variant=\"plain\" overflow=\"auto\">\n {consolidatedBookmarks?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\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 { BookmarksDialogContent } from \"./BookmarksDialogContent\"\n\nexport const BookmarksDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Bookmarks</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <BookmarksDialogContent 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 { 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 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 { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\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 { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\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 = (props: ComponentProps<typeof ThemedSlider>) => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, [reader]) ?? {}\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 {...props}\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 { Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport { LuChevronDown, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp, LuNotebookPen } from \"react-icons/lu\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasBookmarksEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (\n item: \"annotations\" | \"search\" | \"help\" | \"toc\" | \"bookmarks\",\n ) => 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 present={open} position=\"bottom\">\n <Stack flex={1} overflow=\"auto\">\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=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <Scrubber\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"35px\",\n }}\n />\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 alignItems=\"center\" justifyContent=\"center\">\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\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 display=\"flex\" justifyContent=\"center\">\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"help\")}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"toc\")}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"search\")}\n >\n <LuSearch />\n </IconButton>\n )}\n {hasBookmarksEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\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 { memo } from \"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 = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (item: \"more\" | \"back\") => 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={() => onItemClick(\"back\")}\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={() => onItemClick(\"more\")}\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)\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onItemClick,\n }: {\n onItemClick: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\",\n ) => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar open={quickMenuOpen} onItemClick={onItemClick} />\n <BottomBar open={quickMenuOpen} onItemClick={onItemClick} />\n </>\n )\n },\n)\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { Box, Heading, Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback, useState } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { map, startWith } from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\n\nexport const SearchDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const [text, setText] = useState(\"\")\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setText(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const search = useObserve(\n () =>\n readerWithSearch?.search.search(text).pipe(\n map((data) => ({ type: `end` as const, data })),\n startWith({ type: `start` as const }),\n ),\n [reader, text],\n )\n const searching = search?.type === \"start\"\n const results = search?.type === \"end\" ? search.data : []\n const consolidatedResults = useObserve(\n () => reader?.pagination.locate(results.slice(0, 100)),\n [results],\n )\n\n return (\n <Stack flex={1} height=\"100%\">\n <Box px={4}>\n <Input\n placeholder=\"Type something...\"\n value={text}\n onChange={onValueChange}\n borderRadius={0}\n />\n </Box>\n <Box\n px={4}\n pb={4}\n mt={2}\n flex={1}\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n >\n {searching && <Text>Searching ...</Text>}\n {!searching && results.length === 0 && <p>There are no results</p>}\n {!searching && results.length >= 0 && (\n <Stack>\n <Heading as=\"h2\" size=\"md\">\n {results.length} result(s)\n </Heading>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={text}\n cfi={result.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Box>\n </Stack>\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 { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = 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 height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <SearchDialogContent 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 { 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 { useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { Bookmarks } from \"./bookmarks/Bookmarks\"\nimport { BookmarksDialog } from \"./bookmarks/BookmarksDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./quickmenu/QuickMenu\"\nimport { useQuickMenu } from \"./quickmenu/useQuickMenu\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onItemClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onItemClick?: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpen, setIsAnnotationsOpen] = useState(false)\n const [isBookmarksOpen, setIsBookmarksOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n const onNavigate = useCallback(() => {\n setIsTableOfContentsOpen(false)\n setIsHelpOpen(false)\n setIsSearchOpen(false)\n setIsAnnotationsOpen(false)\n setIsBookmarksOpen(false)\n setQuickMenuOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpen(true)\n } else if (item === \"search\") {\n setIsSearchOpen(true)\n } else if (item === \"help\") {\n setIsHelpOpen(true)\n } else if (item === \"toc\") {\n setIsTableOfContentsOpen(true)\n } else if (item === \"bookmarks\") {\n setIsBookmarksOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\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 onItemClick={_onItemClick} />\n <Bookmarks />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={onNavigate}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={onNavigate}\n />\n <AnnotationsDialog\n open={isAnnotationsOpen}\n setOpen={setIsAnnotationsOpen}\n onNavigate={onNavigate}\n />\n <BookmarksDialog\n open={isBookmarksOpen}\n setOpen={setIsBookmarksOpen}\n onNavigate={onNavigate}\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","CloseButton","React","props","ref","ChakraIconButton","LuX","DialogContent","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useReader","useContext","hasSearchEnhancer","hasBookmarksEnhancer","hasAnnotationsEnhancer","AnnotationsDialogContent","onNavigate","readerWithAnnotations","consolidatedHighlights","useObserve","switchMap","highlights","mapItemToListEntry","item","index","List","jsxs","Link","LuNotebookPen","Stack","Text","_a","AnnotationsDialog","open","setOpen","e","Button","Bookmarks","readerWithBookmarks","spineElement","pages","bookmarks","consolidatedBookmarks","Fragment","createPortal","isBookmarkable","left","top","width","bookmarkForPage","bookmark","Presence","Box","IconButton","BsBookmarkXFill","BsBookmarkPlus","BookmarksDialogContent","items","_e","_d","BookmarksDialog","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","map","state","context","isOnlyImages","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","useState","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","ToggleTip","showArrow","content","ChakraPopover","InfoTip","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","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","onItemClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","absolutePageIndex","before","after","SearchDialogContent","setText","readerWithSearch","onValueChange","search","data","startWith","searching","results","consolidatedResults","Input","result","j","_c","_b","_f","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpen","setIsAnnotationsOpen","isBookmarksOpen","setIsBookmarksOpen","setQuickMenuOpen","_onItemClick"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prose-reader/react-reader",
3
3
  "private": false,
4
- "version": "1.193.0",
4
+ "version": "1.194.0",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {
@@ -49,5 +49,5 @@
49
49
  "optional": true
50
50
  }
51
51
  },
52
- "gitHead": "bf39ea1fa624308df2bedd76e41060b94e287fda"
52
+ "gitHead": "dc135bf96a3e9f6bc08a072cdc2a906f8482a3b6"
53
53
  }