@prose-reader/react-reader 1.217.0 → 1.218.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/useReaderContext.ts","../src/context/useReader.ts","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/bookmarks/Bookmarks.tsx","../src/bookmarks/BookmarksDialogContent.tsx","../src/bookmarks/BookmarksDialog.tsx","../src/components/ui/toaster.tsx","../src/common/useMeasure.ts","../src/gallery/useAttachSnapshot.ts","../src/gallery/GalleryDialog.tsx","../src/help/HelpDialog.tsx","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/quickmenu/TimeIndicator.tsx","../src/quickmenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/navigation/useInterceptExternalLinks.ts","../src/zoom/useNotifyZoom.ts","../src/notifications/useNotifications.ts","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/quickmenu/PaginationInfoSection.tsx","../src/quickmenu/QuickBar.tsx","../src/quickmenu/ThemedSlider.tsx","../src/quickmenu/Scrubber.tsx","../src/quickmenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/quickmenu/TopBar.tsx","../src/quickmenu/QuickMenu.tsx","../src/search/SearchListItem.tsx","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/toc/TableOfContentsDialog.tsx","../src/ReactReader.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\nimport { Subject } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\n\ntype ContextType = {\n reader: Reader | undefined\n quickMenuSignal: Signal<boolean, undefined>\n notificationsSubject: Subject<ReaderNotification>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n notificationsSubject: new Subject<ReaderNotification>(),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport {\n signal,\n useConstant,\n useLiveRef,\n useSignalState,\n useSubscribe,\n} from \"reactjrx\"\nimport { Subject, tap } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n quickMenuOpen,\n onQuickMenuOpenChange,\n }: {\n children?: React.ReactNode\n reader: Reader | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const [, quickMenuSignal] = useSignalState(() =>\n signal({\n default: quickMenuOpen,\n }),\n )\n const notificationsSubject = useConstant(\n () => new Subject<ReaderNotification>(),\n )\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n notificationsSubject,\n }),\n [quickMenuSignal, reader, notificationsSubject],\n )\n\n useEffect(() => {\n quickMenuSignal.setValue(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () => quickMenuSignal.pipe(tap(onQuickMenuOpenChangeLiveRef.current)),\n [quickMenuSignal, onQuickMenuOpenChangeLiveRef],\n )\n\n return (\n <ReaderContext.Provider value={value}>{children}</ReaderContext.Provider>\n )\n },\n)\n","import type { ButtonProps } from \"@chakra-ui/react\"\nimport { IconButton as ChakraIconButton } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { LuX } from \"react-icons/lu\"\n\nexport type CloseButtonProps = ButtonProps\n\nexport const CloseButton = React.forwardRef<\n HTMLButtonElement,\n CloseButtonProps\n>(function CloseButton(props, ref) {\n return (\n <ChakraIconButton variant=\"ghost\" aria-label=\"Close\" ref={ref} {...props}>\n {props.children ?? <LuX />}\n </ChakraIconButton>\n )\n})\n","import { Dialog as ChakraDialog, Portal } from \"@chakra-ui/react\"\nimport { CloseButton } from \"./close-button\"\nimport * as React from \"react\"\n\ninterface DialogContentProps extends ChakraDialog.ContentProps {\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n backdrop?: boolean\n}\n\nexport const DialogContent = React.forwardRef<\n HTMLDivElement,\n DialogContentProps\n>(function DialogContent(props, ref) {\n const {\n children,\n portalled = true,\n portalRef,\n backdrop = true,\n ...rest\n } = props\n\n return (\n <Portal disabled={!portalled} container={portalRef}>\n {backdrop && <ChakraDialog.Backdrop />}\n <ChakraDialog.Positioner>\n <ChakraDialog.Content ref={ref} {...rest} asChild={false}>\n {children}\n </ChakraDialog.Content>\n </ChakraDialog.Positioner>\n </Portal>\n )\n})\n\nexport const DialogCloseTrigger = React.forwardRef<\n HTMLButtonElement,\n ChakraDialog.CloseTriggerProps\n>(function DialogCloseTrigger(props, ref) {\n return (\n <ChakraDialog.CloseTrigger\n position=\"absolute\"\n top=\"2\"\n insetEnd=\"2\"\n {...props}\n asChild\n >\n <CloseButton size=\"sm\" ref={ref}>\n {props.children}\n </CloseButton>\n </ChakraDialog.CloseTrigger>\n )\n})\n\nexport const DialogRoot = ChakraDialog.Root\nexport const DialogFooter = ChakraDialog.Footer\nexport const DialogHeader = ChakraDialog.Header\nexport const DialogBody = ChakraDialog.Body\nexport const DialogBackdrop = ChakraDialog.Backdrop\nexport const DialogTitle = ChakraDialog.Title\nexport const DialogDescription = ChakraDialog.Description\nexport const DialogTrigger = ChakraDialog.Trigger\nexport const DialogActionTrigger = ChakraDialog.ActionTrigger\n","import { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReaderContext = () => {\n return useContext(ReaderContext)\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { BookmarksEnhancerAPI } from \"@prose-reader/enhancer-bookmarks\"\nimport type { GalleryEnhancerAPI } from \"@prose-reader/enhancer-gallery\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useReaderContext } from \"./useReaderContext\"\n\nexport const useReader = (): Reader | undefined => {\n const { reader } = useReaderContext()\n\n return reader\n}\n\nexport const hasSearchEnhancer = (\n reader?: Reader,\n): reader is Reader & SearchEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_SEARCH\" in reader\n}\n\nexport const hasBookmarksEnhancer = (\n reader?: Reader,\n): reader is Reader & BookmarksEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_BOOKMARKS\" in reader\n}\n\nexport const hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n\nexport const hasGalleryEnhancer = (\n reader?: Reader,\n): reader is Reader & GalleryEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_GALLERY\" in reader\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const AnnotationsDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.highlights$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.locateResource(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedHighlights>[number],\n index: number,\n ) => (\n <List.Item key={index}>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.meta.cfi ?? \"\")\n }}\n >\n {(item.resource?.contents ?? [])[0] ? (\n <List.Indicator asChild>\n <LuNotebookPen />\n </List.Indicator>\n ) : (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text lineClamp={2} fontSize=\"md\">\n {item.resource?.selectionAsText ? (\n (item.resource.selectionAsText ?? \"\")\n ) : (\n <i>\n <b>unknown (not loaded)</b>\n </i>\n )}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {consolidatedHighlights?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { AnnotationsDialogContent } from \"./AnnotationsDialogContent\"\n\nexport const AnnotationsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Annotations</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <AnnotationsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Box, IconButton, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { BsBookmarkPlus, BsBookmarkXFill } from \"react-icons/bs\"\nimport { useObserve } from \"reactjrx\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const Bookmarks = memo(() => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader) ? reader : undefined\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n const pages = useObserve(\n () => readerWithBookmarks?.bookmarks.pages$,\n [readerWithBookmarks],\n )\n const bookmarks = useObserve(\n () => readerWithBookmarks?.bookmarks.bookmarks$,\n [readerWithBookmarks],\n )\n const consolidatedBookmarks = useObserve(\n () => reader?.locateResource(bookmarks ?? []),\n [reader, bookmarks],\n )\n\n if (!spineElement) return null\n\n return (\n <>\n {createPortal(\n pages?.map(\n (\n { isBookmarkable, absolutePosition: { left, top, width } },\n index,\n ) => {\n const bookmarkForPage = consolidatedBookmarks?.find(\n (bookmark) => bookmark?.meta?.absolutePageIndex === index,\n )\n\n /**\n * Stale bookmarks means we cannot assert at the moment whether the page is marked or not.\n * In this case we just hide the bookmark button. You may want to have different UX to handle\n * this case.\n *\n * This also avoid having a flash where you show an non bookmarked icon and right away change it with\n * a valid marked page icon.\n */\n if (!isBookmarkable) return null\n\n return (\n <Presence\n key={index}\n present={true}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n top={top}\n p={2}\n >\n {!bookmarkForPage ? (\n <IconButton\n aria-label=\"bookmark\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.bookmark(index)\n }}\n size=\"lg\"\n bgColor=\"white\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkPlus />\n </IconButton>\n ) : (\n <IconButton\n aria-label=\"bookmark\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n onClick={() => {\n bookmarkForPage &&\n readerWithBookmarks?.bookmarks.delete(\n bookmarkForPage.resource.id,\n )\n }}\n size=\"lg\"\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkXFill />\n </IconButton>\n )}\n </Box>\n </Presence>\n )\n },\n ),\n spineElement,\n )}\n </>\n )\n})\n","import { Button, Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const BookmarksDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedBookmarks = useObserve(\n () =>\n readerWithBookmarks?.bookmarks.bookmarks$.pipe(\n switchMap((items) => readerWithBookmarks.locateResource(items)),\n ),\n [readerWithBookmarks],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedBookmarks>[number],\n index: number,\n ) => (\n <List.Item key={index} justifyContent=\"space-between\" alignItems=\"center\">\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.meta.cfi ?? \"\")\n }}\n >\n <Stack gap={0}>\n <Text fontSize=\"md\">\n {`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown\"\n }`}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n truncate\n lineClamp={2}\n >\n {item.meta?.startNode?.textContent\n ? item.meta?.startNode?.textContent\n : \"...\"}\n </Text>\n </Stack>\n </Link>\n <Button\n colorPalette=\"red\"\n variant=\"solid\"\n size=\"xs\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.delete(item.resource.id)\n }}\n >\n Delete\n </Button>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} variant=\"plain\" overflow=\"auto\">\n {consolidatedBookmarks?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { BookmarksDialogContent } from \"./BookmarksDialogContent\"\n\nexport const BookmarksDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Bookmarks</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <BookmarksDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","\"use client\"\n\nimport {\n Toaster as ChakraToaster,\n Portal,\n Spinner,\n Stack,\n Toast,\n createToaster,\n} from \"@chakra-ui/react\"\n\nexport const toaster = createToaster({\n placement: \"bottom-end\",\n pauseOnPageIdle: true,\n})\n\nexport const Toaster = () => {\n return (\n <Portal>\n <ChakraToaster toaster={toaster} insetInline={{ mdDown: \"4\" }}>\n {(toast) => (\n <Toast.Root width={{ md: \"sm\" }}>\n {toast.type === \"loading\" ? (\n <Spinner size=\"sm\" color=\"blue.solid\" />\n ) : (\n <Toast.Indicator />\n )}\n <Stack gap=\"1\" flex=\"1\" maxWidth=\"100%\">\n {toast.title && <Toast.Title>{toast.title}</Toast.Title>}\n {toast.description && (\n <Toast.Description>{toast.description}</Toast.Description>\n )}\n </Stack>\n {toast.action && (\n <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>\n )}\n {toast.meta?.closable && <Toast.CloseTrigger />}\n </Toast.Root>\n )}\n </ChakraToaster>\n </Portal>\n )\n}\n","import { useLayoutEffect, useMemo, useState } from \"react\"\n\nexport type UseMeasureRect = Pick<\n DOMRectReadOnly,\n \"x\" | \"y\" | \"top\" | \"left\" | \"right\" | \"bottom\" | \"height\" | \"width\"\n>\nexport type UseMeasureRef<E extends Element = Element> = (element: E) => void\nexport type UseMeasureResult<E extends Element = Element> = [\n UseMeasureRef<E>,\n UseMeasureRect,\n E | null,\n]\n\nconst defaultState: UseMeasureRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n}\n\nexport function useMeasure<E extends Element = Element>(): UseMeasureResult<E> {\n const [element, setElement] = useState<E | null>(null)\n const [rect, setRect] = useState<UseMeasureRect>(defaultState)\n\n const observer = useMemo(\n () =>\n new ResizeObserver((entries) => {\n if (entries[0]) {\n const { x, y, width, height, top, left, bottom, right } =\n entries[0].contentRect\n setRect({ x, y, width, height, top, left, bottom, right })\n }\n }),\n [],\n )\n\n useLayoutEffect(() => {\n if (!element) return\n\n observer.observe(element)\n\n return () => {\n observer.disconnect()\n }\n }, [element, observer])\n\n return [setElement, rect, element]\n}\n","import {\n type SpineItem,\n isShallowEqual,\n observeIntersection,\n} from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport {\n distinctUntilChanged,\n first,\n map,\n startWith,\n switchMap,\n tap,\n throttleTime,\n} from \"rxjs\"\nimport { NEVER } from \"rxjs\"\nimport { filter } from \"rxjs\"\nimport type { UseMeasureRect } from \"../common/useMeasure\"\nimport { useReader } from \"../context/useReader\"\nimport { hasGalleryEnhancer } from \"../context/useReader\"\n\nexport const useAttachSnapshot = (\n element: Element | null,\n item: SpineItem,\n measures: UseMeasureRect,\n) => {\n const reader = useReader()\n const readerWithGalleryEnhancer = hasGalleryEnhancer(reader)\n ? reader\n : undefined\n\n useSubscribe(() => {\n if (!readerWithGalleryEnhancer || !element) return NEVER\n\n const itemLayoutChanged$ = item.layout.layout$.pipe(\n startWith(item.layout.layoutInfo),\n distinctUntilChanged(isShallowEqual),\n )\n\n const isIntemIntersecting$ = observeIntersection(\n element as HTMLElement,\n ).pipe(map((entries) => entries.some((e) => e.isIntersecting)))\n\n return itemLayoutChanged$.pipe(\n throttleTime(100, undefined, { trailing: true }),\n switchMap(() => {\n return isIntemIntersecting$\n .pipe(\n tap((isVisible) => {\n // if the layout change and the item is not visible anymore, cleanup the element\n if (!isVisible) {\n element.innerHTML = \"\"\n }\n }),\n filter((isVisible) => isVisible),\n first(),\n )\n .pipe(\n switchMap(() => {\n element.innerHTML = \"\"\n\n return readerWithGalleryEnhancer?.gallery.snapshot(\n item,\n element,\n measures,\n )\n }),\n )\n }),\n )\n }, [readerWithGalleryEnhancer, item, measures, element])\n}\n","import { Box, Button, Text } from \"@chakra-ui/react\"\nimport type { SpineItem } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useMeasure } from \"../common/useMeasure\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { useReader } from \"../context/useReader\"\nimport { useAttachSnapshot } from \"./useAttachSnapshot\"\n\nconst GalleryItem = memo(\n ({\n item,\n onNavigated,\n }: {\n item: SpineItem\n onNavigated: () => void\n }) => {\n const [setElement, measures, element] = useMeasure()\n const reader = useReader()\n\n useAttachSnapshot(element, item, measures)\n\n const locatedResource = useObserve(\n () => reader?.locateResource(item, { mode: \"shallow\" }),\n [reader, item],\n )\n\n return (\n <Box\n width=\"100%\"\n aspectRatio=\"2/3\"\n border=\"1px solid\"\n borderColor=\"border\"\n borderRadius=\"md\"\n data-grid-item\n cursor=\"pointer\"\n position=\"relative\"\n overflow=\"hidden\"\n onClick={() => {\n onNavigated()\n reader?.navigation.goToSpineItem({ indexOrId: item })\n }}\n >\n <Box\n height=\"100%\"\n width=\"100%\"\n overflow=\"hidden\"\n pointerEvents=\"none\"\n ref={setElement}\n />\n <Text\n position=\"absolute\"\n bottom={0}\n left=\"0\"\n right=\"0\"\n textAlign=\"center\"\n bgColor=\"white\"\n p={4}\n fontSize=\"xs\"\n >\n Page {(locatedResource?.meta?.absolutePageIndex ?? 0) + 1}\n </Text>\n </Box>\n )\n },\n)\n\nexport const GalleryDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n const reader = useReader()\n const items = useObserve(() => reader?.spineItemsManager.items$, [reader])\n\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Gallery</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Box\n gridTemplateColumns={[\n \"repeat(2, minmax(0, 1fr))\",\n \"repeat(3, minmax(0, 1fr))\",\n ]}\n display=\"grid\"\n gap={[2, 4]}\n pt={2}\n data-grid\n >\n {items?.map((item) => (\n <GalleryItem\n key={item.item.id}\n item={item}\n onNavigated={() => {\n setOpen(false)\n }}\n />\n ))}\n </Box>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Button, HStack, Heading, Kbd, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuArrowBigLeft, LuArrowBigRight } from \"react-icons/lu\"\nimport { name, version } from \"../../package.json\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\n\nexport const HelpDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Help</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Shortcuts\n </Heading>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigRight />\n </Kbd>{\" \"}\n <Text>Navigate to right page</Text>\n </HStack>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigLeft />\n </Kbd>{\" \"}\n <Text>Navigate to left page</Text>\n </HStack>\n <Heading mb={2} mt={4} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { NEVER, combineLatest, map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context.state$]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, Text } from \"@chakra-ui/react\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const FloatingProgress = () => {\n const pagination = usePagination()\n const roundedProgress = Math.floor(\n (pagination?.percentageEstimateOfBook ?? 0) * 100,\n )\n const displayableProgress = roundedProgress > 0 ? roundedProgress : 1\n\n if (pagination?.percentageEstimateOfBook === undefined) return null\n\n return (\n <Box position=\"absolute\" right={0} bottom={0} p={2} color={\"black\"}>\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n )\n}\n","import { Text, type TextProps } from \"@chakra-ui/react\"\nimport { useEffect, useState } from \"react\"\n\nexport const useTime = () => {\n const [time, setTime] = useState(new Date())\n\n useEffect(() => {\n const interval = setInterval(() => {\n setTime(new Date())\n }, 1000 * 60)\n\n return () => clearInterval(interval)\n }, [])\n\n return time\n}\n\nexport const TimeIndicator = (props: TextProps) => {\n const time = useTime()\n\n return (\n <Text fontSize=\"xs\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { useSignalValue } from \"reactjrx\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\nexport const useQuickMenu = () => {\n const { quickMenuSignal } = useReaderContext()\n\n const quickMenu = useSignalValue(quickMenuSignal)\n\n return [quickMenu, quickMenuSignal.setValue, quickMenuSignal] as const\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { TimeIndicator } from \"../quickmenu/TimeIndicator\"\nimport { useQuickMenu } from \"../quickmenu/useQuickMenu\"\n\nexport const FloatingTime = () => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <Box\n position=\"absolute\"\n left={0}\n bottom={0}\n p={2}\n color={quickMenuOpen ? undefined : \"colorPalette.contrast\"}\n >\n <TimeIndicator />\n </Box>\n )\n}\n","import { isHtmlTagElement } from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useInterceptExternalLinks = () => {\n const reader = useReader()\n\n useSubscribe(\n () =>\n reader?.links$.subscribe((event) => {\n if (event.type === \"click\" && isHtmlTagElement(event.target, \"a\")) {\n if (!event.target.href) return\n\n const url = new URL(event.target.href)\n\n if (window.location.host !== url.host) {\n const response = confirm(\n `You are going to be redirected to external link`,\n )\n\n if (response) {\n window.open(event.target.href, \"__blank\")\n }\n }\n }\n }),\n [reader],\n )\n}\n","import { useSubscribe } from \"reactjrx\"\nimport { EMPTY, NEVER, Subject, finalize, switchMap } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\nexport const useNotifyZoom = () => {\n const reader = useReader()\n const { notificationsSubject } = useReaderContext()\n\n useSubscribe(\n () =>\n reader?.zoom.isZooming$.pipe(\n switchMap((isZooming) => {\n if (!isZooming) return EMPTY\n\n const abort = new Subject<void>()\n\n notificationsSubject.next({\n key: \"zoom\",\n title: \"Zooming\",\n duration: 999999,\n abort: abort,\n })\n\n return NEVER.pipe(\n finalize(() => {\n abort.next()\n abort.complete()\n }),\n )\n }),\n ),\n [reader],\n )\n}\n","import { isDefined, useSubscribe } from \"reactjrx\"\nimport {\n NEVER,\n distinctUntilChanged,\n filter,\n finalize,\n first,\n map,\n merge,\n mergeMap,\n skip,\n tap,\n timer,\n} from \"rxjs\"\nimport { toaster } from \"../components/ui/toaster\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { useNotifyZoom } from \"../zoom/useNotifyZoom\"\n\nconst useNotifyFontScaleChange = () => {\n const reader = useReader()\n const { notificationsSubject } = useReaderContext()\n\n useSubscribe(\n () =>\n reader?.settings.values$.pipe(\n map(({ fontScale }) => fontScale),\n distinctUntilChanged(),\n skip(1),\n tap((fontScale) => {\n notificationsSubject.next({\n key: \"fontScaleChange\",\n title: \"Font size changed\",\n description: `${fontScale * 100} %`,\n })\n }),\n ),\n [reader, notificationsSubject],\n )\n}\n\nexport const useNotifications = () => {\n const { notificationsSubject } = useReaderContext()\n\n useNotifyFontScaleChange()\n useNotifyZoom()\n\n useSubscribe(\n () =>\n notificationsSubject.pipe(\n filter(isDefined),\n mergeMap((notification) => {\n const duration = notification.duration ?? 3000\n\n const toast = toaster.create({\n title: notification.title,\n description: notification.description,\n duration,\n })\n\n const sameNotification$ = notificationsSubject.pipe(\n skip(1),\n filter((n) => !!notification.key && n?.key === notification.key),\n )\n\n return merge(\n timer(duration),\n notification.abort ?? NEVER,\n sameNotification$,\n ).pipe(\n first(),\n finalize(() => {\n toaster.dismiss(toast)\n }),\n )\n }),\n ),\n [notificationsSubject],\n )\n}\n","import { Popover as ChakraPopover, IconButton, Portal } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { HiOutlineInformationCircle } from \"react-icons/hi\"\n\nexport interface ToggleTipProps extends ChakraPopover.RootProps {\n showArrow?: boolean\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n content?: React.ReactNode\n}\n\nexport const ToggleTip = React.forwardRef<HTMLDivElement, ToggleTipProps>(\n function ToggleTip(props, ref) {\n const {\n showArrow,\n children,\n portalled = true,\n content,\n portalRef,\n ...rest\n } = props\n\n return (\n <ChakraPopover.Root\n {...rest}\n positioning={{ ...rest.positioning, gutter: 4 }}\n >\n <ChakraPopover.Trigger asChild>{children}</ChakraPopover.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraPopover.Positioner>\n <ChakraPopover.Content\n width=\"auto\"\n px=\"2\"\n py=\"1\"\n textStyle=\"xs\"\n rounded=\"sm\"\n ref={ref}\n >\n {showArrow && (\n <ChakraPopover.Arrow>\n <ChakraPopover.ArrowTip />\n </ChakraPopover.Arrow>\n )}\n {content}\n </ChakraPopover.Content>\n </ChakraPopover.Positioner>\n </Portal>\n </ChakraPopover.Root>\n )\n },\n)\n\nexport const InfoTip = React.forwardRef<\n HTMLDivElement,\n Partial<ToggleTipProps>\n>(function InfoTip(props, ref) {\n const { children, ...rest } = props\n return (\n <ToggleTip content={children} {...rest} ref={ref}>\n <IconButton\n variant=\"ghost\"\n aria-label=\"info\"\n size=\"2xs\"\n colorPalette=\"gray\"\n >\n <HiOutlineInformationCircle />\n </IconButton>\n </ToggleTip>\n )\n})\n","import { Progress as ChakraProgress } from \"@chakra-ui/react\"\nimport { InfoTip } from \"./toggle-tip\"\nimport * as React from \"react\"\n\nexport const ProgressBar = React.forwardRef<\n HTMLDivElement,\n ChakraProgress.TrackProps\n>(function ProgressBar(props, ref) {\n return (\n <ChakraProgress.Track {...props} ref={ref}>\n <ChakraProgress.Range />\n </ChakraProgress.Track>\n )\n})\n\nexport interface ProgressLabelProps extends ChakraProgress.LabelProps {\n info?: React.ReactNode\n}\n\nexport const ProgressLabel = React.forwardRef<\n HTMLDivElement,\n ProgressLabelProps\n>(function ProgressLabel(props, ref) {\n const { children, info, ...rest } = props\n return (\n <ChakraProgress.Label {...rest} ref={ref}>\n {children}\n {info && <InfoTip>{info}</InfoTip>}\n </ChakraProgress.Label>\n )\n})\n\nexport const ProgressRoot = ChakraProgress.Root\nexport const ProgressValueText = ChakraProgress.ValueText\n","import { usePagination } from \"../pagination/usePagination\"\n\nexport const useNavigationContext = () => {\n const pagination = usePagination()\n const hasOnlyOnePage = pagination?.numberOfTotalPages === 1\n\n const isBeginWithinChapter =\n (pagination?.beginNumberOfPagesInSpineItem ?? 0) > 1\n\n const isEndWithinChapter = (pagination?.endNumberOfPagesInSpineItem ?? 0) > 1\n\n const beginPageIndex =\n (pagination?.hasChapters\n ? pagination?.beginPageIndexInSpineItem\n : pagination?.beginAbsolutePageIndex) ?? 0\n const endPageIndex =\n (pagination?.hasChapters\n ? pagination?.endPageIndexInSpineItem\n : pagination?.endAbsolutePageIndex) ?? 0\n\n const [leftPageIndex = 0, rightPageIndex = 0] = [\n beginPageIndex,\n endPageIndex,\n ].sort((a, b) => a - b)\n\n const beginAndEndAreDifferent =\n pagination?.beginPageIndexInSpineItem !==\n pagination?.endPageIndexInSpineItem ||\n pagination?.beginSpineItemIndex !== pagination?.endSpineItemIndex\n\n const totalApproximatePages = pagination?.hasChapters\n ? pagination?.beginNumberOfPagesInSpineItem\n : pagination?.numberOfTotalPages\n\n return {\n hasOnlyOnePage,\n beginPageIndex,\n endPageIndex,\n isBeginWithinChapter,\n isEndWithinChapter,\n beginAndEndAreDifferent,\n totalApproximatePages,\n leftPageIndex,\n rightPageIndex,\n }\n}\n","import { HStack, Stack, Text } from \"@chakra-ui/react\"\nimport {\n ProgressBar,\n ProgressRoot,\n ProgressValueText,\n} from \"../components/ui/progress\"\nimport { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const PaginationInfoSection = () => {\n const pagination = usePagination()\n const {\n hasOnlyOnePage,\n leftPageIndex,\n rightPageIndex,\n totalApproximatePages,\n beginAndEndAreDifferent,\n } = useNavigationContext()\n const progress = Math.round((pagination?.percentageEstimateOfBook ?? 0) * 100)\n\n const buildTitleChain = (\n chapterInfo: NonNullable<typeof pagination>[\"beginChapterInfo\"],\n ): string => {\n if (chapterInfo?.subChapter) {\n return `${chapterInfo.title} / ${buildTitleChain(chapterInfo.subChapter)}`\n }\n return chapterInfo?.title || \"\"\n }\n\n const chapterTitle = buildTitleChain(pagination?.beginChapterInfo)\n\n return (\n <Stack alignItems=\"center\" gap={1} maxW=\"100%\" overflow=\"auto\">\n <ProgressRoot value={progress} size=\"xs\" width={150}>\n <HStack justifyContent=\"space-between\">\n <ProgressBar width={110} />\n <ProgressValueText>{`${progress}%`}</ProgressValueText>\n </HStack>\n </ProgressRoot>\n <Text truncate maxWidth=\"100%\" fontSize=\"sm\" mt={1}>\n {chapterTitle ? `Chapter: ${chapterTitle}` : `\\u00A0`}\n </Text>\n {!hasOnlyOnePage && (\n <HStack>\n <Text fontSize=\"xs\">\n {beginAndEndAreDifferent\n ? `${leftPageIndex + 1} - ${rightPageIndex + 1} of ${totalApproximatePages}`\n : `${leftPageIndex + 1} of ${totalApproximatePages}`}\n </Text>\n {!!pagination?.hasChapters && (\n <>\n <Text>-</Text>\n <Text fontSize=\"xs\">\n ({(pagination?.beginAbsolutePageIndex ?? 0) + 1})\n </Text>\n </>\n )}\n </HStack>\n )}\n </Stack>\n )\n}\n","import { Presence, type PresenceProps } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const QuickBar = memo(\n ({\n children,\n position,\n ...rest\n }: { position: \"top\" | \"bottom\" } & PresenceProps) => {\n return (\n <Presence\n display=\"flex\"\n flexDirection=\"row\"\n width=\"100%\"\n position=\"absolute\"\n {...(position === \"bottom\" ? { bottom: 0 } : { top: 0 })}\n animationName={\n position === \"bottom\"\n ? {\n _open: \"slide-from-bottom, fade-in\",\n _closed: \"slide-to-bottom, fade-out\",\n }\n : {\n _open: \"slide-from-top, fade-in\",\n _closed: \"slide-to-top, fade-out\",\n }\n }\n animationDuration=\"moderate\"\n bgColor=\"bg.panel\"\n alignItems=\"center\"\n justifyContent=\"center\"\n shadow=\"md\"\n p={4}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\n)\n","import RcSlider from \"rc-slider\"\nimport { type ComponentProps, memo } from \"react\"\nimport \"rc-slider/assets/index.css\"\nimport { Box, chakra } from \"@chakra-ui/react\"\n\nconst ChakraRcSlider = chakra(RcSlider)\n\nexport const ThemedSlider = memo((props: ComponentProps<typeof RcSlider>) => {\n return (\n <Box\n display=\"contents\"\n css={{\n \"--bg\": \"colors.bg\",\n \"--bg-emphasized\": \"colors.bg.emphasized\",\n \"--color-solid\": \"colors.colorPalette.solid\",\n }}\n >\n <ChakraRcSlider\n keyboard={false}\n style={{\n padding: 0,\n }}\n css={{\n \"& > .rc-slider-handle:focus-visible\": {\n boxShadow: \"0 0 0 2px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle:active\": {\n boxShadow: \"0 0 5px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle.rc-slider-handle-dragging\": {\n boxShadow: \"0 0 0 3px var(--color-solid) !important\",\n },\n }}\n styles={{\n rail: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--bg-emphasized)\",\n },\n track: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--color-solid)\",\n },\n handle: {\n width: \"24px\",\n height: \"24px\",\n top: \"50%\",\n borderColor: \"var(--color-solid)\",\n transform: `translate(${props.reverse ? \"50%\" : \"-50%\"}, -50%)`,\n backgroundColor: \"var(--bg)\",\n marginTop: \"0px\",\n },\n }}\n {...props}\n />\n </Box>\n )\n})\n","import { Box } from \"@chakra-ui/react\"\nimport { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { signal, useObserve, useSignalState, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\nimport { ThemedSlider } from \"./ThemedSlider\"\n\nconst useSliderValues = () => {\n const pagination = usePagination()\n const isUsingSpread = pagination?.isUsingSpread\n const { beginPageIndex: currentRealPage, totalApproximatePages = 0 } =\n useNavigationContext()\n const currentPage = isUsingSpread\n ? Math.floor((currentRealPage || 0) / 2)\n : currentRealPage\n const [value, valueSignal] = useSignalState(() =>\n signal({\n default: currentPage || 0,\n }),\n )\n const min = 0\n const max = Math.max(\n 0,\n isUsingSpread\n ? Math.floor((totalApproximatePages - 1) / 2)\n : totalApproximatePages - 1,\n )\n\n useEffect(() => {\n valueSignal.update(currentPage || 0)\n }, [currentPage, valueSignal])\n\n return {\n value,\n valueSignal,\n min,\n max,\n }\n}\n\nexport const Scrubber = (props: ComponentProps<typeof ThemedSlider>) => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, [reader]) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.setValue(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.state.beginSpineItemIndex ?? 0,\n animation: false,\n })\n }\n },\n [reader, isUsingSpread, valueSignal, isScrubberWithinChapter],\n )\n\n /**\n * @note\n * Scrubber can navigate fast and without lock we may end up with\n * slowness due to the reader\n * paginating and loading items in between.\n * This is good practice (but not required) to throttle it.\n */\n useSubscribe(\n () =>\n reader?.navigation.throttleLock({\n duration: 100,\n trigger: valueSignal.subject,\n }),\n [reader, valueSignal],\n )\n\n // const marks =\n // max > 1\n // ? Array.from({ length: max + 1 }, (_, i) => i).reduce(\n // (acc: number[], val) => [...acc, val],\n // [],\n // )\n // : []\n\n const disabled =\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n if (disabled) return <Box style={props.style} />\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\n {...props}\n />\n )\n // return (\n // <Slider\n // value={[value]}\n // max={max}\n // min={min}\n // marks={marks}\n // onChange={e => {\n // debugger\n // }}\n // onValueChange={onChange}\n // // reverse={reverse}\n // orientation=\"horizontal\"\n // step={step}\n // />\n // )\n}\n","import { Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport { LuChevronDown, LuGalleryHorizontal, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp, LuNotebookPen } from \"react-icons/lu\"\nimport { RiGalleryView2 } from \"react-icons/ri\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasBookmarksEnhancer,\n hasGalleryEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (\n item: \"annotations\" | \"search\" | \"help\" | \"toc\" | \"bookmarks\" | \"gallery\",\n ) => void\n }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection =\n settings?.computedPageTurnDirection === \"vertical\"\n const [isExtraOpen, setIsExtraOpen] = useState(true)\n\n return (\n <QuickBar\n present={open}\n position=\"bottom\"\n display=\"flex\"\n flexDirection=\"column\"\n overflow=\"auto\"\n pb={8}\n >\n <HStack flex={1} alignItems=\"center\" justifyContent=\"center\">\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <Scrubber\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"35px\",\n }}\n />\n </Stack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n disabled={\n !navigation?.canGoRightSpineItem &&\n !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? (\n <RxDoubleArrowDown />\n ) : (\n <RxDoubleArrowRight />\n )}\n </IconButton>\n </HStack>\n <HStack alignSelf=\"stretch\" alignItems=\"center\" justifyContent=\"center\">\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\n width=\"100%\"\n display=\"flex\"\n justifyContent=\"center\"\n >\n <LuChevronDown\n style={{\n transform: isExtraOpen ? \"rotate(0deg)\" : \"rotate(180deg)\",\n }}\n />\n </Collapsible.Trigger>\n <Collapsible.Content display=\"flex\" justifyContent=\"center\">\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"help\")}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"toc\")}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"search\")}\n >\n <LuSearch />\n </IconButton>\n )}\n {hasBookmarksEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Thumbnails\"\n size=\"lg\"\n variant={\n reader?.settings.values.viewportMode === \"thumbnails\"\n ? \"solid\"\n : \"ghost\"\n }\n onClick={() => {\n reader?.settings.update({\n viewportMode:\n reader?.settings.values.viewportMode === \"normal\"\n ? \"thumbnails\"\n : \"normal\",\n })\n }}\n >\n <LuGalleryHorizontal />\n </IconButton>\n {hasGalleryEnhancer(reader) && (\n <IconButton\n aria-label=\"Gallery\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"gallery\")}\n >\n <RiGalleryView2 />\n </IconButton>\n )}\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\n </QuickBar>\n )\n },\n)\n","import { useEffect } from \"react\"\n\nimport { useCallback } from \"react\"\n\nimport { useState } from \"react\"\n\nexport const useFullscreen = () => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const onToggleFullscreenClick = useCallback(() => {\n if (document.fullscreenElement) {\n return document\n .exitFullscreen()\n .catch(console.error)\n .then(() => {\n setIsFullscreen(false)\n })\n }\n\n return document.documentElement\n .requestFullscreen({ navigationUI: \"hide\" })\n .catch(console.error)\n .then(() => {\n setIsFullscreen(true)\n })\n }, [])\n\n useEffect(() => {\n function fullscreenchangeHandler() {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n document.addEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n }\n }, [])\n\n return {\n isFullscreen,\n onToggleFullscreenClick,\n }\n}\n","import { HStack, IconButton, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { IoIosArrowBack, IoMdMore } from \"react-icons/io\"\nimport { MdFullscreen, MdFullscreenExit } from \"react-icons/md\"\nimport { useObserve } from \"reactjrx\"\nimport { useFullscreen } from \"../common/useFullscreen\"\nimport { useReader } from \"../context/useReader\"\nimport { QuickBar } from \"./QuickBar\"\n\nexport const TopBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (item: \"more\" | \"back\") => void\n }) => {\n const reader = useReader()\n const manifest = useObserve(() => reader?.context.manifest$, [reader])\n const { isFullscreen, onToggleFullscreenClick } = useFullscreen()\n\n return (\n <QuickBar\n present={open}\n position=\"top\"\n height=\"80px\"\n justifyContent=\"space-between\"\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => onItemClick(\"back\")}\n >\n <IoIosArrowBack />\n </IconButton>\n <Stack\n flex={1}\n maxW={600}\n gap={1}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <Text truncate maxWidth=\"100%\">\n {manifest?.title}\n </Text>\n </Stack>\n <HStack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={() => onItemClick(\"more\")}\n >\n <IoMdMore />\n </IconButton>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onToggleFullscreenClick}\n >\n {isFullscreen ? <MdFullscreenExit /> : <MdFullscreen />}\n </IconButton>\n </HStack>\n </QuickBar>\n )\n },\n)\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onItemClick,\n }: {\n onItemClick: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\"\n | \"gallery\",\n ) => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar open={quickMenuOpen} onItemClick={onItemClick} />\n <BottomBar open={quickMenuOpen} onItemClick={onItemClick} />\n </>\n )\n },\n)\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { Box, Heading, Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback, useState } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { map, startWith } from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\n\nexport const SearchDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const [text, setText] = useState(\"\")\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setText(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const search = useObserve(\n () =>\n readerWithSearch?.search.search(text).pipe(\n map((data) => ({ type: `end` as const, data })),\n startWith({ type: `start` as const }),\n ),\n [reader, text],\n )\n const searching = search?.type === \"start\"\n const results = search?.type === \"end\" ? search.data : []\n const consolidatedResults = useObserve(\n () => reader?.locateResource(results.slice(0, 100)),\n [results],\n )\n\n return (\n <Stack flex={1} height=\"100%\">\n <Box px={4}>\n <Input\n placeholder=\"Type something...\"\n value={text}\n onChange={onValueChange}\n borderRadius={0}\n />\n </Box>\n <Box\n px={4}\n pb={4}\n mt={2}\n flex={1}\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n >\n {searching && <Text>Searching ...</Text>}\n {!searching && results.length === 0 && <p>There are no results</p>}\n {!searching && results.length >= 0 && (\n <Stack>\n <Heading as=\"h2\" size=\"md\">\n {results.length} result(s)\n </Heading>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={text}\n cfi={result.meta.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Box>\n </Stack>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <SearchDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Link, Stack, Text } from \"@chakra-ui/react\"\n\nimport { List } from \"@chakra-ui/react\"\nimport React, { memo } from \"react\"\nimport { LuCircleCheck } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const TableOfContentsDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context.state$, [reader]) ?? {}\n const { nav } = manifest ?? {}\n const pagination = usePagination()\n const toc = nav?.toc || []\n const { beginSpineItemIndex, beginPageIndexInSpineItem } = pagination ?? {}\n const currentSpineItemOrChapterPageIndex =\n (assumedRenditionLayout === \"reflowable\"\n ? beginPageIndexInSpineItem\n : beginSpineItemIndex) || 0\n\n console.log({ assumedRenditionLayout, currentSpineItemOrChapterPageIndex })\n\n let currentSubChapter = pagination?.beginChapterInfo\n\n while (currentSubChapter?.subChapter) {\n currentSubChapter = currentSubChapter?.subChapter\n }\n\n const buildTocForItem = (\n tocItem: (typeof toc)[number],\n index: number,\n lvl: number,\n ) => (\n <React.Fragment key={index}>\n <List.Item\n pl={4 * (lvl + 1)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Link\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToUrl(tocItem.href)\n }}\n href=\"#\"\n >\n {currentSubChapter?.path === tocItem.path && (\n <List.Indicator asChild>\n <LuCircleCheck />\n </List.Indicator>\n )}\n {currentSubChapter?.path !== tocItem.path && (\n <List.Indicator asChild visibility=\"hidden\">\n <LuCircleCheck />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text fontSize=\"md\">{tocItem.title || tocItem.path}</Text>\n {currentSubChapter?.path === tocItem.path && (\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Currently on page ${\n currentSpineItemOrChapterPageIndex + 1\n }`}</Text>\n )}\n </Stack>\n </Link>\n </List.Item>\n {tocItem.contents.length > 0 && (\n <List.Root as=\"div\" gap={2}>\n {tocItem.contents.map((tocItem, index) =>\n buildTocForItem(tocItem, index, lvl + 1),\n )}\n </List.Root>\n )}\n </React.Fragment>\n )\n\n return (\n <List.Root gap={3} overflowY=\"auto\" py={4} flex={1}>\n {nav?.toc.map((tocItem, index) => buildTocForItem(tocItem, index, 0))}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { TableOfContentsDialogContent } from \"./TableOfContentsDialogContent\"\n\nexport const TableOfContentsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Table of Contents</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <TableOfContentsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport { useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { Bookmarks } from \"./bookmarks/Bookmarks\"\nimport { BookmarksDialog } from \"./bookmarks/BookmarksDialog\"\nimport { Toaster } from \"./components/ui/toaster\"\nimport { GalleryDialog } from \"./gallery/GalleryDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { useInterceptExternalLinks } from \"./navigation/useInterceptExternalLinks\"\nimport { useNotifications } from \"./notifications/useNotifications\"\nimport { QuickMenu } from \"./quickmenu/QuickMenu\"\nimport { useQuickMenu } from \"./quickmenu/useQuickMenu\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onItemClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onItemClick?: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\"\n | \"gallery\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpen, setIsAnnotationsOpen] = useState(false)\n const [isBookmarksOpen, setIsBookmarksOpen] = useState(false)\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 setIsAnnotationsOpen(false)\n setIsBookmarksOpen(false)\n setQuickMenuOpen(false)\n setIsGalleryOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpen(true)\n } else if (item === \"search\") {\n setIsSearchOpen(true)\n } else if (item === \"help\") {\n setIsHelpOpen(true)\n } else if (item === \"toc\") {\n setIsTableOfContentsOpen(true)\n } else if (item === \"bookmarks\") {\n setIsBookmarksOpen(true)\n } else if (item === \"gallery\") {\n setIsGalleryOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\n\n useInterceptExternalLinks()\n useNotifications()\n\n return (\n <>\n {enableFloatingProgress && (\n <Presence\n present={!quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <FloatingProgress />\n </Presence>\n )}\n <GalleryDialog open={isGalleryOpen} setOpen={setIsGalleryOpen} />\n <QuickMenu onItemClick={_onItemClick} />\n <Bookmarks />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={onNavigate}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={onNavigate}\n />\n <AnnotationsDialog\n open={isAnnotationsOpen}\n setOpen={setIsAnnotationsOpen}\n onNavigate={onNavigate}\n />\n <BookmarksDialog\n open={isBookmarksOpen}\n setOpen={setIsBookmarksOpen}\n onNavigate={onNavigate}\n />\n <Presence\n present={enableFloatingTime || quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n <Toaster />\n </>\n )\n}\n"],"names":["ReaderContext","createContext","signal","Subject","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useSignalState","notificationsSubject","useConstant","onQuickMenuOpenChangeLiveRef","useLiveRef","value","useMemo","useEffect","useSubscribe","tap","jsx","CloseButton","React","props","ref","ChakraIconButton","LuX","DialogContent","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useReaderContext","useContext","useReader","hasSearchEnhancer","hasBookmarksEnhancer","hasAnnotationsEnhancer","hasGalleryEnhancer","AnnotationsDialogContent","onNavigate","readerWithAnnotations","consolidatedHighlights","useObserve","switchMap","highlights","mapItemToListEntry","item","index","List","jsxs","Link","_a","LuNotebookPen","Stack","Text","_b","_c","AnnotationsDialog","open","setOpen","e","Button","Bookmarks","readerWithBookmarks","spineElement","pages","bookmarks","consolidatedBookmarks","Fragment","createPortal","isBookmarkable","left","top","width","bookmarkForPage","bookmark","Presence","Box","IconButton","BsBookmarkXFill","BsBookmarkPlus","BookmarksDialogContent","items","_e","_d","BookmarksDialog","toaster","createToaster","Toaster","ChakraToaster","toast","Toast","Spinner","defaultState","useMeasure","element","setElement","useState","rect","setRect","observer","entries","x","y","height","bottom","right","useLayoutEffect","useAttachSnapshot","measures","readerWithGalleryEnhancer","NEVER","itemLayoutChanged$","startWith","distinctUntilChanged","isShallowEqual","isIntemIntersecting$","observeIntersection","map","throttleTime","isVisible","filter","first","GalleryItem","onNavigated","locatedResource","GalleryDialog","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","state","context","isOnlyImages","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","useInterceptExternalLinks","event","isHtmlTagElement","url","useNotifyZoom","isZooming","EMPTY","abort","finalize","useNotifyFontScaleChange","fontScale","skip","useNotifications","isDefined","mergeMap","notification","duration","sameNotification$","n","merge","timer","ToggleTip","showArrow","content","ChakraPopover","InfoTip","HiOutlineInformationCircle","ProgressBar","ChakraProgress","React__namespace","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","onItemClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","LuGalleryHorizontal","RiGalleryView2","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","absolutePageIndex","before","after","SearchDialogContent","setText","readerWithSearch","onValueChange","search","data","searching","results","consolidatedResults","Input","result","j","_f","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpen","setIsAnnotationsOpen","isBookmarksOpen","setIsBookmarksOpen","isGalleryOpen","setIsGalleryOpen","setQuickMenuOpen","_onItemClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/useReaderContext.ts","../src/context/useReader.ts","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/bookmarks/Bookmarks.tsx","../src/bookmarks/BookmarksDialogContent.tsx","../src/bookmarks/BookmarksDialog.tsx","../src/components/ui/toaster.tsx","../src/common/useMeasure.ts","../src/gallery/useAttachSnapshot.ts","../src/gallery/GalleryDialog.tsx","../src/help/HelpDialog.tsx","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/quickmenu/TimeIndicator.tsx","../src/quickmenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/navigation/useInterceptExternalLinks.ts","../src/zoom/useNotifyZoom.ts","../src/notifications/useNotifications.ts","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/quickmenu/PaginationInfoSection.tsx","../src/quickmenu/QuickBar.tsx","../src/quickmenu/ThemedSlider.tsx","../src/quickmenu/Scrubber.tsx","../src/quickmenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/quickmenu/TopBar.tsx","../src/quickmenu/QuickMenu.tsx","../src/search/SearchListItem.tsx","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/toc/TableOfContentsDialog.tsx","../src/ReactReader.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\nimport { Subject } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\n\ntype ContextType = {\n reader: Reader | undefined\n quickMenuSignal: Signal<boolean, undefined>\n notificationsSubject: Subject<ReaderNotification>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n notificationsSubject: new Subject<ReaderNotification>(),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport {\n signal,\n useConstant,\n useLiveRef,\n useSignalState,\n useSubscribe,\n} from \"reactjrx\"\nimport { Subject, tap } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n quickMenuOpen,\n onQuickMenuOpenChange,\n }: {\n children?: React.ReactNode\n reader: Reader | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const [, quickMenuSignal] = useSignalState(() =>\n signal({\n default: quickMenuOpen,\n }),\n )\n const notificationsSubject = useConstant(\n () => new Subject<ReaderNotification>(),\n )\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n notificationsSubject,\n }),\n [quickMenuSignal, reader, notificationsSubject],\n )\n\n useEffect(() => {\n quickMenuSignal.setValue(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () => quickMenuSignal.pipe(tap(onQuickMenuOpenChangeLiveRef.current)),\n [quickMenuSignal, onQuickMenuOpenChangeLiveRef],\n )\n\n return (\n <ReaderContext.Provider value={value}>{children}</ReaderContext.Provider>\n )\n },\n)\n","import type { ButtonProps } from \"@chakra-ui/react\"\nimport { IconButton as ChakraIconButton } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { LuX } from \"react-icons/lu\"\n\nexport type CloseButtonProps = ButtonProps\n\nexport const CloseButton = React.forwardRef<\n HTMLButtonElement,\n CloseButtonProps\n>(function CloseButton(props, ref) {\n return (\n <ChakraIconButton variant=\"ghost\" aria-label=\"Close\" ref={ref} {...props}>\n {props.children ?? <LuX />}\n </ChakraIconButton>\n )\n})\n","import { Dialog as ChakraDialog, Portal } from \"@chakra-ui/react\"\nimport { CloseButton } from \"./close-button\"\nimport * as React from \"react\"\n\ninterface DialogContentProps extends ChakraDialog.ContentProps {\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n backdrop?: boolean\n}\n\nexport const DialogContent = React.forwardRef<\n HTMLDivElement,\n DialogContentProps\n>(function DialogContent(props, ref) {\n const {\n children,\n portalled = true,\n portalRef,\n backdrop = true,\n ...rest\n } = props\n\n return (\n <Portal disabled={!portalled} container={portalRef}>\n {backdrop && <ChakraDialog.Backdrop />}\n <ChakraDialog.Positioner>\n <ChakraDialog.Content ref={ref} {...rest} asChild={false}>\n {children}\n </ChakraDialog.Content>\n </ChakraDialog.Positioner>\n </Portal>\n )\n})\n\nexport const DialogCloseTrigger = React.forwardRef<\n HTMLButtonElement,\n ChakraDialog.CloseTriggerProps\n>(function DialogCloseTrigger(props, ref) {\n return (\n <ChakraDialog.CloseTrigger\n position=\"absolute\"\n top=\"2\"\n insetEnd=\"2\"\n {...props}\n asChild\n >\n <CloseButton size=\"sm\" ref={ref}>\n {props.children}\n </CloseButton>\n </ChakraDialog.CloseTrigger>\n )\n})\n\nexport const DialogRoot = ChakraDialog.Root\nexport const DialogFooter = ChakraDialog.Footer\nexport const DialogHeader = ChakraDialog.Header\nexport const DialogBody = ChakraDialog.Body\nexport const DialogBackdrop = ChakraDialog.Backdrop\nexport const DialogTitle = ChakraDialog.Title\nexport const DialogDescription = ChakraDialog.Description\nexport const DialogTrigger = ChakraDialog.Trigger\nexport const DialogActionTrigger = ChakraDialog.ActionTrigger\n","import { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReaderContext = () => {\n return useContext(ReaderContext)\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { BookmarksEnhancerAPI } from \"@prose-reader/enhancer-bookmarks\"\nimport type { GalleryEnhancerAPI } from \"@prose-reader/enhancer-gallery\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useReaderContext } from \"./useReaderContext\"\n\nexport const useReader = (): Reader | undefined => {\n const { reader } = useReaderContext()\n\n return reader\n}\n\nexport const hasSearchEnhancer = (\n reader?: Reader,\n): reader is Reader & SearchEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_SEARCH\" in reader\n}\n\nexport const hasBookmarksEnhancer = (\n reader?: Reader,\n): reader is Reader & BookmarksEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_BOOKMARKS\" in reader\n}\n\nexport const hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n\nexport const hasGalleryEnhancer = (\n reader?: Reader,\n): reader is Reader & GalleryEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_GALLERY\" in reader\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const AnnotationsDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.highlights$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.locateResource(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedHighlights>[number],\n index: number,\n ) => (\n <List.Item key={index}>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.meta.cfi ?? \"\")\n }}\n >\n {(item.resource?.contents ?? [])[0] ? (\n <List.Indicator asChild>\n <LuNotebookPen />\n </List.Indicator>\n ) : (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text lineClamp={2} fontSize=\"md\">\n {item.resource?.selectionAsText ? (\n (item.resource.selectionAsText ?? \"\")\n ) : (\n <i>\n <b>unknown (not loaded)</b>\n </i>\n )}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {consolidatedHighlights?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { AnnotationsDialogContent } from \"./AnnotationsDialogContent\"\n\nexport const AnnotationsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Annotations</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <AnnotationsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Box, IconButton, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { BsBookmarkPlus, BsBookmarkXFill } from \"react-icons/bs\"\nimport { useObserve } from \"reactjrx\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const Bookmarks = memo(() => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader) ? reader : undefined\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n const pages = useObserve(\n () => readerWithBookmarks?.bookmarks.pages$,\n [readerWithBookmarks],\n )\n const bookmarks = useObserve(\n () => readerWithBookmarks?.bookmarks.bookmarks$,\n [readerWithBookmarks],\n )\n const consolidatedBookmarks = useObserve(\n () => reader?.locateResource(bookmarks ?? []),\n [reader, bookmarks],\n )\n\n if (!spineElement) return null\n\n return (\n <>\n {createPortal(\n pages?.map(\n (\n { isBookmarkable, absolutePosition: { left, top, width } },\n index,\n ) => {\n const bookmarkForPage = consolidatedBookmarks?.find(\n (bookmark) => bookmark?.meta?.absolutePageIndex === index,\n )\n\n /**\n * Stale bookmarks means we cannot assert at the moment whether the page is marked or not.\n * In this case we just hide the bookmark button. You may want to have different UX to handle\n * this case.\n *\n * This also avoid having a flash where you show an non bookmarked icon and right away change it with\n * a valid marked page icon.\n */\n if (!isBookmarkable) return null\n\n return (\n <Presence\n key={index}\n present={true}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n top={top}\n p={2}\n >\n {!bookmarkForPage ? (\n <IconButton\n aria-label=\"bookmark\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.bookmark(index)\n }}\n size=\"lg\"\n bgColor=\"white\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkPlus />\n </IconButton>\n ) : (\n <IconButton\n aria-label=\"bookmark\"\n opacity={0.5}\n _hover={{ opacity: 1 }}\n onClick={() => {\n bookmarkForPage &&\n readerWithBookmarks?.bookmarks.delete(\n bookmarkForPage.resource.id,\n )\n }}\n size=\"lg\"\n variant=\"ghost\"\n _icon={{ boxSize: \"36px\" }}\n >\n <BsBookmarkXFill />\n </IconButton>\n )}\n </Box>\n </Presence>\n )\n },\n ),\n spineElement,\n )}\n </>\n )\n})\n","import { Button, Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasBookmarksEnhancer, useReader } from \"../context/useReader\"\n\nexport const BookmarksDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const readerWithBookmarks = hasBookmarksEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedBookmarks = useObserve(\n () =>\n readerWithBookmarks?.bookmarks.bookmarks$.pipe(\n switchMap((items) => readerWithBookmarks.locateResource(items)),\n ),\n [readerWithBookmarks],\n )\n\n const mapItemToListEntry = (\n item: NonNullable<typeof consolidatedBookmarks>[number],\n index: number,\n ) => (\n <List.Item key={index} justifyContent=\"space-between\" alignItems=\"center\">\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(item.meta.cfi ?? \"\")\n }}\n >\n <Stack gap={0}>\n <Text fontSize=\"md\">\n {`Book page: ${\n item.meta?.absolutePageIndex !== undefined\n ? item.meta.absolutePageIndex + 1\n : \"unknown\"\n }`}\n </Text>\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n truncate\n lineClamp={2}\n >\n {item.meta?.startNode?.textContent\n ? item.meta?.startNode?.textContent\n : \"...\"}\n </Text>\n </Stack>\n </Link>\n <Button\n colorPalette=\"red\"\n variant=\"solid\"\n size=\"xs\"\n onClick={() => {\n readerWithBookmarks?.bookmarks.delete(item.resource.id)\n }}\n >\n Delete\n </Button>\n </List.Item>\n )\n\n return (\n <List.Root overflowY=\"auto\" gap={3} variant=\"plain\" overflow=\"auto\">\n {consolidatedBookmarks?.map((item, index) =>\n mapItemToListEntry(item, index),\n )}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { BookmarksDialogContent } from \"./BookmarksDialogContent\"\n\nexport const BookmarksDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Bookmarks</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <BookmarksDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","\"use client\"\n\nimport {\n Toaster as ChakraToaster,\n Portal,\n Spinner,\n Stack,\n Toast,\n createToaster,\n} from \"@chakra-ui/react\"\n\ntype Toaster = ReturnType<typeof createToaster>\n\nexport const toaster: Toaster = createToaster({\n placement: \"bottom-end\",\n pauseOnPageIdle: true,\n})\n\nexport const Toaster = () => {\n return (\n <Portal>\n <ChakraToaster toaster={toaster} insetInline={{ mdDown: \"4\" }}>\n {(toast) => (\n <Toast.Root width={{ md: \"sm\" }}>\n {toast.type === \"loading\" ? (\n <Spinner size=\"sm\" color=\"blue.solid\" />\n ) : (\n <Toast.Indicator />\n )}\n <Stack gap=\"1\" flex=\"1\" maxWidth=\"100%\">\n {toast.title && <Toast.Title>{toast.title}</Toast.Title>}\n {toast.description && (\n <Toast.Description>{toast.description}</Toast.Description>\n )}\n </Stack>\n {toast.action && (\n <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>\n )}\n {toast.meta?.closable && <Toast.CloseTrigger />}\n </Toast.Root>\n )}\n </ChakraToaster>\n </Portal>\n )\n}\n","import { useLayoutEffect, useMemo, useState } from \"react\"\n\nexport type UseMeasureRect = Pick<\n DOMRectReadOnly,\n \"x\" | \"y\" | \"top\" | \"left\" | \"right\" | \"bottom\" | \"height\" | \"width\"\n>\nexport type UseMeasureRef<E extends Element = Element> = (element: E) => void\nexport type UseMeasureResult<E extends Element = Element> = [\n UseMeasureRef<E>,\n UseMeasureRect,\n E | null,\n]\n\nconst defaultState: UseMeasureRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n}\n\nexport function useMeasure<E extends Element = Element>(): UseMeasureResult<E> {\n const [element, setElement] = useState<E | null>(null)\n const [rect, setRect] = useState<UseMeasureRect>(defaultState)\n\n const observer = useMemo(\n () =>\n new ResizeObserver((entries) => {\n if (entries[0]) {\n const { x, y, width, height, top, left, bottom, right } =\n entries[0].contentRect\n setRect({ x, y, width, height, top, left, bottom, right })\n }\n }),\n [],\n )\n\n useLayoutEffect(() => {\n if (!element) return\n\n observer.observe(element)\n\n return () => {\n observer.disconnect()\n }\n }, [element, observer])\n\n return [setElement, rect, element]\n}\n","import {\n type SpineItem,\n isShallowEqual,\n observeIntersection,\n} from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport {\n distinctUntilChanged,\n first,\n map,\n startWith,\n switchMap,\n tap,\n throttleTime,\n} from \"rxjs\"\nimport { NEVER } from \"rxjs\"\nimport { filter } from \"rxjs\"\nimport type { UseMeasureRect } from \"../common/useMeasure\"\nimport { useReader } from \"../context/useReader\"\nimport { hasGalleryEnhancer } from \"../context/useReader\"\n\nexport const useAttachSnapshot = (\n element: Element | null,\n item: SpineItem,\n measures: UseMeasureRect,\n) => {\n const reader = useReader()\n const readerWithGalleryEnhancer = hasGalleryEnhancer(reader)\n ? reader\n : undefined\n\n useSubscribe(() => {\n if (!readerWithGalleryEnhancer || !element) return NEVER\n\n const itemLayoutChanged$ = item.layout.layout$.pipe(\n startWith(item.layout.layoutInfo),\n distinctUntilChanged(isShallowEqual),\n )\n\n const isIntemIntersecting$ = observeIntersection(\n element as HTMLElement,\n ).pipe(map((entries) => entries.some((e) => e.isIntersecting)))\n\n return itemLayoutChanged$.pipe(\n throttleTime(100, undefined, { trailing: true }),\n switchMap(() => {\n return isIntemIntersecting$\n .pipe(\n tap((isVisible) => {\n // if the layout change and the item is not visible anymore, cleanup the element\n if (!isVisible) {\n element.innerHTML = \"\"\n }\n }),\n filter((isVisible) => isVisible),\n first(),\n )\n .pipe(\n switchMap(() => {\n element.innerHTML = \"\"\n\n return readerWithGalleryEnhancer?.gallery.snapshot(\n item,\n element,\n measures,\n )\n }),\n )\n }),\n )\n }, [readerWithGalleryEnhancer, item, measures, element])\n}\n","import { Box, Button, Text } from \"@chakra-ui/react\"\nimport type { SpineItem } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useMeasure } from \"../common/useMeasure\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { useReader } from \"../context/useReader\"\nimport { useAttachSnapshot } from \"./useAttachSnapshot\"\n\nconst GalleryItem = memo(\n ({\n item,\n onNavigated,\n }: {\n item: SpineItem\n onNavigated: () => void\n }) => {\n const [setElement, measures, element] = useMeasure()\n const reader = useReader()\n\n useAttachSnapshot(element, item, measures)\n\n const locatedResource = useObserve(\n () => reader?.locateResource(item, { mode: \"shallow\" }),\n [reader, item],\n )\n\n return (\n <Box\n width=\"100%\"\n aspectRatio=\"2/3\"\n border=\"1px solid\"\n borderColor=\"border\"\n borderRadius=\"md\"\n data-grid-item\n cursor=\"pointer\"\n position=\"relative\"\n overflow=\"hidden\"\n onClick={() => {\n onNavigated()\n reader?.navigation.goToSpineItem({ indexOrId: item })\n }}\n >\n <Box\n height=\"100%\"\n width=\"100%\"\n overflow=\"hidden\"\n pointerEvents=\"none\"\n ref={setElement}\n />\n <Text\n position=\"absolute\"\n bottom={0}\n left=\"0\"\n right=\"0\"\n textAlign=\"center\"\n bgColor=\"white\"\n p={4}\n fontSize=\"xs\"\n >\n Page {(locatedResource?.meta?.absolutePageIndex ?? 0) + 1}\n </Text>\n </Box>\n )\n },\n)\n\nexport const GalleryDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n const reader = useReader()\n const items = useObserve(() => reader?.spineItemsManager.items$, [reader])\n\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Gallery</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Box\n gridTemplateColumns={[\n \"repeat(2, minmax(0, 1fr))\",\n \"repeat(3, minmax(0, 1fr))\",\n ]}\n display=\"grid\"\n gap={[2, 4]}\n pt={2}\n data-grid\n >\n {items?.map((item) => (\n <GalleryItem\n key={item.item.id}\n item={item}\n onNavigated={() => {\n setOpen(false)\n }}\n />\n ))}\n </Box>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Button, HStack, Heading, Kbd, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuArrowBigLeft, LuArrowBigRight } from \"react-icons/lu\"\nimport { name, version } from \"../../package.json\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\n\nexport const HelpDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Help</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Shortcuts\n </Heading>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigRight />\n </Kbd>{\" \"}\n <Text>Navigate to right page</Text>\n </HStack>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigLeft />\n </Kbd>{\" \"}\n <Text>Navigate to left page</Text>\n </HStack>\n <Heading mb={2} mt={4} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { NEVER, combineLatest, map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context.state$]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, Text } from \"@chakra-ui/react\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const FloatingProgress = () => {\n const pagination = usePagination()\n const roundedProgress = Math.floor(\n (pagination?.percentageEstimateOfBook ?? 0) * 100,\n )\n const displayableProgress = roundedProgress > 0 ? roundedProgress : 1\n\n if (pagination?.percentageEstimateOfBook === undefined) return null\n\n return (\n <Box position=\"absolute\" right={0} bottom={0} p={2} color={\"black\"}>\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n )\n}\n","import { Text, type TextProps } from \"@chakra-ui/react\"\nimport { useEffect, useState } from \"react\"\n\nexport const useTime = () => {\n const [time, setTime] = useState(new Date())\n\n useEffect(() => {\n const interval = setInterval(() => {\n setTime(new Date())\n }, 1000 * 60)\n\n return () => clearInterval(interval)\n }, [])\n\n return time\n}\n\nexport const TimeIndicator = (props: TextProps) => {\n const time = useTime()\n\n return (\n <Text fontSize=\"xs\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { useSignalValue } from \"reactjrx\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\nexport const useQuickMenu = () => {\n const { quickMenuSignal } = useReaderContext()\n\n const quickMenu = useSignalValue(quickMenuSignal)\n\n return [quickMenu, quickMenuSignal.setValue, quickMenuSignal] as const\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { TimeIndicator } from \"../quickmenu/TimeIndicator\"\nimport { useQuickMenu } from \"../quickmenu/useQuickMenu\"\n\nexport const FloatingTime = () => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <Box\n position=\"absolute\"\n left={0}\n bottom={0}\n p={2}\n color={quickMenuOpen ? undefined : \"colorPalette.contrast\"}\n >\n <TimeIndicator />\n </Box>\n )\n}\n","import { isHtmlTagElement } from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useInterceptExternalLinks = () => {\n const reader = useReader()\n\n useSubscribe(\n () =>\n reader?.links$.subscribe((event) => {\n if (event.type === \"click\" && isHtmlTagElement(event.target, \"a\")) {\n if (!event.target.href) return\n\n const url = new URL(event.target.href)\n\n if (window.location.host !== url.host) {\n const response = confirm(\n `You are going to be redirected to external link`,\n )\n\n if (response) {\n window.open(event.target.href, \"__blank\")\n }\n }\n }\n }),\n [reader],\n )\n}\n","import { useSubscribe } from \"reactjrx\"\nimport { EMPTY, NEVER, Subject, finalize, switchMap } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\nexport const useNotifyZoom = () => {\n const reader = useReader()\n const { notificationsSubject } = useReaderContext()\n\n useSubscribe(\n () =>\n reader?.zoom.isZooming$.pipe(\n switchMap((isZooming) => {\n if (!isZooming) return EMPTY\n\n const abort = new Subject<void>()\n\n notificationsSubject.next({\n key: \"zoom\",\n title: \"Zooming\",\n duration: 999999,\n abort: abort,\n })\n\n return NEVER.pipe(\n finalize(() => {\n abort.next()\n abort.complete()\n }),\n )\n }),\n ),\n [reader],\n )\n}\n","import { isDefined, useSubscribe } from \"reactjrx\"\nimport {\n NEVER,\n distinctUntilChanged,\n filter,\n finalize,\n first,\n map,\n merge,\n mergeMap,\n skip,\n tap,\n timer,\n} from \"rxjs\"\nimport { toaster } from \"../components/ui/toaster\"\nimport { useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { useNotifyZoom } from \"../zoom/useNotifyZoom\"\n\nconst useNotifyFontScaleChange = () => {\n const reader = useReader()\n const { notificationsSubject } = useReaderContext()\n\n useSubscribe(\n () =>\n reader?.settings.values$.pipe(\n map(({ fontScale }) => fontScale),\n distinctUntilChanged(),\n skip(1),\n tap((fontScale) => {\n notificationsSubject.next({\n key: \"fontScaleChange\",\n title: \"Font size changed\",\n description: `${fontScale * 100} %`,\n })\n }),\n ),\n [reader, notificationsSubject],\n )\n}\n\nexport const useNotifications = () => {\n const { notificationsSubject } = useReaderContext()\n\n useNotifyFontScaleChange()\n useNotifyZoom()\n\n useSubscribe(\n () =>\n notificationsSubject.pipe(\n filter(isDefined),\n mergeMap((notification) => {\n const duration = notification.duration ?? 3000\n\n const toast = toaster.create({\n title: notification.title,\n description: notification.description,\n duration,\n })\n\n const sameNotification$ = notificationsSubject.pipe(\n skip(1),\n filter((n) => !!notification.key && n?.key === notification.key),\n )\n\n return merge(\n timer(duration),\n notification.abort ?? NEVER,\n sameNotification$,\n ).pipe(\n first(),\n finalize(() => {\n toaster.dismiss(toast)\n }),\n )\n }),\n ),\n [notificationsSubject],\n )\n}\n","import { Popover as ChakraPopover, IconButton, Portal } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { HiOutlineInformationCircle } from \"react-icons/hi\"\n\nexport interface ToggleTipProps extends ChakraPopover.RootProps {\n showArrow?: boolean\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n content?: React.ReactNode\n}\n\nexport const ToggleTip = React.forwardRef<HTMLDivElement, ToggleTipProps>(\n function ToggleTip(props, ref) {\n const {\n showArrow,\n children,\n portalled = true,\n content,\n portalRef,\n ...rest\n } = props\n\n return (\n <ChakraPopover.Root\n {...rest}\n positioning={{ ...rest.positioning, gutter: 4 }}\n >\n <ChakraPopover.Trigger asChild>{children}</ChakraPopover.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraPopover.Positioner>\n <ChakraPopover.Content\n width=\"auto\"\n px=\"2\"\n py=\"1\"\n textStyle=\"xs\"\n rounded=\"sm\"\n ref={ref}\n >\n {showArrow && (\n <ChakraPopover.Arrow>\n <ChakraPopover.ArrowTip />\n </ChakraPopover.Arrow>\n )}\n {content}\n </ChakraPopover.Content>\n </ChakraPopover.Positioner>\n </Portal>\n </ChakraPopover.Root>\n )\n },\n)\n\nexport const InfoTip = React.forwardRef<\n HTMLDivElement,\n Partial<ToggleTipProps>\n>(function InfoTip(props, ref) {\n const { children, ...rest } = props\n return (\n <ToggleTip content={children} {...rest} ref={ref}>\n <IconButton\n variant=\"ghost\"\n aria-label=\"info\"\n size=\"2xs\"\n colorPalette=\"gray\"\n >\n <HiOutlineInformationCircle />\n </IconButton>\n </ToggleTip>\n )\n})\n","import { Progress as ChakraProgress } from \"@chakra-ui/react\"\nimport { InfoTip } from \"./toggle-tip\"\nimport * as React from \"react\"\n\nexport const ProgressBar = React.forwardRef<\n HTMLDivElement,\n ChakraProgress.TrackProps\n>(function ProgressBar(props, ref) {\n return (\n <ChakraProgress.Track {...props} ref={ref}>\n <ChakraProgress.Range />\n </ChakraProgress.Track>\n )\n})\n\nexport interface ProgressLabelProps extends ChakraProgress.LabelProps {\n info?: React.ReactNode\n}\n\nexport const ProgressLabel = React.forwardRef<\n HTMLDivElement,\n ProgressLabelProps\n>(function ProgressLabel(props, ref) {\n const { children, info, ...rest } = props\n return (\n <ChakraProgress.Label {...rest} ref={ref}>\n {children}\n {info && <InfoTip>{info}</InfoTip>}\n </ChakraProgress.Label>\n )\n})\n\nexport const ProgressRoot = ChakraProgress.Root\nexport const ProgressValueText = ChakraProgress.ValueText\n","import { usePagination } from \"../pagination/usePagination\"\n\nexport const useNavigationContext = () => {\n const pagination = usePagination()\n const hasOnlyOnePage = pagination?.numberOfTotalPages === 1\n\n const isBeginWithinChapter =\n (pagination?.beginNumberOfPagesInSpineItem ?? 0) > 1\n\n const isEndWithinChapter = (pagination?.endNumberOfPagesInSpineItem ?? 0) > 1\n\n const beginPageIndex =\n (pagination?.hasChapters\n ? pagination?.beginPageIndexInSpineItem\n : pagination?.beginAbsolutePageIndex) ?? 0\n const endPageIndex =\n (pagination?.hasChapters\n ? pagination?.endPageIndexInSpineItem\n : pagination?.endAbsolutePageIndex) ?? 0\n\n const [leftPageIndex = 0, rightPageIndex = 0] = [\n beginPageIndex,\n endPageIndex,\n ].sort((a, b) => a - b)\n\n const beginAndEndAreDifferent =\n pagination?.beginPageIndexInSpineItem !==\n pagination?.endPageIndexInSpineItem ||\n pagination?.beginSpineItemIndex !== pagination?.endSpineItemIndex\n\n const totalApproximatePages = pagination?.hasChapters\n ? pagination?.beginNumberOfPagesInSpineItem\n : pagination?.numberOfTotalPages\n\n return {\n hasOnlyOnePage,\n beginPageIndex,\n endPageIndex,\n isBeginWithinChapter,\n isEndWithinChapter,\n beginAndEndAreDifferent,\n totalApproximatePages,\n leftPageIndex,\n rightPageIndex,\n }\n}\n","import { HStack, Stack, Text } from \"@chakra-ui/react\"\nimport {\n ProgressBar,\n ProgressRoot,\n ProgressValueText,\n} from \"../components/ui/progress\"\nimport { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const PaginationInfoSection = () => {\n const pagination = usePagination()\n const {\n hasOnlyOnePage,\n leftPageIndex,\n rightPageIndex,\n totalApproximatePages,\n beginAndEndAreDifferent,\n } = useNavigationContext()\n const progress = Math.round((pagination?.percentageEstimateOfBook ?? 0) * 100)\n\n const buildTitleChain = (\n chapterInfo: NonNullable<typeof pagination>[\"beginChapterInfo\"],\n ): string => {\n if (chapterInfo?.subChapter) {\n return `${chapterInfo.title} / ${buildTitleChain(chapterInfo.subChapter)}`\n }\n return chapterInfo?.title || \"\"\n }\n\n const chapterTitle = buildTitleChain(pagination?.beginChapterInfo)\n\n return (\n <Stack alignItems=\"center\" gap={1} maxW=\"100%\" overflow=\"auto\">\n <ProgressRoot value={progress} size=\"xs\" width={150}>\n <HStack justifyContent=\"space-between\">\n <ProgressBar width={110} />\n <ProgressValueText>{`${progress}%`}</ProgressValueText>\n </HStack>\n </ProgressRoot>\n <Text truncate maxWidth=\"100%\" fontSize=\"sm\" mt={1}>\n {chapterTitle ? `Chapter: ${chapterTitle}` : `\\u00A0`}\n </Text>\n {!hasOnlyOnePage && (\n <HStack>\n <Text fontSize=\"xs\">\n {beginAndEndAreDifferent\n ? `${leftPageIndex + 1} - ${rightPageIndex + 1} of ${totalApproximatePages}`\n : `${leftPageIndex + 1} of ${totalApproximatePages}`}\n </Text>\n {!!pagination?.hasChapters && (\n <>\n <Text>-</Text>\n <Text fontSize=\"xs\">\n ({(pagination?.beginAbsolutePageIndex ?? 0) + 1})\n </Text>\n </>\n )}\n </HStack>\n )}\n </Stack>\n )\n}\n","import { Presence, type PresenceProps } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const QuickBar = memo(\n ({\n children,\n position,\n ...rest\n }: { position: \"top\" | \"bottom\" } & PresenceProps) => {\n return (\n <Presence\n display=\"flex\"\n flexDirection=\"row\"\n width=\"100%\"\n position=\"absolute\"\n {...(position === \"bottom\" ? { bottom: 0 } : { top: 0 })}\n animationName={\n position === \"bottom\"\n ? {\n _open: \"slide-from-bottom, fade-in\",\n _closed: \"slide-to-bottom, fade-out\",\n }\n : {\n _open: \"slide-from-top, fade-in\",\n _closed: \"slide-to-top, fade-out\",\n }\n }\n animationDuration=\"moderate\"\n bgColor=\"bg.panel\"\n alignItems=\"center\"\n justifyContent=\"center\"\n shadow=\"md\"\n p={4}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\n)\n","import RcSlider from \"rc-slider\"\nimport { type ComponentProps, memo } from \"react\"\nimport \"rc-slider/assets/index.css\"\nimport { Box, chakra } from \"@chakra-ui/react\"\n\nconst ChakraRcSlider = chakra(RcSlider)\n\nexport const ThemedSlider = memo((props: ComponentProps<typeof RcSlider>) => {\n return (\n <Box\n display=\"contents\"\n css={{\n \"--bg\": \"colors.bg\",\n \"--bg-emphasized\": \"colors.bg.emphasized\",\n \"--color-solid\": \"colors.colorPalette.solid\",\n }}\n >\n <ChakraRcSlider\n keyboard={false}\n style={{\n padding: 0,\n }}\n css={{\n \"& > .rc-slider-handle:focus-visible\": {\n boxShadow: \"0 0 0 2px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle:active\": {\n boxShadow: \"0 0 5px var(--color-solid) !important\",\n },\n \"& > .rc-slider-handle.rc-slider-handle-dragging\": {\n boxShadow: \"0 0 0 3px var(--color-solid) !important\",\n },\n }}\n styles={{\n rail: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--bg-emphasized)\",\n },\n track: {\n height: \"8px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n backgroundColor: \"var(--color-solid)\",\n },\n handle: {\n width: \"24px\",\n height: \"24px\",\n top: \"50%\",\n borderColor: \"var(--color-solid)\",\n transform: `translate(${props.reverse ? \"50%\" : \"-50%\"}, -50%)`,\n backgroundColor: \"var(--bg)\",\n marginTop: \"0px\",\n },\n }}\n {...props}\n />\n </Box>\n )\n})\n","import { Box } from \"@chakra-ui/react\"\nimport { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { signal, useObserve, useSignalState, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { useNavigationContext } from \"../navigation/useNavigationContext\"\nimport { usePagination } from \"../pagination/usePagination\"\nimport { ThemedSlider } from \"./ThemedSlider\"\n\nconst useSliderValues = () => {\n const pagination = usePagination()\n const isUsingSpread = pagination?.isUsingSpread\n const { beginPageIndex: currentRealPage, totalApproximatePages = 0 } =\n useNavigationContext()\n const currentPage = isUsingSpread\n ? Math.floor((currentRealPage || 0) / 2)\n : currentRealPage\n const [value, valueSignal] = useSignalState(() =>\n signal({\n default: currentPage || 0,\n }),\n )\n const min = 0\n const max = Math.max(\n 0,\n isUsingSpread\n ? Math.floor((totalApproximatePages - 1) / 2)\n : totalApproximatePages - 1,\n )\n\n useEffect(() => {\n valueSignal.update(currentPage || 0)\n }, [currentPage, valueSignal])\n\n return {\n value,\n valueSignal,\n min,\n max,\n }\n}\n\nexport const Scrubber = (props: ComponentProps<typeof ThemedSlider>) => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, [reader]) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.setValue(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.state.beginSpineItemIndex ?? 0,\n animation: false,\n })\n }\n },\n [reader, isUsingSpread, valueSignal, isScrubberWithinChapter],\n )\n\n /**\n * @note\n * Scrubber can navigate fast and without lock we may end up with\n * slowness due to the reader\n * paginating and loading items in between.\n * This is good practice (but not required) to throttle it.\n */\n useSubscribe(\n () =>\n reader?.navigation.throttleLock({\n duration: 100,\n trigger: valueSignal.subject,\n }),\n [reader, valueSignal],\n )\n\n // const marks =\n // max > 1\n // ? Array.from({ length: max + 1 }, (_, i) => i).reduce(\n // (acc: number[], val) => [...acc, val],\n // [],\n // )\n // : []\n\n const disabled =\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n if (disabled) return <Box style={props.style} />\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\n {...props}\n />\n )\n // return (\n // <Slider\n // value={[value]}\n // max={max}\n // min={min}\n // marks={marks}\n // onChange={e => {\n // debugger\n // }}\n // onValueChange={onChange}\n // // reverse={reverse}\n // orientation=\"horizontal\"\n // step={step}\n // />\n // )\n}\n","import { Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport { LuChevronDown, LuGalleryHorizontal, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp, LuNotebookPen } from \"react-icons/lu\"\nimport { RiGalleryView2 } from \"react-icons/ri\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasBookmarksEnhancer,\n hasGalleryEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (\n item: \"annotations\" | \"search\" | \"help\" | \"toc\" | \"bookmarks\" | \"gallery\",\n ) => void\n }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection =\n settings?.computedPageTurnDirection === \"vertical\"\n const [isExtraOpen, setIsExtraOpen] = useState(true)\n\n return (\n <QuickBar\n present={open}\n position=\"bottom\"\n display=\"flex\"\n flexDirection=\"column\"\n overflow=\"auto\"\n pb={8}\n >\n <HStack flex={1} alignItems=\"center\" justifyContent=\"center\">\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <Scrubber\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"35px\",\n }}\n />\n </Stack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n disabled={\n !navigation?.canGoRightSpineItem &&\n !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? (\n <RxDoubleArrowDown />\n ) : (\n <RxDoubleArrowRight />\n )}\n </IconButton>\n </HStack>\n <HStack alignSelf=\"stretch\" alignItems=\"center\" justifyContent=\"center\">\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\n width=\"100%\"\n display=\"flex\"\n justifyContent=\"center\"\n >\n <LuChevronDown\n style={{\n transform: isExtraOpen ? \"rotate(0deg)\" : \"rotate(180deg)\",\n }}\n />\n </Collapsible.Trigger>\n <Collapsible.Content display=\"flex\" justifyContent=\"center\">\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"help\")}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"toc\")}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"search\")}\n >\n <LuSearch />\n </IconButton>\n )}\n {hasBookmarksEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Thumbnails\"\n size=\"lg\"\n variant={\n reader?.settings.values.viewportMode === \"thumbnails\"\n ? \"solid\"\n : \"ghost\"\n }\n onClick={() => {\n reader?.settings.update({\n viewportMode:\n reader?.settings.values.viewportMode === \"normal\"\n ? \"thumbnails\"\n : \"normal\",\n })\n }}\n >\n <LuGalleryHorizontal />\n </IconButton>\n {hasGalleryEnhancer(reader) && (\n <IconButton\n aria-label=\"Gallery\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"gallery\")}\n >\n <RiGalleryView2 />\n </IconButton>\n )}\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\n </QuickBar>\n )\n },\n)\n","import { useEffect } from \"react\"\n\nimport { useCallback } from \"react\"\n\nimport { useState } from \"react\"\n\nexport const useFullscreen = () => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const onToggleFullscreenClick = useCallback(() => {\n if (document.fullscreenElement) {\n return document\n .exitFullscreen()\n .catch(console.error)\n .then(() => {\n setIsFullscreen(false)\n })\n }\n\n return document.documentElement\n .requestFullscreen({ navigationUI: \"hide\" })\n .catch(console.error)\n .then(() => {\n setIsFullscreen(true)\n })\n }, [])\n\n useEffect(() => {\n function fullscreenchangeHandler() {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n document.addEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n }\n }, [])\n\n return {\n isFullscreen,\n onToggleFullscreenClick,\n }\n}\n","import { HStack, IconButton, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { IoIosArrowBack, IoMdMore } from \"react-icons/io\"\nimport { MdFullscreen, MdFullscreenExit } from \"react-icons/md\"\nimport { useObserve } from \"reactjrx\"\nimport { useFullscreen } from \"../common/useFullscreen\"\nimport { useReader } from \"../context/useReader\"\nimport { QuickBar } from \"./QuickBar\"\n\nexport const TopBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (item: \"more\" | \"back\") => void\n }) => {\n const reader = useReader()\n const manifest = useObserve(() => reader?.context.manifest$, [reader])\n const { isFullscreen, onToggleFullscreenClick } = useFullscreen()\n\n return (\n <QuickBar\n present={open}\n position=\"top\"\n height=\"80px\"\n justifyContent=\"space-between\"\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => onItemClick(\"back\")}\n >\n <IoIosArrowBack />\n </IconButton>\n <Stack\n flex={1}\n maxW={600}\n gap={1}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <Text truncate maxWidth=\"100%\">\n {manifest?.title}\n </Text>\n </Stack>\n <HStack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={() => onItemClick(\"more\")}\n >\n <IoMdMore />\n </IconButton>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onToggleFullscreenClick}\n >\n {isFullscreen ? <MdFullscreenExit /> : <MdFullscreen />}\n </IconButton>\n </HStack>\n </QuickBar>\n )\n },\n)\n","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onItemClick,\n }: {\n onItemClick: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\"\n | \"gallery\",\n ) => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar open={quickMenuOpen} onItemClick={onItemClick} />\n <BottomBar open={quickMenuOpen} onItemClick={onItemClick} />\n </>\n )\n },\n)\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { Box, Heading, Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback, useState } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { map, startWith } from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\n\nexport const SearchDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const [text, setText] = useState(\"\")\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setText(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const search = useObserve(\n () =>\n readerWithSearch?.search.search(text).pipe(\n map((data) => ({ type: `end` as const, data })),\n startWith({ type: `start` as const }),\n ),\n [reader, text],\n )\n const searching = search?.type === \"start\"\n const results = search?.type === \"end\" ? search.data : []\n const consolidatedResults = useObserve(\n () => reader?.locateResource(results.slice(0, 100)),\n [results],\n )\n\n return (\n <Stack flex={1} height=\"100%\">\n <Box px={4}>\n <Input\n placeholder=\"Type something...\"\n value={text}\n onChange={onValueChange}\n borderRadius={0}\n />\n </Box>\n <Box\n px={4}\n pb={4}\n mt={2}\n flex={1}\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n >\n {searching && <Text>Searching ...</Text>}\n {!searching && results.length === 0 && <p>There are no results</p>}\n {!searching && results.length >= 0 && (\n <Stack>\n <Heading as=\"h2\" size=\"md\">\n {results.length} result(s)\n </Heading>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={text}\n cfi={result.meta.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Box>\n </Stack>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <SearchDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Link, Stack, Text } from \"@chakra-ui/react\"\n\nimport { List } from \"@chakra-ui/react\"\nimport React, { memo } from \"react\"\nimport { LuCircleCheck } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const TableOfContentsDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context.state$, [reader]) ?? {}\n const { nav } = manifest ?? {}\n const pagination = usePagination()\n const toc = nav?.toc || []\n const { beginSpineItemIndex, beginPageIndexInSpineItem } = pagination ?? {}\n const currentSpineItemOrChapterPageIndex =\n (assumedRenditionLayout === \"reflowable\"\n ? beginPageIndexInSpineItem\n : beginSpineItemIndex) || 0\n\n console.log({ assumedRenditionLayout, currentSpineItemOrChapterPageIndex })\n\n let currentSubChapter = pagination?.beginChapterInfo\n\n while (currentSubChapter?.subChapter) {\n currentSubChapter = currentSubChapter?.subChapter\n }\n\n const buildTocForItem = (\n tocItem: (typeof toc)[number],\n index: number,\n lvl: number,\n ) => (\n <React.Fragment key={index}>\n <List.Item\n pl={4 * (lvl + 1)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Link\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToUrl(tocItem.href)\n }}\n href=\"#\"\n >\n {currentSubChapter?.path === tocItem.path && (\n <List.Indicator asChild>\n <LuCircleCheck />\n </List.Indicator>\n )}\n {currentSubChapter?.path !== tocItem.path && (\n <List.Indicator asChild visibility=\"hidden\">\n <LuCircleCheck />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text fontSize=\"md\">{tocItem.title || tocItem.path}</Text>\n {currentSubChapter?.path === tocItem.path && (\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Currently on page ${\n currentSpineItemOrChapterPageIndex + 1\n }`}</Text>\n )}\n </Stack>\n </Link>\n </List.Item>\n {tocItem.contents.length > 0 && (\n <List.Root as=\"div\" gap={2}>\n {tocItem.contents.map((tocItem, index) =>\n buildTocForItem(tocItem, index, lvl + 1),\n )}\n </List.Root>\n )}\n </React.Fragment>\n )\n\n return (\n <List.Root gap={3} overflowY=\"auto\" py={4} flex={1}>\n {nav?.toc.map((tocItem, index) => buildTocForItem(tocItem, index, 0))}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { TableOfContentsDialogContent } from \"./TableOfContentsDialogContent\"\n\nexport const TableOfContentsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Table of Contents</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <TableOfContentsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport { useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { Bookmarks } from \"./bookmarks/Bookmarks\"\nimport { BookmarksDialog } from \"./bookmarks/BookmarksDialog\"\nimport { Toaster } from \"./components/ui/toaster\"\nimport { GalleryDialog } from \"./gallery/GalleryDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { useInterceptExternalLinks } from \"./navigation/useInterceptExternalLinks\"\nimport { useNotifications } from \"./notifications/useNotifications\"\nimport { QuickMenu } from \"./quickmenu/QuickMenu\"\nimport { useQuickMenu } from \"./quickmenu/useQuickMenu\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onItemClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onItemClick?: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\"\n | \"gallery\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpen, setIsAnnotationsOpen] = useState(false)\n const [isBookmarksOpen, setIsBookmarksOpen] = useState(false)\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 setIsAnnotationsOpen(false)\n setIsBookmarksOpen(false)\n setQuickMenuOpen(false)\n setIsGalleryOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpen(true)\n } else if (item === \"search\") {\n setIsSearchOpen(true)\n } else if (item === \"help\") {\n setIsHelpOpen(true)\n } else if (item === \"toc\") {\n setIsTableOfContentsOpen(true)\n } else if (item === \"bookmarks\") {\n setIsBookmarksOpen(true)\n } else if (item === \"gallery\") {\n setIsGalleryOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\n\n useInterceptExternalLinks()\n useNotifications()\n\n return (\n <>\n {enableFloatingProgress && (\n <Presence\n present={!quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <FloatingProgress />\n </Presence>\n )}\n <GalleryDialog open={isGalleryOpen} setOpen={setIsGalleryOpen} />\n <QuickMenu onItemClick={_onItemClick} />\n <Bookmarks />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={onNavigate}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={onNavigate}\n />\n <AnnotationsDialog\n open={isAnnotationsOpen}\n setOpen={setIsAnnotationsOpen}\n onNavigate={onNavigate}\n />\n <BookmarksDialog\n open={isBookmarksOpen}\n setOpen={setIsBookmarksOpen}\n onNavigate={onNavigate}\n />\n <Presence\n present={enableFloatingTime || quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n <Toaster />\n </>\n )\n}\n"],"names":["ReaderContext","createContext","signal","Subject","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useSignalState","notificationsSubject","useConstant","onQuickMenuOpenChangeLiveRef","useLiveRef","value","useMemo","useEffect","useSubscribe","tap","jsx","CloseButton","React","props","ref","ChakraIconButton","LuX","DialogContent","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useReaderContext","useContext","useReader","hasSearchEnhancer","hasBookmarksEnhancer","hasAnnotationsEnhancer","hasGalleryEnhancer","AnnotationsDialogContent","onNavigate","readerWithAnnotations","consolidatedHighlights","useObserve","switchMap","highlights","mapItemToListEntry","item","index","List","jsxs","Link","_a","LuNotebookPen","Stack","Text","_b","_c","AnnotationsDialog","open","setOpen","e","Button","Bookmarks","readerWithBookmarks","spineElement","pages","bookmarks","consolidatedBookmarks","Fragment","createPortal","isBookmarkable","left","top","width","bookmarkForPage","bookmark","Presence","Box","IconButton","BsBookmarkXFill","BsBookmarkPlus","BookmarksDialogContent","items","_e","_d","BookmarksDialog","toaster","createToaster","Toaster","ChakraToaster","toast","Toast","Spinner","defaultState","useMeasure","element","setElement","useState","rect","setRect","observer","entries","x","y","height","bottom","right","useLayoutEffect","useAttachSnapshot","measures","readerWithGalleryEnhancer","NEVER","itemLayoutChanged$","startWith","distinctUntilChanged","isShallowEqual","isIntemIntersecting$","observeIntersection","map","throttleTime","isVisible","filter","first","GalleryItem","onNavigated","locatedResource","GalleryDialog","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","state","context","isOnlyImages","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","useInterceptExternalLinks","event","isHtmlTagElement","url","useNotifyZoom","isZooming","EMPTY","abort","finalize","useNotifyFontScaleChange","fontScale","skip","useNotifications","isDefined","mergeMap","notification","duration","sameNotification$","n","merge","timer","ToggleTip","showArrow","content","ChakraPopover","InfoTip","HiOutlineInformationCircle","ProgressBar","ChakraProgress","React__namespace","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","onItemClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","LuGalleryHorizontal","RiGalleryView2","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","absolutePageIndex","before","after","SearchDialogContent","setText","readerWithSearch","onValueChange","search","data","searching","results","consolidatedResults","Input","result","j","_f","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpen","setIsAnnotationsOpen","isBookmarksOpen","setIsBookmarksOpen","isGalleryOpen","setIsGalleryOpen","setQuickMenuOpen","_onItemClick"],"mappings":"qzCAYaA,EAAsCC,EAAAA,cAA2B,CAC5E,OAAQ,OACR,gBAAiBC,EAAA,OAAO,CAAE,QAAS,GAAO,EAC1C,qBAAsB,IAAIC,EAA4B,OACxD,CAAC,ECHYC,GAAsBC,EAAA,KACjC,CAAC,CACC,SAAAC,EACA,OAAAC,EACA,cAAAC,EACA,sBAAAC,CAAA,IAMI,CACE,KAAA,CAAA,CAAGC,CAAe,EAAIC,EAAA,eAAe,IACzCT,SAAO,CACL,QAASM,CACV,CAAA,CACH,EACMI,EAAuBC,EAAA,YAC3B,IAAM,IAAIV,EAA4B,OACxC,EACMW,EAA+BC,aAAWN,CAAqB,EAE/DO,EAAQC,EAAA,QACZ,KAAO,CACL,gBAAAP,EACA,OAAAH,EACA,qBAAAK,CAAA,GAEF,CAACF,EAAiBH,EAAQK,CAAoB,CAChD,EAEAM,OAAAA,EAAAA,UAAU,IAAM,CACdR,EAAgB,SAASF,CAAa,CAAA,EACrC,CAACA,EAAeE,CAAe,CAAC,EAEnCS,EAAA,aACE,IAAMT,EAAgB,KAAKU,EAAI,IAAAN,EAA6B,OAAO,CAAC,EACpE,CAACJ,EAAiBI,CAA4B,CAChD,EAGGO,EAAAA,IAAArB,EAAc,SAAd,CAAuB,MAAAgB,EAAe,SAAAV,CAAS,CAAA,CAAA,CAGtD,EClDagB,GAAcC,EAAM,WAG/B,SAAqBC,EAAOC,EAAK,CACjC,OACGJ,EAAAA,IAAAK,EAAAA,WAAA,CAAiB,QAAQ,QAAQ,aAAW,QAAQ,IAAAD,EAAW,GAAGD,EAChE,SAAAA,EAAM,UAAYH,EAAA,IAACM,OAAI,CAAA,EAC1B,CAEJ,CAAC,ECNYC,EAAgBL,EAAM,WAGjC,SAAuBC,EAAOC,EAAK,CAC7B,KAAA,CACJ,SAAAnB,EACA,UAAAuB,EAAY,GACZ,UAAAC,EACA,SAAAC,EAAW,GACX,GAAGC,CAAA,EACDR,EAEJ,cACGS,EAAO,OAAA,CAAA,SAAU,CAACJ,EAAW,UAAWC,EACtC,SAAA,CAAYC,GAAAV,EAAA,IAACa,SAAa,SAAb,CAAA,CAAsB,EACnCb,EAAA,IAAAa,EAAA,OAAa,WAAb,CACC,eAACA,EAAAA,OAAa,QAAb,CAAqB,IAAAT,EAAW,GAAGO,EAAM,QAAS,GAChD,SAAA1B,CACH,CAAA,CACF,CAAA,CAAA,EACF,CAEJ,CAAC,EAEY6B,EAAqBZ,EAAM,WAGtC,SAA4BC,EAAOC,EAAK,CAEtC,OAAAJ,EAAA,IAACa,EAAAA,OAAa,aAAb,CACC,SAAS,WACT,IAAI,IACJ,SAAS,IACR,GAAGV,EACJ,QAAO,GAEP,eAACF,GAAY,CAAA,KAAK,KAAK,IAAAG,EACpB,WAAM,QACT,CAAA,CAAA,CACF,CAEJ,CAAC,EAEYW,EAAaF,EAAa,OAAA,KAC1BG,EAAeH,EAAa,OAAA,OAC5BI,EAAeJ,EAAa,OAAA,OAC5BK,EAAaL,EAAa,OAAA,KACTA,EAAAA,OAAa,SACpC,MAAMM,EAAcN,EAAa,OAAA,MACPA,EAAAA,OAAa,YACjBA,EAAAA,OAAa,QACnC,MAAMO,EAAsBP,EAAa,OAAA,cC1DnCQ,EAAmB,IACvBC,EAAAA,WAAW3C,CAAa,ECGpB4C,EAAY,IAA0B,CAC3C,KAAA,CAAE,OAAArC,CAAO,EAAImC,EAAiB,EAE7B,OAAAnC,CACT,EAEasC,EACXtC,GAEO,CAAC,CAACA,GAAU,mCAAoCA,EAG5CuC,EACXvC,GAEO,CAAC,CAACA,GAAU,sCAAuCA,EAG/CwC,EACXxC,GAEO,CAAC,CAACA,GAAU,wCAAyCA,EAGjDyC,EACXzC,GAEO,CAAC,CAACA,GAAU,oCAAqCA,EC3B7C0C,GAA2B5C,EAAA,KACtC,CAAC,CAAE,WAAA6C,CAAA,IAA6C,CAC9C,MAAM3C,EAASqC,EAAU,EACnBO,EAAwBJ,EAAuBxC,CAAM,EACvDA,EACA,OAEE6C,EAAyBC,EAAA,WAC7B,IACEF,GAAA,YAAAA,EAAuB,YAAY,YAAY,KAC7CG,EAAA,UAAWC,GACTJ,EAAsB,eAAeI,CAAU,CAAA,GAGrD,CAACJ,CAAqB,CACxB,EAEMK,EAAqB,CACzBC,EACAC,eAECrC,OAAAA,EAAA,IAAAsC,OAAK,KAAL,CACC,SAAAC,EAAA,KAACC,EAAA,KAAA,CACC,KAAK,IACL,QAAS,IAAM,CACFX,EAAA,EAEX3C,GAAA,MAAAA,EAAQ,WAAW,QAAQkD,EAAK,KAAK,KAAO,GAC9C,EAEE,SAAA,IAAKK,EAAAL,EAAA,WAAA,YAAAK,EAAU,WAAY,CAAI,GAAA,CAAC,EAChCzC,EAAAA,IAACsC,EAAAA,KAAK,UAAL,CAAe,QAAO,GACrB,SAAAtC,EAAA,IAAC0C,kBAAc,CACjB,CAAA,EAEC1C,EAAA,IAAAsC,EAAA,KAAK,UAAL,CAAe,QAAO,GAAC,WAAW,SACjC,SAACtC,EAAAA,IAAA0C,EAAAA,cAAA,CAAA,CAAc,CACjB,CAAA,EAEFH,EAAAA,KAACI,EAAAA,MAAM,CAAA,IAAK,EACV,SAAA,CAAA3C,EAAAA,IAAC4C,QAAK,UAAW,EAAG,SAAS,KAC1B,UAAAC,EAAAT,EAAK,WAAL,MAAAS,EAAe,gBACbT,EAAK,SAAS,iBAAmB,GAEjCpC,EAAAA,IAAA,IAAA,CACC,eAAC,IAAE,CAAA,SAAA,uBAAoB,EACzB,CAEJ,CAAA,EACAA,EAAA,IAAC4C,EAAA,KAAA,CACC,UAAU,SACV,WAAW,OACX,SAAS,KACT,SAAA,gBACAE,EAAAV,EAAK,OAAL,YAAAU,EAAW,qBAAsB,OAC7BV,EAAK,KAAK,kBAAoB,EAC9B,sBACN,EAAA,CAAA,CAAG,CACL,CAAA,CAAA,CAAA,IArCYC,CAuChB,GAGF,OACGrC,EAAAA,IAAAsC,EAAAA,KAAK,KAAL,CAAU,UAAU,OAAO,IAAK,EAAG,GAAI,EAAG,QAAQ,QAChD,SAAwBP,GAAA,YAAAA,EAAA,IAAI,CAACK,EAAMC,IAClCF,EAAmBC,EAAMC,CAAK,GAElC,CAAA,CAGN,EChEaU,GAAoB/D,EAAA,KAC/B,CAAC,CACC,KAAAgE,EACA,QAAAC,EACA,WAAApB,CAAA,IAOE7B,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiC,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,SAAAX,EAAA,KAAChC,EAAc,CAAA,OAAO,OACpB,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,aAAW,CAAA,EAC1B,QACCD,EAAW,CAAA,KAAM,EAChB,SAAClB,EAAA,IAAA4B,GAAA,CAAyB,WAAAC,CAAwB,CAAA,EACpD,EACC7B,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAmD,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCrC,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,EC3CasC,GAAYpE,OAAK,IAAM,CAClC,MAAME,EAASqC,EAAU,EACnB8B,EAAsB5B,EAAqBvC,CAAM,EAAIA,EAAS,OAC9DoE,EAAetB,EAAAA,WAAW,IAAM9C,GAAA,YAAAA,EAAQ,MAAM,SAAU,CAACA,CAAM,CAAC,EAChEqE,EAAQvB,EAAA,WACZ,IAAMqB,GAAA,YAAAA,EAAqB,UAAU,OACrC,CAACA,CAAmB,CACtB,EACMG,EAAYxB,EAAA,WAChB,IAAMqB,GAAA,YAAAA,EAAqB,UAAU,WACrC,CAACA,CAAmB,CACtB,EACMI,EAAwBzB,EAAA,WAC5B,IAAM9C,GAAA,YAAAA,EAAQ,eAAesE,GAAa,IAC1C,CAACtE,EAAQsE,CAAS,CACpB,EAEI,OAACF,EAIAtD,MAAA0D,EAAAA,SAAA,CAAA,SAAAC,EAAA,aACCJ,GAAA,YAAAA,EAAO,IACL,CACE,CAAE,eAAAK,EAAgB,iBAAkB,CAAE,KAAAC,EAAM,IAAAC,EAAK,MAAAC,CAAA,CAAQ,EACzD1B,IACG,CACH,MAAM2B,EAAkBP,GAAA,YAAAA,EAAuB,KAC5CQ,GAAa,OAAA,QAAAxB,EAAAwB,GAAA,YAAAA,EAAU,OAAV,YAAAxB,EAAgB,qBAAsBJ,IAWlD,OAACuB,EAGH5D,EAAA,IAACkE,EAAA,SAAA,CAEC,QAAS,GACT,UAAS,GACT,cAAe,CAAE,MAAO,UAAW,QAAS,UAAW,EACvD,kBAAkB,WAElB,SAAAlE,EAAA,IAACmE,EAAA,IAAA,CACC,qBAAkB,GAClB,SAAS,WACT,KAAMN,EAAOE,EACb,UAAU,oBACV,IAAAD,EACA,EAAG,EAEF,SAACE,EAgBAhE,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,WACX,QAAS,GACT,OAAQ,CAAE,QAAS,CAAE,EACrB,QAAS,IAAM,CACbJ,IACEX,GAAA,MAAAA,EAAqB,UAAU,OAC7BW,EAAgB,SAAS,IAE/B,EACA,KAAK,KACL,QAAQ,QACR,MAAO,CAAE,QAAS,MAAO,EAEzB,eAACK,EAAAA,gBAAgB,CAAA,CAAA,CAAA,CAAA,EA7BnBrE,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,WACX,QAAS,IAAM,CACQf,GAAA,MAAAA,EAAA,UAAU,SAAShB,EAC1C,EACA,KAAK,KACL,QAAQ,QACR,QAAS,GACT,OAAQ,CAAE,QAAS,CAAE,EACrB,QAAQ,QACR,MAAO,CAAE,QAAS,MAAO,EAEzB,eAACiC,EAAAA,eAAe,CAAA,CAAA,CAAA,CAAA,CAkBlB,CAAA,CAEJ,EA/CKjC,CAgDP,EApD0B,IAoD1B,GAINiB,CAAA,EAEJ,EAhFwB,IAkF5B,CAAC,ECpGYiB,GAAyBvF,EAAA,KACpC,CAAC,CAAE,WAAA6C,CAAA,IAA6C,CAC9C,MAAM3C,EAASqC,EAAU,EACnB8B,EAAsB5B,EAAqBvC,CAAM,EACnDA,EACA,OAEEuE,EAAwBzB,EAAA,WAC5B,IACEqB,GAAA,YAAAA,EAAqB,UAAU,WAAW,KACxCpB,EAAAA,UAAWuC,GAAUnB,EAAoB,eAAemB,CAAK,CAAC,GAElE,CAACnB,CAAmB,CACtB,EAEMlB,EAAqB,CACzBC,EACAC,IAEA,eAAAE,OAAAA,EAAA,KAACD,EAAK,KAAA,KAAL,CAAsB,eAAe,gBAAgB,WAAW,SAC/D,SAAA,CAAAtC,EAAA,IAACwC,EAAA,KAAA,CACC,KAAK,IACL,QAAS,IAAM,CACFX,EAAA,EAEX3C,GAAA,MAAAA,EAAQ,WAAW,QAAQkD,EAAK,KAAK,KAAO,GAC9C,EAEA,SAAAG,EAAA,KAACI,EAAM,MAAA,CAAA,IAAK,EACV,SAAA,CAAA3C,EAAA,IAAC4C,EAAK,KAAA,CAAA,SAAS,KACZ,SAAA,gBACCH,EAAAL,EAAK,OAAL,YAAAK,EAAW,qBAAsB,OAC7BL,EAAK,KAAK,kBAAoB,EAC9B,SACN,GACF,EACApC,EAAA,IAAC4C,EAAA,KAAA,CACC,UAAU,SACV,WAAW,OACX,SAAS,KACT,SAAQ,GACR,UAAW,EAEV,iBAAK,qBAAM,oBAAW,aACnB6B,GAAAC,EAAAtC,EAAK,OAAL,YAAAsC,EAAW,YAAX,YAAAD,EAAsB,YACtB,KAAA,CAAA,CACN,CACF,CAAA,CAAA,CACF,EACAzE,EAAA,IAACmD,EAAA,OAAA,CACC,aAAa,MACb,QAAQ,QACR,KAAK,KACL,QAAS,IAAM,CACbE,GAAA,MAAAA,EAAqB,UAAU,OAAOjB,EAAK,SAAS,GACtD,EACD,SAAA,QAAA,CAAA,CAED,CAAA,EAvCcC,CAwChB,GAGF,OACGrC,EAAAA,IAAAsC,EAAAA,KAAK,KAAL,CAAU,UAAU,OAAO,IAAK,EAAG,QAAQ,QAAQ,SAAS,OAC1D,SAAuBmB,GAAA,YAAAA,EAAA,IAAI,CAACrB,EAAMC,IACjCF,EAAmBC,EAAMC,CAAK,GAElC,CAAA,CAGN,EC9DasC,GAAkB3F,EAAA,KAC7B,CAAC,CACC,KAAAgE,EACA,QAAAC,EACA,WAAApB,CAAA,IAOE7B,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiC,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,SAAAX,EAAA,KAAChC,EAAc,CAAA,OAAO,OACpB,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,WAAS,CAAA,EACxB,EACCnB,MAAAkB,EAAA,CACC,SAAClB,EAAAA,IAAAuE,GAAA,CAAuB,WAAA1C,CAAwB,CAAA,EAClD,EACC7B,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAmD,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCrC,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,ECrCa8D,EAAmBC,EAAAA,cAAc,CAC5C,UAAW,aACX,gBAAiB,EACnB,CAAC,EAEYC,GAAU,IAEnB9E,MAACY,EAAAA,QACC,SAACZ,EAAA,IAAA+E,UAAA,CAAc,QAAAH,EAAkB,YAAa,CAAE,OAAQ,GAAI,EACzD,SAACI,GACA,OAAAzC,OAAAA,OAAC0C,EAAAA,MAAM,KAAN,CAAW,MAAO,CAAE,GAAI,IACtB,EAAA,SAAA,CAAAD,EAAM,OAAS,UACbhF,EAAA,IAAAkF,EAAA,QAAA,CAAQ,KAAK,KAAK,MAAM,YAAa,CAAA,EAEtClF,EAAAA,IAACiF,EAAAA,MAAM,UAAN,CAAA,CAAgB,SAElBtC,EAAAA,MAAM,CAAA,IAAI,IAAI,KAAK,IAAI,SAAS,OAC9B,SAAA,CAAAqC,EAAM,OAAUhF,EAAAA,IAAAiF,EAAA,MAAM,MAAN,CAAa,WAAM,MAAM,EACzCD,EAAM,aACLhF,EAAAA,IAACiF,QAAM,YAAN,CAAmB,WAAM,WAAY,CAAA,CAAA,EAE1C,EACCD,EAAM,QACJhF,EAAA,IAAAiF,QAAM,cAAN,CAAqB,SAAAD,EAAM,OAAO,MAAM,IAE1CvC,EAAAuC,EAAM,OAAN,YAAAvC,EAAY,WAAazC,EAAA,IAAAiF,EAAA,MAAM,aAAN,CAAmB,CAAA,CAAA,CAC/C,CAAA,EAEJ,CAAA,EACF,EC7BEE,GAA+B,CACnC,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACR,IAAK,EACL,KAAM,EACN,OAAQ,EACR,MAAO,CACT,EAEO,SAASC,IAA+D,CAC7E,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAmB,IAAI,EAC/C,CAACC,EAAMC,CAAO,EAAIF,EAAAA,SAAyBJ,EAAY,EAEvDO,EAAW9F,EAAA,QACf,IACE,IAAI,eAAgB+F,GAAY,CAC1B,GAAAA,EAAQ,CAAC,EAAG,CACd,KAAM,CAAE,EAAAC,EAAG,EAAAC,EAAG,MAAA9B,EAAO,OAAA+B,EAAQ,IAAAhC,EAAK,KAAAD,EAAM,OAAAkC,EAAQ,MAAAC,CAAM,EACpDL,EAAQ,CAAC,EAAE,YACLF,EAAA,CAAE,EAAAG,EAAG,EAAAC,EAAG,MAAA9B,EAAO,OAAA+B,EAAQ,IAAAhC,EAAK,KAAAD,EAAM,OAAAkC,EAAQ,MAAAC,EAAO,CAAA,CAC3D,CACD,EACH,CAAA,CACF,EAEAC,OAAAA,EAAAA,gBAAgB,IAAM,CACpB,GAAKZ,EAEL,OAAAK,EAAS,QAAQL,CAAO,EAEjB,IAAM,CACXK,EAAS,WAAW,CACtB,CAAA,EACC,CAACL,EAASK,CAAQ,CAAC,EAEf,CAACJ,EAAYE,EAAMH,CAAO,CACnC,CC9BO,MAAMa,GAAoB,CAC/Bb,EACAjD,EACA+D,IACG,CACH,MAAMjH,EAASqC,EAAU,EACnB6E,EAA4BzE,EAAmBzC,CAAM,EACvDA,EACA,OAEJY,EAAAA,aAAa,IAAM,CACjB,GAAI,CAACsG,GAA6B,CAACf,EAAgB,OAAAgB,EAAA,MAE7C,MAAAC,EAAqBlE,EAAK,OAAO,QAAQ,KAC7CmE,YAAUnE,EAAK,OAAO,UAAU,EAChCoE,EAAAA,qBAAqBC,EAAc,cAAA,CACrC,EAEMC,EAAuBC,EAAA,oBAC3BtB,CACA,EAAA,KAAKuB,EAAAA,IAAKjB,GAAYA,EAAQ,KAAMzC,GAAMA,EAAE,cAAc,CAAC,CAAC,EAE9D,OAAOoD,EAAmB,KACxBO,EAAAA,aAAa,IAAK,OAAW,CAAE,SAAU,GAAM,EAC/C5E,EAAAA,UAAU,IACDyE,EACJ,KACC3G,EAAA,IAAK+G,GAAc,CAEZA,IACHzB,EAAQ,UAAY,GACtB,CACD,EACD0B,SAAQD,GAAcA,CAAS,EAC/BE,EAAM,MAAA,CAAA,EAEP,KACC/E,EAAAA,UAAU,KACRoD,EAAQ,UAAY,GAEbe,GAAA,YAAAA,EAA2B,QAAQ,SACxChE,EACAiD,EACAc,GAEH,CACH,CACH,CACH,GACC,CAACC,EAA2BhE,EAAM+D,EAAUd,CAAO,CAAC,CACzD,ECrDM4B,GAAcjI,EAAA,KAClB,CAAC,CACC,KAAAoD,EACA,YAAA8E,CAAA,IAII,OACJ,KAAM,CAAC5B,EAAYa,EAAUd,CAAO,EAAID,GAAW,EAC7ClG,EAASqC,EAAU,EAEP2E,GAAAb,EAASjD,EAAM+D,CAAQ,EAEzC,MAAMgB,EAAkBnF,EAAA,WACtB,IAAM9C,GAAA,YAAAA,EAAQ,eAAekD,EAAM,CAAE,KAAM,YAC3C,CAAClD,EAAQkD,CAAI,CACf,EAGE,OAAAG,EAAA,KAAC4B,EAAA,IAAA,CACC,MAAM,OACN,YAAY,MACZ,OAAO,YACP,YAAY,SACZ,aAAa,KACb,iBAAc,GACd,OAAO,UACP,SAAS,WACT,SAAS,SACT,QAAS,IAAM,CACD+C,EAAA,EACZhI,GAAA,MAAAA,EAAQ,WAAW,cAAc,CAAE,UAAWkD,GAChD,EAEA,SAAA,CAAApC,EAAA,IAACmE,EAAA,IAAA,CACC,OAAO,OACP,MAAM,OACN,SAAS,SACT,cAAc,OACd,IAAKmB,CAAA,CACP,EACA/C,EAAA,KAACK,EAAA,KAAA,CACC,SAAS,WACT,OAAQ,EACR,KAAK,IACL,MAAM,IACN,UAAU,SACV,QAAQ,QACR,EAAG,EACH,SAAS,KACV,SAAA,CAAA,WACQH,EAAA0E,GAAA,YAAAA,EAAiB,OAAjB,YAAA1E,EAAuB,oBAAqB,GAAK,CAAA,CAAA,CAAA,CAC1D,CAAA,CACF,CAAA,CAGN,EAEa2E,GAAgBpI,EAAA,KAC3B,CAAC,CACC,KAAAgE,EACA,QAAAC,CAAA,IAII,CACJ,MAAM/D,EAASqC,EAAU,EACnBiD,EAAQxC,EAAAA,WAAW,IAAM9C,GAAA,YAAAA,EAAQ,kBAAkB,OAAQ,CAACA,CAAM,CAAC,EAGvE,OAAAc,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiC,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,SAAAX,EAAA,KAAChC,EAAc,CAAA,OAAO,OACpB,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,SAAO,CAAA,EACtB,QACCD,EACC,CAAA,SAAAlB,EAAA,IAACmE,EAAA,IAAA,CACC,oBAAqB,CACnB,4BACA,2BACF,EACA,QAAQ,OACR,IAAK,CAAC,EAAG,CAAC,EACV,GAAI,EACJ,YAAS,GAER,SAAAK,GAAA,YAAAA,EAAO,IAAKpC,GACXpC,EAAA,IAACiH,GAAA,CAEC,KAAA7E,EACA,YAAa,IAAM,CACjBa,EAAQ,EAAK,CAAA,CACf,EAJKb,EAAK,KAAK,EAMlB,EAAA,CAAA,EAEL,EACCpC,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAmD,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCrC,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAAA,CAGN,+CCrHauG,GAAarI,EAAA,KACxB,CAAC,CACC,KAAAgE,EACA,QAAAC,CAAA,IAMEjD,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiC,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,gBAAC3C,EACC,CAAA,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,MAAI,CAAA,EACnB,EACCoB,EAAA,KAAArB,EAAA,CAAW,UAAU,OAAO,KAAM,EACjC,SAAA,CAAAlB,EAAAA,IAACsH,WAAQ,GAAI,EAAG,GAAG,KAAK,KAAK,KAAK,SAElC,WAAA,CAAA,EACA/E,EAAAA,KAACgF,EAAAA,OAAO,CAAA,GAAI,EACV,SAAA,CAACvH,EAAA,IAAAwH,EAAA,IAAA,CACC,SAACxH,EAAA,IAAAyH,EAAA,gBAAA,CAAgB,CAAA,EACnB,EAAO,IACPzH,EAAAA,IAAC4C,QAAK,SAAsB,wBAAA,CAAA,CAAA,EAC9B,EACAL,EAAAA,KAACgF,EAAAA,OAAO,CAAA,GAAI,EACV,SAAA,CAACvH,EAAA,IAAAwH,EAAA,IAAA,CACC,SAACxH,EAAA,IAAA0H,EAAA,eAAA,CAAe,CAAA,EAClB,EAAO,IACP1H,EAAAA,IAAC4C,QAAK,SAAqB,uBAAA,CAAA,CAAA,EAC7B,EACA5C,EAAAA,IAACsH,EAAAA,QAAQ,CAAA,GAAI,EAAG,GAAI,EAAG,GAAG,KAAK,KAAK,KAAK,SAEzC,OAAA,CAAA,SACC1E,EAAAA,KACE,CAAA,SAAA,CAAA+E,GAAK,aAAWC,EAAA,CACnB,CAAA,CAAA,EACF,EACC5H,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAmD,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCrC,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,EChEa+G,EAAgB,IAEZ,CACf,MAAM3I,EAASqC,EAAU,EAElB,OAAAS,EAAA,WACL,IACG9C,EAEG4I,EAAAA,cAAc,CAAC5I,EAAO,WAAW,OAAQA,EAAO,QAAQ,MAAM,CAAC,EAAE,KAC/D0H,EAAAA,IAAI,CAAC,CAACmB,EAAOC,CAAO,IAAM,OAClB,MAAAC,GAAexF,EAAAuF,EAAQ,WAAR,YAAAvF,EAAkB,WAAW,MAAOL,GACvD,OAAA,OAAAK,EAAAL,EAAK,YAAL,YAAAK,EAAgB,WAAW,YAGtB,MAAA,CACL,GAAGsF,EACH,YAAa,CAACC,EAAQ,qBAAuB,CAACC,CAChD,CACD,CAAA,CACH,EAZA5B,QAaN,CAACnH,CAAM,CACT,CACF,ECzBagJ,GAAmB,IAAM,CACpC,MAAMC,EAAaN,EAAc,EAC3BO,EAAkB,KAAK,QAC1BD,GAAA,YAAAA,EAAY,2BAA4B,GAAK,GAChD,EACME,EAAsBD,EAAkB,EAAIA,EAAkB,EAEhE,OAAAD,GAAA,YAAAA,EAAY,4BAA6B,OAAkB,KAG5DnI,EAAA,IAAAmE,EAAA,IAAA,CAAI,SAAS,WAAW,MAAO,EAAG,OAAQ,EAAG,EAAG,EAAG,MAAO,QACzD,SAAC5B,EAAAA,KAAAK,EAAAA,KAAA,CAAK,SAAS,KAAM,SAAA,CAAAyF,EAAoB,IAAA,CAAA,CAAE,CAC7C,CAAA,CAEJ,ECdaC,GAAU,IAAM,CAC3B,KAAM,CAACC,EAAMC,CAAO,EAAIjD,EAAAA,SAAS,IAAI,IAAM,EAE3C1F,OAAAA,EAAAA,UAAU,IAAM,CACR,MAAA4I,EAAW,YAAY,IAAM,CACzBD,EAAA,IAAI,IAAM,CAAA,EACjB,GAAS,EAEL,MAAA,IAAM,cAAcC,CAAQ,CACrC,EAAG,EAAE,EAEEF,CACT,EAEaG,GAAiBvI,GAAqB,CACjD,MAAMoI,EAAOD,GAAQ,EAGnB,OAAAtI,MAAC4C,EAAAA,MAAK,SAAS,KAAM,GAAGzC,EACrB,SAAAoI,EAAK,mBAAmB,UAAU,SAAU,CAC3C,KAAM,UACN,OAAQ,SACT,CAAA,EACH,CAEJ,ECzBaI,EAAe,IAAM,CAC1B,KAAA,CAAE,gBAAAtJ,CAAgB,EAAIgC,EAAiB,EAI7C,MAAO,CAFWuH,iBAAevJ,CAAe,EAE7BA,EAAgB,SAAUA,CAAe,CAC9D,ECLawJ,GAAe,IAAM,CAC1B,KAAA,CAAC1J,CAAa,EAAIwJ,EAAa,EAGnC,OAAA3I,EAAA,IAACmE,EAAA,IAAA,CACC,SAAS,WACT,KAAM,EACN,OAAQ,EACR,EAAG,EACH,MAAOhF,EAAgB,OAAY,wBAEnC,eAACuJ,GAAc,CAAA,CAAA,CAAA,CACjB,CAEJ,ECdaI,GAA4B,IAAM,CAC7C,MAAM5J,EAASqC,EAAU,EAEzBzB,EAAA,aACE,IACEZ,GAAA,YAAAA,EAAQ,OAAO,UAAW6J,GAAU,CAClC,GAAIA,EAAM,OAAS,SAAWC,mBAAiBD,EAAM,OAAQ,GAAG,EAAG,CAC7D,GAAA,CAACA,EAAM,OAAO,KAAM,OAExB,MAAME,EAAM,IAAI,IAAIF,EAAM,OAAO,IAAI,EAEjC,OAAO,SAAS,OAASE,EAAI,MACd,QACf,iDACF,GAGE,OAAO,KAAKF,EAAM,OAAO,KAAM,SAAS,CAE5C,CACF,GAEJ,CAAC7J,CAAM,CACT,CACF,ECvBagK,GAAgB,IAAM,CACjC,MAAMhK,EAASqC,EAAU,EACnB,CAAE,qBAAAhC,CAAqB,EAAI8B,EAAiB,EAElDvB,EAAA,aACE,IACEZ,GAAA,YAAAA,EAAQ,KAAK,WAAW,KACtB+C,EAAA,UAAWkH,GAAc,CACnB,GAAA,CAACA,EAAkB,OAAAC,EAAA,MAEjB,MAAAC,EAAQ,IAAIvK,UAElB,OAAAS,EAAqB,KAAK,CACxB,IAAK,OACL,MAAO,UACP,SAAU,OACV,MAAA8J,CAAA,CACD,EAEMhD,EAAM,MAAA,KACXiD,EAAAA,SAAS,IAAM,CACbD,EAAM,KAAK,EACXA,EAAM,SAAS,CAChB,CAAA,CACH,CACD,CAAA,GAEL,CAACnK,CAAM,CACT,CACF,ECfMqK,GAA2B,IAAM,CACrC,MAAMrK,EAASqC,EAAU,EACnB,CAAE,qBAAAhC,CAAqB,EAAI8B,EAAiB,EAElDvB,EAAA,aACE,IACEZ,GAAA,YAAAA,EAAQ,SAAS,QAAQ,KACvB0H,EAAAA,IAAI,CAAC,CAAE,UAAA4C,KAAgBA,CAAS,EAChChD,uBAAqB,EACrBiD,EAAAA,KAAK,CAAC,EACN1J,EAAA,IAAKyJ,GAAc,CACjBjK,EAAqB,KAAK,CACxB,IAAK,kBACL,MAAO,oBACP,YAAa,GAAGiK,EAAY,GAAG,IAAA,CAChC,CACF,CAAA,GAEL,CAACtK,EAAQK,CAAoB,CAC/B,CACF,EAEamK,GAAmB,IAAM,CAC9B,KAAA,CAAE,qBAAAnK,CAAqB,EAAI8B,EAAiB,EAEzBkI,GAAA,EACXL,GAAA,EAEdpJ,EAAA,aACE,IACEP,EAAqB,KACnBwH,EAAAA,OAAO4C,EAAAA,SAAS,EAChBC,EAAA,SAAUC,GAAiB,CACnB,MAAAC,EAAWD,EAAa,UAAY,IAEpC7E,EAAQJ,EAAQ,OAAO,CAC3B,MAAOiF,EAAa,MACpB,YAAaA,EAAa,YAC1B,SAAAC,CAAA,CACD,EAEKC,EAAoBxK,EAAqB,KAC7CkK,EAAAA,KAAK,CAAC,EACN1C,SAAQiD,GAAM,CAAC,CAACH,EAAa,MAAOG,GAAA,YAAAA,EAAG,OAAQH,EAAa,GAAG,CACjE,EAEO,OAAAI,EAAA,MACLC,EAAAA,MAAMJ,CAAQ,EACdD,EAAa,OAASxD,EAAA,MACtB0D,CAAA,EACA,KACA/C,QAAM,EACNsC,EAAAA,SAAS,IAAM,CACb1E,EAAQ,QAAQI,CAAK,CACtB,CAAA,CACH,CACD,CAAA,CACH,EACF,CAACzF,CAAoB,CACvB,CACF,ECpEa4K,GAAYjK,EAAM,WAC7B,SAAmBC,EAAOC,EAAK,CACvB,KAAA,CACJ,UAAAgK,EACA,SAAAnL,EACA,UAAAuB,EAAY,GACZ,QAAA6J,EACA,UAAA5J,EACA,GAAGE,CAAA,EACDR,EAGF,OAAAoC,EAAA,KAAC+H,EAAAA,QAAc,KAAd,CACE,GAAG3J,EACJ,YAAa,CAAE,GAAGA,EAAK,YAAa,OAAQ,CAAE,EAE9C,SAAA,CAAAX,EAAA,IAACsK,EAAc,QAAA,QAAd,CAAsB,QAAO,GAAE,SAAArL,EAAS,EACzCe,EAAAA,IAACY,EAAAA,OAAO,CAAA,SAAU,CAACJ,EAAW,UAAWC,EACvC,SAAAT,EAAAA,IAACsK,EAAAA,QAAc,WAAd,CACC,SAAA/H,EAAA,KAAC+H,EAAAA,QAAc,QAAd,CACC,MAAM,OACN,GAAG,IACH,GAAG,IACH,UAAU,KACV,QAAQ,KACR,IAAAlK,EAEC,SAAA,CACCgK,GAAApK,EAAA,IAACsK,UAAc,MAAd,CACC,eAACA,UAAc,SAAd,CAAuB,CAAA,EAC1B,EAEDD,CAAA,CAAA,GAEL,CACF,CAAA,CAAA,CAAA,CACF,CAAA,CAGN,EAEaE,GAAUrK,EAAM,WAG3B,SAAiBC,EAAOC,EAAK,CAC7B,KAAM,CAAE,SAAAnB,EAAU,GAAG0B,CAAA,EAASR,EAC9B,aACGgK,GAAU,CAAA,QAASlL,EAAW,GAAG0B,EAAM,IAAAP,EACtC,SAAAJ,EAAA,IAACoE,EAAA,WAAA,CACC,QAAQ,QACR,aAAW,OACX,KAAK,MACL,aAAa,OAEb,eAACoG,GAAAA,2BAA2B,CAAA,CAAA,CAAA,CAAA,EAEhC,CAEJ,CAAC,ECjEYC,GAAcvK,EAAM,WAG/B,SAAqBC,EAAOC,EAAK,CAE/B,OAAAJ,EAAA,IAAC0K,EAAe,SAAA,MAAf,CAAsB,GAAGvK,EAAO,IAAAC,EAC/B,SAACJ,EAAA,IAAA0K,EAAA,SAAe,MAAf,CAAA,CAAqB,CACxB,CAAA,CAEJ,CAAC,EAMkCC,EAAA,WAGjC,SAAuBxK,EAAOC,EAAK,CACnC,KAAM,CAAE,SAAAnB,EAAU,KAAA2L,EAAM,GAAGjK,CAAS,EAAAR,EACpC,cACGuK,EAAAA,SAAe,MAAf,CAAsB,GAAG/J,EAAM,IAAAP,EAC7B,SAAA,CAAAnB,EACA2L,GAAS5K,EAAAA,IAAAuK,GAAA,CAAS,SAAKK,CAAA,CAAA,CAAA,EAC1B,CAEJ,CAAC,EAEM,MAAMC,GAAeH,EAAe,SAAA,KAC9BI,GAAoBJ,EAAe,SAAA,UC/BnCK,EAAuB,IAAM,CACxC,MAAM5C,EAAaN,EAAc,EAC3BmD,GAAiB7C,GAAA,YAAAA,EAAY,sBAAuB,EAEpD8C,IACH9C,GAAA,YAAAA,EAAY,gCAAiC,GAAK,EAE/C+C,IAAsB/C,GAAA,YAAAA,EAAY,8BAA+B,GAAK,EAEtEgD,GACHhD,GAAA,MAAAA,EAAY,YACTA,GAAA,YAAAA,EAAY,0BACZA,GAAA,YAAAA,EAAY,yBAA2B,EACvCiD,GACHjD,GAAA,MAAAA,EAAY,YACTA,GAAA,YAAAA,EAAY,wBACZA,GAAA,YAAAA,EAAY,uBAAyB,EAErC,CAACkD,EAAgB,EAAGC,EAAiB,CAAC,EAAI,CAC9CH,EACAC,GACA,KAAK,CAACG,EAAGC,IAAMD,EAAIC,CAAC,EAEhBC,GACJtD,GAAA,YAAAA,EAAY,8BACVA,GAAA,YAAAA,EAAY,2BACdA,GAAA,YAAAA,EAAY,wBAAwBA,GAAA,YAAAA,EAAY,mBAE5CuD,EAAwBvD,GAAA,MAAAA,EAAY,YACtCA,GAAA,YAAAA,EAAY,8BACZA,GAAA,YAAAA,EAAY,mBAET,MAAA,CACL,eAAA6C,EACA,eAAAG,EACA,aAAAC,EACA,qBAAAH,EACA,mBAAAC,EACA,wBAAAO,EACA,sBAAAC,EACA,cAAAL,EACA,eAAAC,CACF,CACF,ECpCaK,GAAwB,IAAM,CACzC,MAAMxD,EAAaN,EAAc,EAC3B,CACJ,eAAAmD,EACA,cAAAK,EACA,eAAAC,EACA,sBAAAI,EACA,wBAAAD,GACEV,EAAqB,EACnBa,EAAW,KAAK,QAAOzD,GAAA,YAAAA,EAAY,2BAA4B,GAAK,GAAG,EAEvE0D,EACJC,GAEIA,GAAA,MAAAA,EAAa,WACR,GAAGA,EAAY,KAAK,MAAMD,EAAgBC,EAAY,UAAU,CAAC,IAEnEA,GAAA,YAAAA,EAAa,QAAS,GAGzBC,EAAeF,EAAgB1D,GAAA,YAAAA,EAAY,gBAAgB,EAG/D,OAAA5F,OAACI,EAAAA,OAAM,WAAW,SAAS,IAAK,EAAG,KAAK,OAAO,SAAS,OACtD,SAAA,CAAC3C,EAAA,IAAA6K,GAAA,CAAa,MAAOe,EAAU,KAAK,KAAK,MAAO,IAC9C,SAAArJ,EAAAA,KAACgF,EAAAA,OAAO,CAAA,eAAe,gBACrB,SAAA,CAACvH,EAAAA,IAAAyK,GAAA,CAAY,MAAO,GAAK,CAAA,EACxBzK,EAAA,IAAA8K,GAAA,CAAmB,SAAG,GAAAc,CAAQ,GAAI,CAAA,CAAA,CAAA,CACrC,CACF,CAAA,EACC5L,MAAA4C,EAAAA,KAAA,CAAK,SAAQ,GAAC,SAAS,OAAO,SAAS,KAAK,GAAI,EAC9C,SAAAmJ,EAAe,YAAYA,CAAY,GAAK,IAC/C,EACC,CAACf,GACAzI,EAAAA,KAACgF,EACC,OAAA,CAAA,SAAA,CAAAvH,MAAC4C,EAAAA,MAAK,SAAS,KACZ,WACG,GAAGyI,EAAgB,CAAC,MAAMC,EAAiB,CAAC,OAAOI,CAAqB,GACxE,GAAGL,EAAgB,CAAC,OAAOK,CAAqB,GACtD,EACC,CAAC,EAACvD,GAAA,MAAAA,EAAY,cAEX5F,EAAA,KAAAmB,EAAA,SAAA,CAAA,SAAA,CAAA1D,EAAAA,IAAC4C,QAAK,SAAC,GAAA,CAAA,EACPL,EAAAA,KAACK,EAAAA,KAAK,CAAA,SAAS,KAAK,SAAA,CAAA,MACfuF,GAAA,YAAAA,EAAY,yBAA0B,GAAK,EAAE,GAAA,CAClD,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,EAEJ,CAEJ,EC1Da6D,EAAWhN,EAAA,KACtB,CAAC,CACC,SAAAC,EACA,SAAAgN,EACA,GAAGtL,CAAA,IAGDX,EAAA,IAACkE,EAAA,SAAA,CACC,QAAQ,OACR,cAAc,MACd,MAAM,OACN,SAAS,WACR,GAAI+H,IAAa,SAAW,CAAE,OAAQ,GAAM,CAAE,IAAK,CAAE,EACtD,cACEA,IAAa,SACT,CACE,MAAO,6BACP,QAAS,2BAAA,EAEX,CACE,MAAO,0BACP,QAAS,wBACX,EAEN,kBAAkB,WAClB,QAAQ,WACR,WAAW,SACX,eAAe,SACf,OAAO,KACP,EAAG,EACF,GAAGtL,EAEH,SAAA1B,CAAA,CACH,CAGN,EClCMiN,GAAiBC,SAAOC,EAAQ,EAEzBC,GAAerN,EAAAA,KAAMmB,GAE9BH,EAAA,IAACmE,EAAA,IAAA,CACC,QAAQ,WACR,IAAK,CACH,OAAQ,YACR,kBAAmB,uBACnB,gBAAiB,2BACnB,EAEA,SAAAnE,EAAA,IAACkM,GAAA,CACC,SAAU,GACV,MAAO,CACL,QAAS,CACX,EACA,IAAK,CACH,sCAAuC,CACrC,UAAW,yCACb,EACA,+BAAgC,CAC9B,UAAW,uCACb,EACA,kDAAmD,CACjD,UAAW,yCAAA,CAEf,EACA,OAAQ,CACN,KAAM,CACJ,OAAQ,MACR,IAAK,MACL,UAAW,mBACX,gBAAiB,sBACnB,EACA,MAAO,CACL,OAAQ,MACR,IAAK,MACL,UAAW,mBACX,gBAAiB,oBACnB,EACA,OAAQ,CACN,MAAO,OACP,OAAQ,OACR,IAAK,MACL,YAAa,qBACb,UAAW,aAAa/L,EAAM,QAAU,MAAQ,MAAM,UACtD,gBAAiB,YACjB,UAAW,KAAA,CAEf,EACC,GAAGA,CAAA,CAAA,CACN,CACF,CAEH,ECpDKmM,GAAkB,IAAM,CAC5B,MAAMnE,EAAaN,EAAc,EAC3B0E,EAAgBpE,GAAA,YAAAA,EAAY,cAC5B,CAAE,eAAgBqE,EAAiB,sBAAAd,EAAwB,CAAA,EAC/DX,EAAqB,EACjB0B,EAAcF,EAChB,KAAK,OAAOC,GAAmB,GAAK,CAAC,EACrCA,EACE,CAAC7M,EAAO+M,CAAW,EAAIpN,EAAA,eAAe,IAC1CT,SAAO,CACL,QAAS4N,GAAe,CACzB,CAAA,CACH,EACME,EAAM,EACNC,EAAM,KAAK,IACf,EACAL,EACI,KAAK,OAAOb,EAAwB,GAAK,CAAC,EAC1CA,EAAwB,CAC9B,EAEA7L,OAAAA,EAAAA,UAAU,IAAM,CACF6M,EAAA,OAAOD,GAAe,CAAC,CAAA,EAClC,CAACA,EAAaC,CAAW,CAAC,EAEtB,CACL,MAAA/M,EACA,YAAA+M,EACA,IAAAC,EACA,IAAAC,CACF,CACF,EAEaC,GAAY1M,GAA+C,CACtE,MAAMjB,EAASqC,EAAU,EACnB4G,EAAaN,EAAc,EAC3B,CAAE,SAAAiF,GAAa9K,EAAAA,WAAW,IAAM9C,GAAA,YAAAA,EAAQ,QAAQ,OAAQ,CAACA,CAAM,CAAC,GAAK,CAAC,EACtE6N,GAAUD,GAAA,YAAAA,EAAU,oBAAqB,MACzCP,EAAgBpE,GAAA,YAAAA,EAAY,cAC5B,CAAE,sBAAAuD,EAAwB,EAAG,qBAAAT,CAAA,EACjCF,EAAqB,EACjBiC,EAAO,EACPC,EAA0BhC,EAC1B,CAAE,MAAAtL,EAAO,YAAA+M,EAAa,IAAAC,EAAK,IAAAC,CAAA,EAAQN,GAAgB,EAEnDY,EACJC,EAAA,YACGC,GAAW,CACJ,KAAA,CAACzN,EAAQ,CAAC,EAAI,MAAM,QAAQyN,CAAM,EAAIA,EAAS,CAACA,CAAM,EAE5DV,EAAY,SAAS/M,CAAK,EAEpB,MAAA0N,EAAYd,EACd,KAAK,MAAM5M,CAAK,EAAI,EACpB,KAAK,MAAMA,CAAK,EAEfsN,EAMH/N,GAAA,MAAAA,EAAQ,WAAW,oBAAoB,CACrC,UAAAmO,EACA,YAAanO,EAAO,WAAW,MAAM,qBAAuB,EAC5D,UAAW,EAAA,GARbA,GAAA,MAAAA,EAAQ,WAAW,sBAAsB,CACvC,kBAAmBmO,EACnB,UAAW,EAAA,EASjB,EACA,CAACnO,EAAQqN,EAAeG,EAAaO,CAAuB,CAC9D,EAiCF,OAxBAnN,EAAA,aACE,IACEZ,GAAA,YAAAA,EAAQ,WAAW,aAAa,CAC9B,SAAU,IACV,QAASwN,EAAY,OAAA,GAEzB,CAACxN,EAAQwN,CAAW,CACtB,EAWEhB,IAA0B,GACzBa,GAAiBb,IAA0B,EAKzB1L,MAACmE,EAAAA,IAAI,CAAA,MAAOhE,EAAM,MAAO,EAG5CH,EAAA,IAACqM,GAAA,CACC,MAAO,CAAC1M,CAAK,EACb,IAAAiN,EACA,IAAAD,EACA,QAAAI,EACA,KAAAC,EACA,SAAAE,EACC,GAAG/M,CAAA,CACN,CAiBJ,EClHamN,GAAYtO,EAAA,KACvB,CAAC,CACC,KAAAgE,EACA,YAAAuK,CAAA,IAMI,CACJ,MAAMrO,EAASqC,EAAU,EACnBiM,EAAaxL,EAAAA,WAAW,IAAM9C,GAAA,YAAAA,EAAQ,WAAW,OAAQ,CAACA,CAAM,CAAC,EACjEuO,EAAWzL,EAAAA,WAAW,IAAM9C,GAAA,YAAAA,EAAQ,SAAS,QAAS,CAACA,CAAM,CAAC,EAC9DwO,GACJD,GAAA,YAAAA,EAAU,6BAA8B,WACpC,CAACE,EAAaC,CAAc,EAAIrI,EAAAA,SAAS,EAAI,EAGjD,OAAAhD,EAAA,KAACyJ,EAAA,CACC,QAAShJ,EACT,SAAS,SACT,QAAQ,OACR,cAAc,SACd,SAAS,OACT,GAAI,EAEJ,SAAA,CAAAT,OAACgF,EAAAA,QAAO,KAAM,EAAG,WAAW,SAAS,eAAe,SAClD,SAAA,CAAAvH,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,WAAY,EACZ,QAAS,IAAMlF,GAAA,YAAAA,EAAQ,WAAW,yBAClC,SACE,EAACsO,GAAA,MAAAA,EAAY,qBAAsB,EAACA,GAAA,MAAAA,EAAY,mBAGjD,SAAsBE,EAAA1N,MAAC6N,EAAAA,gBAAgB,CAAA,CAAA,QAAMC,EAAAA,kBAAkB,CAAA,CAAA,CAAA,CAClE,EACAvL,EAAA,KAACI,EAAA,MAAA,CACC,KAAM,EACN,KAAM,IACN,IAAK,EACL,WAAW,SACX,SAAS,OACT,GAAI,EAEJ,SAAA,CAAA3C,EAAA,IAAC2L,GAAsB,EAAA,EACvB3L,EAAA,IAAC6M,GAAA,CACC,MAAO,CACL,MAAO,OACP,SAAU,QACV,OAAQ,MAAA,CACV,CAAA,CACF,CAAA,CACF,EACA7M,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,SACE,EAACoJ,GAAA,MAAAA,EAAY,sBACb,EAACA,GAAA,MAAAA,EAAY,sBAEf,QAAS,IAAM,CACbtO,GAAA,MAAAA,EAAQ,WAAW,4BACrB,EAEC,SACCwO,EAAA1N,MAAC+N,EAAAA,kBAAkB,CAAA,CAAA,QAElBC,EAAAA,mBAAmB,CAAA,CAAA,CAAA,CAAA,CAExB,EACF,QACCzG,EAAAA,OAAO,CAAA,UAAU,UAAU,WAAW,SAAS,eAAe,SAC7D,SAAAhF,EAAA,KAAC0L,EAAAA,YAAY,KAAZ,CACC,KAAMN,EACN,KAAM,EACN,aAAc,CAAC,CAAE,KAAA3K,KAAW,CAC1B4K,EAAe5K,CAAI,CACrB,EAEA,SAAA,CAAAhD,EAAA,IAACiO,EAAAA,YAAY,QAAZ,CACC,SAAS,IACT,MAAM,OACN,QAAQ,OACR,eAAe,SAEf,SAAAjO,EAAA,IAACkO,EAAA,cAAA,CACC,MAAO,CACL,UAAWP,EAAc,eAAiB,gBAAA,CAC5C,CAAA,CACF,CACF,SACCM,EAAAA,YAAY,QAAZ,CAAoB,QAAQ,OAAO,eAAe,SACjD,SAAA,CAAAjO,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAMmJ,EAAY,MAAM,EAEjC,eAACY,EAAAA,aAAa,CAAA,CAAA,CAAA,CAChB,EACAnO,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,oBACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAMmJ,EAAY,KAAK,EAEhC,eAACa,EAAAA,kBAAkB,CAAA,CAAA,CAAA,CACrB,EACC5M,EAAkBtC,CAAM,GACvBc,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,SACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAMmJ,EAAY,QAAQ,EAEnC,eAACc,EAAAA,SAAS,CAAA,CAAA,CAAA,CACZ,EAED5M,EAAqBvC,CAAM,GAC1Bc,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,SACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAMmJ,EAAY,WAAW,EAEtC,eAACe,EAAAA,YAAY,CAAA,CAAA,CAAA,CACf,EAED5M,EAAuBxC,CAAM,GAC5Bc,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,SACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAMmJ,EAAY,aAAa,EAExC,eAAC7K,EAAAA,cAAc,CAAA,CAAA,CAAA,CACjB,EAEF1C,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,aACX,KAAK,KACL,SACElF,GAAA,YAAAA,EAAQ,SAAS,OAAO,gBAAiB,aACrC,QACA,QAEN,QAAS,IAAM,CACbA,GAAA,MAAAA,EAAQ,SAAS,OAAO,CACtB,cACEA,GAAA,YAAAA,EAAQ,SAAS,OAAO,gBAAiB,SACrC,aACA,QAAA,EAEV,EAEA,eAACqP,EAAAA,oBAAoB,CAAA,CAAA,CAAA,CACvB,EACC5M,EAAmBzC,CAAM,GACxBc,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,UACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAMmJ,EAAY,SAAS,EAEpC,eAACiB,GAAAA,eAAe,CAAA,CAAA,CAAA,CAAA,CAClB,CAEJ,CAAA,CAAA,CAAA,CAAA,CAEJ,CAAA,CAAA,CAAA,CACF,CAAA,CAGN,ECrMaC,GAAgB,IAAM,CACjC,KAAM,CAACC,EAAcC,CAAe,EAAIpJ,EAAAA,SAAS,EAAK,EAEhDqJ,EAA0BzB,EAAAA,YAAY,IACtC,SAAS,kBACJ,SACJ,iBACA,MAAM,QAAQ,KAAK,EACnB,KAAK,IAAM,CACVwB,EAAgB,EAAK,CAAA,CACtB,EAGE,SAAS,gBACb,kBAAkB,CAAE,aAAc,OAAQ,EAC1C,MAAM,QAAQ,KAAK,EACnB,KAAK,IAAM,CACVA,EAAgB,EAAI,CAAA,CACrB,EACF,EAAE,EAEL9O,OAAAA,EAAAA,UAAU,IAAM,CACd,SAASgP,GAA0B,CACjBF,EAAA,CAAC,CAAC,SAAS,iBAAiB,CAAA,CAGrC,gBAAA,iBAAiB,mBAAoBE,CAAuB,EAE9D,IAAM,CACF,SAAA,oBAAoB,mBAAoBA,CAAuB,CAC1E,CACF,EAAG,EAAE,EAEE,CACL,aAAAH,EACA,wBAAAE,CACF,CACF,EClCaE,GAAS9P,EAAA,KACpB,CAAC,CACC,KAAAgE,EACA,YAAAuK,CAAA,IAII,CACJ,MAAMrO,EAASqC,EAAU,EACnBuL,EAAW9K,EAAAA,WAAW,IAAM9C,GAAA,YAAAA,EAAQ,QAAQ,UAAW,CAACA,CAAM,CAAC,EAC/D,CAAE,aAAAwP,EAAc,wBAAAE,CAAwB,EAAIH,GAAc,EAG9D,OAAAlM,EAAA,KAACyJ,EAAA,CACC,QAAShJ,EACT,SAAS,MACT,OAAO,OACP,eAAe,gBAEf,SAAA,CAAAhD,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,WAAY,EACZ,QAAS,IAAMmJ,EAAY,MAAM,EAEjC,eAACwB,EAAAA,eAAe,CAAA,CAAA,CAAA,CAClB,EACA/O,EAAA,IAAC2C,EAAA,MAAA,CACC,KAAM,EACN,KAAM,IACN,IAAK,EACL,WAAW,SACX,SAAS,OACT,GAAI,EAEJ,eAACC,OAAK,CAAA,SAAQ,GAAC,SAAS,OACrB,0BAAU,KACb,CAAA,CAAA,CACF,SACC2E,EAAAA,OACC,CAAA,SAAA,CAAAvH,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,QAAS,IAAMmJ,EAAY,MAAM,EAEjC,eAACyB,EAAAA,SAAS,CAAA,CAAA,CAAA,CACZ,EACAhP,EAAA,IAACoE,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,QAASwK,EAER,SAAeF,EAAA1O,MAACiP,EAAAA,iBAAiB,CAAA,CAAA,QAAMC,EAAAA,aAAa,CAAA,CAAA,CAAA,CAAA,CACvD,CACF,CAAA,CAAA,CAAA,CACF,CAAA,CAGN,ECnEaC,GAAYnQ,EAAA,KACvB,CAAC,CACC,YAAAuO,CAAA,IAaI,CACE,KAAA,CAACpO,CAAa,EAAIwJ,EAAa,EAErC,OAEIpG,EAAA,KAAAmB,WAAA,CAAA,SAAA,CAAC1D,EAAAA,IAAA8O,GAAA,CAAO,KAAM3P,EAAe,YAAAoO,CAA0B,CAAA,EACtDvN,EAAAA,IAAAsN,GAAA,CAAU,KAAMnO,EAAe,YAAAoO,CAA0B,CAAA,CAAA,EAC5D,CAAA,CAGN,EC3Ba6B,GAAiBpQ,EAAA,KAC5B,CAAC,CACC,YAAAqQ,EAAc,GACd,YAAAC,EAAc,EACd,KAAAC,EACA,IAAAC,EAAM,IACN,QAAAC,EACA,kBAAAC,CAAA,IASI,CAEJ,MAAMC,EAASN,EAAY,UACzB,KAAK,IAAIC,EAAc,GAAiB,CAAC,EACzC,KAAK,IAAIA,EAAa,CAAC,CACzB,EACMM,EAAQP,EAAY,UACxB,KAAK,IAAIC,EAAcC,EAAK,OAAQF,EAAY,OAAS,CAAC,EAC1D,KAAK,IACHC,EAAcC,EAAK,OAAS,GAC5BF,EAAY,OAAS,CAAA,CAEzB,EAGE,OAAA9M,EAAA,KAACC,EAAA,KAAA,CACC,KAAMgN,EACN,MAAO,CAAE,OAAQ,EAAG,SAAU,QAAS,EACvC,QAAUtM,GAAM,CACdA,EAAE,eAAe,EAEjBuM,EAAQD,CAAG,CACb,EACA,QAAQ,OACR,cAAc,SACd,WAAW,aACX,IAAK,EAEL,SAAA,CAACjN,EAAAA,KAAAK,EAAA,KAAA,CAAK,UAAW,EAAG,GAAG,OAAO,MAAO,CAAE,QAAS,OAAA,EAAW,SAAA,CAAA,IACvD+M,EACF3P,EAAAA,IAAC,KAAG,SAAKuP,CAAA,CAAA,EACRK,EAAM,GAAA,EACT,QACChN,EAAAA,KAAK,CAAA,SAAS,KAAK,MAAM,WAAW,MAAO,CAAE,eAAgB,MAAA,EAC3D,SAAc,cAAA8M,IAAsB,OAAYA,EAAoB,EAAI,sBAAsB,EACjG,CAAA,CAAA,CAAA,CACF,CAAA,CAGN,EClDaG,GAAsB7Q,EAAA,KACjC,CAAC,CACC,WAAA6C,CAAA,IAGI,CACJ,KAAM,CAAC0N,EAAMO,CAAO,EAAIvK,EAAAA,SAAS,EAAE,EAC7BrG,EAASqC,EAAU,EACnBwO,EAAmBvO,EAAkBtC,CAAM,EAAIA,EAAS,OAExD8Q,EAAiB9M,GAA2C,CACxD4M,EAAA5M,EAAE,OAAO,KAAK,CACxB,EAEMuM,EAAUtC,EAAA,YACbqC,GAAgB,CACJ3N,EAAA,EACH3C,GAAA,MAAAA,EAAA,WAAW,QAAQsQ,EAC7B,EACA,CAACtQ,EAAQ2C,CAAU,CACrB,EAEMoO,EAASjO,EAAA,WACb,IACE+N,GAAA,YAAAA,EAAkB,OAAO,OAAOR,GAAM,KACpC3I,MAAKsJ,IAAU,CAAE,KAAM,MAAgB,KAAAA,GAAO,EAC9C3J,EAAAA,UAAU,CAAE,KAAM,OAAkB,CAAA,GAExC,CAACrH,EAAQqQ,CAAI,CACf,EACMY,GAAYF,GAAA,YAAAA,EAAQ,QAAS,QAC7BG,GAAUH,GAAA,YAAAA,EAAQ,QAAS,MAAQA,EAAO,KAAO,CAAC,EAClDI,EAAsBrO,EAAA,WAC1B,IAAM9C,GAAA,YAAAA,EAAQ,eAAekR,EAAQ,MAAM,EAAG,GAAG,GACjD,CAACA,CAAO,CACV,EAEA,OACG7N,EAAAA,KAAAI,EAAAA,MAAA,CAAM,KAAM,EAAG,OAAO,OACrB,SAAA,CAAC3C,EAAAA,IAAAmE,EAAAA,IAAA,CAAI,GAAI,EACP,SAAAnE,EAAA,IAACsQ,EAAA,MAAA,CACC,YAAY,oBACZ,MAAOf,EACP,SAAUS,EACV,aAAc,CAAA,CAAA,EAElB,EACAzN,EAAA,KAAC4B,EAAA,IAAA,CACC,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,KAAM,EACN,MAAO,CAAE,SAAU,SAAU,UAAW,MAAO,EAE9C,SAAA,CAAagM,GAAAnQ,EAAAA,IAAC4C,EAAAA,MAAK,SAAa,eAAA,CAAA,EAChC,CAACuN,GAAaC,EAAQ,SAAW,GAAKpQ,EAAA,IAAC,KAAE,SAAoB,uBAAA,EAC7D,CAACmQ,GAAaC,EAAQ,QAAU,UAC9BzN,EAAAA,MACC,CAAA,SAAA,CAAAJ,EAAA,KAAC+E,EAAQ,QAAA,CAAA,GAAG,KAAK,KAAK,KACnB,SAAA,CAAQ8I,EAAA,OAAO,YAAA,EAClB,EACApQ,MAAC2C,EAAAA,OAAM,IAAK,EACT,0BAAqB,IAAI,CAAC4N,EAAQC,IAAM,mBAErC,OAAAxQ,EAAA,IAACoP,GAAA,CAEC,cACEtM,GAAAD,GAAAJ,EAAA8N,EAAO,OAAP,YAAA9N,EAAa,QAAb,YAAAI,EAAoB,eAAe,gBAAnC,YAAAC,EACI,cAAe,GAErB,WAAW4B,EAAA6L,EAAO,OAAP,YAAA7L,EAAa,cACxB,cAAa+L,GAAAhM,EAAA8L,EAAO,OAAP,YAAA9L,EAAa,QAAb,YAAAgM,EAAoB,cAAe,EAChD,KAAAlB,EACA,IAAKgB,EAAO,KAAK,IACjB,QAAAd,EACA,mBAAmBiB,EAAAH,EAAO,OAAP,YAAAG,EAAa,iBAAA,EAV3BF,CAWP,CAAA,EAGN,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAAA,CAEJ,EACF,CAAA,CAGN,EChFaG,GAAe3R,EAAA,KAC1B,CAAC,CACC,KAAAgE,EACA,QAAAC,EACA,WAAApB,CAAA,IAOE7B,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiC,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,SAAAX,EAAA,KAAChC,EAAc,CAAA,OAAO,OACpB,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,QAAM,CAAA,EACrB,QACCD,EAAW,CAAA,KAAM,EAChB,SAAClB,EAAA,IAAA6P,GAAA,CAAoB,WAAAhO,CAAwB,CAAA,EAC/C,EACC7B,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAmD,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCrC,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,ECzCa8P,GAA+B5R,EAAA,KAC1C,CAAC,CACC,WAAA6C,CAAA,IAGI,CACJ,MAAM3C,EAASqC,EAAU,EACnB,CAAE,SAAAuL,EAAU,uBAAA+D,CAAuB,EACvC7O,aAAW,IAAM9C,GAAA,YAAAA,EAAQ,QAAQ,OAAQ,CAACA,CAAM,CAAC,GAAK,CAAC,EACnD,CAAE,IAAA4R,GAAQhE,GAAY,CAAC,EACvB3E,EAAaN,EAAc,EACrBiJ,GAAA,MAAAA,EAAK,IACjB,KAAM,CAAE,oBAAAC,EAAqB,0BAAAC,CAA0B,EAAI7I,GAAc,CAAC,EACpE8I,GACHJ,IAA2B,aACxBG,EACAD,IAAwB,EAE9B,QAAQ,IAAI,CAAE,uBAAAF,EAAwB,mCAAAI,CAAA,CAAoC,EAE1E,IAAIC,EAAoB/I,GAAA,YAAAA,EAAY,iBAEpC,KAAO+I,GAAA,MAAAA,EAAmB,YACxBA,EAAoBA,GAAA,YAAAA,EAAmB,WAGnC,MAAAC,EAAkB,CACtBC,EACA/O,EACAgP,IAEC9O,EAAAA,KAAArC,EAAM,SAAN,CACC,SAAA,CAAAF,EAAA,IAACsC,EAAAA,KAAK,KAAL,CACC,GAAI,GAAK+O,EAAM,GACf,MAAO,CACL,QAAS,OACT,WAAY,QACd,EAEA,SAAA9O,EAAA,KAACC,EAAA,KAAA,CACC,QAAS,IAAM,CACFX,EAAA,EAEH3C,GAAA,MAAAA,EAAA,WAAW,QAAQkS,EAAQ,KACrC,EACA,KAAK,IAEJ,SAAA,EAAmBF,GAAA,YAAAA,EAAA,QAASE,EAAQ,MAClCpR,EAAA,IAAAsC,EAAA,KAAK,UAAL,CAAe,QAAO,GACrB,SAACtC,EAAAA,IAAAsR,EAAAA,cAAA,CAAA,CAAc,CACjB,CAAA,GAEDJ,GAAA,YAAAA,EAAmB,QAASE,EAAQ,YAClC9O,EAAAA,KAAK,UAAL,CAAe,QAAO,GAAC,WAAW,SACjC,SAAAtC,EAAA,IAACsR,iBAAc,CAAA,EACjB,EAEF/O,EAAAA,KAACI,EAAAA,MAAM,CAAA,IAAK,EACV,SAAA,CAAA3C,MAAC4C,EAAAA,MAAK,SAAS,KAAM,SAAQwO,EAAA,OAASA,EAAQ,KAAK,GAClDF,GAAA,YAAAA,EAAmB,QAASE,EAAQ,MACnCpR,EAAA,IAAC4C,EAAA,KAAA,CACC,UAAU,SACV,WAAW,OACX,SAAS,KACT,SAAA,qBACAqO,EAAqC,CACvC,EAAA,CAAA,CAAG,CAEP,CAAA,CAAA,CAAA,CAAA,CACF,CACF,EACCG,EAAQ,SAAS,OAAS,GACxBpR,EAAA,IAAAsC,EAAA,KAAK,KAAL,CAAU,GAAG,MAAM,IAAK,EACtB,WAAQ,SAAS,IAAI,CAAC8O,EAAS/O,IAC9B8O,EAAgBC,EAAS/O,EAAOgP,EAAM,CAAC,CAAA,CAE3C,CAAA,CAAA,CAAA,EA7CiBhP,CA+CrB,EAIA,OAAArC,MAACsC,EAAAA,KAAK,KAAL,CAAU,IAAK,EAAG,UAAU,OAAO,GAAI,EAAG,KAAM,EAC9C,SAAKwO,GAAA,YAAAA,EAAA,IAAI,IAAI,CAACM,EAAS/O,IAAU8O,EAAgBC,EAAS/O,EAAO,CAAC,EACrE,CAAA,CAAA,CAGN,EClFakP,GAAwBvS,EAAA,KACnC,CAAC,CACC,KAAAgE,EACA,QAAAC,EACA,WAAApB,CAAA,IAOE7B,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiC,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,gBAAC3C,EACC,CAAA,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,mBAAiB,CAAA,EAChC,EACAnB,EAAAA,IAACkB,GAAW,UAAU,OAAO,KAAM,EACjC,SAAAlB,EAAA,IAAC4Q,GAA6B,CAAA,WAAA/O,CAAA,CAAwB,CACxD,CAAA,EACC7B,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAmD,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCrC,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,ECjCa0Q,GAAc,CAAC,CAC1B,mBAAAC,EAAqB,GACrB,uBAAAC,EAAyB,GACzB,YAAAnE,CACF,IAcM,CACJ,KAAM,CAACoE,EAAuBC,CAAwB,EAAIrM,EAAAA,SAAS,EAAK,EAClE,CAACsM,EAAYC,CAAa,EAAIvM,EAAAA,SAAS,EAAK,EAC5C,CAACwM,EAAcC,CAAe,EAAIzM,EAAAA,SAAS,EAAK,EAChD,CAAC0M,EAAmBC,CAAoB,EAAI3M,EAAAA,SAAS,EAAK,EAC1D,CAAC4M,EAAiBC,CAAkB,EAAI7M,EAAAA,SAAS,EAAK,EACtD,CAAC8M,EAAeC,CAAgB,EAAI/M,EAAAA,SAAS,EAAK,EAClD,CAACpG,EAAeoT,CAAgB,EAAI5J,EAAa,EAEjD9G,EAAasL,EAAAA,YAAY,IAAM,CACnCyE,EAAyB,EAAK,EAC9BE,EAAc,EAAK,EACnBE,EAAgB,EAAK,EACrBE,EAAqB,EAAK,EAC1BE,EAAmB,EAAK,EACxBG,EAAiB,EAAK,EACtBD,EAAiB,EAAK,CAAA,EACrB,CAACC,CAAgB,CAAC,EAEfC,EAAgDrF,EAAA,YACnD/K,GAAS,CACJA,IAAS,cACX8P,EAAqB,EAAI,EAChB9P,IAAS,SAClB4P,EAAgB,EAAI,EACX5P,IAAS,OAClB0P,EAAc,EAAI,EACT1P,IAAS,MAClBwP,EAAyB,EAAI,EACpBxP,IAAS,YAClBgQ,EAAmB,EAAI,EACdhQ,IAAS,WAClBkQ,EAAiB,EAAI,EAEvB/E,GAAA,MAAAA,EAAcnL,EAChB,EACA,CAACmL,CAAW,CACd,EAE0B,OAAAzE,GAAA,EACTY,GAAA,EAIZnH,EAAA,KAAAmB,WAAA,CAAA,SAAA,CACCgO,GAAA1R,EAAA,IAACkE,EAAA,SAAA,CACC,QAAS,CAAC/E,EACV,cAAe,CAAE,MAAO,UAAW,QAAS,UAAW,EACvD,kBAAkB,WAElB,eAAC+I,GAAiB,CAAA,CAAA,CAAA,CACpB,EAEDlI,EAAA,IAAAoH,GAAA,CAAc,KAAMiL,EAAe,QAASC,EAAkB,EAC/DtS,EAAAA,IAACmP,GAAU,CAAA,YAAaqD,CAAc,CAAA,QACrCpP,GAAU,EAAA,EACVpD,EAAA,IAAAqH,GAAA,CAAW,KAAMwK,EAAY,QAASC,EAAe,EACtD9R,EAAA,IAACuR,GAAA,CACC,KAAMI,EACN,QAASC,EACT,WAAA/P,CAAA,CACF,EACA7B,EAAA,IAAC2Q,GAAA,CACC,KAAMoB,EACN,QAASC,EACT,WAAAnQ,CAAA,CACF,EACA7B,EAAA,IAAC+C,GAAA,CACC,KAAMkP,EACN,QAASC,EACT,WAAArQ,CAAA,CACF,EACA7B,EAAA,IAAC2E,GAAA,CACC,KAAMwN,EACN,QAASC,EACT,WAAAvQ,CAAA,CACF,EACA7B,EAAA,IAACkE,EAAA,SAAA,CACC,QAASuN,GAAsBtS,EAC/B,cAAe,CAAE,MAAO,UAAW,QAAS,UAAW,EACvD,kBAAkB,OAClB,SAAS,SAET,eAAC0J,GAAa,CAAA,CAAA,CAAA,CAChB,QACC/D,GAAQ,CAAA,CAAA,CAAA,EACX,CAEJ"}
|