@prose-reader/react-reader 1.270.0 → 1.272.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/constants.ts","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/context.ts","../src/context/useReaderContext.ts","../src/context/useReader.ts","../src/annotations/useAnnotation.ts","../src/annotations/AnnotationListItem.tsx","../src/annotations/useAnnotations.ts","../src/annotations/useHighlights.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/annotations/bookmarks/BookmarkPageMarker.tsx","../src/annotations/bookmarks/BookmarkPageMarkers.tsx","../src/annotations/useReaderWithAnnotations.ts","../src/annotations/bookmarks/useBookmarkOnCornerTap.ts","../src/annotations/usePreventInteractionOnSelection.ts","../src/components/ui/toaster.tsx","../src/context/ReactReaderProvider.tsx","../src/components/ui/radio.tsx","../src/components/ui/slider.tsx","../src/settings/types.ts","../src/fonts/FontSizeControlsDialog.tsx","../src/fonts/SyncFontSettings.ts","../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/navigation/FloatingTime.tsx","../src/navigation/useInterceptExternalLinks.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/useQuickMenu.ts","../src/quickmenu/QuickMenu.tsx","../src/quickmenu/useQuickMenuToggleGesture.ts","../src/components/ui/field.tsx","../src/refit/RefitDialog.tsx","../src/search/SearchListItem.tsx","../src/search/useSearch.ts","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/toc/TableOfContentsDialog.tsx","../src/zoom/useZoomSettings.ts","../src/zoom/ZoomControls.tsx","../src/ReactReader.tsx"],"sourcesContent":["export const BOOKMARK_AREA_DATA_ATTRIBUTE = `data-bookmark-area`\nexport const MAX_ZOOM_SCALE = 5\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 * as React from \"react\"\nimport { CloseButton } from \"./close-button\"\n\ninterface DialogContentProps extends ChakraDialog.ContentProps {\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n backdrop?: boolean\n}\n\nexport const DialogContent = React.forwardRef<\n HTMLDivElement,\n DialogContentProps\n>(function DialogContent(props, ref) {\n const {\n children,\n portalled = true,\n portalRef,\n backdrop = true,\n ...rest\n } = props\n\n return (\n <Portal disabled={!portalled} container={portalRef}>\n {backdrop && <ChakraDialog.Backdrop />}\n <ChakraDialog.Positioner>\n <ChakraDialog.Content ref={ref} {...rest} asChild={false}>\n {children}\n </ChakraDialog.Content>\n </ChakraDialog.Positioner>\n </Portal>\n )\n})\n\nexport const DialogCloseTrigger = React.forwardRef<\n HTMLButtonElement,\n ChakraDialog.CloseTriggerProps\n>(function DialogCloseTrigger(props, ref) {\n return (\n <ChakraDialog.CloseTrigger\n position=\"absolute\"\n top=\"2\"\n insetEnd=\"2\"\n {...props}\n asChild\n >\n <CloseButton size=\"sm\" ref={ref}>\n {props.children}\n </CloseButton>\n </ChakraDialog.CloseTrigger>\n )\n})\n\nexport const DialogRoot = ChakraDialog.Root\nexport const DialogFooter = ChakraDialog.Footer\nexport const DialogHeader = ChakraDialog.Header\nexport const DialogBody = ChakraDialog.Body\nexport const DialogBackdrop = ChakraDialog.Backdrop\nexport const DialogTitle = ChakraDialog.Title\nexport const DialogDescription = ChakraDialog.Description\nexport const DialogTrigger = ChakraDialog.Trigger\nexport const DialogActionTrigger = ChakraDialog.ActionTrigger\n","import type { Reader } from \"@prose-reader/core\"\nimport type { EnhancerAPI as GesturesEnhancerAPI } from \"@prose-reader/enhancer-gestures\"\nimport { createContext, type Dispatch, type SetStateAction } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\nimport { Subject } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\nimport type {\n PROSE_REACT_READER_SETTINGS_SCOPE,\n PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE,\n} from \"../settings/types\"\n\nexport type PrivateContextType = {\n /**\n * Internal fallback values used for uncontrolled settings. This way the\n * Reader works as intended but:\n * - there are no persistent settings\n * - the settings are valid only for the current mount runtime\n */\n uncontrolledFontSize: number\n refitMenuOpen: boolean\n onRefitMenuOpenChange: (open: boolean) => void\n fontSizeMenuOpen: boolean\n onFontSizeMenuOpenChange: (open: boolean) => void\n notificationsSubject: Subject<ReaderNotification>\n quickMenuBottomBarBoundingBoxSignal: Signal<ResizeObserverEntry | undefined>\n fontSizeMin: number\n fontSizeMax: number\n _quickMenuOpen: boolean\n _onQuickMenuOpenChange: Dispatch<SetStateAction<boolean>>\n}\n\nexport type PublicContextType = {\n reader: (Reader & GesturesEnhancerAPI) | undefined\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 quickMenuOpen?: boolean\n onQuickMenuOpenChange?: Dispatch<SetStateAction<boolean>>\n fontSize?: number\n zoomMaxScale?: number\n onFontSizeChange?: (\n from: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE | \"internal\",\n value: number,\n ) => void\n fontSizeScope?: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE\n onFontSizeScopeChange?: (scope: PROSE_REACT_READER_SETTINGS_SCOPE) => void\n fontSizeValues?: Record<\n PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE,\n number | undefined\n >\n}\n\nexport type ReaderContextType = PrivateContextType & PublicContextType\n\nexport const getDefaultValue = (): ReaderContextType => ({\n _quickMenuOpen: false,\n _onQuickMenuOpenChange: (prev) => prev,\n reader: undefined,\n quickMenuBottomBarBoundingBoxSignal: signal<ResizeObserverEntry | undefined>({\n default: undefined,\n }),\n notificationsSubject: new Subject<ReaderNotification>(),\n refitMenuOpen: false,\n onRefitMenuOpenChange: () => {},\n fontSizeMenuOpen: false,\n onFontSizeMenuOpenChange: () => {},\n fontSizeMin: 0.2,\n fontSizeMax: 5,\n uncontrolledFontSize: 1,\n enableFloatingProgress: true,\n})\n\nexport const ReaderContext = createContext(\n signal({ default: getDefaultValue() }),\n)\n","import { useContext } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { ReaderContext, type ReaderContextType } from \"./context\"\n\nexport const useReaderContextValue = <T extends keyof ReaderContextType>(\n selector: Array<T>,\n) => {\n const context = useContext(ReaderContext)\n\n return useObserve(context, selector)\n}\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 { RefitEnhancerAPI } from \"@prose-reader/enhancer-refit\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useReaderContextValue } from \"./useReaderContext\"\n\nexport const useReader = () => {\n const { reader } = useReaderContextValue([\"reader\"])\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\nexport const hasRefitEnhancer = (\n reader?: Reader,\n): reader is Reader & RefitEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_REFIT\" 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 allowLeftIcon = true,\n}: {\n id: string\n onNavigate: () => void\n allowLeftIcon?: boolean\n}) => {\n const reader = useReader()\n const { data: annotation } = useAnnotation(id)\n const textContent =\n annotation?.meta.range?.toString() || annotation?.meta.node?.textContent\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 ) : allowLeftIcon ? (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n ) : null}\n <Stack gap={0}>\n {textContent ? (\n <Text lineClamp={2} fontSize=\"md\">\n {textContent}\n </Text>\n ) : (\n <Text lineClamp={2} fontSize=\"md\" fontStyle=\"italic\">\n Page {(annotation?.meta.absolutePageIndex ?? 0) + 1}\n </Text>\n )}\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 { useAnnotations } from \"./useAnnotations\"\n\nexport const useHighlights = () => {\n const { data: annotations } = useAnnotations()\n\n return {\n data: annotations?.filter((annotation) => annotation.meta.isCfiRange),\n }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"./AnnotationListItem\"\nimport { useHighlights } from \"./useHighlights\"\n\nexport const AnnotationsList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useHighlights()\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(\n (annotation) => !annotation.meta.isCfiRange && !annotation.resource.notes,\n ),\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 allowLeftIcon={false}\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 { useObserve } from \"reactjrx\"\nimport { EMPTY, map, of } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useSpineItem = ({\n absolutePageIndex,\n itemIndex,\n}: {\n absolutePageIndex?: number\n itemIndex?: number\n}) => {\n const reader = useReader()\n\n const spineItem = useObserve(() => {\n if (!reader) return EMPTY\n\n if (itemIndex !== undefined)\n return of(reader.spine.spineItemsManager.get(itemIndex))\n\n if (absolutePageIndex !== undefined) {\n return reader.spine.pages\n .observeFromAbsolutePageIndex(absolutePageIndex)\n .pipe(\n map((page) => reader.spine.spineItemsManager.get(page?.itemIndex)),\n )\n }\n\n return EMPTY\n }, [itemIndex, absolutePageIndex, reader])\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}: {\n absolutePageIndex?: number\n itemIndex?: number\n}) => {\n const { spineItem } = useSpineItem({ absolutePageIndex, itemIndex })\n const isReady = useObserve(\n () => spineItem?.isReady$ ?? of(false),\n [spineItem],\n )\n\n return { spineItem, isReady }\n}\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 { isReady: isItemReady } = useSpineItemReady({\n absolutePageIndex,\n })\n const { data: bookmarks } = useAnnotations()\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex === absolutePageIndex &&\n !bookmark.meta.isCfiRange,\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 BookmarkPageMarkers = 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\nconst CONTINUE_TAP_GESTURE = true\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 CONTINUE_TAP_GESTURE\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 CONTINUE_TAP_GESTURE\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 !CONTINUE_TAP_GESTURE\n }\n\n const canBookmarkPage = candidates?.[pageEntry.absolutePageIndex]\n\n if (canBookmarkPage) {\n reader?.annotations.annotateAbsolutePage({\n absolutePageIndex: pageEntry.absolutePageIndex,\n })\n\n return !CONTINUE_TAP_GESTURE\n }\n }\n\n return CONTINUE_TAP_GESTURE\n }),\n ),\n )\n\n return unSub\n }, [reader, bookmarks])\n}\n","import { useSubscribe } from \"reactjrx\"\nimport { map, withLatestFrom } from \"rxjs\"\nimport { useReaderWithAnnotations } from \"./useReaderWithAnnotations\"\n\nexport const usePreventInteractionOnSelection = () => {\n const reader = useReaderWithAnnotations()\n\n useSubscribe(\n () =>\n /**\n * Hook used to prevent some gestures from being handled.\n */\n reader?.gestures.hooks.register(\"beforeTapGesture\", ({ event$ }) =>\n event$.pipe(\n withLatestFrom(reader.selection.lastSelectionOnPointerdown$),\n map(([{ event }, lastSelectionOnPointerdown]) => {\n const target = event.event.target\n\n /**\n * In this case if we have a gesture on an annotation, we want to prevent\n * it.\n */\n const wasOrIsOnSelection =\n (target && reader.annotations.isTargetWithinHighlight(target)) ||\n lastSelectionOnPointerdown\n\n return !wasOrIsOnSelection\n }),\n ),\n ),\n [reader],\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 { isShallowEqual } from \"@prose-reader/shared\"\nimport { type ComponentProps, memo, useCallback, useEffect } from \"react\"\nimport { signal, useConstant, useMemoCompare, useSignalValue } from \"reactjrx\"\nimport {\n getDefaultValue,\n type PrivateContextType,\n type PublicContextType,\n ReaderContext,\n} from \"./context\"\n\nconst SignalProvider = ({\n children,\n ...props\n}: {\n children: React.ReactNode\n} & PublicContextType) => {\n const valueSignal = useConstant(() => signal({ default: getDefaultValue() }))\n /**\n * font menu open\n */\n const uncontrolledFontSizeMenuOpen = useConstant(() =>\n signal({ default: valueSignal.value.fontSizeMenuOpen }),\n )\n const uncontrolledFontSizeMenuOpenValue = useSignalValue(\n uncontrolledFontSizeMenuOpen,\n )\n const uncontrolledOnFontSizeMenuOpenChange = useCallback(\n (open: boolean) => {\n uncontrolledFontSizeMenuOpen.update(open)\n },\n [uncontrolledFontSizeMenuOpen],\n )\n const _onQuickMenuOpenChange: PrivateContextType[\"_onQuickMenuOpenChange\"] =\n useCallback(\n (valueOrUpdater: boolean | ((prev: boolean) => boolean)) => {\n valueSignal.update((old) => ({\n ...old,\n _quickMenuOpen:\n typeof valueOrUpdater === \"function\"\n ? valueOrUpdater(old._quickMenuOpen)\n : valueOrUpdater,\n }))\n },\n [valueSignal],\n )\n const uncontrolledRefitMenuOpen = useConstant(() =>\n signal({ default: valueSignal.value.refitMenuOpen }),\n )\n const uncontrolledOnRefitMenuOpenChange = useCallback(\n (open: boolean) => {\n uncontrolledRefitMenuOpen.update(open)\n },\n [uncontrolledRefitMenuOpen],\n )\n const uncontrolledRefitMenuOpenValue = useSignalValue(\n uncontrolledRefitMenuOpen,\n )\n\n const memoizedProps = useMemoCompare(props, isShallowEqual)\n\n useEffect(() => {\n valueSignal.update((old) => ({\n ...old,\n ...memoizedProps,\n onFontSizeMenuOpenChange: uncontrolledOnFontSizeMenuOpenChange,\n fontSizeMenuOpen: uncontrolledFontSizeMenuOpenValue,\n onRefitMenuOpenChange: uncontrolledOnRefitMenuOpenChange,\n refitMenuOpen: uncontrolledRefitMenuOpenValue,\n _onQuickMenuOpenChange,\n }))\n }, [\n memoizedProps,\n _onQuickMenuOpenChange,\n valueSignal,\n uncontrolledFontSizeMenuOpenValue,\n uncontrolledOnFontSizeMenuOpenChange,\n uncontrolledRefitMenuOpenValue,\n uncontrolledOnRefitMenuOpenChange,\n ])\n\n return (\n <ReaderContext.Provider value={valueSignal}>\n {children}\n </ReaderContext.Provider>\n )\n}\n\nexport const ReactReaderProvider = memo(\n ({ children, ...props }: ComponentProps<typeof SignalProvider>) => {\n return <SignalProvider {...props}>{children}</SignalProvider>\n },\n)\n","import { RadioGroup as ChakraRadioGroup } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface RadioProps extends ChakraRadioGroup.ItemProps {\n rootRef?: React.Ref<HTMLDivElement>\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n function Radio(props, ref) {\n const { children, inputProps, rootRef, ...rest } = props\n return (\n <ChakraRadioGroup.Item ref={rootRef} {...rest}>\n <ChakraRadioGroup.ItemHiddenInput ref={ref} {...inputProps} />\n <ChakraRadioGroup.ItemIndicator />\n {children && (\n <ChakraRadioGroup.ItemText>{children}</ChakraRadioGroup.ItemText>\n )}\n </ChakraRadioGroup.Item>\n )\n },\n)\n\nexport const RadioGroup = ChakraRadioGroup.Root\n","import { Slider as ChakraSlider, For, HStack } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface SliderProps extends ChakraSlider.RootProps {\n marks?: Array<number | { value: number; label: React.ReactNode }>\n label?: React.ReactNode\n showValue?: boolean\n}\n\nexport const Slider = React.memo(function Slider({\n ref,\n ...props\n}: SliderProps & { ref?: React.RefObject<HTMLDivElement> }) {\n const { marks: marksProp, label, showValue, ...rest } = props\n const value = props.defaultValue ?? props.value\n\n const marks = marksProp?.map((mark) => {\n if (typeof mark === \"number\") return { value: mark, label: undefined }\n return mark\n })\n\n const hasMarkLabel = !!marks?.some((mark) => mark.label)\n\n return (\n <ChakraSlider.Root ref={ref} thumbAlignment=\"center\" {...rest}>\n {label && !showValue && <ChakraSlider.Label>{label}</ChakraSlider.Label>}\n {label && showValue && (\n <HStack justify=\"space-between\">\n <ChakraSlider.Label>{label}</ChakraSlider.Label>\n <ChakraSlider.ValueText />\n </HStack>\n )}\n <ChakraSlider.Control data-has-mark-label={hasMarkLabel || undefined}>\n <ChakraSlider.Track>\n <ChakraSlider.Range />\n </ChakraSlider.Track>\n <SliderThumbs value={value} />\n <SliderMarks marks={marks} />\n </ChakraSlider.Control>\n </ChakraSlider.Root>\n )\n})\n\nfunction SliderThumbs(props: { value?: number[] }) {\n const { value } = props\n return (\n <For each={value}>\n {(_, index) => (\n <ChakraSlider.Thumb key={index} index={index}>\n <ChakraSlider.HiddenInput />\n </ChakraSlider.Thumb>\n )}\n </For>\n )\n}\n\ninterface SliderMarksProps {\n marks?: Array<number | { value: number; label: React.ReactNode }>\n}\n\nconst SliderMarks = React.forwardRef<HTMLDivElement, SliderMarksProps>(\n function SliderMarks(props, ref) {\n const { marks } = props\n if (!marks?.length) return null\n\n return (\n <ChakraSlider.MarkerGroup ref={ref}>\n {marks.map((mark, index) => {\n const value = typeof mark === \"number\" ? mark : mark.value\n const label = typeof mark === \"number\" ? undefined : mark.label\n return (\n <ChakraSlider.Marker key={index} value={value}>\n <ChakraSlider.MarkerIndicator />\n {label}\n </ChakraSlider.Marker>\n )\n })}\n </ChakraSlider.MarkerGroup>\n )\n },\n)\n","export const PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION = [\n {\n value: \"global\",\n references: [\"global\"],\n },\n {\n value: \"book\",\n references: [\"book\"],\n },\n {\n value: \"screen\",\n references: [\"mobile\", \"tablet\", \"desktop\"],\n },\n] as const\nexport type PROSE_REACT_READER_SETTINGS_SCOPE =\n (typeof PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION)[number][\"value\"]\nexport type PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE =\n (typeof PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION)[number][\"references\"][number]\n","import {\n Button,\n Fieldset,\n HStack,\n type SliderValueChangeDetails,\n Stack,\n Tabs,\n type TabsValueChangeDetails,\n} from \"@chakra-ui/react\"\nimport {\n type ComponentProps,\n memo,\n useCallback,\n useEffect,\n useState,\n} from \"react\"\nimport { LuCheck } from \"react-icons/lu\"\nimport { useLiveRef } from \"reactjrx\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { Radio, RadioGroup } from \"../components/ui/radio\"\nimport { Slider } from \"../components/ui/slider\"\nimport {\n useReaderContext,\n useReaderContextValue,\n} from \"../context/useReaderContext\"\nimport {\n type PROSE_REACT_READER_SETTINGS_SCOPE,\n PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION,\n type PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE,\n} from \"../settings/types\"\n\nconst SETTINGS_SCOPES_VALUES =\n PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION.map((item) => item.value)\nconst SETTINGS_SCOPES_REFERENCES =\n PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION.flatMap(\n (item) => item.references,\n )\n\nconst getScopeForReference = (\n reference: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE | undefined,\n) => {\n if (!reference) {\n return undefined\n }\n\n return PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION.find((item) =>\n (item.references as readonly string[]).includes(reference),\n )?.value\n}\n\nexport const FontSizeControlsDialog = memo(() => {\n const context = useReaderContext()\n const {\n fontSizeMenuOpen,\n onFontSizeMenuOpenChange,\n uncontrolledFontSize,\n fontSize = uncontrolledFontSize,\n fontSizeMin,\n fontSizeMax,\n fontSizeScope,\n fontSizeValues,\n onFontSizeChange,\n onFontSizeScopeChange,\n } = useReaderContextValue([\n \"fontSizeMenuOpen\",\n \"onFontSizeMenuOpenChange\",\n \"fontSize\",\n \"fontSizeMin\",\n \"fontSizeMax\",\n \"fontSizeScope\",\n \"onFontSizeChange\",\n \"onFontSizeScopeChange\",\n \"uncontrolledFontSize\",\n \"fontSizeValues\",\n ])\n const onFontSizeChangeRef = useLiveRef(onFontSizeChange)\n const [tabValue, setTabValue] =\n useState<PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE>(\n fontSizeScope ?? \"global\",\n )\n const onFontUpdate = useCallback(\n (scope: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE, value: number) => {\n if (onFontSizeChangeRef.current) {\n onFontSizeChangeRef.current(scope, value)\n } else {\n context.update((old) => ({\n ...old,\n uncontrolledFontSize: value,\n }))\n }\n },\n [onFontSizeChangeRef, context],\n )\n const getValueForScope = useCallback(\n (scope: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE) => {\n return fontSizeValues?.[scope] ?? fontSize\n },\n [fontSize, fontSizeValues],\n )\n\n const onScopeValueChange = useCallback(\n (\n details: Parameters<\n NonNullable<ComponentProps<typeof RadioGroup>[\"onValueChange\"]>\n >[0],\n ) => {\n const value = details.value as PROSE_REACT_READER_SETTINGS_SCOPE\n\n onFontSizeScopeChange?.(value)\n },\n [onFontSizeScopeChange],\n )\n\n const onTabValueChange = useCallback((details: TabsValueChangeDetails) => {\n setTabValue(details.value as PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE)\n }, [])\n\n const onSliderValueChange = useCallback(\n (details: SliderValueChangeDetails) => {\n const value = details.value[0] ?? 0\n\n onFontUpdate(tabValue, value / 100)\n },\n [onFontUpdate, tabValue],\n )\n\n useEffect(\n function syncScopeChangeWithTabs() {\n setTabValue(fontSizeScope ?? \"global\")\n },\n [fontSizeScope],\n )\n\n return (\n <DialogRoot\n lazyMount\n open={fontSizeMenuOpen}\n onOpenChange={(e) => {\n onFontSizeMenuOpenChange(e.open)\n }}\n placement=\"center\"\n >\n <DialogContent maxH=\"40vh\" overflow=\"auto\">\n <DialogHeader>\n <DialogTitle>Font size</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Stack gap={4} flex={1}>\n <Fieldset.Root>\n <Fieldset.Legend>Scope</Fieldset.Legend>\n <Fieldset.HelperText>\n The scope to which apply the font size for this book.\n </Fieldset.HelperText>\n <Fieldset.Content>\n <RadioGroup\n onValueChange={onScopeValueChange}\n value={getScopeForReference(fontSizeScope) ?? \"global\"}\n disabled={!onFontSizeScopeChange}\n >\n <HStack gap={2}>\n {SETTINGS_SCOPES_VALUES.map((scope) => (\n <Radio value={scope} key={scope}>\n {scope}\n </Radio>\n ))}\n </HStack>\n </RadioGroup>\n </Fieldset.Content>\n </Fieldset.Root>\n <Tabs.Root\n value={tabValue}\n onValueChange={onTabValueChange}\n fitted={false}\n size=\"sm\"\n >\n <Tabs.List>\n {SETTINGS_SCOPES_REFERENCES.map((scope) => (\n <Tabs.Trigger\n value={scope}\n key={scope}\n textTransform=\"capitalize\"\n disabled={scope !== \"global\" && !fontSizeScope}\n >\n {fontSizeScope === scope && <LuCheck />}\n {scope}\n </Tabs.Trigger>\n ))}\n </Tabs.List>\n {SETTINGS_SCOPES_REFERENCES.map((scope) => (\n <Tabs.Content value={scope} key={scope}>\n <Slider\n label={`%`}\n value={[(getValueForScope(scope) ?? 1) * 100]}\n onValueChange={onSliderValueChange}\n showValue={true}\n marks={[\n { value: 100, label: \"Publisher\" },\n {\n value: fontSizeMin * 100,\n label: `${fontSizeMin * 100}%`,\n },\n {\n value: fontSizeMax * 100,\n label: `${fontSizeMax * 100}%`,\n },\n ]}\n max={fontSizeMax * 100}\n min={fontSizeMin * 100}\n width=\"100%\"\n step={0.1 * 100}\n />\n </Tabs.Content>\n ))}\n </Tabs.Root>\n </Stack>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n})\n","import { useEffect } from \"react\"\nimport { useSubscribe } from \"reactjrx\"\nimport { map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\nimport {\n useReaderContext,\n useReaderContextValue,\n} from \"../context/useReaderContext\"\n\nexport const SyncFontSettings = () => {\n const reader = useReader()\n const context = useReaderContext()\n const { fontSize, uncontrolledFontSize } = useReaderContextValue([\n \"fontSize\",\n \"uncontrolledFontSize\",\n \"onFontSizeChange\",\n ])\n const _fontSize = fontSize ?? uncontrolledFontSize\n\n useEffect(\n function syncDownFontSize() {\n if (reader && _fontSize) {\n const timeout = setTimeout(() => {\n reader.settings.update({\n fontScale: _fontSize,\n })\n }, 200)\n\n return () => clearTimeout(timeout)\n }\n },\n [reader, _fontSize],\n )\n\n useSubscribe(\n function syncUpFontSize() {\n return reader?.settings.values$\n .pipe(map((settings) => settings.fontScale))\n .subscribe((fontScale) => {\n const _fontSize =\n context.value.fontSize ?? context.value.uncontrolledFontSize\n\n if (fontScale !== _fontSize) {\n context.value.onFontSizeChange?.(\"internal\", fontScale)\n context.update((old) => ({\n ...old,\n uncontrolledFontSize: fontScale,\n }))\n }\n })\n },\n [reader, context],\n )\n\n return null\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 ({ item, onNavigated }: { item: SpineItem; onNavigated: () => void }) => {\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 ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {\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, Heading, HStack, Kbd, Stack, 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 ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {\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\n overflowY=\"auto\"\n flex={1}\n display=\"flex\"\n flexDirection=\"column\"\n gap={4}\n >\n <Stack>\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 </Stack>\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Bookmarks\n </Heading>\n <HStack mb={1}>\n <Text>Tap on the top right corner of a page bookmark it</Text>\n </HStack>\n </Stack>\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </Stack>\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 { combineLatest, map, NEVER } 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]).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, Presence, Text } from \"@chakra-ui/react\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nconst ANIMATION_NAME_IN_OUT = { _open: \"fade-in\", _closed: \"fade-out\" }\n\nexport const FloatingProgress = () => {\n const { enableFloatingProgress, quickMenuOpen } = useReaderContextValue([\n \"enableFloatingProgress\",\n \"quickMenuOpen\",\n ])\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 (\n pagination?.percentageEstimateOfBook === undefined ||\n !enableFloatingProgress\n )\n return null\n\n return (\n <Presence\n present={!quickMenuOpen}\n animationName={ANIMATION_NAME_IN_OUT}\n animationDuration=\"moderate\"\n >\n <Box\n position=\"absolute\"\n right={0}\n bottom={0}\n p={2}\n WebkitTextStroke=\"2px black\"\n paintOrder=\"stroke fill\"\n pointerEvents=\"none\"\n letterSpacing={1}\n color=\"white\"\n >\n <Text fontSize=\"md\">{displayableProgress} %</Text>\n </Box>\n </Presence>\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=\"md\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { TimeIndicator } from \"../quickmenu/TimeIndicator\"\n\nexport const FloatingTime = memo(() => {\n return (\n <Box\n position=\"absolute\"\n left={0}\n bottom={0}\n p={2}\n color=\"white\"\n WebkitTextStroke=\"2px black\"\n paintOrder=\"stroke fill\"\n pointerEvents=\"none\"\n letterSpacing={1}\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 { isDefined, useSubscribe } from \"reactjrx\"\nimport {\n filter,\n finalize,\n first,\n merge,\n mergeMap,\n NEVER,\n Observable,\n skip,\n switchMap,\n timer,\n} from \"rxjs\"\nimport { toaster } from \"../components/ui/toaster\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\nimport { useFontSizeNotifications } from \"../fonts/useFontSizeNotifications\"\n\nexport const useNotifications = () => {\n const { notificationsSubject } = useReaderContextValue([\n \"notificationsSubject\",\n ])\n\n useFontSizeNotifications()\n\n useSubscribe(\n () =>\n notificationsSubject.pipe(\n filter(isDefined),\n mergeMap((notification) => {\n const duration = notification.duration ?? 3000\n\n const toast$ = new Observable<string>((subscriber) => {\n try {\n queueMicrotask(() => {\n const toastId = toaster.create({\n title: notification.title,\n description: notification.description,\n duration,\n })\n\n subscriber.next(toastId)\n subscriber.complete()\n })\n } catch (error) {\n subscriber.error(error)\n }\n })\n\n const sameNotification$ = notificationsSubject.pipe(\n skip(1),\n filter((n) => !!notification.key && n?.key === notification.key),\n )\n\n return toast$.pipe(\n switchMap((toast) =>\n merge(\n timer(duration),\n notification.abort ?? NEVER,\n sameNotification$,\n ).pipe(\n first(),\n finalize(() => {\n queueMicrotask(() => {\n toaster.dismiss(toast)\n })\n }),\n ),\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 ref?: React.RefObject<HTMLDivElement | null>\n }) => {\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, [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.update(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 { Box, Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useEffect, useRef, useState } from \"react\"\nimport { BiFontSize } from \"react-icons/bi\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport {\n LuChevronDown,\n LuCircleHelp,\n LuGalleryHorizontal,\n LuNotebookPen,\n LuSearch,\n LuTableOfContents,\n LuZoomIn,\n LuZoomOut,\n} from \"react-icons/lu\"\nimport { MdOutlineFitScreen } from \"react-icons/md\"\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 { map } from \"rxjs\"\nimport {\n hasAnnotationsEnhancer,\n hasGalleryEnhancer,\n hasRefitEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\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 boxRef = useRef<HTMLDivElement>(null)\n const reader = useReader()\n const {\n quickMenuBottomBarBoundingBoxSignal,\n onFontSizeMenuOpenChange,\n onRefitMenuOpenChange,\n } = useReaderContextValue([\n \"quickMenuBottomBarBoundingBoxSignal\",\n \"onFontSizeMenuOpenChange\",\n \"onRefitMenuOpenChange\",\n ])\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const zoomState = useObserve(\n () =>\n reader?.zoom.state$.pipe(\n map((state) =>\n state.currentScale > 1\n ? \"in\"\n : state.currentScale < 1\n ? \"out\"\n : undefined,\n ),\n ),\n [reader],\n )\n const isZoomingIn = zoomState === \"in\"\n const isZoomingOut = zoomState === \"out\"\n const isScrollingMode = settings?.computedPageTurnMode === \"scrollable\"\n const isVerticalDirection =\n settings?.computedPageTurnDirection === \"vertical\"\n const [isExtraOpen, setIsExtraOpen] = useState(true)\n\n useEffect(() => {\n if (!boxRef.current) return\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n quickMenuBottomBarBoundingBoxSignal.update(entry)\n }\n })\n\n resizeObserver.observe(boxRef.current)\n\n return () => {\n resizeObserver.disconnect()\n }\n }, [quickMenuBottomBarBoundingBoxSignal])\n\n return (\n <QuickBar\n present={open}\n position=\"bottom\"\n display=\"flex\"\n flexDirection=\"column\"\n overflow=\"auto\"\n pb={8}\n px={0}\n ref={boxRef}\n >\n <HStack\n flex={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n maxWidth=\"100%\"\n px={4}\n >\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 width=\"100%\"\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 <Box display=\"flex\" overflowX=\"auto\" px={4} pb={1}>\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 <IconButton\n aria-label=\"Zoom\"\n size=\"lg\"\n variant={isZoomingIn ? \"solid\" : \"ghost\"}\n onClick={() => {\n if (isZoomingIn) {\n reader?.zoom.exit({ animate: true })\n } else {\n reader?.zoom.enter({\n animate: true,\n scale: 2,\n })\n }\n }}\n >\n {isZoomingIn ? <LuZoomOut /> : <LuZoomIn />}\n </IconButton>\n <IconButton\n aria-label=\"font size\"\n size=\"lg\"\n onClick={() => {\n onFontSizeMenuOpenChange(true)\n }}\n variant=\"ghost\"\n >\n <BiFontSize />\n </IconButton>\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 {hasRefitEnhancer(reader) && (\n <IconButton\n aria-label=\"Refit\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => {\n onRefitMenuOpenChange(true)\n }}\n disabled={!isScrollingMode}\n >\n <MdOutlineFitScreen />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Thumbnails\"\n size=\"lg\"\n variant={isZoomingOut ? \"solid\" : \"ghost\"}\n onClick={() => {\n if (isZoomingOut) {\n reader?.zoom.exit({ animate: true })\n } else {\n reader?.zoom.enter({\n animate: true,\n scale: 0.5,\n })\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 </Box>\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 { useReaderContextValue } from \"../context/useReaderContext\"\n\nexport const useQuickMenu = () => {\n const {\n quickMenuOpen,\n onQuickMenuOpenChange,\n _quickMenuOpen,\n _onQuickMenuOpenChange,\n } = useReaderContextValue([\n \"quickMenuOpen\",\n \"onQuickMenuOpenChange\",\n \"_quickMenuOpen\",\n \"_onQuickMenuOpenChange\",\n ])\n\n return [\n quickMenuOpen ?? _quickMenuOpen,\n onQuickMenuOpenChange ?? _onQuickMenuOpenChange,\n ] as const\n}\n","import { memo } from \"react\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\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 const { refitMenuOpen, fontSizeMenuOpen } = useReaderContextValue([\n \"refitMenuOpen\",\n \"fontSizeMenuOpen\",\n ])\n\n return (\n <>\n <TopBar\n open={quickMenuOpen && !refitMenuOpen && !fontSizeMenuOpen}\n onItemClick={onItemClick}\n />\n <BottomBar\n open={quickMenuOpen && !refitMenuOpen && !fontSizeMenuOpen}\n onItemClick={onItemClick}\n />\n </>\n )\n },\n)\n","import { useSubscribe } from \"reactjrx\"\nimport { filter, tap, withLatestFrom } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const useQuickMenuToggleGesture = () => {\n const [_quickMenuOpen, onQuickMenuOpenChange] = useQuickMenu()\n const reader = useReader()\n\n /**\n * Subscribe to all unhandled events from gesture manager.\n *\n * These are \"app\" specific behavior that the enhancer would usually not\n * know about such as triggering the quick menu.\n */\n useSubscribe(() => {\n return reader?.gestures.gestures$.pipe(\n filter((event) => event.type === \"tap\" && !event.handled),\n withLatestFrom(\n reader.selection.selection$,\n reader.selection.lastSelectionOnPointerdown$,\n ),\n tap(([, selection, selectionOnPointerdown]) => {\n /**\n * Where there is or was a selection before or during the tap, we want to avoid\n * showing the quick menu.\n */\n if (selection || selectionOnPointerdown) {\n onQuickMenuOpenChange(false)\n } else {\n onQuickMenuOpenChange((val) => !val)\n }\n }),\n )\n }, [reader])\n}\n","import { Field as ChakraField } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface FieldProps extends Omit<ChakraField.RootProps, \"label\"> {\n label?: React.ReactNode\n helperText?: React.ReactNode\n errorText?: React.ReactNode\n optionalText?: React.ReactNode\n}\n\nexport const Field = React.forwardRef<HTMLDivElement, FieldProps>(\n function Field(props, ref) {\n const { label, children, helperText, errorText, optionalText, ...rest } =\n props\n return (\n <ChakraField.Root ref={ref} {...rest}>\n {label && (\n <ChakraField.Label>\n {label}\n <ChakraField.RequiredIndicator fallback={optionalText} />\n </ChakraField.Label>\n )}\n {children}\n {helperText && (\n <ChakraField.HelperText>{helperText}</ChakraField.HelperText>\n )}\n {errorText && (\n <ChakraField.ErrorText>{errorText}</ChakraField.ErrorText>\n )}\n </ChakraField.Root>\n )\n },\n)\n","import { Button, Fieldset, Stack } from \"@chakra-ui/react\"\nimport type { RefitEnhancerOptions } from \"@prose-reader/enhancer-refit\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { Field } from \"../components/ui/field\"\nimport { Radio, RadioGroup } from \"../components/ui/radio\"\nimport { Slider } from \"../components/ui/slider\"\nimport { hasRefitEnhancer, useReader } from \"../context/useReader\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\n\ntype OptionValue = RefitEnhancerOptions[\"viewportFit\"]\n\nexport const RefitDialog = memo(() => {\n const defaultCustomWidth = 60\n const { refitMenuOpen, onRefitMenuOpenChange } = useReaderContextValue([\n \"refitMenuOpen\",\n \"onRefitMenuOpenChange\",\n ])\n const reader = useReader()\n const readerWithRefit = hasRefitEnhancer(reader) ? reader : undefined\n const refitSettings = useObserve(\n () => readerWithRefit?.refit.settings$,\n [readerWithRefit],\n )\n\n return (\n <DialogRoot\n lazyMount\n open={refitMenuOpen}\n onOpenChange={(e) => onRefitMenuOpenChange(e.open)}\n placement=\"center\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Viewport fit</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Fieldset.Root>\n <Fieldset.HelperText>\n Adjust the viewport for a more comfortable reading experience.\n </Fieldset.HelperText>\n <Fieldset.Content>\n <Field label=\"Profile\">\n <RadioGroup\n defaultValue={`fit` satisfies OptionValue}\n onValueChange={(e) => {\n const value = e.value as OptionValue\n readerWithRefit?.refit.update({\n viewportFit: value,\n customWidth: defaultCustomWidth,\n })\n }}\n value={refitSettings?.viewportFit ?? `fit`}\n >\n <Stack gap={2}>\n <Radio value={`desktop` satisfies OptionValue}>\n Desktop\n </Radio>\n <Radio value={`tablet` satisfies OptionValue}>Tablet</Radio>\n <Radio value={`fit` satisfies OptionValue}>\n Full width (default)\n </Radio>\n <Radio value={`custom` satisfies OptionValue}>Custom</Radio>\n </Stack>\n </RadioGroup>\n </Field>\n <Slider\n label=\"Maximum width (%)\"\n showValue\n max={100}\n min={10}\n step={1}\n disabled={refitSettings?.viewportFit !== `custom`}\n value={[refitSettings?.customWidth ?? defaultCustomWidth]}\n onValueChange={(e) => {\n const value = e.value[0] ?? 0\n\n readerWithRefit?.refit.update({\n customWidth: value,\n })\n }}\n />\n </Fieldset.Content>\n </Fieldset.Root>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\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 { useConstant, useObserve } from \"reactjrx\"\nimport {\n BehaviorSubject,\n distinctUntilChanged,\n map,\n merge,\n of,\n switchMap,\n timer,\n} from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\n\nconst DEBOUNCE_TIME = 500\n\nexport const useSearch = () => {\n const searchSubject = useConstant(() => new BehaviorSubject(\"\"))\n const searchValue = useObserve(searchSubject)\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const search = useObserve(() => {\n return searchSubject.pipe(\n distinctUntilChanged(),\n switchMap((value) =>\n value === \"\" || !readerWithSearch\n ? of(undefined)\n : merge(\n of({\n type: `start` as const,\n data: undefined,\n }),\n timer(DEBOUNCE_TIME).pipe(\n switchMap(() => readerWithSearch.search.search(value)),\n map((data) => ({ type: `end` as const, data })),\n ),\n ),\n ),\n )\n }, [readerWithSearch, searchSubject])\n\n return {\n value: searchValue,\n setValue: searchSubject.next.bind(searchSubject),\n status: search?.type ?? \"idle\",\n data: search?.data,\n }\n}\n","import { Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\nimport { useSearch } from \"./useSearch\"\n\nexport const SearchDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const { value: searchValue, setValue, status, data } = useSearch()\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(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 consolidatedResults = useObserve(\n () => reader?.locateResource(data?.slice(0, 100) ?? []),\n [data],\n )\n\n return (\n <Stack flex={1} height=\"100%\" gap={2}>\n <Input\n placeholder=\"Type something...\"\n value={searchValue}\n onChange={onValueChange}\n flexShrink={0}\n variant=\"subtle\"\n name=\"search\"\n focusRing=\"none\"\n focusVisibleRing=\"none\"\n outline=\"none\"\n focusRingColor=\"transparent\"\n />\n <Stack\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n overflow=\"auto\"\n px={4}\n flex={1}\n >\n {status === \"start\" && <Text>Searching ...</Text>}\n {data?.length === 0 && <Text>No results</Text>}\n {status === \"end\" && (data?.length ?? 0) > 0 && (\n <Stack>\n <Text fontSize=\"md\">{data?.length} result(s)</Text>\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={searchValue}\n cfi={result.meta.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Stack>\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} p={0}>\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, List, Stack, Text } 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 ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context, [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 { useEffect } from \"react\"\nimport { MAX_ZOOM_SCALE } from \"../constants\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\n\nexport const useZoomSettings = () => {\n const reader = useReader()\n const { zoomMaxScale } = useReaderContextValue([\"zoomMaxScale\"])\n\n useEffect(\n function syncSettingsWithGesturesEnhancer() {\n reader?.gestures.settings.update({\n zoomMaxScale: zoomMaxScale ?? MAX_ZOOM_SCALE,\n })\n },\n [reader, zoomMaxScale],\n )\n}\n","import { Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useObserve, useSignalValue } from \"reactjrx\"\nimport { animationFrameScheduler, map, throttleTime } from \"rxjs\"\nimport { Slider } from \"../components/ui/slider\"\nimport { MAX_ZOOM_SCALE } from \"../constants\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\n\nconst STEP = 0.5\nconst MIN = 1\n// const MAX = MAX_ZOOM_SCALE\n\nconst normalizeZoomValue = (\n value: number,\n min: number,\n max: number,\n step: number,\n): number => {\n if (value > min && value < min + step) {\n return min + step\n }\n\n // Clamp to min/max bounds\n const clamped = Math.min(Math.max(value, min), max)\n // Round to nearest step\n const stepped = Math.round((clamped - min) / step) * step + min\n // Round to avoid floating point precision issues\n return Math.round(stepped * 100) / 100\n}\n\nexport const ZoomControls = memo(() => {\n const { quickMenuBottomBarBoundingBoxSignal, zoomMaxScale = MAX_ZOOM_SCALE } =\n useReaderContextValue([\n \"quickMenuBottomBarBoundingBoxSignal\",\n \"zoomMaxScale\",\n ])\n const quickMenuBottomBarBoundingBox = useSignalValue(\n quickMenuBottomBarBoundingBoxSignal,\n )\n const reader = useReader()\n const zoomScaleValue =\n useObserve(\n () =>\n reader?.zoom.state$.pipe(\n map((state) => state.currentScale),\n throttleTime(100, animationFrameScheduler, {\n leading: true,\n trailing: true,\n }),\n ),\n [reader],\n ) ?? 1\n const isZooming =\n useObserve(\n () => reader?.zoom.state$.pipe(map((state) => state.isZooming)),\n [reader],\n ) ?? false\n const normalizedZoomScaleValue = normalizeZoomValue(\n zoomScaleValue,\n MIN,\n zoomMaxScale,\n STEP,\n )\n const bottomBarHeight =\n quickMenuBottomBarBoundingBox?.borderBoxSize?.[0]?.blockSize ?? 1\n\n return (\n <Presence\n present={isZooming && zoomScaleValue > 1}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n position=\"absolute\"\n bottom={`calc(${bottomBarHeight}px + var(--chakra-spacing-4))`}\n right={4}\n backgroundColor=\"bg.panel\"\n shadow=\"sm\"\n borderRadius=\"md\"\n p={4}\n >\n <Slider\n value={[normalizedZoomScaleValue]}\n min={MIN}\n max={zoomMaxScale}\n step={STEP}\n minWidth={200}\n onValueChange={(e) => {\n const value = e.value?.[0] ?? 1\n\n if (value === 1) {\n reader?.zoom.exit()\n } else {\n reader?.zoom.scaleAt(value, {\n constrain: \"within-viewport\",\n })\n }\n }}\n />\n </Presence>\n )\n})\n","import { Box, type BoxProps, Presence } from \"@chakra-ui/react\"\nimport { type ComponentProps, memo, useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { BookmarkPageMarkers } from \"./annotations/bookmarks/BookmarkPageMarkers\"\nimport { useBookmarkOnCornerTap } from \"./annotations/bookmarks/useBookmarkOnCornerTap\"\nimport { usePreventInteractionOnSelection } from \"./annotations/usePreventInteractionOnSelection\"\nimport { Toaster } from \"./components/ui/toaster\"\nimport { ReactReaderProvider } from \"./context/ReactReaderProvider\"\nimport { useReaderContextValue } from \"./context/useReaderContext\"\nimport { FontSizeControlsDialog } from \"./fonts/FontSizeControlsDialog\"\nimport { SyncFontSettings } from \"./fonts/SyncFontSettings\"\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 { useQuickMenuToggleGesture } from \"./quickmenu/useQuickMenuToggleGesture\"\nimport { RefitDialog } from \"./refit/RefitDialog\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\nimport { useZoomSettings } from \"./zoom/useZoomSettings\"\nimport { ZoomControls } from \"./zoom/ZoomControls\"\n\nconst ANIMATION_NAME_IN_OUT = { _open: \"fade-in\", _closed: \"fade-out\" }\n\nconst BookmarksEffects = memo(() => {\n // Intensive\n useBookmarkOnCornerTap()\n\n return null\n})\n\nconst Effects = memo(() => {\n useZoomSettings()\n useInterceptExternalLinks()\n useNotifications()\n useQuickMenuToggleGesture()\n usePreventInteractionOnSelection()\n\n return (\n <>\n <SyncFontSettings />\n <BookmarksEffects />\n </>\n )\n})\n\nconst InnerReactReader = memo(\n ({\n children,\n ...rest\n }: {\n children: React.ReactNode\n } & BoxProps) => {\n const { enableFloatingTime, onItemClick } = useReaderContextValue([\n \"enableFloatingTime\",\n \"onItemClick\",\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 return (\n <>\n <Effects />\n <Box\n position=\"absolute\"\n top={0}\n left={0}\n height=\"100%\"\n width=\"100%\"\n overflow=\"hidden\"\n data-prose-react-reader\n {...rest}\n >\n {children}\n <FloatingProgress />\n <GalleryDialog open={isGalleryOpen} setOpen={setIsGalleryOpen} />\n <RefitDialog />\n <QuickMenu onItemClick={_onItemClick} />\n <ZoomControls />\n <FontSizeControlsDialog />\n <BookmarkPageMarkers />\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={ANIMATION_NAME_IN_OUT}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n <Toaster />\n </Box>\n </>\n )\n },\n)\n\nexport const ReactReader = memo(\n ({\n children,\n slots,\n ...props\n }: ComponentProps<typeof ReactReaderProvider> & {\n slots?: {\n container?: {\n props?: Omit<ComponentProps<typeof InnerReactReader>, \"children\">\n }\n }\n }) => {\n const { container: { props: containerProps = {} } = {} } = slots ?? {}\n\n return (\n <ReactReaderProvider {...props}>\n <InnerReactReader {...containerProps}>{children}</InnerReactReader>\n </ReactReaderProvider>\n )\n },\n)\n"],"names":["BOOKMARK_AREA_DATA_ATTRIBUTE","MAX_ZOOM_SCALE","CloseButton","React","props","ref","jsx","ChakraIconButton","LuX","DialogContent","children","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","getDefaultValue","prev","signal","Subject","ReaderContext","createContext","useReaderContextValue","selector","context","useContext","useObserve","useReaderContext","useReader","reader","hasSearchEnhancer","hasAnnotationsEnhancer","hasGalleryEnhancer","hasRefitEnhancer","useAnnotation","id","readerWithAnnotations","map","items","item","filter","isDefined","switchMap","AnnotationListItem","onNavigate","allowLeftIcon","annotation","textContent","List","jsxs","Link","LuNotebookPen","Stack","Text","useAnnotations","highlights","useHighlights","annotations","AnnotationsList","useBookmarks","BookmarksList","AnnotationsDialogContent","memo","defaultTab","tab","setTab","useState","Tabs","e","LuBookmark","AnnotationsDialog","openWith","setOpen","Button","Spine","spineElement","Fragment","createPortal","useSpineItem","absolutePageIndex","itemIndex","of","page","EMPTY","useSpineItemReady","spineItem","isReady","BookmarkPageMarker","left","top","width","isItemReady","bookmarks","bookmarkForPage","bookmark","markerSize","Presence","Box","BookmarkPageMarkers","pages","pageIndex","useReaderWithAnnotations","CONTINUE_TAP_GESTURE","useBookmarkOnCornerTap","useEffect","event$","withLatestFrom","candidates","spineItemPageIndex","spineItemPagePosition","pageSize","isPositionInArea","pageEntry","usePreventInteractionOnSelection","useSubscribe","event","lastSelectionOnPointerdown","target","toaster","createToaster","Toaster","ChakraToaster","toast","Toast","Spinner","SignalProvider","valueSignal","useConstant","uncontrolledFontSizeMenuOpen","uncontrolledFontSizeMenuOpenValue","useSignalValue","uncontrolledOnFontSizeMenuOpenChange","useCallback","open","_onQuickMenuOpenChange","valueOrUpdater","old","uncontrolledRefitMenuOpen","uncontrolledOnRefitMenuOpenChange","uncontrolledRefitMenuOpenValue","memoizedProps","useMemoCompare","isShallowEqual","ReactReaderProvider","Radio","inputProps","rootRef","ChakraRadioGroup","RadioGroup","Slider","marksProp","label","showValue","value","marks","mark","hasMarkLabel","ChakraSlider","HStack","SliderThumbs","SliderMarks","For","_","index","PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION","SETTINGS_SCOPES_VALUES","SETTINGS_SCOPES_REFERENCES","getScopeForReference","reference","FontSizeControlsDialog","fontSizeMenuOpen","onFontSizeMenuOpenChange","uncontrolledFontSize","fontSize","fontSizeMin","fontSizeMax","fontSizeScope","fontSizeValues","onFontSizeChange","onFontSizeScopeChange","onFontSizeChangeRef","useLiveRef","tabValue","setTabValue","onFontUpdate","scope","getValueForScope","onScopeValueChange","details","onTabValueChange","onSliderValueChange","Fieldset","LuCheck","SyncFontSettings","_fontSize","timeout","settings","fontScale","defaultState","useMeasure","element","setElement","rect","setRect","observer","useMemo","entries","x","y","height","bottom","right","useLayoutEffect","useAttachSnapshot","measures","readerWithGalleryEnhancer","NEVER","itemLayoutChanged$","startWith","distinctUntilChanged","isIntemIntersecting$","observeIntersection","throttleTime","tap","isVisible","first","GalleryItem","onNavigated","locatedResource","GalleryDialog","HelpDialog","Heading","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","state","isOnlyImages","ANIMATION_NAME_IN_OUT","FloatingProgress","enableFloatingProgress","quickMenuOpen","pagination","roundedProgress","displayableProgress","useTime","time","setTime","interval","TimeIndicator","FloatingTime","useInterceptExternalLinks","isHtmlTagElement","url","useNotifications","notificationsSubject","mergeMap","notification","duration","toast$","Observable","subscriber","toastId","error","sameNotification$","skip","n","merge","timer","finalize","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","useSignalState","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","values","BottomBar","onItemClick","boxRef","useRef","quickMenuBottomBarBoundingBoxSignal","onRefitMenuOpenChange","navigation","zoomState","isZoomingIn","isZoomingOut","isScrollingMode","isVerticalDirection","isExtraOpen","setIsExtraOpen","resizeObserver","entry","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","LuZoomOut","LuZoomIn","BiFontSize","BsBookmarks","MdOutlineFitScreen","LuGalleryHorizontal","RiGalleryView2","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","useQuickMenu","onQuickMenuOpenChange","_quickMenuOpen","QuickMenu","refitMenuOpen","useQuickMenuToggleGesture","selection","selectionOnPointerdown","val","Field","helperText","errorText","optionalText","ChakraField","RefitDialog","readerWithRefit","refitSettings","SearchListItem","contextText","startOffset","text","cfi","onClick","before","after","DEBOUNCE_TIME","useSearch","searchSubject","BehaviorSubject","searchValue","readerWithSearch","search","data","SearchDialogContent","setValue","status","onValueChange","consolidatedResults","Input","result","j","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","useZoomSettings","zoomMaxScale","STEP","MIN","normalizeZoomValue","clamped","stepped","ZoomControls","quickMenuBottomBarBoundingBox","zoomScaleValue","animationFrameScheduler","isZooming","normalizedZoomScaleValue","bottomBarHeight","BookmarksEffects","Effects","InnerReactReader","enableFloatingTime","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpenWith","setIsAnnotationsOpenWith","isGalleryOpen","setIsGalleryOpen","setQuickMenuOpen","_onItemClick","ReactReader","slots","containerProps"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/constants.ts","../src/context/context.ts","../src/context/useReaderContext.ts","../src/common/FloatingMenu.tsx","../src/context/useReader.ts","../src/annotations/useReaderWithAnnotations.ts","../src/annotations/AnnotateControls.tsx","../src/common/utils.ts","../src/components/ui/close-button.tsx","../src/components/ui/drawer.tsx","../src/annotations/AnnotationDrawer.tsx","../src/components/ui/dialog.tsx","../src/annotations/useAnnotation.ts","../src/annotations/AnnotationListItem.tsx","../src/annotations/useAnnotations.ts","../src/annotations/useHighlights.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/annotations/bookmarks/BookmarkPageMarker.tsx","../src/annotations/bookmarks/BookmarkPageMarkers.tsx","../src/annotations/bookmarks/useBookmarkOnCornerTap.ts","../src/annotations/usePreventInteractionOnSelection.ts","../src/annotations/useSyncAnnotationsWithReader.ts","../src/components/ui/toaster.tsx","../src/context/ReactReaderProvider.tsx","../src/components/ui/radio.tsx","../src/components/ui/slider.tsx","../src/settings/types.ts","../src/fonts/FontSizeControlsDialog.tsx","../src/fonts/SyncFontSettings.ts","../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/navigation/FloatingTime.tsx","../src/navigation/useInterceptExternalLinks.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/useQuickMenu.ts","../src/quickmenu/QuickMenu.tsx","../src/quickmenu/useQuickMenuToggleGesture.ts","../src/components/ui/field.tsx","../src/refit/RefitDialog.tsx","../src/search/SearchListItem.tsx","../src/search/useSearch.ts","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/toc/TableOfContentsDialog.tsx","../src/zoom/useZoomSettings.ts","../src/zoom/ZoomControls.tsx","../src/ReactReader.tsx"],"sourcesContent":["export const BOOKMARK_AREA_DATA_ATTRIBUTE = `data-bookmark-area`\nexport const MAX_ZOOM_SCALE = 5\n","import type { Reader } from \"@prose-reader/core\"\nimport type {\n Annotation,\n RuntimeAnnotation,\n} from \"@prose-reader/enhancer-annotations\"\nimport type { EnhancerAPI as GesturesEnhancerAPI } from \"@prose-reader/enhancer-gestures\"\nimport { createContext, type Dispatch, type SetStateAction } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\nimport { Subject } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\nimport type {\n PROSE_REACT_READER_SETTINGS_SCOPE,\n PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE,\n} from \"../settings/types\"\n\nexport type PrivateContextType = {\n /**\n * Internal fallback values used for uncontrolled settings. This way the\n * Reader works as intended but:\n * - there are no persistent settings\n * - the settings are valid only for the current mount runtime\n */\n uncontrolledFontSize: number\n refitMenuOpen: boolean\n onRefitMenuOpenChange: (open: boolean) => void\n fontSizeMenuOpen: boolean\n onFontSizeMenuOpenChange: (open: boolean) => void\n notificationsSubject: Subject<ReaderNotification>\n quickMenuBottomBarBoundingBoxSignal: Signal<ResizeObserverEntry | undefined>\n fontSizeMin: number\n fontSizeMax: number\n _quickMenuOpen: boolean\n _onQuickMenuOpenChange: Dispatch<SetStateAction<boolean>>\n selectedHighlight:\n | {\n highlight?: RuntimeAnnotation\n selection?: {\n selection: Selection\n itemIndex: number\n }\n }\n | undefined\n}\n\nexport type PublicContextType = {\n reader: (Reader & GesturesEnhancerAPI) | undefined\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 quickMenuOpen?: boolean\n onQuickMenuOpenChange?: Dispatch<SetStateAction<boolean>>\n fontSize?: number\n zoomMaxScale?: number\n onFontSizeChange?: (\n from: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE | \"internal\",\n value: number,\n ) => void\n fontSizeScope?: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE\n onFontSizeScopeChange?: (scope: PROSE_REACT_READER_SETTINGS_SCOPE) => void\n fontSizeValues?: Record<\n PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE,\n number | undefined\n >\n annotations?: Annotation[]\n onAnnotationCreate?: (annotation: Annotation) => void\n onAnnotationUpdate?: (\n annotation: Pick<Annotation, \"id\" | \"highlightColor\" | \"notes\">,\n ) => void\n onAnnotationDelete?: (id: string) => void\n}\n\nexport type ReaderContextType = PrivateContextType & PublicContextType\n\nexport const getDefaultValue = (): ReaderContextType => ({\n _quickMenuOpen: false,\n _onQuickMenuOpenChange: (prev) => prev,\n reader: undefined,\n quickMenuBottomBarBoundingBoxSignal: signal<ResizeObserverEntry | undefined>({\n default: undefined,\n }),\n notificationsSubject: new Subject<ReaderNotification>(),\n refitMenuOpen: false,\n onRefitMenuOpenChange: () => {},\n fontSizeMenuOpen: false,\n onFontSizeMenuOpenChange: () => {},\n fontSizeMin: 0.2,\n fontSizeMax: 5,\n uncontrolledFontSize: 1,\n enableFloatingProgress: true,\n selectedHighlight: undefined,\n})\n\nexport const ReaderContext = createContext(\n signal({ default: getDefaultValue() }),\n)\n","import { useContext } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { ReaderContext, type ReaderContextType } from \"./context\"\n\nexport const useReaderContextValue = <T extends keyof ReaderContextType>(\n selector: Array<T>,\n) => {\n const context = useContext(ReaderContext)\n\n return useObserve(context, selector)\n}\n\nexport const useReaderContext = () => {\n return useContext(ReaderContext)\n}\n","import { Presence, type PresenceProps } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useSignalValue } from \"reactjrx\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\n\nconst SAFE_MARGIN_FLOATING_BOTTOM_ELEMENTS = 24\n\n// @todo use Popover\nexport const FloatingMenu = memo(\n ({\n children,\n ...rest\n }: {\n present: boolean\n children: React.ReactNode\n } & PresenceProps) => {\n const { quickMenuBottomBarBoundingBoxSignal } = useReaderContextValue([\n \"quickMenuBottomBarBoundingBoxSignal\",\n \"zoomMaxScale\",\n ])\n const quickMenuBottomBarBoundingBox = useSignalValue(\n quickMenuBottomBarBoundingBoxSignal,\n )\n const bottomBarHeight =\n quickMenuBottomBarBoundingBox?.borderBoxSize?.[0]?.blockSize ||\n SAFE_MARGIN_FLOATING_BOTTOM_ELEMENTS\n\n return (\n <Presence\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n position=\"absolute\"\n bottom={`calc(${bottomBarHeight}px + var(--chakra-spacing-4))`}\n right={4}\n backgroundColor=\"bg.panel\"\n shadow=\"sm\"\n borderRadius=\"md\"\n p={2}\n display=\"flex\"\n flexDirection=\"row\"\n gap={2}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\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 { RefitEnhancerAPI } from \"@prose-reader/enhancer-refit\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useReaderContextValue } from \"./useReaderContext\"\n\nexport const useReader = () => {\n const { reader } = useReaderContextValue([\"reader\"])\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\nexport const hasRefitEnhancer = (\n reader?: Reader,\n): reader is Reader & RefitEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_REFIT\" in reader\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 { Button } from \"@chakra-ui/react\"\nimport { FaEdit } from \"react-icons/fa\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { EMPTY, map, startWith, switchMap } from \"rxjs\"\nimport { FloatingMenu } from \"../common/FloatingMenu\"\nimport {\n useReaderContext,\n useReaderContextValue,\n} from \"../context/useReaderContext\"\nimport { useReaderWithAnnotations } from \"./useReaderWithAnnotations\"\n\nexport const AnnotateControls = () => {\n const reader = useReaderWithAnnotations()\n const context = useReaderContext()\n const { selectedHighlight } = useReaderContextValue([\"selectedHighlight\"])\n const isOpen = useObserve(\n () =>\n reader?.selection.selectionOver$.pipe(\n switchMap(() =>\n reader.selection.selectionEnd$.pipe(\n map(() => false),\n startWith(true),\n ),\n ),\n ) ?? EMPTY,\n { defaultValue: false },\n [reader],\n )\n\n return (\n <FloatingMenu present={isOpen && !selectedHighlight}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n const selection = reader?.selection.getSelection()\n\n if (!selection) return\n\n context.update((state) => ({\n ...state,\n selectedHighlight: {\n selection,\n },\n }))\n }}\n >\n <FaEdit />\n Annotate\n </Button>\n <Button variant=\"outline\" size=\"sm\" disabled>\n <LuNotebookPen />\n Bookmark\n </Button>\n </FloatingMenu>\n )\n}\n","export const truncateText = (text: string, maxLength = 50): string => {\n if (text.length <= maxLength) return text\n return `${text.slice(0, maxLength)}...`\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 { Drawer as ChakraDrawer, Portal } from \"@chakra-ui/react\"\nimport { CloseButton } from \"./close-button\"\nimport * as React from \"react\"\n\ninterface DrawerContentProps extends ChakraDrawer.ContentProps {\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n offset?: ChakraDrawer.ContentProps[\"padding\"]\n}\n\nexport const DrawerContent = React.forwardRef<\n HTMLDivElement,\n DrawerContentProps\n>(function DrawerContent(props, ref) {\n const { children, portalled = true, portalRef, offset, ...rest } = props\n return (\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraDrawer.Positioner padding={offset}>\n <ChakraDrawer.Content ref={ref} {...rest} asChild={false}>\n {children}\n </ChakraDrawer.Content>\n </ChakraDrawer.Positioner>\n </Portal>\n )\n})\n\nexport const DrawerCloseTrigger = React.forwardRef<\n HTMLButtonElement,\n ChakraDrawer.CloseTriggerProps\n>(function DrawerCloseTrigger(props, ref) {\n return (\n <ChakraDrawer.CloseTrigger\n position=\"absolute\"\n top=\"2\"\n insetEnd=\"2\"\n {...props}\n asChild\n >\n <CloseButton size=\"sm\" ref={ref} />\n </ChakraDrawer.CloseTrigger>\n )\n})\n\nexport const DrawerTrigger = ChakraDrawer.Trigger\nexport const DrawerRoot = ChakraDrawer.Root\nexport const DrawerFooter = ChakraDrawer.Footer\nexport const DrawerHeader = ChakraDrawer.Header\nexport const DrawerBody = ChakraDrawer.Body\nexport const DrawerBackdrop = ChakraDrawer.Backdrop\nexport const DrawerDescription = ChakraDrawer.Description\nexport const DrawerTitle = ChakraDrawer.Title\nexport const DrawerActionTrigger = ChakraDrawer.ActionTrigger\n","import { Box, Button, Stack, Text, Textarea } from \"@chakra-ui/react\"\nimport { type ComponentProps, memo, useEffect, useState } from \"react\"\nimport { useSubscribe } from \"reactjrx\"\nimport { tap } from \"rxjs\"\nimport { truncateText } from \"../common/utils\"\nimport {\n DrawerBackdrop,\n DrawerBody,\n DrawerContent,\n DrawerHeader,\n DrawerRoot,\n} from \"../components/ui/drawer\"\nimport {\n useReaderContext,\n useReaderContextValue,\n} from \"../context/useReaderContext\"\nimport { useReaderWithAnnotations } from \"./useReaderWithAnnotations\"\n\nconst HIGHLIGHT_COLORS = [\n \"rgba(216, 191, 216, 1)\", // Light purple\n \"rgba(255, 225, 125, 1)\", // Soft yellow\n \"rgba(144, 238, 144, 1)\", // Light green\n \"rgba(173, 216, 230, 1)\", // Light blue\n \"rgba(255, 182, 193, 1)\", // Light pink\n] as const\n\nexport const AnnotationDrawer = memo(() => {\n const reader = useReaderWithAnnotations()\n const {\n selectedHighlight,\n onAnnotationCreate,\n onAnnotationUpdate,\n onAnnotationDelete,\n } = useReaderContextValue([\n \"selectedHighlight\",\n \"onAnnotationCreate\",\n \"onAnnotationUpdate\",\n \"onAnnotationDelete\",\n ])\n const context = useReaderContext()\n const { highlight, selection } = selectedHighlight ?? {}\n const [selectedColor, setSelectedColor] = useState<string>(\n HIGHLIGHT_COLORS[0],\n )\n const [contents, setContents] = useState<string>(\"\")\n const isOpen = !!(selection ?? highlight)\n\n const onClose = () => {\n context.update((state) => ({\n ...state,\n selectedHighlight: undefined,\n }))\n }\n\n const onOpenChange: ComponentProps<typeof DrawerRoot>[\"onOpenChange\"] = (\n event,\n ) => {\n if (!event.open) {\n onClose()\n }\n }\n\n const highlightColor = highlight?.highlightColor\n const highlightContent = highlight?.notes\n\n useEffect(() => {\n void isOpen\n\n setContents(\"\")\n }, [isOpen])\n\n useEffect(() => {\n setContents(highlightContent ?? \"\")\n }, [highlightContent])\n\n useEffect(() => {\n void isOpen\n\n if (highlightColor) {\n setSelectedColor(highlightColor)\n } else {\n setSelectedColor(HIGHLIGHT_COLORS[0])\n }\n }, [highlightColor, isOpen])\n\n useSubscribe(\n function openDrawerOnTap() {\n return reader?.annotations.highlightTap$.pipe(\n tap(({ highlight }) => {\n context.update((state) => ({\n ...state,\n selectedHighlight: {\n highlight,\n },\n }))\n }),\n )\n },\n [reader],\n )\n\n return (\n <DrawerRoot placement=\"bottom\" onOpenChange={onOpenChange} open={isOpen}>\n <DrawerBackdrop />\n <DrawerContent>\n <DrawerHeader borderBottomWidth=\"1px\">\n {highlight\n ? \"Highlight\"\n : `Selection: \"${truncateText(selection?.selection?.toString() ?? \"\", 10)}\"`}\n </DrawerHeader>\n <DrawerBody gap={4} display=\"flex\" flexDirection=\"column\" pb={4}>\n <Stack>\n <Stack gap={2} flexDirection=\"row\">\n {HIGHLIGHT_COLORS.map((color) => (\n <Box\n bgColor={color}\n height={10}\n width={10}\n key={color}\n borderRadius=\"50%\"\n cursor=\"pointer\"\n {...(selectedColor === color && {\n border: \"4px solid white\",\n })}\n onClick={() => setSelectedColor(color)}\n />\n ))}\n </Stack>\n <Text>Annotation:</Text>\n <Textarea\n value={contents}\n onChange={(event) => setContents(event.target.value)}\n />\n </Stack>\n {!!selection && (\n <Button\n onClick={() => {\n onClose()\n\n const annotation = reader?.annotations.createAnnotation({\n ...selection,\n highlightColor: selectedColor,\n notes: contents,\n })\n\n if (annotation) {\n onAnnotationCreate?.(annotation)\n }\n }}\n >\n Highlight\n </Button>\n )}\n {!!highlight && (\n <Stack direction=\"row\">\n <Button\n flex={1}\n onClick={() => {\n onClose()\n\n onAnnotationUpdate?.({\n id: highlight.id,\n highlightColor: selectedColor,\n notes: contents,\n })\n }}\n >\n Update\n </Button>\n <Button\n flex={1}\n variant=\"surface\"\n onClick={() => {\n onClose()\n\n onAnnotationDelete?.(highlight.id)\n }}\n >\n Remove\n </Button>\n </Stack>\n )}\n </DrawerBody>\n </DrawerContent>\n </DrawerRoot>\n )\n})\n","import { Dialog as ChakraDialog, Portal } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { CloseButton } from \"./close-button\"\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 { 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 allowLeftIcon = true,\n}: {\n id: string\n onNavigate: () => void\n allowLeftIcon?: boolean\n}) => {\n const reader = useReader()\n const { data: annotation } = useAnnotation(id)\n const textContent =\n annotation?.meta.range?.toString() || annotation?.meta.node?.textContent\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 ) : allowLeftIcon ? (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n ) : null}\n <Stack gap={0}>\n {textContent ? (\n <Text lineClamp={2} fontSize=\"md\">\n {textContent}\n </Text>\n ) : (\n <Text lineClamp={2} fontSize=\"md\" fontStyle=\"italic\">\n Page {(annotation?.meta.absolutePageIndex ?? 0) + 1}\n </Text>\n )}\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 return readerWithAnnotations.locateResource(highlights)\n }),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { useAnnotations } from \"./useAnnotations\"\n\nexport const useHighlights = () => {\n const { data: annotations } = useAnnotations()\n\n return {\n data: annotations?.filter((annotation) => annotation.meta.isCfiRange),\n }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"./AnnotationListItem\"\nimport { useHighlights } from \"./useHighlights\"\n\nexport const AnnotationsList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useHighlights()\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(\n (annotation) => !annotation.meta.isCfiRange && !annotation.resource.notes,\n ),\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 allowLeftIcon={false}\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 { useObserve } from \"reactjrx\"\nimport { EMPTY, map, of } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useSpineItem = ({\n absolutePageIndex,\n itemIndex,\n}: {\n absolutePageIndex?: number\n itemIndex?: number\n}) => {\n const reader = useReader()\n\n const spineItem = useObserve(() => {\n if (!reader) return EMPTY\n\n if (itemIndex !== undefined)\n return of(reader.spine.spineItemsManager.get(itemIndex))\n\n if (absolutePageIndex !== undefined) {\n return reader.spine.pages\n .observeFromAbsolutePageIndex(absolutePageIndex)\n .pipe(\n map((page) => reader.spine.spineItemsManager.get(page?.itemIndex)),\n )\n }\n\n return EMPTY\n }, [itemIndex, absolutePageIndex, reader])\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}: {\n absolutePageIndex?: number\n itemIndex?: number\n}) => {\n const { spineItem } = useSpineItem({ absolutePageIndex, itemIndex })\n const isReady = useObserve(\n () => spineItem?.isReady$ ?? of(false),\n [spineItem],\n )\n\n return { spineItem, isReady }\n}\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 { isReady: isItemReady } = useSpineItemReady({\n absolutePageIndex,\n })\n const { data: bookmarks } = useAnnotations()\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex === absolutePageIndex &&\n !bookmark.meta.isCfiRange,\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 BookmarkPageMarkers = 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 { isPositionInArea } from \"@prose-reader/enhancer-gestures\"\nimport { useEffect } from \"react\"\nimport { map, withLatestFrom } from \"rxjs\"\nimport { useReaderContext } from \"../../context/useReaderContext\"\nimport { useAnnotations } from \"../useAnnotations\"\nimport { useReaderWithAnnotations } from \"../useReaderWithAnnotations\"\n\nconst CONTINUE_TAP_GESTURE = true\n\nexport const useBookmarkOnCornerTap = () => {\n const reader = useReaderWithAnnotations()\n const { data: bookmarks } = useAnnotations()\n const readerContext = useReaderContext()\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 CONTINUE_TAP_GESTURE\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 CONTINUE_TAP_GESTURE\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 readerContext.value.onAnnotationDelete?.(\n bookmarkForPage.resource.id,\n )\n\n return !CONTINUE_TAP_GESTURE\n }\n\n const canBookmarkPage = candidates?.[pageEntry.absolutePageIndex]\n\n if (canBookmarkPage) {\n const annotation = reader?.annotations.createAnnotation({\n absolutePageIndex: pageEntry.absolutePageIndex,\n })\n\n if (annotation) {\n readerContext.value.onAnnotationCreate?.(annotation)\n }\n\n return !CONTINUE_TAP_GESTURE\n }\n }\n\n return CONTINUE_TAP_GESTURE\n }),\n ),\n )\n\n return unSub\n }, [reader, bookmarks, readerContext])\n}\n","import { useSubscribe } from \"reactjrx\"\nimport { map, withLatestFrom } from \"rxjs\"\nimport { useReaderWithAnnotations } from \"./useReaderWithAnnotations\"\n\nexport const usePreventInteractionOnSelection = () => {\n const reader = useReaderWithAnnotations()\n\n useSubscribe(\n () =>\n /**\n * Hook used to prevent some gestures from being handled.\n */\n reader?.gestures.hooks.register(\"beforeTapGesture\", ({ event$ }) =>\n event$.pipe(\n withLatestFrom(reader.selection.lastSelectionOnPointerdown$),\n map(([{ event }, lastSelectionOnPointerdown]) => {\n const target = event.event.target\n\n /**\n * In this case if we have a gesture on an annotation, we want to prevent\n * it.\n */\n const wasOrIsOnSelection =\n (target && reader.annotations.isTargetWithinHighlight(target)) ||\n lastSelectionOnPointerdown\n\n return !wasOrIsOnSelection\n }),\n ),\n ),\n [reader],\n )\n}\n","import { useSubscribe } from \"reactjrx\"\nimport { combineLatest, distinctUntilChanged, map } from \"rxjs\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { useReaderWithAnnotations } from \"./useReaderWithAnnotations\"\n\nexport const useSyncAnnotationsWithReader = () => {\n const reader = useReaderWithAnnotations()\n const context = useReaderContext()\n\n useSubscribe(() => {\n if (reader) {\n const selectedHighlight$ = context.pipe(\n map((context) => context.selectedHighlight?.highlight?.id),\n distinctUntilChanged(),\n )\n\n const annotations$ = context.pipe(\n map((context) => context.annotations ?? []),\n distinctUntilChanged(),\n )\n\n const annotationsWithSelected$ = combineLatest([\n annotations$,\n selectedHighlight$,\n ]).pipe(\n map(([annotations, selectedHighlight]) =>\n annotations.map((annotation) => ({\n ...annotation,\n selected: annotation.id === selectedHighlight,\n })),\n ),\n )\n\n reader.annotations.update({ annotations$: annotationsWithSelected$ })\n }\n }, [reader, context])\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 { isShallowEqual } from \"@prose-reader/shared\"\nimport { type ComponentProps, memo, useCallback, useEffect } from \"react\"\nimport { signal, useConstant, useMemoCompare, useSignalValue } from \"reactjrx\"\nimport {\n getDefaultValue,\n type PrivateContextType,\n type PublicContextType,\n ReaderContext,\n} from \"./context\"\n\nconst SignalProvider = ({\n children,\n ...props\n}: {\n children: React.ReactNode\n} & PublicContextType) => {\n const valueSignal = useConstant(() => signal({ default: getDefaultValue() }))\n /**\n * font menu open\n */\n const uncontrolledFontSizeMenuOpen = useConstant(() =>\n signal({ default: valueSignal.value.fontSizeMenuOpen }),\n )\n const uncontrolledFontSizeMenuOpenValue = useSignalValue(\n uncontrolledFontSizeMenuOpen,\n )\n const uncontrolledOnFontSizeMenuOpenChange = useCallback(\n (open: boolean) => {\n uncontrolledFontSizeMenuOpen.update(open)\n },\n [uncontrolledFontSizeMenuOpen],\n )\n const _onQuickMenuOpenChange: PrivateContextType[\"_onQuickMenuOpenChange\"] =\n useCallback(\n (valueOrUpdater: boolean | ((prev: boolean) => boolean)) => {\n valueSignal.update((old) => ({\n ...old,\n _quickMenuOpen:\n typeof valueOrUpdater === \"function\"\n ? valueOrUpdater(old._quickMenuOpen)\n : valueOrUpdater,\n }))\n },\n [valueSignal],\n )\n const uncontrolledRefitMenuOpen = useConstant(() =>\n signal({ default: valueSignal.value.refitMenuOpen }),\n )\n const uncontrolledOnRefitMenuOpenChange = useCallback(\n (open: boolean) => {\n uncontrolledRefitMenuOpen.update(open)\n },\n [uncontrolledRefitMenuOpen],\n )\n const uncontrolledRefitMenuOpenValue = useSignalValue(\n uncontrolledRefitMenuOpen,\n )\n\n const memoizedProps = useMemoCompare(props, isShallowEqual)\n\n useEffect(() => {\n valueSignal.update((old) => ({\n ...old,\n ...memoizedProps,\n onFontSizeMenuOpenChange: uncontrolledOnFontSizeMenuOpenChange,\n fontSizeMenuOpen: uncontrolledFontSizeMenuOpenValue,\n onRefitMenuOpenChange: uncontrolledOnRefitMenuOpenChange,\n refitMenuOpen: uncontrolledRefitMenuOpenValue,\n _onQuickMenuOpenChange,\n }))\n }, [\n memoizedProps,\n _onQuickMenuOpenChange,\n valueSignal,\n uncontrolledFontSizeMenuOpenValue,\n uncontrolledOnFontSizeMenuOpenChange,\n uncontrolledRefitMenuOpenValue,\n uncontrolledOnRefitMenuOpenChange,\n ])\n\n return (\n <ReaderContext.Provider value={valueSignal}>\n {children}\n </ReaderContext.Provider>\n )\n}\n\nexport const ReactReaderProvider = memo(\n ({ children, ...props }: ComponentProps<typeof SignalProvider>) => {\n return <SignalProvider {...props}>{children}</SignalProvider>\n },\n)\n","import { RadioGroup as ChakraRadioGroup } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface RadioProps extends ChakraRadioGroup.ItemProps {\n rootRef?: React.Ref<HTMLDivElement>\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n function Radio(props, ref) {\n const { children, inputProps, rootRef, ...rest } = props\n return (\n <ChakraRadioGroup.Item ref={rootRef} {...rest}>\n <ChakraRadioGroup.ItemHiddenInput ref={ref} {...inputProps} />\n <ChakraRadioGroup.ItemIndicator />\n {children && (\n <ChakraRadioGroup.ItemText>{children}</ChakraRadioGroup.ItemText>\n )}\n </ChakraRadioGroup.Item>\n )\n },\n)\n\nexport const RadioGroup = ChakraRadioGroup.Root\n","import { Slider as ChakraSlider, For, HStack } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface SliderProps extends ChakraSlider.RootProps {\n marks?: Array<number | { value: number; label: React.ReactNode }>\n label?: React.ReactNode\n showValue?: boolean\n}\n\nexport const Slider = React.memo(function Slider({\n ref,\n ...props\n}: SliderProps & { ref?: React.RefObject<HTMLDivElement> }) {\n const { marks: marksProp, label, showValue, ...rest } = props\n const value = props.defaultValue ?? props.value\n\n const marks = marksProp?.map((mark) => {\n if (typeof mark === \"number\") return { value: mark, label: undefined }\n return mark\n })\n\n const hasMarkLabel = !!marks?.some((mark) => mark.label)\n\n return (\n <ChakraSlider.Root ref={ref} thumbAlignment=\"center\" {...rest}>\n {label && !showValue && <ChakraSlider.Label>{label}</ChakraSlider.Label>}\n {label && showValue && (\n <HStack justify=\"space-between\">\n <ChakraSlider.Label>{label}</ChakraSlider.Label>\n <ChakraSlider.ValueText />\n </HStack>\n )}\n <ChakraSlider.Control data-has-mark-label={hasMarkLabel || undefined}>\n <ChakraSlider.Track>\n <ChakraSlider.Range />\n </ChakraSlider.Track>\n <SliderThumbs value={value} />\n <SliderMarks marks={marks} />\n </ChakraSlider.Control>\n </ChakraSlider.Root>\n )\n})\n\nfunction SliderThumbs(props: { value?: number[] }) {\n const { value } = props\n return (\n <For each={value}>\n {(_, index) => (\n <ChakraSlider.Thumb key={index} index={index}>\n <ChakraSlider.HiddenInput />\n </ChakraSlider.Thumb>\n )}\n </For>\n )\n}\n\ninterface SliderMarksProps {\n marks?: Array<number | { value: number; label: React.ReactNode }>\n}\n\nconst SliderMarks = React.forwardRef<HTMLDivElement, SliderMarksProps>(\n function SliderMarks(props, ref) {\n const { marks } = props\n if (!marks?.length) return null\n\n return (\n <ChakraSlider.MarkerGroup ref={ref}>\n {marks.map((mark, index) => {\n const value = typeof mark === \"number\" ? mark : mark.value\n const label = typeof mark === \"number\" ? undefined : mark.label\n return (\n <ChakraSlider.Marker key={index} value={value}>\n <ChakraSlider.MarkerIndicator />\n {label}\n </ChakraSlider.Marker>\n )\n })}\n </ChakraSlider.MarkerGroup>\n )\n },\n)\n","export const PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION = [\n {\n value: \"global\",\n references: [\"global\"],\n },\n {\n value: \"book\",\n references: [\"book\"],\n },\n {\n value: \"screen\",\n references: [\"mobile\", \"tablet\", \"desktop\"],\n },\n] as const\nexport type PROSE_REACT_READER_SETTINGS_SCOPE =\n (typeof PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION)[number][\"value\"]\nexport type PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE =\n (typeof PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION)[number][\"references\"][number]\n","import {\n Button,\n Fieldset,\n HStack,\n type SliderValueChangeDetails,\n Stack,\n Tabs,\n type TabsValueChangeDetails,\n} from \"@chakra-ui/react\"\nimport {\n type ComponentProps,\n memo,\n useCallback,\n useEffect,\n useState,\n} from \"react\"\nimport { LuCheck } from \"react-icons/lu\"\nimport { useLiveRef } from \"reactjrx\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { Radio, RadioGroup } from \"../components/ui/radio\"\nimport { Slider } from \"../components/ui/slider\"\nimport {\n useReaderContext,\n useReaderContextValue,\n} from \"../context/useReaderContext\"\nimport {\n type PROSE_REACT_READER_SETTINGS_SCOPE,\n PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION,\n type PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE,\n} from \"../settings/types\"\n\nconst SETTINGS_SCOPES_VALUES =\n PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION.map((item) => item.value)\nconst SETTINGS_SCOPES_REFERENCES =\n PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION.flatMap(\n (item) => item.references,\n )\n\nconst getScopeForReference = (\n reference: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE | undefined,\n) => {\n if (!reference) {\n return undefined\n }\n\n return PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION.find((item) =>\n (item.references as readonly string[]).includes(reference),\n )?.value\n}\n\nexport const FontSizeControlsDialog = memo(() => {\n const context = useReaderContext()\n const {\n fontSizeMenuOpen,\n onFontSizeMenuOpenChange,\n uncontrolledFontSize,\n fontSize = uncontrolledFontSize,\n fontSizeMin,\n fontSizeMax,\n fontSizeScope,\n fontSizeValues,\n onFontSizeChange,\n onFontSizeScopeChange,\n } = useReaderContextValue([\n \"fontSizeMenuOpen\",\n \"onFontSizeMenuOpenChange\",\n \"fontSize\",\n \"fontSizeMin\",\n \"fontSizeMax\",\n \"fontSizeScope\",\n \"onFontSizeChange\",\n \"onFontSizeScopeChange\",\n \"uncontrolledFontSize\",\n \"fontSizeValues\",\n ])\n const onFontSizeChangeRef = useLiveRef(onFontSizeChange)\n const [tabValue, setTabValue] =\n useState<PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE>(\n fontSizeScope ?? \"global\",\n )\n const onFontUpdate = useCallback(\n (scope: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE, value: number) => {\n if (onFontSizeChangeRef.current) {\n onFontSizeChangeRef.current(scope, value)\n } else {\n context.update((old) => ({\n ...old,\n uncontrolledFontSize: value,\n }))\n }\n },\n [onFontSizeChangeRef, context],\n )\n const getValueForScope = useCallback(\n (scope: PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE) => {\n return fontSizeValues?.[scope] ?? fontSize\n },\n [fontSize, fontSizeValues],\n )\n\n const onScopeValueChange = useCallback(\n (\n details: Parameters<\n NonNullable<ComponentProps<typeof RadioGroup>[\"onValueChange\"]>\n >[0],\n ) => {\n const value = details.value as PROSE_REACT_READER_SETTINGS_SCOPE\n\n onFontSizeScopeChange?.(value)\n },\n [onFontSizeScopeChange],\n )\n\n const onTabValueChange = useCallback((details: TabsValueChangeDetails) => {\n setTabValue(details.value as PROSE_REACT_READER_SETTINGS_SCOPE_REFERENCE)\n }, [])\n\n const onSliderValueChange = useCallback(\n (details: SliderValueChangeDetails) => {\n const value = details.value[0] ?? 0\n\n onFontUpdate(tabValue, value / 100)\n },\n [onFontUpdate, tabValue],\n )\n\n useEffect(\n function syncScopeChangeWithTabs() {\n setTabValue(fontSizeScope ?? \"global\")\n },\n [fontSizeScope],\n )\n\n return (\n <DialogRoot\n lazyMount\n open={fontSizeMenuOpen}\n onOpenChange={(e) => {\n onFontSizeMenuOpenChange(e.open)\n }}\n placement=\"center\"\n >\n <DialogContent maxH=\"40vh\" overflow=\"auto\">\n <DialogHeader>\n <DialogTitle>Font size</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Stack gap={4} flex={1}>\n <Fieldset.Root>\n <Fieldset.Legend>Scope</Fieldset.Legend>\n <Fieldset.HelperText>\n The scope to which apply the font size for this book.\n </Fieldset.HelperText>\n <Fieldset.Content>\n <RadioGroup\n onValueChange={onScopeValueChange}\n value={getScopeForReference(fontSizeScope) ?? \"global\"}\n disabled={!onFontSizeScopeChange}\n >\n <HStack gap={2}>\n {SETTINGS_SCOPES_VALUES.map((scope) => (\n <Radio value={scope} key={scope}>\n {scope}\n </Radio>\n ))}\n </HStack>\n </RadioGroup>\n </Fieldset.Content>\n </Fieldset.Root>\n <Tabs.Root\n value={tabValue}\n onValueChange={onTabValueChange}\n fitted={false}\n size=\"sm\"\n >\n <Tabs.List>\n {SETTINGS_SCOPES_REFERENCES.map((scope) => (\n <Tabs.Trigger\n value={scope}\n key={scope}\n textTransform=\"capitalize\"\n disabled={scope !== \"global\" && !fontSizeScope}\n >\n {fontSizeScope === scope && <LuCheck />}\n {scope}\n </Tabs.Trigger>\n ))}\n </Tabs.List>\n {SETTINGS_SCOPES_REFERENCES.map((scope) => (\n <Tabs.Content value={scope} key={scope}>\n <Slider\n label={`%`}\n value={[(getValueForScope(scope) ?? 1) * 100]}\n onValueChange={onSliderValueChange}\n showValue={true}\n marks={[\n { value: 100, label: \"Publisher\" },\n {\n value: fontSizeMin * 100,\n label: `${fontSizeMin * 100}%`,\n },\n {\n value: fontSizeMax * 100,\n label: `${fontSizeMax * 100}%`,\n },\n ]}\n max={fontSizeMax * 100}\n min={fontSizeMin * 100}\n width=\"100%\"\n step={0.1 * 100}\n />\n </Tabs.Content>\n ))}\n </Tabs.Root>\n </Stack>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n})\n","import { useEffect } from \"react\"\nimport { useSubscribe } from \"reactjrx\"\nimport { map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\nimport {\n useReaderContext,\n useReaderContextValue,\n} from \"../context/useReaderContext\"\n\nexport const SyncFontSettings = () => {\n const reader = useReader()\n const context = useReaderContext()\n const { fontSize, uncontrolledFontSize } = useReaderContextValue([\n \"fontSize\",\n \"uncontrolledFontSize\",\n \"onFontSizeChange\",\n ])\n const _fontSize = fontSize ?? uncontrolledFontSize\n\n useEffect(\n function syncDownFontSize() {\n if (reader && _fontSize) {\n const timeout = setTimeout(() => {\n reader.settings.update({\n fontScale: _fontSize,\n })\n }, 200)\n\n return () => clearTimeout(timeout)\n }\n },\n [reader, _fontSize],\n )\n\n useSubscribe(\n function syncUpFontSize() {\n return reader?.settings.values$\n .pipe(map((settings) => settings.fontScale))\n .subscribe((fontScale) => {\n const _fontSize =\n context.value.fontSize ?? context.value.uncontrolledFontSize\n\n if (fontScale !== _fontSize) {\n context.value.onFontSizeChange?.(\"internal\", fontScale)\n context.update((old) => ({\n ...old,\n uncontrolledFontSize: fontScale,\n }))\n }\n })\n },\n [reader, context],\n )\n\n return null\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 isShallowEqual,\n observeIntersection,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport {\n distinctUntilChanged,\n filter,\n first,\n map,\n NEVER,\n startWith,\n switchMap,\n tap,\n throttleTime,\n} from \"rxjs\"\nimport type { UseMeasureRect } from \"../common/useMeasure\"\nimport { hasGalleryEnhancer, useReader } 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.didLayout$.pipe(\n startWith(item.layoutInfo),\n distinctUntilChanged(isShallowEqual),\n )\n\n const isItemIntersecting$ = 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 isItemIntersecting$\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 ({ item, onNavigated }: { item: SpineItem; onNavigated: () => void }) => {\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 ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {\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, Heading, HStack, Kbd, Stack, 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 ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {\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\n overflowY=\"auto\"\n flex={1}\n display=\"flex\"\n flexDirection=\"column\"\n gap={4}\n >\n <Stack>\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 </Stack>\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Bookmarks\n </Heading>\n <HStack mb={1}>\n <Text>Tap on the top right corner of a page bookmark it</Text>\n </HStack>\n </Stack>\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </Stack>\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 { combineLatest, map, NEVER } 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]).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, Presence, Text } from \"@chakra-ui/react\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nconst ANIMATION_NAME_IN_OUT = { _open: \"fade-in\", _closed: \"fade-out\" }\n\nexport const FloatingProgress = () => {\n const { enableFloatingProgress, quickMenuOpen } = useReaderContextValue([\n \"enableFloatingProgress\",\n \"quickMenuOpen\",\n ])\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 (\n pagination?.percentageEstimateOfBook === undefined ||\n !enableFloatingProgress\n )\n return null\n\n return (\n <Presence\n present={!quickMenuOpen}\n animationName={ANIMATION_NAME_IN_OUT}\n animationDuration=\"moderate\"\n >\n <Box\n position=\"absolute\"\n right={0}\n bottom={0}\n p={2}\n WebkitTextStroke=\"2px black\"\n paintOrder=\"stroke fill\"\n pointerEvents=\"none\"\n letterSpacing={1}\n color=\"white\"\n >\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n </Presence>\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=\"sm\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { TimeIndicator } from \"../quickmenu/TimeIndicator\"\n\nexport const FloatingTime = memo(() => {\n return (\n <Box\n position=\"absolute\"\n left={0}\n bottom={0}\n p={2}\n color=\"white\"\n WebkitTextStroke=\"2px black\"\n paintOrder=\"stroke fill\"\n pointerEvents=\"none\"\n letterSpacing={1}\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 { isDefined, useSubscribe } from \"reactjrx\"\nimport {\n filter,\n finalize,\n first,\n merge,\n mergeMap,\n NEVER,\n Observable,\n skip,\n switchMap,\n timer,\n} from \"rxjs\"\nimport { toaster } from \"../components/ui/toaster\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\nimport { useFontSizeNotifications } from \"../fonts/useFontSizeNotifications\"\n\nexport const useNotifications = () => {\n const { notificationsSubject } = useReaderContextValue([\n \"notificationsSubject\",\n ])\n\n useFontSizeNotifications()\n\n useSubscribe(\n () =>\n notificationsSubject.pipe(\n filter(isDefined),\n mergeMap((notification) => {\n const duration = notification.duration ?? 3000\n\n const toast$ = new Observable<string>((subscriber) => {\n try {\n queueMicrotask(() => {\n const toastId = toaster.create({\n title: notification.title,\n description: notification.description,\n duration,\n })\n\n subscriber.next(toastId)\n subscriber.complete()\n })\n } catch (error) {\n subscriber.error(error)\n }\n })\n\n const sameNotification$ = notificationsSubject.pipe(\n skip(1),\n filter((n) => !!notification.key && n?.key === notification.key),\n )\n\n return toast$.pipe(\n switchMap((toast) =>\n merge(\n timer(duration),\n notification.abort ?? NEVER,\n sameNotification$,\n ).pipe(\n first(),\n finalize(() => {\n queueMicrotask(() => {\n toaster.dismiss(toast)\n })\n }),\n ),\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 ref?: React.RefObject<HTMLDivElement | null>\n }) => {\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, [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.update(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 { Box, Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useEffect, useRef, useState } from \"react\"\nimport { BiFontSize } from \"react-icons/bi\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport {\n LuChevronDown,\n LuCircleHelp,\n LuGalleryHorizontal,\n LuNotebookPen,\n LuSearch,\n LuTableOfContents,\n LuZoomIn,\n LuZoomOut,\n} from \"react-icons/lu\"\nimport { MdOutlineFitScreen } from \"react-icons/md\"\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 { map } from \"rxjs\"\nimport {\n hasAnnotationsEnhancer,\n hasGalleryEnhancer,\n hasRefitEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\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 boxRef = useRef<HTMLDivElement>(null)\n const reader = useReader()\n const {\n quickMenuBottomBarBoundingBoxSignal,\n onFontSizeMenuOpenChange,\n onRefitMenuOpenChange,\n } = useReaderContextValue([\n \"quickMenuBottomBarBoundingBoxSignal\",\n \"onFontSizeMenuOpenChange\",\n \"onRefitMenuOpenChange\",\n ])\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const zoomState = useObserve(\n () =>\n reader?.zoom.state$.pipe(\n map((state) =>\n state.currentScale > 1\n ? \"in\"\n : state.currentScale < 1\n ? \"out\"\n : undefined,\n ),\n ),\n [reader],\n )\n const isZoomingIn = zoomState === \"in\"\n const isZoomingOut = zoomState === \"out\"\n const isScrollingMode = settings?.computedPageTurnMode === \"scrollable\"\n const isVerticalDirection =\n settings?.computedPageTurnDirection === \"vertical\"\n const [isExtraOpen, setIsExtraOpen] = useState(true)\n\n useEffect(() => {\n if (!boxRef.current) return\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n quickMenuBottomBarBoundingBoxSignal.update(entry)\n }\n })\n\n resizeObserver.observe(boxRef.current)\n\n return () => {\n resizeObserver.disconnect()\n }\n }, [quickMenuBottomBarBoundingBoxSignal])\n\n return (\n <QuickBar\n present={open}\n position=\"bottom\"\n display=\"flex\"\n flexDirection=\"column\"\n overflow=\"auto\"\n pb={8}\n px={0}\n ref={boxRef}\n >\n <HStack\n flex={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n maxWidth=\"100%\"\n px={4}\n >\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 width=\"100%\"\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 <Box display=\"flex\" overflowX=\"auto\" px={4} pb={1}>\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 <IconButton\n aria-label=\"Zoom\"\n size=\"lg\"\n variant={isZoomingIn ? \"solid\" : \"ghost\"}\n onClick={() => {\n if (isZoomingIn) {\n reader?.zoom.exit({ animate: true })\n } else {\n reader?.zoom.enter({\n animate: true,\n scale: 2,\n })\n }\n }}\n >\n {isZoomingIn ? <LuZoomOut /> : <LuZoomIn />}\n </IconButton>\n <IconButton\n aria-label=\"font size\"\n size=\"lg\"\n onClick={() => {\n onFontSizeMenuOpenChange(true)\n }}\n variant=\"ghost\"\n >\n <BiFontSize />\n </IconButton>\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 {hasRefitEnhancer(reader) && (\n <IconButton\n aria-label=\"Refit\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => {\n onRefitMenuOpenChange(true)\n }}\n disabled={!isScrollingMode}\n >\n <MdOutlineFitScreen />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Thumbnails\"\n size=\"lg\"\n variant={isZoomingOut ? \"solid\" : \"ghost\"}\n onClick={() => {\n if (isZoomingOut) {\n reader?.zoom.exit({ animate: true })\n } else {\n reader?.zoom.enter({\n animate: true,\n scale: 0.5,\n })\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 </Box>\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 { useReaderContextValue } from \"../context/useReaderContext\"\n\nexport const useQuickMenu = () => {\n const {\n quickMenuOpen,\n onQuickMenuOpenChange,\n _quickMenuOpen,\n _onQuickMenuOpenChange,\n } = useReaderContextValue([\n \"quickMenuOpen\",\n \"onQuickMenuOpenChange\",\n \"_quickMenuOpen\",\n \"_onQuickMenuOpenChange\",\n ])\n\n return [\n quickMenuOpen ?? _quickMenuOpen,\n onQuickMenuOpenChange ?? _onQuickMenuOpenChange,\n ] as const\n}\n","import { memo } from \"react\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\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 const { refitMenuOpen, fontSizeMenuOpen, selectedHighlight } =\n useReaderContextValue([\n \"refitMenuOpen\",\n \"fontSizeMenuOpen\",\n \"selectedHighlight\",\n ])\n\n return (\n <>\n <TopBar\n open={\n quickMenuOpen &&\n !refitMenuOpen &&\n !fontSizeMenuOpen &&\n !selectedHighlight\n }\n onItemClick={onItemClick}\n />\n <BottomBar\n open={quickMenuOpen && !refitMenuOpen && !fontSizeMenuOpen}\n onItemClick={onItemClick}\n />\n </>\n )\n },\n)\n","import { useSubscribe } from \"reactjrx\"\nimport { filter, tap, withLatestFrom } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const useQuickMenuToggleGesture = () => {\n const [_quickMenuOpen, onQuickMenuOpenChange] = useQuickMenu()\n const reader = useReader()\n\n /**\n * Subscribe to all unhandled events from gesture manager.\n *\n * These are \"app\" specific behavior that the enhancer would usually not\n * know about such as triggering the quick menu.\n */\n useSubscribe(() => {\n return reader?.gestures.gestures$.pipe(\n filter((event) => event.type === \"tap\" && !event.handled),\n withLatestFrom(\n reader.selection.selection$,\n reader.selection.lastSelectionOnPointerdown$,\n ),\n tap(([, selection, selectionOnPointerdown]) => {\n /**\n * Where there is or was a selection before or during the tap, we want to avoid\n * showing the quick menu.\n */\n if (selection || selectionOnPointerdown) {\n onQuickMenuOpenChange(false)\n } else {\n onQuickMenuOpenChange((val) => !val)\n }\n }),\n )\n }, [reader])\n}\n","import { Field as ChakraField } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface FieldProps extends Omit<ChakraField.RootProps, \"label\"> {\n label?: React.ReactNode\n helperText?: React.ReactNode\n errorText?: React.ReactNode\n optionalText?: React.ReactNode\n}\n\nexport const Field = React.forwardRef<HTMLDivElement, FieldProps>(\n function Field(props, ref) {\n const { label, children, helperText, errorText, optionalText, ...rest } =\n props\n return (\n <ChakraField.Root ref={ref} {...rest}>\n {label && (\n <ChakraField.Label>\n {label}\n <ChakraField.RequiredIndicator fallback={optionalText} />\n </ChakraField.Label>\n )}\n {children}\n {helperText && (\n <ChakraField.HelperText>{helperText}</ChakraField.HelperText>\n )}\n {errorText && (\n <ChakraField.ErrorText>{errorText}</ChakraField.ErrorText>\n )}\n </ChakraField.Root>\n )\n },\n)\n","import { Button, Fieldset, Stack } from \"@chakra-ui/react\"\nimport type { RefitEnhancerOptions } from \"@prose-reader/enhancer-refit\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { Field } from \"../components/ui/field\"\nimport { Radio, RadioGroup } from \"../components/ui/radio\"\nimport { Slider } from \"../components/ui/slider\"\nimport { hasRefitEnhancer, useReader } from \"../context/useReader\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\n\ntype OptionValue = RefitEnhancerOptions[\"viewportFit\"]\n\nexport const RefitDialog = memo(() => {\n const defaultCustomWidth = 60\n const { refitMenuOpen, onRefitMenuOpenChange } = useReaderContextValue([\n \"refitMenuOpen\",\n \"onRefitMenuOpenChange\",\n ])\n const reader = useReader()\n const readerWithRefit = hasRefitEnhancer(reader) ? reader : undefined\n const refitSettings = useObserve(\n () => readerWithRefit?.refit.settings$,\n [readerWithRefit],\n )\n\n return (\n <DialogRoot\n lazyMount\n open={refitMenuOpen}\n onOpenChange={(e) => onRefitMenuOpenChange(e.open)}\n placement=\"center\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Viewport fit</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Fieldset.Root>\n <Fieldset.HelperText>\n Adjust the viewport for a more comfortable reading experience.\n </Fieldset.HelperText>\n <Fieldset.Content>\n <Field label=\"Profile\">\n <RadioGroup\n defaultValue={`fit` satisfies OptionValue}\n onValueChange={(e) => {\n const value = e.value as OptionValue\n readerWithRefit?.refit.update({\n viewportFit: value,\n customWidth: defaultCustomWidth,\n })\n }}\n value={refitSettings?.viewportFit ?? `fit`}\n >\n <Stack gap={2}>\n <Radio value={`desktop` satisfies OptionValue}>\n Desktop\n </Radio>\n <Radio value={`tablet` satisfies OptionValue}>Tablet</Radio>\n <Radio value={`fit` satisfies OptionValue}>\n Full width (default)\n </Radio>\n <Radio value={`custom` satisfies OptionValue}>Custom</Radio>\n </Stack>\n </RadioGroup>\n </Field>\n <Slider\n label=\"Maximum width (%)\"\n showValue\n max={100}\n min={10}\n step={1}\n disabled={refitSettings?.viewportFit !== `custom`}\n value={[refitSettings?.customWidth ?? defaultCustomWidth]}\n onValueChange={(e) => {\n const value = e.value[0] ?? 0\n\n readerWithRefit?.refit.update({\n customWidth: value,\n })\n }}\n />\n </Fieldset.Content>\n </Fieldset.Root>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\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 { useConstant, useObserve } from \"reactjrx\"\nimport {\n BehaviorSubject,\n distinctUntilChanged,\n map,\n merge,\n of,\n switchMap,\n timer,\n} from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\n\nconst DEBOUNCE_TIME = 500\n\nexport const useSearch = () => {\n const searchSubject = useConstant(() => new BehaviorSubject(\"\"))\n const searchValue = useObserve(searchSubject)\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const search = useObserve(() => {\n return searchSubject.pipe(\n distinctUntilChanged(),\n switchMap((value) =>\n value === \"\" || !readerWithSearch\n ? of(undefined)\n : merge(\n of({\n type: `start` as const,\n data: undefined,\n }),\n timer(DEBOUNCE_TIME).pipe(\n switchMap(() => readerWithSearch.search.search(value)),\n map((data) => ({ type: `end` as const, data })),\n ),\n ),\n ),\n )\n }, [readerWithSearch, searchSubject])\n\n return {\n value: searchValue,\n setValue: searchSubject.next.bind(searchSubject),\n status: search?.type ?? \"idle\",\n data: search?.data,\n }\n}\n","import { Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\nimport { useSearch } from \"./useSearch\"\n\nexport const SearchDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const { value: searchValue, setValue, status, data } = useSearch()\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(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 consolidatedResults = useObserve(\n () => reader?.locateResource(data?.slice(0, 100) ?? []),\n [data],\n )\n\n return (\n <Stack flex={1} height=\"100%\" gap={2}>\n <Input\n placeholder=\"Type something...\"\n value={searchValue}\n onChange={onValueChange}\n flexShrink={0}\n variant=\"subtle\"\n name=\"search\"\n focusRing=\"none\"\n focusVisibleRing=\"none\"\n outline=\"none\"\n focusRingColor=\"transparent\"\n />\n <Stack\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n overflow=\"auto\"\n px={4}\n flex={1}\n >\n {status === \"start\" && <Text>Searching ...</Text>}\n {data?.length === 0 && <Text>No results</Text>}\n {status === \"end\" && (data?.length ?? 0) > 0 && (\n <Stack>\n <Text fontSize=\"md\">{data?.length} result(s)</Text>\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={searchValue}\n cfi={result.meta.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Stack>\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} p={0}>\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, List, Stack, Text } 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 ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context, [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 { useEffect } from \"react\"\nimport { MAX_ZOOM_SCALE } from \"../constants\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\n\nexport const useZoomSettings = () => {\n const reader = useReader()\n const { zoomMaxScale } = useReaderContextValue([\"zoomMaxScale\"])\n\n useEffect(\n function syncSettingsWithGesturesEnhancer() {\n reader?.gestures.settings.update({\n zoomMaxScale: zoomMaxScale ?? MAX_ZOOM_SCALE,\n })\n },\n [reader, zoomMaxScale],\n )\n}\n","import { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { animationFrameScheduler, map, throttleTime } from \"rxjs\"\nimport { FloatingMenu } from \"../common/FloatingMenu\"\nimport { Slider } from \"../components/ui/slider\"\nimport { MAX_ZOOM_SCALE } from \"../constants\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContextValue } from \"../context/useReaderContext\"\n\nconst STEP = 0.5\nconst MIN = 1\n// const MAX = MAX_ZOOM_SCALE\n\nconst normalizeZoomValue = (\n value: number,\n min: number,\n max: number,\n step: number,\n): number => {\n if (value > min && value < min + step) {\n return min + step\n }\n\n // Clamp to min/max bounds\n const clamped = Math.min(Math.max(value, min), max)\n // Round to nearest step\n const stepped = Math.round((clamped - min) / step) * step + min\n // Round to avoid floating point precision issues\n return Math.round(stepped * 100) / 100\n}\n\nexport const ZoomControls = memo(() => {\n const { zoomMaxScale = MAX_ZOOM_SCALE } = useReaderContextValue([\n \"zoomMaxScale\",\n ])\n const reader = useReader()\n const zoomScaleValue =\n useObserve(\n () =>\n reader?.zoom.state$.pipe(\n map((state) => state.currentScale),\n throttleTime(100, animationFrameScheduler, {\n leading: true,\n trailing: true,\n }),\n ),\n [reader],\n ) ?? 1\n const isZooming =\n useObserve(\n () => reader?.zoom.state$.pipe(map((state) => state.isZooming)),\n [reader],\n ) ?? false\n const normalizedZoomScaleValue = normalizeZoomValue(\n zoomScaleValue,\n MIN,\n zoomMaxScale,\n STEP,\n )\n\n return (\n <FloatingMenu present={isZooming && zoomScaleValue > 1}>\n <Slider\n value={[normalizedZoomScaleValue]}\n min={MIN}\n max={zoomMaxScale}\n step={STEP}\n minWidth={200}\n onValueChange={(e) => {\n const value = e.value?.[0] ?? 1\n\n if (value === 1) {\n reader?.zoom.exit()\n } else {\n reader?.zoom.scaleAt(value, {\n constrain: \"within-viewport\",\n })\n }\n }}\n />\n </FloatingMenu>\n )\n})\n","import { Box, type BoxProps, Presence } from \"@chakra-ui/react\"\nimport { type ComponentProps, memo, useCallback, useState } from \"react\"\nimport { AnnotateControls } from \"./annotations/AnnotateControls\"\nimport { AnnotationDrawer } from \"./annotations/AnnotationDrawer\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { BookmarkPageMarkers } from \"./annotations/bookmarks/BookmarkPageMarkers\"\nimport { useBookmarkOnCornerTap } from \"./annotations/bookmarks/useBookmarkOnCornerTap\"\nimport { usePreventInteractionOnSelection } from \"./annotations/usePreventInteractionOnSelection\"\nimport { useSyncAnnotationsWithReader } from \"./annotations/useSyncAnnotationsWithReader\"\nimport { Toaster } from \"./components/ui/toaster\"\nimport { ReactReaderProvider } from \"./context/ReactReaderProvider\"\nimport { useReaderContextValue } from \"./context/useReaderContext\"\nimport { FontSizeControlsDialog } from \"./fonts/FontSizeControlsDialog\"\nimport { SyncFontSettings } from \"./fonts/SyncFontSettings\"\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 { useQuickMenuToggleGesture } from \"./quickmenu/useQuickMenuToggleGesture\"\nimport { RefitDialog } from \"./refit/RefitDialog\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\nimport { useZoomSettings } from \"./zoom/useZoomSettings\"\nimport { ZoomControls } from \"./zoom/ZoomControls\"\n\nconst ANIMATION_NAME_IN_OUT = { _open: \"fade-in\", _closed: \"fade-out\" }\n\nconst BookmarksEffects = memo(() => {\n // Intensive\n useBookmarkOnCornerTap()\n\n return null\n})\n\nconst Effects = memo(() => {\n useZoomSettings()\n useInterceptExternalLinks()\n useNotifications()\n useQuickMenuToggleGesture()\n usePreventInteractionOnSelection()\n useSyncAnnotationsWithReader()\n\n return (\n <>\n <SyncFontSettings />\n <BookmarksEffects />\n </>\n )\n})\n\nconst InnerReactReader = memo(\n ({\n children,\n ...rest\n }: {\n children: React.ReactNode\n } & BoxProps) => {\n const { enableFloatingTime, onItemClick } = useReaderContextValue([\n \"enableFloatingTime\",\n \"onItemClick\",\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 return (\n <>\n <Effects />\n <Box\n position=\"absolute\"\n top={0}\n left={0}\n height=\"100%\"\n width=\"100%\"\n overflow=\"hidden\"\n data-prose-react-reader\n {...rest}\n >\n {children}\n <FloatingProgress />\n <GalleryDialog open={isGalleryOpen} setOpen={setIsGalleryOpen} />\n <RefitDialog />\n <QuickMenu onItemClick={_onItemClick} />\n <ZoomControls />\n <AnnotateControls />\n <AnnotationDrawer />\n <FontSizeControlsDialog />\n <BookmarkPageMarkers />\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={ANIMATION_NAME_IN_OUT}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n <Toaster />\n </Box>\n </>\n )\n },\n)\n\nexport const ReactReader = memo(\n ({\n children,\n slots,\n ...props\n }: ComponentProps<typeof ReactReaderProvider> & {\n slots?: {\n container?: {\n props?: Omit<ComponentProps<typeof InnerReactReader>, \"children\">\n }\n }\n }) => {\n const { container: { props: containerProps = {} } = {} } = slots ?? {}\n\n return (\n <ReactReaderProvider {...props}>\n <InnerReactReader {...containerProps}>{children}</InnerReactReader>\n </ReactReaderProvider>\n )\n },\n)\n"],"names":["BOOKMARK_AREA_DATA_ATTRIBUTE","MAX_ZOOM_SCALE","getDefaultValue","prev","signal","Subject","ReaderContext","createContext","useReaderContextValue","selector","context","useContext","useObserve","useReaderContext","SAFE_MARGIN_FLOATING_BOTTOM_ELEMENTS","FloatingMenu","memo","children","rest","quickMenuBottomBarBoundingBoxSignal","bottomBarHeight","useSignalValue","jsx","Presence","useReader","reader","hasSearchEnhancer","hasAnnotationsEnhancer","hasGalleryEnhancer","hasRefitEnhancer","useReaderWithAnnotations","AnnotateControls","selectedHighlight","isOpen","switchMap","map","startWith","EMPTY","jsxs","Button","selection","state","FaEdit","LuNotebookPen","truncateText","text","maxLength","CloseButton","React","props","ref","ChakraIconButton","LuX","DrawerContent","portalled","portalRef","offset","Portal","ChakraDrawer","DrawerRoot","DrawerHeader","DrawerBody","DrawerBackdrop","HIGHLIGHT_COLORS","AnnotationDrawer","onAnnotationCreate","onAnnotationUpdate","onAnnotationDelete","highlight","selectedColor","setSelectedColor","useState","contents","setContents","onClose","onOpenChange","event","highlightColor","highlightContent","useEffect","useSubscribe","tap","Stack","color","Box","Text","Textarea","annotation","DialogContent","backdrop","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useAnnotation","id","readerWithAnnotations","items","item","filter","isDefined","AnnotationListItem","onNavigate","allowLeftIcon","textContent","List","Link","useAnnotations","highlights","useHighlights","annotations","AnnotationsList","useBookmarks","BookmarksList","AnnotationsDialogContent","defaultTab","tab","setTab","Tabs","e","LuBookmark","AnnotationsDialog","openWith","setOpen","Spine","spineElement","Fragment","createPortal","useSpineItem","absolutePageIndex","itemIndex","of","page","useSpineItemReady","spineItem","isReady","BookmarkPageMarker","left","top","width","isItemReady","bookmarks","bookmarkForPage","bookmark","markerSize","BookmarkPageMarkers","pages","pageIndex","CONTINUE_TAP_GESTURE","useBookmarkOnCornerTap","readerContext","event$","withLatestFrom","candidates","spineItemPageIndex","spineItemPagePosition","pageSize","isPositionInArea","pageEntry","usePreventInteractionOnSelection","lastSelectionOnPointerdown","target","useSyncAnnotationsWithReader","selectedHighlight$","distinctUntilChanged","annotations$","annotationsWithSelected$","combineLatest","toaster","createToaster","Toaster","ChakraToaster","toast","Toast","Spinner","SignalProvider","valueSignal","useConstant","uncontrolledFontSizeMenuOpen","uncontrolledFontSizeMenuOpenValue","uncontrolledOnFontSizeMenuOpenChange","useCallback","open","_onQuickMenuOpenChange","valueOrUpdater","old","uncontrolledRefitMenuOpen","uncontrolledOnRefitMenuOpenChange","uncontrolledRefitMenuOpenValue","memoizedProps","useMemoCompare","isShallowEqual","ReactReaderProvider","Radio","inputProps","rootRef","ChakraRadioGroup","RadioGroup","Slider","marksProp","label","showValue","value","marks","mark","hasMarkLabel","ChakraSlider","HStack","SliderThumbs","SliderMarks","For","_","index","PROSE_REACT_READER_SETTINGS_SCOPE_CONFIGURATION","SETTINGS_SCOPES_VALUES","SETTINGS_SCOPES_REFERENCES","getScopeForReference","reference","FontSizeControlsDialog","fontSizeMenuOpen","onFontSizeMenuOpenChange","uncontrolledFontSize","fontSize","fontSizeMin","fontSizeMax","fontSizeScope","fontSizeValues","onFontSizeChange","onFontSizeScopeChange","onFontSizeChangeRef","useLiveRef","tabValue","setTabValue","onFontUpdate","scope","getValueForScope","onScopeValueChange","details","onTabValueChange","onSliderValueChange","Fieldset","LuCheck","SyncFontSettings","_fontSize","timeout","settings","fontScale","defaultState","useMeasure","element","setElement","rect","setRect","observer","useMemo","entries","x","y","height","bottom","right","useLayoutEffect","useAttachSnapshot","measures","readerWithGalleryEnhancer","NEVER","itemLayoutChanged$","isItemIntersecting$","observeIntersection","throttleTime","isVisible","first","GalleryItem","onNavigated","locatedResource","GalleryDialog","HelpDialog","Heading","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","isOnlyImages","ANIMATION_NAME_IN_OUT","FloatingProgress","enableFloatingProgress","quickMenuOpen","pagination","roundedProgress","displayableProgress","useTime","time","setTime","interval","TimeIndicator","FloatingTime","useInterceptExternalLinks","isHtmlTagElement","url","useNotifications","notificationsSubject","mergeMap","notification","duration","toast$","Observable","subscriber","toastId","error","sameNotification$","skip","n","merge","timer","finalize","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","useSignalState","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","values","BottomBar","onItemClick","boxRef","useRef","onRefitMenuOpenChange","navigation","zoomState","isZoomingIn","isZoomingOut","isScrollingMode","isVerticalDirection","isExtraOpen","setIsExtraOpen","resizeObserver","entry","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","LuZoomOut","LuZoomIn","BiFontSize","BsBookmarks","MdOutlineFitScreen","LuGalleryHorizontal","RiGalleryView2","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","useQuickMenu","onQuickMenuOpenChange","_quickMenuOpen","QuickMenu","refitMenuOpen","useQuickMenuToggleGesture","selectionOnPointerdown","val","Field","helperText","errorText","optionalText","ChakraField","RefitDialog","readerWithRefit","refitSettings","SearchListItem","contextText","startOffset","cfi","onClick","before","after","DEBOUNCE_TIME","useSearch","searchSubject","BehaviorSubject","searchValue","readerWithSearch","search","data","SearchDialogContent","setValue","status","onValueChange","consolidatedResults","Input","result","j","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","useZoomSettings","zoomMaxScale","STEP","MIN","normalizeZoomValue","clamped","stepped","ZoomControls","zoomScaleValue","animationFrameScheduler","isZooming","normalizedZoomScaleValue","BookmarksEffects","Effects","InnerReactReader","enableFloatingTime","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpenWith","setIsAnnotationsOpenWith","isGalleryOpen","setIsGalleryOpen","setQuickMenuOpen","_onItemClick","ReactReader","slots","containerProps"],"mappings":"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"}