@prose-reader/react-reader 1.228.0 → 1.230.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.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/useReaderContext.ts","../src/context/useReader.ts","../src/annotations/useAnnotation.ts","../src/annotations/AnnotationListItem.tsx","../src/annotations/useAnnotations.ts","../src/annotations/AnnotationsList.tsx","../src/annotations/bookmarks/useBookmarks.ts","../src/annotations/bookmarks/BookmarksList.tsx","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/common/Spine.tsx","../src/common/useSpineItem.ts","../src/common/useSpineItemReady.ts","../src/constants.ts","../src/annotations/useReaderWithAnnotations.ts","../src/annotations/bookmarks/useCanBookmarkPage.ts","../src/annotations/bookmarks/BookmarkPageButton.tsx","../src/annotations/bookmarks/Bookmarks.tsx","../src/components/ui/toaster.tsx","../src/common/useMeasure.ts","../src/gallery/useAttachSnapshot.ts","../src/gallery/GalleryDialog.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/navigation/useInterceptExternalLinks.ts","../src/zoom/useNotifyZoom.ts","../src/notifications/useNotifications.ts","../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\"\nimport { Subject } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\n\ntype ContextType = {\n reader: Reader | undefined\n quickMenuSignal: Signal<boolean, undefined>\n notificationsSubject: Subject<ReaderNotification>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n notificationsSubject: new Subject<ReaderNotification>(),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport {\n signal,\n useConstant,\n useLiveRef,\n useSignalState,\n useSubscribe,\n} from \"reactjrx\"\nimport { Subject, tap } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\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] = useSignalState(() =>\n signal({\n default: quickMenuOpen,\n }),\n )\n const notificationsSubject = useConstant(\n () => new Subject<ReaderNotification>(),\n )\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n notificationsSubject,\n }),\n [quickMenuSignal, reader, notificationsSubject],\n )\n\n useEffect(() => {\n quickMenuSignal.setValue(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () => quickMenuSignal.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 { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReaderContext = () => {\n return useContext(ReaderContext)\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { GalleryEnhancerAPI } from \"@prose-reader/enhancer-gallery\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useReaderContext } from \"./useReaderContext\"\n\nexport const useReader = () => {\n const { reader } = useReaderContext()\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 hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n\nexport const hasGalleryEnhancer = (\n reader?: Reader,\n): reader is Reader & GalleryEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_GALLERY\" in reader\n}\n","import { isDefined, useObserve } from \"reactjrx\"\nimport { filter, map, switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useAnnotation = (id: string) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.annotations$.pipe(\n map((items) => items.find((item) => item.id === id)),\n filter(isDefined),\n switchMap((item) => readerWithAnnotations.locateResource(item)),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useReader } from \"../context/useReader\"\nimport { useAnnotation } from \"./useAnnotation\"\n\nexport const AnnotationListItem = ({\n id,\n onNavigate,\n}: { id: string; onNavigate: () => void }) => {\n const reader = useReader()\n const { data: annotation } = useAnnotation(id)\n\n return (\n <List.Item>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(annotation?.meta.cfi ?? \"\")\n }}\n >\n {annotation?.resource?.notes ? (\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 {annotation?.meta.range ? (\n annotation?.meta.range.toString()\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 annotation?.meta?.absolutePageIndex !== undefined\n ? annotation.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n}\n","import { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useAnnotations = () => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.annotations$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.locateResource(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"./AnnotationListItem\"\nimport { useAnnotations } from \"./useAnnotations\"\n\nexport const AnnotationsList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useAnnotations()\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {annotations?.map((item) => (\n <AnnotationListItem\n key={item.resource.id}\n id={item.resource.id}\n onNavigate={onNavigate}\n />\n ))}\n </List.Root>\n )\n}\n","import { useAnnotations } from \"../useAnnotations\"\n\nexport const useBookmarks = () => {\n const { data: annotations } = useAnnotations()\n\n return {\n data: annotations?.filter((annotation) => !annotation.meta.range),\n }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"../AnnotationListItem\"\nimport { useBookmarks } from \"./useBookmarks\"\n\nexport const BookmarksList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useBookmarks()\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {annotations?.map((item) => (\n <AnnotationListItem\n key={item.resource.id}\n id={item.resource.id}\n onNavigate={onNavigate}\n />\n ))}\n </List.Root>\n )\n}\n","import { Tabs } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { LuBookmark, LuNotebookPen } from \"react-icons/lu\"\nimport { AnnotationsList } from \"./AnnotationsList\"\nimport { BookmarksList } from \"./bookmarks/BookmarksList\"\n\nexport const AnnotationsDialogContent = memo(\n ({\n onNavigate,\n defaultTab,\n }: {\n onNavigate: () => void\n defaultTab: \"bookmarks\" | \"annotations\" | undefined\n }) => {\n const [tab, setTab] = useState(defaultTab ?? \"bookmarks\")\n\n return (\n <Tabs.Root\n value={tab}\n onValueChange={(e) => setTab(e.value as \"bookmarks\" | \"annotations\")}\n >\n <Tabs.List>\n <Tabs.Trigger value=\"bookmarks\">\n <LuBookmark />\n Bookmarks\n </Tabs.Trigger>\n <Tabs.Trigger value=\"annotations\">\n <LuNotebookPen />\n Annotations\n </Tabs.Trigger>\n <Tabs.Indicator />\n </Tabs.List>\n <Tabs.Content value=\"bookmarks\">\n <BookmarksList onNavigate={onNavigate} />\n </Tabs.Content>\n <Tabs.Content value=\"annotations\">\n <AnnotationsList onNavigate={onNavigate} />\n </Tabs.Content>\n </Tabs.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 openWith,\n setOpen,\n onNavigate,\n }: {\n openWith: \"bookmarks\" | \"annotations\" | undefined\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={!!openWith}\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\n onNavigate={onNavigate}\n defaultTab={openWith}\n />\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 { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const Spine = memo(({ children }: { children: React.ReactNode }) => {\n const reader = useReader()\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n\n if (!spineElement) return null\n\n return <>{createPortal(children, spineElement)}</>\n})\n","import { useMemo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useSpineItem = ({\n absolutePageIndex,\n itemIndex,\n}: { absolutePageIndex?: number; itemIndex?: number }) => {\n const reader = useReader()\n\n const items = useObserve(\n () => reader?.spine.spineItemsManager.items$,\n [reader],\n )\n\n const spineItem = useMemo(() => {\n void items\n\n if (itemIndex !== undefined)\n return reader?.spine.spineItemsManager.get(itemIndex)\n\n if (absolutePageIndex !== undefined) {\n const { itemIndex } =\n reader?.spine.locator.getSpineInfoFromAbsolutePageIndex({\n absolutePageIndex,\n }) ?? {}\n\n return reader?.spine.spineItemsManager.get(itemIndex)\n }\n\n return undefined\n }, [itemIndex, absolutePageIndex, reader, items])\n\n return {\n spineItem,\n }\n}\n","import { useObserve } from \"reactjrx\"\nimport { of } from \"rxjs\"\nimport { useSpineItem } from \"./useSpineItem\"\n\nexport const useSpineItemReady = ({\n absolutePageIndex,\n itemIndex,\n}: { absolutePageIndex?: number; itemIndex?: number }) => {\n const { spineItem } = useSpineItem({ absolutePageIndex, itemIndex })\n const isItemReady = useObserve(\n () => spineItem?.isReady$ ?? of(false),\n [spineItem],\n )\n\n return isItemReady\n}\n","export const BOOKMARK_AREA_DATA_ATTRIBUTE = `data-bookmark-area`\n","import { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useReaderWithAnnotations = () => {\n const reader = useReader()\n const readerWithBookmarks = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n return readerWithBookmarks\n}\n","import { useObserve } from \"reactjrx\"\nimport { map } from \"rxjs\"\nimport { useReaderWithAnnotations } from \"../useReaderWithAnnotations\"\n\nexport const useCanBookmarkPage = (absolutePageIndex: number) => {\n const reader = useReaderWithAnnotations()\n\n return useObserve(\n () =>\n reader?.annotations.candidates$.pipe(\n map((candidates) => candidates[absolutePageIndex]),\n ),\n [reader],\n )\n}\n","import { Box, IconButton, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { BsBookmarkPlus, BsBookmarkXFill } from \"react-icons/bs\"\nimport { useSpineItemReady } from \"../../common/useSpineItemReady\"\nimport { BOOKMARK_AREA_DATA_ATTRIBUTE } from \"../../constants\"\nimport { useAnnotations } from \"../useAnnotations\"\nimport { useReaderWithAnnotations } from \"../useReaderWithAnnotations\"\nimport { useCanBookmarkPage } from \"./useCanBookmarkPage\"\n\nexport const BookmarkPageButton = memo(\n ({\n absolutePageIndex,\n left,\n top,\n width,\n }: {\n absolutePageIndex: number\n left: number\n top: number\n width: number\n }) => {\n const reader = useReaderWithAnnotations()\n const isItemReady = useSpineItemReady({ absolutePageIndex })\n const { data: bookmarks } = useAnnotations()\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex === absolutePageIndex &&\n bookmark.meta.range === undefined,\n )\n const canBookmarkPage = useCanBookmarkPage(absolutePageIndex)\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 (!isItemReady || !canBookmarkPage) return null\n\n return (\n <Presence\n present={true}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area={BOOKMARK_AREA_DATA_ATTRIBUTE}\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 reader?.annotations.annotateAbsolutePage({\n absolutePageIndex,\n })\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 reader?.annotations.delete(bookmarkForPage.resource.id)\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","import { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { Spine } from \"../../common/Spine\"\nimport { useReader } from \"../../context/useReader\"\nimport { BookmarkPageButton } from \"./BookmarkPageButton\"\n\nexport const Bookmarks = memo(() => {\n const reader = useReader()\n const pages = useObserve(() => reader?.layoutInfo$, [reader])\n\n return (\n <Spine>\n {pages?.pages.map(\n ({ absoluteLayout: { left, top, width } }, pageIndex) => (\n <BookmarkPageButton\n key={pageIndex}\n absolutePageIndex={pageIndex}\n left={left}\n top={top}\n width={width}\n />\n ),\n )}\n </Spine>\n )\n})\n","\"use client\"\n\nimport {\n Toaster as ChakraToaster,\n Portal,\n Spinner,\n Stack,\n Toast,\n createToaster,\n} from \"@chakra-ui/react\"\n\ntype Toaster = ReturnType<typeof createToaster>\n\nexport const toaster: Toaster = createToaster({\n placement: \"bottom-end\",\n pauseOnPageIdle: true,\n})\n\nexport const Toaster = () => {\n return (\n <Portal>\n <ChakraToaster toaster={toaster} insetInline={{ mdDown: \"4\" }}>\n {(toast) => (\n <Toast.Root width={{ md: \"sm\" }}>\n {toast.type === \"loading\" ? (\n <Spinner size=\"sm\" color=\"blue.solid\" />\n ) : (\n <Toast.Indicator />\n )}\n <Stack gap=\"1\" flex=\"1\" maxWidth=\"100%\">\n {toast.title && <Toast.Title>{toast.title}</Toast.Title>}\n {toast.description && (\n <Toast.Description>{toast.description}</Toast.Description>\n )}\n </Stack>\n {toast.action && (\n <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>\n )}\n {toast.meta?.closable && <Toast.CloseTrigger />}\n </Toast.Root>\n )}\n </ChakraToaster>\n </Portal>\n )\n}\n","import { useLayoutEffect, useMemo, useState } from \"react\"\n\nexport type UseMeasureRect = Pick<\n DOMRectReadOnly,\n \"x\" | \"y\" | \"top\" | \"left\" | \"right\" | \"bottom\" | \"height\" | \"width\"\n>\nexport type UseMeasureRef<E extends Element = Element> = (element: E) => void\nexport type UseMeasureResult<E extends Element = Element> = [\n UseMeasureRef<E>,\n UseMeasureRect,\n E | null,\n]\n\nconst defaultState: UseMeasureRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n}\n\nexport function useMeasure<E extends Element = Element>(): UseMeasureResult<E> {\n const [element, setElement] = useState<E | null>(null)\n const [rect, setRect] = useState<UseMeasureRect>(defaultState)\n\n const observer = useMemo(\n () =>\n new ResizeObserver((entries) => {\n if (entries[0]) {\n const { x, y, width, height, top, left, bottom, right } =\n entries[0].contentRect\n setRect({ x, y, width, height, top, left, bottom, right })\n }\n }),\n [],\n )\n\n useLayoutEffect(() => {\n if (!element) return\n\n observer.observe(element)\n\n return () => {\n observer.disconnect()\n }\n }, [element, observer])\n\n return [setElement, rect, element]\n}\n","import {\n type SpineItem,\n isShallowEqual,\n observeIntersection,\n} from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport {\n distinctUntilChanged,\n first,\n map,\n startWith,\n switchMap,\n tap,\n throttleTime,\n} from \"rxjs\"\nimport { NEVER } from \"rxjs\"\nimport { filter } from \"rxjs\"\nimport type { UseMeasureRect } from \"../common/useMeasure\"\nimport { useReader } from \"../context/useReader\"\nimport { hasGalleryEnhancer } from \"../context/useReader\"\n\nexport const useAttachSnapshot = (\n element: Element | null,\n item: SpineItem,\n measures: UseMeasureRect,\n) => {\n const reader = useReader()\n const readerWithGalleryEnhancer = hasGalleryEnhancer(reader)\n ? reader\n : undefined\n\n useSubscribe(() => {\n if (!readerWithGalleryEnhancer || !element) return NEVER\n\n const itemLayoutChanged$ = item.layout.layout$.pipe(\n startWith(item.layout.layoutInfo),\n distinctUntilChanged(isShallowEqual),\n )\n\n const isIntemIntersecting$ = observeIntersection(\n element as HTMLElement,\n ).pipe(map((entries) => entries.some((e) => e.isIntersecting)))\n\n return itemLayoutChanged$.pipe(\n throttleTime(100, undefined, { trailing: true }),\n switchMap(() => {\n return isIntemIntersecting$\n .pipe(\n tap((isVisible) => {\n // if the layout change and the item is not visible anymore, cleanup the element\n if (!isVisible) {\n element.innerHTML = \"\"\n }\n }),\n filter((isVisible) => isVisible),\n first(),\n )\n .pipe(\n switchMap(() => {\n element.innerHTML = \"\"\n\n return readerWithGalleryEnhancer?.gallery.snapshot(\n item,\n element,\n measures,\n )\n }),\n )\n }),\n )\n }, [readerWithGalleryEnhancer, item, measures, element])\n}\n","import { Box, Button, Text } from \"@chakra-ui/react\"\nimport type { SpineItem } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useMeasure } from \"../common/useMeasure\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { useReader } from \"../context/useReader\"\nimport { useAttachSnapshot } from \"./useAttachSnapshot\"\n\nconst GalleryItem = memo(\n ({\n item,\n onNavigated,\n }: {\n item: SpineItem\n onNavigated: () => void\n }) => {\n const [setElement, measures, element] = useMeasure()\n const reader = useReader()\n\n useAttachSnapshot(element, item, measures)\n\n const locatedResource = useObserve(\n () => reader?.locateResource(item, { mode: \"shallow\" }),\n [reader, item],\n )\n\n return (\n <Box\n width=\"100%\"\n aspectRatio=\"2/3\"\n border=\"1px solid\"\n borderColor=\"border\"\n borderRadius=\"md\"\n data-grid-item\n cursor=\"pointer\"\n position=\"relative\"\n overflow=\"hidden\"\n onClick={() => {\n onNavigated()\n reader?.navigation.goToSpineItem({ indexOrId: item })\n }}\n >\n <Box\n height=\"100%\"\n width=\"100%\"\n overflow=\"hidden\"\n pointerEvents=\"none\"\n ref={setElement}\n />\n <Text\n position=\"absolute\"\n bottom={0}\n left=\"0\"\n right=\"0\"\n textAlign=\"center\"\n bgColor=\"white\"\n p={4}\n fontSize=\"xs\"\n >\n Page {(locatedResource?.meta?.absolutePageIndex ?? 0) + 1}\n </Text>\n </Box>\n )\n },\n)\n\nexport const GalleryDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n const reader = useReader()\n const items = useObserve(() => reader?.spineItemsManager.items$, [reader])\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>Gallery</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Box\n gridTemplateColumns={[\n \"repeat(2, minmax(0, 1fr))\",\n \"repeat(3, minmax(0, 1fr))\",\n ]}\n display=\"grid\"\n gap={[2, 4]}\n pt={2}\n data-grid\n >\n {items?.map((item) => (\n <GalleryItem\n key={item.item.id}\n item={item}\n onNavigated={() => {\n setOpen(false)\n }}\n />\n ))}\n </Box>\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 { useSignalValue } from \"reactjrx\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\nexport const useQuickMenu = () => {\n const { quickMenuSignal } = useReaderContext()\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 { isHtmlTagElement } from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useInterceptExternalLinks = () => {\n const reader = useReader()\n\n useSubscribe(\n () =>\n reader?.links$.subscribe((event) => {\n if (event.type === \"click\" && isHtmlTagElement(event.target, \"a\")) {\n if (!event.target.href) return\n\n const url = new URL(event.target.href)\n\n if (window.location.host !== url.host) {\n const response = confirm(\n `You are going to be redirected to external link`,\n )\n\n if (response) {\n window.open(event.target.href, \"__blank\")\n }\n }\n }\n }),\n [reader],\n )\n}\n","import { useSubscribe } from \"reactjrx\"\nimport { EMPTY, NEVER, Subject, finalize, switchMap } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\nexport const useNotifyZoom = () => {\n const reader = useReader()\n const { notificationsSubject } = useReaderContext()\n\n useSubscribe(\n () =>\n reader?.zoom.isZooming$.pipe(\n switchMap((isZooming) => {\n if (!isZooming) return EMPTY\n\n const abort = new Subject<void>()\n\n notificationsSubject.next({\n key: \"zoom\",\n title: \"Zooming\",\n duration: 999999,\n abort: abort,\n })\n\n return NEVER.pipe(\n finalize(() => {\n abort.next()\n abort.complete()\n }),\n )\n }),\n ),\n [reader],\n )\n}\n","import { isDefined, useSubscribe } from \"reactjrx\"\nimport {\n NEVER,\n distinctUntilChanged,\n filter,\n finalize,\n first,\n map,\n merge,\n mergeMap,\n skip,\n tap,\n timer,\n} from \"rxjs\"\nimport { toaster } from \"../components/ui/toaster\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { useNotifyZoom } from \"../zoom/useNotifyZoom\"\n\nconst useNotifyFontScaleChange = () => {\n const reader = useReader()\n const { notificationsSubject } = useReaderContext()\n\n useSubscribe(\n () =>\n reader?.settings.values$.pipe(\n map(({ fontScale }) => fontScale),\n distinctUntilChanged(),\n skip(1),\n tap((fontScale) => {\n notificationsSubject.next({\n key: \"fontScaleChange\",\n title: \"Font size changed\",\n description: `${fontScale * 100} %`,\n })\n }),\n ),\n [reader, notificationsSubject],\n )\n}\n\nexport const useNotifications = () => {\n const { notificationsSubject } = useReaderContext()\n\n useNotifyFontScaleChange()\n useNotifyZoom()\n\n useSubscribe(\n () =>\n notificationsSubject.pipe(\n filter(isDefined),\n mergeMap((notification) => {\n const duration = notification.duration ?? 3000\n\n const toast = toaster.create({\n title: notification.title,\n description: notification.description,\n duration,\n })\n\n const sameNotification$ = notificationsSubject.pipe(\n skip(1),\n filter((n) => !!notification.key && n?.key === notification.key),\n )\n\n return merge(\n timer(duration),\n notification.abort ?? NEVER,\n sameNotification$,\n ).pipe(\n first(),\n finalize(() => {\n toaster.dismiss(toast)\n }),\n )\n }),\n ),\n [notificationsSubject],\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 { Box } from \"@chakra-ui/react\"\nimport { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { signal, useObserve, useSignalState, 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] = useSignalState(() =>\n signal({\n default: currentPage || 0,\n }),\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.update(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.state.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 const disabled =\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n if (disabled) return <Box style={props.style} />\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, LuGalleryHorizontal, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp, LuNotebookPen } from \"react-icons/lu\"\nimport { RiGalleryView2 } from \"react-icons/ri\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasGalleryEnhancer,\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\" | \"gallery\",\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\n present={open}\n position=\"bottom\"\n display=\"flex\"\n flexDirection=\"column\"\n overflow=\"auto\"\n pb={8}\n >\n <HStack flex={1} alignItems=\"center\" justifyContent=\"center\">\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"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 alignSelf=\"stretch\" 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 {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Bookmarks\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Annotations\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Thumbnails\"\n size=\"lg\"\n variant={\n reader?.settings.values.viewportMode === \"thumbnails\"\n ? \"solid\"\n : \"ghost\"\n }\n onClick={() => {\n reader?.settings.update({\n viewportMode:\n reader?.settings.values.viewportMode === \"normal\"\n ? \"thumbnails\"\n : \"normal\",\n })\n }}\n >\n <LuGalleryHorizontal />\n </IconButton>\n {hasGalleryEnhancer(reader) && (\n <IconButton\n aria-label=\"Gallery\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"gallery\")}\n >\n <RiGalleryView2 />\n </IconButton>\n )}\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\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 | \"gallery\",\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?.locateResource(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.meta.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 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 \"./annotations/bookmarks/Bookmarks\"\nimport { Toaster } from \"./components/ui/toaster\"\nimport { GalleryDialog } from \"./gallery/GalleryDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { useInterceptExternalLinks } from \"./navigation/useInterceptExternalLinks\"\nimport { useNotifications } from \"./notifications/useNotifications\"\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 | \"gallery\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpenWith, setIsAnnotationsOpenWith] = useState<\n \"bookmarks\" | \"annotations\" | undefined\n >(undefined)\n const [isGalleryOpen, setIsGalleryOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n const onNavigate = useCallback(() => {\n setIsTableOfContentsOpen(false)\n setIsHelpOpen(false)\n setIsSearchOpen(false)\n setIsAnnotationsOpenWith(undefined)\n setQuickMenuOpen(false)\n setIsGalleryOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpenWith(\"annotations\")\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 setIsAnnotationsOpenWith(\"bookmarks\")\n } else if (item === \"gallery\") {\n setIsGalleryOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\n\n useInterceptExternalLinks()\n useNotifications()\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 <GalleryDialog open={isGalleryOpen} setOpen={setIsGalleryOpen} />\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 openWith={isAnnotationsOpenWith}\n setOpen={(open) =>\n setIsAnnotationsOpenWith(open ? \"annotations\" : undefined)\n }\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 <Toaster />\n </>\n )\n}\n"],"names":["ReaderContext","createContext","signal","Subject","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useSignalState","notificationsSubject","useConstant","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","useReaderContext","useContext","useReader","hasSearchEnhancer","hasAnnotationsEnhancer","hasGalleryEnhancer","useAnnotation","id","readerWithAnnotations","useObserve","map","items","item","filter","isDefined","switchMap","AnnotationListItem","onNavigate","annotation","List","jsxs","Link","_a","LuNotebookPen","Stack","Text","_b","useAnnotations","highlights","AnnotationsList","annotations","useBookmarks","BookmarksList","AnnotationsDialogContent","defaultTab","tab","setTab","useState","Tabs","e","LuBookmark","AnnotationsDialog","openWith","setOpen","Button","Spine","spineElement","Fragment","createPortal","useSpineItem","absolutePageIndex","itemIndex","useSpineItemReady","spineItem","of","BOOKMARK_AREA_DATA_ATTRIBUTE","useReaderWithAnnotations","useCanBookmarkPage","candidates","BookmarkPageButton","left","top","width","isItemReady","bookmarks","bookmarkForPage","bookmark","canBookmarkPage","Presence","Box","IconButton","BsBookmarkXFill","BsBookmarkPlus","Bookmarks","pages","pageIndex","toaster","createToaster","Toaster","ChakraToaster","toast","Toast","Spinner","defaultState","useMeasure","element","setElement","rect","setRect","observer","entries","x","y","height","bottom","right","useLayoutEffect","useAttachSnapshot","measures","readerWithGalleryEnhancer","NEVER","itemLayoutChanged$","startWith","distinctUntilChanged","isShallowEqual","isIntemIntersecting$","observeIntersection","throttleTime","isVisible","first","GalleryItem","onNavigated","locatedResource","GalleryDialog","open","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","state","context","isOnlyImages","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","useInterceptExternalLinks","event","isHtmlTagElement","url","useNotifyZoom","isZooming","EMPTY","abort","finalize","useNotifyFontScaleChange","fontScale","skip","useNotifications","mergeMap","notification","duration","sameNotification$","n","merge","timer","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","BottomBar","onItemClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","LuGalleryHorizontal","RiGalleryView2","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","before","after","SearchDialogContent","setText","readerWithSearch","onValueChange","search","data","searching","results","consolidatedResults","Input","result","j","_c","_d","_f","_e","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","index","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpenWith","setIsAnnotationsOpenWith","isGalleryOpen","setIsGalleryOpen","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/useReaderContext.ts","../src/context/useReader.ts","../src/annotations/useAnnotation.ts","../src/annotations/AnnotationListItem.tsx","../src/annotations/useAnnotations.ts","../src/annotations/AnnotationsList.tsx","../src/annotations/bookmarks/useBookmarks.ts","../src/annotations/bookmarks/BookmarksList.tsx","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/common/Spine.tsx","../src/common/useSpineItem.ts","../src/common/useSpineItemReady.ts","../src/constants.ts","../src/annotations/bookmarks/BookmarkPageMarker.tsx","../src/annotations/bookmarks/Bookmarks.tsx","../src/annotations/useReaderWithAnnotations.ts","../src/annotations/bookmarks/useBookmarkOnCornerTap.ts","../src/components/ui/toaster.tsx","../src/common/useMeasure.ts","../src/gallery/useAttachSnapshot.ts","../src/gallery/GalleryDialog.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/navigation/useInterceptExternalLinks.ts","../src/zoom/useNotifyZoom.ts","../src/notifications/useNotifications.ts","../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 { EnhancerAPI as GesturesEnhancerAPI } from \"@prose-reader/enhancer-gestures\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\nimport { Subject } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\n\ntype ContextType = {\n reader: (Reader & GesturesEnhancerAPI) | undefined\n quickMenuSignal: Signal<boolean, undefined>\n notificationsSubject: Subject<ReaderNotification>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n notificationsSubject: new Subject<ReaderNotification>(),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport type { EnhancerAPI as GestureEnhancerAPI } from \"@prose-reader/enhancer-gestures\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport {\n signal,\n useConstant,\n useLiveRef,\n useSignalState,\n useSubscribe,\n} from \"reactjrx\"\nimport { Subject, tap } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\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 & GestureEnhancerAPI) | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const [, quickMenuSignal] = useSignalState(() =>\n signal({\n default: quickMenuOpen,\n }),\n )\n const notificationsSubject = useConstant(\n () => new Subject<ReaderNotification>(),\n )\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n notificationsSubject,\n }),\n [quickMenuSignal, reader, notificationsSubject],\n )\n\n useEffect(() => {\n quickMenuSignal.setValue(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () => quickMenuSignal.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 { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReaderContext = () => {\n return useContext(ReaderContext)\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { GalleryEnhancerAPI } from \"@prose-reader/enhancer-gallery\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useReaderContext } from \"./useReaderContext\"\n\nexport const useReader = () => {\n const { reader } = useReaderContext()\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 hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n\nexport const hasGalleryEnhancer = (\n reader?: Reader,\n): reader is Reader & GalleryEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_GALLERY\" in reader\n}\n","import { isDefined, useObserve } from \"reactjrx\"\nimport { filter, map, switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useAnnotation = (id: string) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.annotations$.pipe(\n map((items) => items.find((item) => item.id === id)),\n filter(isDefined),\n switchMap((item) => readerWithAnnotations.locateResource(item)),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useReader } from \"../context/useReader\"\nimport { useAnnotation } from \"./useAnnotation\"\n\nexport const AnnotationListItem = ({\n id,\n onNavigate,\n}: { id: string; onNavigate: () => void }) => {\n const reader = useReader()\n const { data: annotation } = useAnnotation(id)\n\n return (\n <List.Item>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(annotation?.meta.cfi ?? \"\")\n }}\n >\n {annotation?.resource?.notes ? (\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 {annotation?.meta.range ? (\n annotation?.meta.range.toString()\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 annotation?.meta?.absolutePageIndex !== undefined\n ? annotation.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n}\n","import { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useAnnotations = () => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.annotations$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.locateResource(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"./AnnotationListItem\"\nimport { useAnnotations } from \"./useAnnotations\"\n\nexport const AnnotationsList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useAnnotations()\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {annotations?.map((item) => (\n <AnnotationListItem\n key={item.resource.id}\n id={item.resource.id}\n onNavigate={onNavigate}\n />\n ))}\n </List.Root>\n )\n}\n","import { useAnnotations } from \"../useAnnotations\"\n\nexport const useBookmarks = () => {\n const { data: annotations } = useAnnotations()\n\n return {\n data: annotations?.filter((annotation) => !annotation.meta.range),\n }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"../AnnotationListItem\"\nimport { useBookmarks } from \"./useBookmarks\"\n\nexport const BookmarksList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useBookmarks()\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {annotations?.map((item) => (\n <AnnotationListItem\n key={item.resource.id}\n id={item.resource.id}\n onNavigate={onNavigate}\n />\n ))}\n </List.Root>\n )\n}\n","import { Tabs } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { LuBookmark, LuNotebookPen } from \"react-icons/lu\"\nimport { AnnotationsList } from \"./AnnotationsList\"\nimport { BookmarksList } from \"./bookmarks/BookmarksList\"\n\nexport const AnnotationsDialogContent = memo(\n ({\n onNavigate,\n defaultTab,\n }: {\n onNavigate: () => void\n defaultTab: \"bookmarks\" | \"annotations\" | undefined\n }) => {\n const [tab, setTab] = useState(defaultTab ?? \"bookmarks\")\n\n return (\n <Tabs.Root\n value={tab}\n onValueChange={(e) => setTab(e.value as \"bookmarks\" | \"annotations\")}\n >\n <Tabs.List>\n <Tabs.Trigger value=\"bookmarks\">\n <LuBookmark />\n Bookmarks\n </Tabs.Trigger>\n <Tabs.Trigger value=\"annotations\">\n <LuNotebookPen />\n Annotations\n </Tabs.Trigger>\n <Tabs.Indicator />\n </Tabs.List>\n <Tabs.Content value=\"bookmarks\">\n <BookmarksList onNavigate={onNavigate} />\n </Tabs.Content>\n <Tabs.Content value=\"annotations\">\n <AnnotationsList onNavigate={onNavigate} />\n </Tabs.Content>\n </Tabs.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 openWith,\n setOpen,\n onNavigate,\n }: {\n openWith: \"bookmarks\" | \"annotations\" | undefined\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={!!openWith}\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\n onNavigate={onNavigate}\n defaultTab={openWith}\n />\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 { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const Spine = memo(({ children }: { children: React.ReactNode }) => {\n const reader = useReader()\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n\n if (!spineElement) return null\n\n return <>{createPortal(children, spineElement)}</>\n})\n","import { useMemo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useSpineItem = ({\n absolutePageIndex,\n itemIndex,\n}: { absolutePageIndex?: number; itemIndex?: number }) => {\n const reader = useReader()\n\n const items = useObserve(\n () => reader?.spine.spineItemsManager.items$,\n [reader],\n )\n\n const spineItem = useMemo(() => {\n void items\n\n if (itemIndex !== undefined)\n return reader?.spine.spineItemsManager.get(itemIndex)\n\n if (absolutePageIndex !== undefined) {\n const { itemIndex } =\n reader?.spine.locator.getSpineInfoFromAbsolutePageIndex({\n absolutePageIndex,\n }) ?? {}\n\n return reader?.spine.spineItemsManager.get(itemIndex)\n }\n\n return undefined\n }, [itemIndex, absolutePageIndex, reader, items])\n\n return {\n spineItem,\n }\n}\n","import { useObserve } from \"reactjrx\"\nimport { of } from \"rxjs\"\nimport { useSpineItem } from \"./useSpineItem\"\n\nexport const useSpineItemReady = ({\n absolutePageIndex,\n itemIndex,\n}: { absolutePageIndex?: number; itemIndex?: number }) => {\n const { spineItem } = useSpineItem({ absolutePageIndex, itemIndex })\n const isItemReady = useObserve(\n () => spineItem?.isReady$ ?? of(false),\n [spineItem],\n )\n\n return isItemReady\n}\n","export const BOOKMARK_AREA_DATA_ATTRIBUTE = `data-bookmark-area`\n","import { Box, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useSpineItemReady } from \"../../common/useSpineItemReady\"\nimport { BOOKMARK_AREA_DATA_ATTRIBUTE } from \"../../constants\"\nimport { useAnnotations } from \"../useAnnotations\"\n\nexport const BookmarkPageMarker = memo(\n ({\n absolutePageIndex,\n left,\n top,\n width,\n }: {\n absolutePageIndex: number\n left: number\n top: number\n width: number\n }) => {\n const isItemReady = useSpineItemReady({ absolutePageIndex })\n const { data: bookmarks } = useAnnotations()\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex === absolutePageIndex &&\n bookmark.meta.range === undefined,\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 (!isItemReady) return null\n\n const markerSize = (width * 0.1) / 2\n\n return (\n <Presence\n present={!!bookmarkForPage}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area={BOOKMARK_AREA_DATA_ATTRIBUTE}\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n pointerEvents=\"none\"\n top={top}\n width={markerSize}\n height={markerSize}\n _before={{\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n borderTop: `${markerSize}px solid #03030373`,\n borderLeft: `${markerSize}px solid transparent`,\n }}\n />\n </Presence>\n )\n },\n)\n","import { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { Spine } from \"../../common/Spine\"\nimport { useReader } from \"../../context/useReader\"\nimport { BookmarkPageMarker } from \"./BookmarkPageMarker\"\n\nexport const Bookmarks = memo(() => {\n const reader = useReader()\n const pages = useObserve(() => reader?.layoutInfo$, [reader])\n\n return (\n <Spine>\n {pages?.pages.map(\n ({ absoluteLayout: { left, top, width } }, pageIndex) => (\n <BookmarkPageMarker\n key={pageIndex}\n absolutePageIndex={pageIndex}\n left={left}\n top={top}\n width={width}\n />\n ),\n )}\n </Spine>\n )\n})\n","import { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useReaderWithAnnotations = () => {\n const reader = useReader()\n const readerWithBookmarks = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n return readerWithBookmarks\n}\n","import { isPositionInArea } from \"@prose-reader/enhancer-gestures\"\nimport { useEffect } from \"react\"\nimport { map, withLatestFrom } from \"rxjs\"\nimport { useAnnotations } from \"../useAnnotations\"\nimport { useReaderWithAnnotations } from \"../useReaderWithAnnotations\"\n\nexport const useBookmarkOnCornerTap = () => {\n const reader = useReaderWithAnnotations()\n const { data: bookmarks } = useAnnotations()\n\n useEffect(() => {\n if (!reader) return\n\n const unSub = reader.gestures.hooks.register(\n \"beforeTapGesture\",\n ({ event$ }) =>\n event$.pipe(\n withLatestFrom(reader?.annotations.candidates$),\n map(([context, candidates]) => {\n if (!context.page) return true\n\n const {\n spineItem,\n spineItemPageIndex,\n spineItemPagePosition,\n pageSize,\n } = context.page\n\n const hasTapOnTopRightCorner = isPositionInArea(\n spineItemPagePosition,\n {\n type: \"corner\",\n corner: \"top-right\",\n size: 10,\n unit: \"%\",\n },\n pageSize,\n )\n\n if (hasTapOnTopRightCorner) {\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n spineItemPageIndex,\n )\n\n if (!pageEntry) return true\n\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex ===\n pageEntry.absolutePageIndex &&\n bookmark.meta.range === undefined,\n )\n\n if (bookmarkForPage) {\n reader?.annotations.delete(bookmarkForPage.resource.id)\n\n return false\n }\n\n const canBookmarkPage = candidates?.[pageEntry.absolutePageIndex]\n\n if (canBookmarkPage) {\n reader?.annotations.annotateAbsolutePage({\n absolutePageIndex: pageEntry.absolutePageIndex,\n })\n\n return false\n }\n }\n\n return true\n }),\n ),\n )\n\n return unSub\n }, [reader, bookmarks])\n}\n","\"use client\"\n\nimport {\n Toaster as ChakraToaster,\n Portal,\n Spinner,\n Stack,\n Toast,\n createToaster,\n} from \"@chakra-ui/react\"\n\ntype Toaster = ReturnType<typeof createToaster>\n\nexport const toaster: Toaster = createToaster({\n placement: \"bottom-end\",\n pauseOnPageIdle: true,\n})\n\nexport const Toaster = () => {\n return (\n <Portal>\n <ChakraToaster toaster={toaster} insetInline={{ mdDown: \"4\" }}>\n {(toast) => (\n <Toast.Root width={{ md: \"sm\" }}>\n {toast.type === \"loading\" ? (\n <Spinner size=\"sm\" color=\"blue.solid\" />\n ) : (\n <Toast.Indicator />\n )}\n <Stack gap=\"1\" flex=\"1\" maxWidth=\"100%\">\n {toast.title && <Toast.Title>{toast.title}</Toast.Title>}\n {toast.description && (\n <Toast.Description>{toast.description}</Toast.Description>\n )}\n </Stack>\n {toast.action && (\n <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>\n )}\n {toast.meta?.closable && <Toast.CloseTrigger />}\n </Toast.Root>\n )}\n </ChakraToaster>\n </Portal>\n )\n}\n","import { useLayoutEffect, useMemo, useState } from \"react\"\n\nexport type UseMeasureRect = Pick<\n DOMRectReadOnly,\n \"x\" | \"y\" | \"top\" | \"left\" | \"right\" | \"bottom\" | \"height\" | \"width\"\n>\nexport type UseMeasureRef<E extends Element = Element> = (element: E) => void\nexport type UseMeasureResult<E extends Element = Element> = [\n UseMeasureRef<E>,\n UseMeasureRect,\n E | null,\n]\n\nconst defaultState: UseMeasureRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n}\n\nexport function useMeasure<E extends Element = Element>(): UseMeasureResult<E> {\n const [element, setElement] = useState<E | null>(null)\n const [rect, setRect] = useState<UseMeasureRect>(defaultState)\n\n const observer = useMemo(\n () =>\n new ResizeObserver((entries) => {\n if (entries[0]) {\n const { x, y, width, height, top, left, bottom, right } =\n entries[0].contentRect\n setRect({ x, y, width, height, top, left, bottom, right })\n }\n }),\n [],\n )\n\n useLayoutEffect(() => {\n if (!element) return\n\n observer.observe(element)\n\n return () => {\n observer.disconnect()\n }\n }, [element, observer])\n\n return [setElement, rect, element]\n}\n","import {\n type SpineItem,\n isShallowEqual,\n observeIntersection,\n} from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport {\n distinctUntilChanged,\n first,\n map,\n startWith,\n switchMap,\n tap,\n throttleTime,\n} from \"rxjs\"\nimport { NEVER } from \"rxjs\"\nimport { filter } from \"rxjs\"\nimport type { UseMeasureRect } from \"../common/useMeasure\"\nimport { useReader } from \"../context/useReader\"\nimport { hasGalleryEnhancer } from \"../context/useReader\"\n\nexport const useAttachSnapshot = (\n element: Element | null,\n item: SpineItem,\n measures: UseMeasureRect,\n) => {\n const reader = useReader()\n const readerWithGalleryEnhancer = hasGalleryEnhancer(reader)\n ? reader\n : undefined\n\n useSubscribe(() => {\n if (!readerWithGalleryEnhancer || !element) return NEVER\n\n const itemLayoutChanged$ = item.layout.layout$.pipe(\n startWith(item.layout.layoutInfo),\n distinctUntilChanged(isShallowEqual),\n )\n\n const isIntemIntersecting$ = observeIntersection(\n element as HTMLElement,\n ).pipe(map((entries) => entries.some((e) => e.isIntersecting)))\n\n return itemLayoutChanged$.pipe(\n throttleTime(100, undefined, { trailing: true }),\n switchMap(() => {\n return isIntemIntersecting$\n .pipe(\n tap((isVisible) => {\n // if the layout change and the item is not visible anymore, cleanup the element\n if (!isVisible) {\n element.innerHTML = \"\"\n }\n }),\n filter((isVisible) => isVisible),\n first(),\n )\n .pipe(\n switchMap(() => {\n element.innerHTML = \"\"\n\n return readerWithGalleryEnhancer?.gallery.snapshot(\n item,\n element,\n measures,\n )\n }),\n )\n }),\n )\n }, [readerWithGalleryEnhancer, item, measures, element])\n}\n","import { Box, Button, Text } from \"@chakra-ui/react\"\nimport type { SpineItem } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useMeasure } from \"../common/useMeasure\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { useReader } from \"../context/useReader\"\nimport { useAttachSnapshot } from \"./useAttachSnapshot\"\n\nconst GalleryItem = memo(\n ({\n item,\n onNavigated,\n }: {\n item: SpineItem\n onNavigated: () => void\n }) => {\n const [setElement, measures, element] = useMeasure()\n const reader = useReader()\n\n useAttachSnapshot(element, item, measures)\n\n const locatedResource = useObserve(\n () => reader?.locateResource(item, { mode: \"shallow\" }),\n [reader, item],\n )\n\n return (\n <Box\n width=\"100%\"\n aspectRatio=\"2/3\"\n border=\"1px solid\"\n borderColor=\"border\"\n borderRadius=\"md\"\n data-grid-item\n cursor=\"pointer\"\n position=\"relative\"\n overflow=\"hidden\"\n onClick={() => {\n onNavigated()\n reader?.navigation.goToSpineItem({ indexOrId: item })\n }}\n >\n <Box\n height=\"100%\"\n width=\"100%\"\n overflow=\"hidden\"\n pointerEvents=\"none\"\n ref={setElement}\n />\n <Text\n position=\"absolute\"\n bottom={0}\n left=\"0\"\n right=\"0\"\n textAlign=\"center\"\n bgColor=\"white\"\n p={4}\n fontSize=\"xs\"\n >\n Page {(locatedResource?.meta?.absolutePageIndex ?? 0) + 1}\n </Text>\n </Box>\n )\n },\n)\n\nexport const GalleryDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n const reader = useReader()\n const items = useObserve(() => reader?.spineItemsManager.items$, [reader])\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>Gallery</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Box\n gridTemplateColumns={[\n \"repeat(2, minmax(0, 1fr))\",\n \"repeat(3, minmax(0, 1fr))\",\n ]}\n display=\"grid\"\n gap={[2, 4]}\n pt={2}\n data-grid\n >\n {items?.map((item) => (\n <GalleryItem\n key={item.item.id}\n item={item}\n onNavigated={() => {\n setOpen(false)\n }}\n />\n ))}\n </Box>\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 { useSignalValue } from \"reactjrx\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\nexport const useQuickMenu = () => {\n const { quickMenuSignal } = useReaderContext()\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 { isHtmlTagElement } from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useInterceptExternalLinks = () => {\n const reader = useReader()\n\n useSubscribe(\n () =>\n reader?.links$.subscribe((event) => {\n if (event.type === \"click\" && isHtmlTagElement(event.target, \"a\")) {\n if (!event.target.href) return\n\n const url = new URL(event.target.href)\n\n if (window.location.host !== url.host) {\n const response = confirm(\n `You are going to be redirected to external link`,\n )\n\n if (response) {\n window.open(event.target.href, \"__blank\")\n }\n }\n }\n }),\n [reader],\n )\n}\n","import { useSubscribe } from \"reactjrx\"\nimport { EMPTY, NEVER, Subject, finalize, switchMap } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\nexport const useNotifyZoom = () => {\n const reader = useReader()\n const { notificationsSubject } = useReaderContext()\n\n useSubscribe(\n () =>\n reader?.zoom.isZooming$.pipe(\n switchMap((isZooming) => {\n if (!isZooming) return EMPTY\n\n const abort = new Subject<void>()\n\n notificationsSubject.next({\n key: \"zoom\",\n title: \"Zooming\",\n duration: 999999,\n abort: abort,\n })\n\n return NEVER.pipe(\n finalize(() => {\n abort.next()\n abort.complete()\n }),\n )\n }),\n ),\n [reader],\n )\n}\n","import { isDefined, useSubscribe } from \"reactjrx\"\nimport {\n NEVER,\n distinctUntilChanged,\n filter,\n finalize,\n first,\n map,\n merge,\n mergeMap,\n skip,\n tap,\n timer,\n} from \"rxjs\"\nimport { toaster } from \"../components/ui/toaster\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { useNotifyZoom } from \"../zoom/useNotifyZoom\"\n\nconst useNotifyFontScaleChange = () => {\n const reader = useReader()\n const { notificationsSubject } = useReaderContext()\n\n useSubscribe(\n () =>\n reader?.settings.values$.pipe(\n map(({ fontScale }) => fontScale),\n distinctUntilChanged(),\n skip(1),\n tap((fontScale) => {\n notificationsSubject.next({\n key: \"fontScaleChange\",\n title: \"Font size changed\",\n description: `${fontScale * 100} %`,\n })\n }),\n ),\n [reader, notificationsSubject],\n )\n}\n\nexport const useNotifications = () => {\n const { notificationsSubject } = useReaderContext()\n\n useNotifyFontScaleChange()\n useNotifyZoom()\n\n useSubscribe(\n () =>\n notificationsSubject.pipe(\n filter(isDefined),\n mergeMap((notification) => {\n const duration = notification.duration ?? 3000\n\n const toast = toaster.create({\n title: notification.title,\n description: notification.description,\n duration,\n })\n\n const sameNotification$ = notificationsSubject.pipe(\n skip(1),\n filter((n) => !!notification.key && n?.key === notification.key),\n )\n\n return merge(\n timer(duration),\n notification.abort ?? NEVER,\n sameNotification$,\n ).pipe(\n first(),\n finalize(() => {\n toaster.dismiss(toast)\n }),\n )\n }),\n ),\n [notificationsSubject],\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 { Box } from \"@chakra-ui/react\"\nimport { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { signal, useObserve, useSignalState, 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] = useSignalState(() =>\n signal({\n default: currentPage || 0,\n }),\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.update(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.state.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 const disabled =\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n if (disabled) return <Box style={props.style} />\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, LuGalleryHorizontal, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp, LuNotebookPen } from \"react-icons/lu\"\nimport { RiGalleryView2 } from \"react-icons/ri\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasGalleryEnhancer,\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\" | \"gallery\",\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\n present={open}\n position=\"bottom\"\n display=\"flex\"\n flexDirection=\"column\"\n overflow=\"auto\"\n pb={8}\n >\n <HStack flex={1} alignItems=\"center\" justifyContent=\"center\">\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"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 alignSelf=\"stretch\" 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 {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Bookmarks\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Annotations\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Thumbnails\"\n size=\"lg\"\n variant={\n reader?.settings.values.viewportMode === \"thumbnails\"\n ? \"solid\"\n : \"ghost\"\n }\n onClick={() => {\n reader?.settings.update({\n viewportMode:\n reader?.settings.values.viewportMode === \"normal\"\n ? \"thumbnails\"\n : \"normal\",\n })\n }}\n >\n <LuGalleryHorizontal />\n </IconButton>\n {hasGalleryEnhancer(reader) && (\n <IconButton\n aria-label=\"Gallery\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"gallery\")}\n >\n <RiGalleryView2 />\n </IconButton>\n )}\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\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 | \"gallery\",\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?.locateResource(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.meta.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 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 \"./annotations/bookmarks/Bookmarks\"\nimport { useBookmarkOnCornerTap } from \"./annotations/bookmarks/useBookmarkOnCornerTap\"\nimport { Toaster } from \"./components/ui/toaster\"\nimport { GalleryDialog } from \"./gallery/GalleryDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { useInterceptExternalLinks } from \"./navigation/useInterceptExternalLinks\"\nimport { useNotifications } from \"./notifications/useNotifications\"\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 | \"gallery\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpenWith, setIsAnnotationsOpenWith] = useState<\n \"bookmarks\" | \"annotations\" | undefined\n >(undefined)\n const [isGalleryOpen, setIsGalleryOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n const onNavigate = useCallback(() => {\n setIsTableOfContentsOpen(false)\n setIsHelpOpen(false)\n setIsSearchOpen(false)\n setIsAnnotationsOpenWith(undefined)\n setQuickMenuOpen(false)\n setIsGalleryOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpenWith(\"annotations\")\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 setIsAnnotationsOpenWith(\"bookmarks\")\n } else if (item === \"gallery\") {\n setIsGalleryOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\n\n useInterceptExternalLinks()\n useNotifications()\n useBookmarkOnCornerTap()\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 <GalleryDialog open={isGalleryOpen} setOpen={setIsGalleryOpen} />\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 openWith={isAnnotationsOpenWith}\n setOpen={(open) =>\n setIsAnnotationsOpenWith(open ? \"annotations\" : undefined)\n }\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 <Toaster />\n </>\n )\n}\n"],"names":["ReaderContext","createContext","signal","Subject","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useSignalState","notificationsSubject","useConstant","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","useReaderContext","useContext","useReader","hasSearchEnhancer","hasAnnotationsEnhancer","hasGalleryEnhancer","useAnnotation","id","readerWithAnnotations","useObserve","map","items","item","filter","isDefined","switchMap","AnnotationListItem","onNavigate","annotation","List","jsxs","Link","_a","LuNotebookPen","Stack","Text","_b","useAnnotations","highlights","AnnotationsList","annotations","useBookmarks","BookmarksList","AnnotationsDialogContent","defaultTab","tab","setTab","useState","Tabs","e","LuBookmark","AnnotationsDialog","openWith","setOpen","Button","Spine","spineElement","Fragment","createPortal","useSpineItem","absolutePageIndex","itemIndex","useSpineItemReady","spineItem","of","BOOKMARK_AREA_DATA_ATTRIBUTE","BookmarkPageMarker","left","top","width","isItemReady","bookmarks","bookmarkForPage","bookmark","markerSize","Presence","Box","Bookmarks","pages","pageIndex","useReaderWithAnnotations","useBookmarkOnCornerTap","event$","withLatestFrom","context","candidates","spineItemPageIndex","spineItemPagePosition","pageSize","isPositionInArea","pageEntry","toaster","createToaster","Toaster","ChakraToaster","toast","Toast","Spinner","defaultState","useMeasure","element","setElement","rect","setRect","observer","entries","x","y","height","bottom","right","useLayoutEffect","useAttachSnapshot","measures","readerWithGalleryEnhancer","NEVER","itemLayoutChanged$","startWith","distinctUntilChanged","isShallowEqual","isIntemIntersecting$","observeIntersection","throttleTime","isVisible","first","GalleryItem","onNavigated","locatedResource","GalleryDialog","open","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","state","isOnlyImages","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","useInterceptExternalLinks","event","isHtmlTagElement","url","useNotifyZoom","isZooming","EMPTY","abort","finalize","useNotifyFontScaleChange","fontScale","skip","useNotifications","mergeMap","notification","duration","sameNotification$","n","merge","timer","ToggleTip","showArrow","content","ChakraPopover","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","BottomBar","onItemClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","LuGalleryHorizontal","RiGalleryView2","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","before","after","SearchDialogContent","setText","readerWithSearch","onValueChange","search","data","searching","results","consolidatedResults","Input","result","j","_c","_d","_f","_e","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","index","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpenWith","setIsAnnotationsOpenWith","isGalleryOpen","setIsGalleryOpen","setQuickMenuOpen","_onItemClick"],"mappings":"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"}