@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.
- package/dist/annotations/AnnotateControls.d.ts +1 -0
- package/dist/annotations/AnnotationDrawer.d.ts +1 -0
- package/dist/annotations/useReaderWithAnnotations.d.ts +3 -3
- package/dist/annotations/useSyncAnnotationsWithReader.d.ts +1 -0
- package/dist/common/FloatingMenu.d.ts +5 -0
- package/dist/common/utils.d.ts +1 -0
- package/dist/context/context.d.ts +12 -0
- package/dist/context/useReader.d.ts +3 -3
- package/dist/index.js +1058 -824
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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.js","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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"}
|