@prose-reader/react-reader 1.245.0 → 1.246.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/constants.ts","../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/useReaderContext.ts","../src/context/useReader.ts","../src/annotations/useAnnotation.ts","../src/annotations/AnnotationListItem.tsx","../src/annotations/useAnnotations.ts","../src/annotations/useHighlights.ts","../src/annotations/AnnotationsList.tsx","../src/annotations/bookmarks/useBookmarks.ts","../src/annotations/bookmarks/BookmarksList.tsx","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/common/Spine.tsx","../src/common/useSpineItem.ts","../src/common/useSpineItemReady.ts","../src/annotations/bookmarks/BookmarkPageMarker.tsx","../src/annotations/bookmarks/BookmarkPageMarkers.tsx","../src/annotations/useReaderWithAnnotations.ts","../src/annotations/bookmarks/useBookmarkOnCornerTap.ts","../src/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/components/ui/field.tsx","../src/components/ui/radio.tsx","../src/components/ui/slider.tsx","../src/refit/RefitDialog.tsx","../src/search/SearchListItem.tsx","../src/search/useSearch.ts","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/toc/TableOfContentsDialog.tsx","../src/ReactReader.tsx"],"sourcesContent":["export const BOOKMARK_AREA_DATA_ATTRIBUTE = `data-bookmark-area`\n","import type { Reader } from \"@prose-reader/core\"\nimport type { EnhancerAPI as GesturesEnhancerAPI } from \"@prose-reader/enhancer-gestures\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\nimport { Subject } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\n\ntype ContextType = {\n reader: (Reader & GesturesEnhancerAPI) | undefined\n quickMenuSignal: Signal<boolean, undefined>\n notificationsSubject: Subject<ReaderNotification>\n refitMenuSignal: Signal<boolean, undefined>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n notificationsSubject: new Subject<ReaderNotification>(),\n refitMenuSignal: signal({ default: false }),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport type { EnhancerAPI as GestureEnhancerAPI } from \"@prose-reader/enhancer-gestures\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport { signal, useConstant, useLiveRef, useSubscribe } from \"reactjrx\"\nimport { Subject, tap } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n quickMenuOpen,\n onQuickMenuOpenChange,\n }: {\n children?: React.ReactNode\n reader: (Reader & GestureEnhancerAPI) | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const quickMenuSignal = useConstant(() =>\n signal({\n default: quickMenuOpen,\n }),\n )\n const notificationsSubject = useConstant(\n () => new Subject<ReaderNotification>(),\n )\n const refitMenuSignal = useConstant(() =>\n signal({\n default: false,\n }),\n )\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n notificationsSubject,\n refitMenuSignal,\n }),\n [quickMenuSignal, reader, notificationsSubject, refitMenuSignal],\n )\n\n useEffect(() => {\n quickMenuSignal.next(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () => quickMenuSignal.pipe(tap(onQuickMenuOpenChangeLiveRef.current)),\n [quickMenuSignal, onQuickMenuOpenChangeLiveRef],\n )\n\n return (\n <ReaderContext.Provider value={value}>{children}</ReaderContext.Provider>\n )\n },\n)\n","import type { ButtonProps } from \"@chakra-ui/react\"\nimport { IconButton as ChakraIconButton } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { LuX } from \"react-icons/lu\"\n\nexport type CloseButtonProps = ButtonProps\n\nexport const CloseButton = React.forwardRef<\n HTMLButtonElement,\n CloseButtonProps\n>(function CloseButton(props, ref) {\n return (\n <ChakraIconButton variant=\"ghost\" aria-label=\"Close\" ref={ref} {...props}>\n {props.children ?? <LuX />}\n </ChakraIconButton>\n )\n})\n","import { Dialog as ChakraDialog, Portal } from \"@chakra-ui/react\"\nimport { CloseButton } from \"./close-button\"\nimport * as React from \"react\"\n\ninterface DialogContentProps extends ChakraDialog.ContentProps {\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n backdrop?: boolean\n}\n\nexport const DialogContent = React.forwardRef<\n HTMLDivElement,\n DialogContentProps\n>(function DialogContent(props, ref) {\n const {\n children,\n portalled = true,\n portalRef,\n backdrop = true,\n ...rest\n } = props\n\n return (\n <Portal disabled={!portalled} container={portalRef}>\n {backdrop && <ChakraDialog.Backdrop />}\n <ChakraDialog.Positioner>\n <ChakraDialog.Content ref={ref} {...rest} asChild={false}>\n {children}\n </ChakraDialog.Content>\n </ChakraDialog.Positioner>\n </Portal>\n )\n})\n\nexport const DialogCloseTrigger = React.forwardRef<\n HTMLButtonElement,\n ChakraDialog.CloseTriggerProps\n>(function DialogCloseTrigger(props, ref) {\n return (\n <ChakraDialog.CloseTrigger\n position=\"absolute\"\n top=\"2\"\n insetEnd=\"2\"\n {...props}\n asChild\n >\n <CloseButton size=\"sm\" ref={ref}>\n {props.children}\n </CloseButton>\n </ChakraDialog.CloseTrigger>\n )\n})\n\nexport const DialogRoot = ChakraDialog.Root\nexport const DialogFooter = ChakraDialog.Footer\nexport const DialogHeader = ChakraDialog.Header\nexport const DialogBody = ChakraDialog.Body\nexport const DialogBackdrop = ChakraDialog.Backdrop\nexport const DialogTitle = ChakraDialog.Title\nexport const DialogDescription = ChakraDialog.Description\nexport const DialogTrigger = ChakraDialog.Trigger\nexport const DialogActionTrigger = ChakraDialog.ActionTrigger\n","import { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReaderContext = () => {\n return useContext(ReaderContext)\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { GalleryEnhancerAPI } from \"@prose-reader/enhancer-gallery\"\nimport type { RefitEnhancerAPI } from \"@prose-reader/enhancer-refit\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useReaderContext } from \"./useReaderContext\"\n\nexport const useReader = () => {\n const { reader } = useReaderContext()\n\n return reader\n}\n\nexport const hasSearchEnhancer = (\n reader?: Reader,\n): reader is Reader & SearchEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_SEARCH\" in reader\n}\n\nexport const hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n\nexport const hasGalleryEnhancer = (\n reader?: Reader,\n): reader is Reader & GalleryEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_GALLERY\" in reader\n}\n\nexport const hasRefitEnhancer = (\n reader?: Reader,\n): reader is Reader & RefitEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_REFIT\" in reader\n}\n","import { isDefined, useObserve } from \"reactjrx\"\nimport { filter, map, switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useAnnotation = (id: string) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.annotations$.pipe(\n map((items) => items.find((item) => item.id === id)),\n filter(isDefined),\n switchMap((item) => readerWithAnnotations.locateResource(item)),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useReader } from \"../context/useReader\"\nimport { useAnnotation } from \"./useAnnotation\"\n\nexport const AnnotationListItem = ({\n id,\n onNavigate,\n allowLeftIcon = true,\n}: {\n id: string\n onNavigate: () => void\n allowLeftIcon?: boolean\n}) => {\n const reader = useReader()\n const { data: annotation } = useAnnotation(id)\n const textContent =\n annotation?.meta.range?.toString() || annotation?.meta.node?.textContent\n\n return (\n <List.Item>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(annotation?.meta.cfi ?? \"\")\n }}\n >\n {annotation?.resource?.notes ? (\n <List.Indicator asChild>\n <LuNotebookPen />\n </List.Indicator>\n ) : allowLeftIcon ? (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n ) : null}\n <Stack gap={0}>\n {textContent ? (\n <Text lineClamp={2} fontSize=\"md\">\n {textContent}\n </Text>\n ) : (\n <Text lineClamp={2} fontSize=\"md\" fontStyle=\"italic\">\n Page {(annotation?.meta.absolutePageIndex ?? 0) + 1}\n </Text>\n )}\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Book page: ${\n annotation?.meta?.absolutePageIndex !== undefined\n ? annotation.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n}\n","import { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useAnnotations = () => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.annotations$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.locateResource(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { useAnnotations } from \"./useAnnotations\"\n\nexport const useHighlights = () => {\n const { data: annotations } = useAnnotations()\n\n return {\n data: annotations?.filter((annotation) => annotation.meta.isCfiRange),\n }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"./AnnotationListItem\"\nimport { useHighlights } from \"./useHighlights\"\n\nexport const AnnotationsList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useHighlights()\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {annotations?.map((item) => (\n <AnnotationListItem\n key={item.resource.id}\n id={item.resource.id}\n onNavigate={onNavigate}\n />\n ))}\n </List.Root>\n )\n}\n","import { useAnnotations } from \"../useAnnotations\"\n\nexport const useBookmarks = () => {\n const { data: annotations } = useAnnotations()\n\n return {\n data: annotations?.filter(\n (annotation) => !annotation.meta.isCfiRange && !annotation.resource.notes,\n ),\n }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"../AnnotationListItem\"\nimport { useBookmarks } from \"./useBookmarks\"\n\nexport const BookmarksList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useBookmarks()\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {annotations?.map((item) => (\n <AnnotationListItem\n key={item.resource.id}\n id={item.resource.id}\n onNavigate={onNavigate}\n allowLeftIcon={false}\n />\n ))}\n </List.Root>\n )\n}\n","import { Tabs } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { LuBookmark, LuNotebookPen } from \"react-icons/lu\"\nimport { AnnotationsList } from \"./AnnotationsList\"\nimport { BookmarksList } from \"./bookmarks/BookmarksList\"\n\nexport const AnnotationsDialogContent = memo(\n ({\n onNavigate,\n defaultTab,\n }: {\n onNavigate: () => void\n defaultTab: \"bookmarks\" | \"annotations\" | undefined\n }) => {\n const [tab, setTab] = useState(defaultTab ?? \"bookmarks\")\n\n return (\n <Tabs.Root\n value={tab}\n onValueChange={(e) => setTab(e.value as \"bookmarks\" | \"annotations\")}\n >\n <Tabs.List>\n <Tabs.Trigger value=\"bookmarks\">\n <LuBookmark />\n Bookmarks\n </Tabs.Trigger>\n <Tabs.Trigger value=\"annotations\">\n <LuNotebookPen />\n Annotations\n </Tabs.Trigger>\n <Tabs.Indicator />\n </Tabs.List>\n <Tabs.Content value=\"bookmarks\">\n <BookmarksList onNavigate={onNavigate} />\n </Tabs.Content>\n <Tabs.Content value=\"annotations\">\n <AnnotationsList onNavigate={onNavigate} />\n </Tabs.Content>\n </Tabs.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { AnnotationsDialogContent } from \"./AnnotationsDialogContent\"\n\nexport const AnnotationsDialog = memo(\n ({\n openWith,\n setOpen,\n onNavigate,\n }: {\n openWith: \"bookmarks\" | \"annotations\" | undefined\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={!!openWith}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Annotations</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <AnnotationsDialogContent\n onNavigate={onNavigate}\n defaultTab={openWith}\n />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const Spine = memo(({ children }: { children: React.ReactNode }) => {\n const reader = useReader()\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n\n if (!spineElement) return null\n\n return <>{createPortal(children, spineElement)}</>\n})\n","import { useObserve } from \"reactjrx\"\nimport { EMPTY, map, of } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useSpineItem = ({\n absolutePageIndex,\n itemIndex,\n}: {\n absolutePageIndex?: number\n itemIndex?: number\n}) => {\n const reader = useReader()\n\n const spineItem = useObserve(() => {\n if (!reader) return EMPTY\n\n if (itemIndex !== undefined)\n return of(reader.spine.spineItemsManager.get(itemIndex))\n\n if (absolutePageIndex !== undefined) {\n return reader.spine.pages\n .observeFromAbsolutePageIndex(absolutePageIndex)\n .pipe(\n map((page) => reader.spine.spineItemsManager.get(page?.itemIndex)),\n )\n }\n\n return EMPTY\n }, [itemIndex, absolutePageIndex, reader])\n\n return {\n spineItem,\n }\n}\n","import { useObserve } from \"reactjrx\"\nimport { of } from \"rxjs\"\nimport { useSpineItem } from \"./useSpineItem\"\n\nexport const useSpineItemReady = ({\n absolutePageIndex,\n itemIndex,\n}: {\n absolutePageIndex?: number\n itemIndex?: number\n}) => {\n const { spineItem } = useSpineItem({ absolutePageIndex, itemIndex })\n const isReady = useObserve(\n () => spineItem?.isReady$ ?? of(false),\n [spineItem],\n )\n\n return { spineItem, isReady }\n}\n","import { Box, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useSpineItemReady } from \"../../common/useSpineItemReady\"\nimport { BOOKMARK_AREA_DATA_ATTRIBUTE } from \"../../constants\"\nimport { useAnnotations } from \"../useAnnotations\"\n\nexport const BookmarkPageMarker = memo(\n ({\n absolutePageIndex,\n left,\n top,\n width,\n }: {\n absolutePageIndex: number\n left: number\n top: number\n width: number\n }) => {\n const { isReady: isItemReady } = useSpineItemReady({\n absolutePageIndex,\n })\n const { data: bookmarks } = useAnnotations()\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex === absolutePageIndex &&\n bookmark.meta.range === undefined,\n )\n\n /**\n * Stale bookmarks means we cannot assert at the moment whether the page is marked or not.\n * In this case we just hide the bookmark button. You may want to have different UX to handle\n * this case.\n *\n * This also avoid having a flash where you show an non bookmarked icon and right away change it with\n * a valid marked page icon.\n */\n if (!isItemReady) return null\n\n const markerSize = (width * 0.1) / 2\n\n return (\n <Presence\n present={!!bookmarkForPage}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area={BOOKMARK_AREA_DATA_ATTRIBUTE}\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n pointerEvents=\"none\"\n top={top}\n width={markerSize}\n height={markerSize}\n _before={{\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n borderTop: `${markerSize}px solid #03030373`,\n borderLeft: `${markerSize}px solid transparent`,\n }}\n />\n </Presence>\n )\n },\n)\n","import { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { Spine } from \"../../common/Spine\"\nimport { useReader } from \"../../context/useReader\"\nimport { BookmarkPageMarker } from \"./BookmarkPageMarker\"\n\nexport const BookmarkPageMarkers = memo(() => {\n const reader = useReader()\n const pages = useObserve(() => reader?.layoutInfo$, [reader])\n\n return (\n <Spine>\n {pages?.pages.map(\n ({ absoluteLayout: { left, top, width } }, pageIndex) => (\n <BookmarkPageMarker\n key={pageIndex}\n absolutePageIndex={pageIndex}\n left={left}\n top={top}\n width={width}\n />\n ),\n )}\n </Spine>\n )\n})\n","import { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useReaderWithAnnotations = () => {\n const reader = useReader()\n const readerWithBookmarks = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n return readerWithBookmarks\n}\n","import { isPositionInArea } from \"@prose-reader/enhancer-gestures\"\nimport { useEffect } from \"react\"\nimport { map, withLatestFrom } from \"rxjs\"\nimport { useAnnotations } from \"../useAnnotations\"\nimport { useReaderWithAnnotations } from \"../useReaderWithAnnotations\"\n\nexport const useBookmarkOnCornerTap = () => {\n const reader = useReaderWithAnnotations()\n const { data: bookmarks } = useAnnotations()\n\n useEffect(() => {\n if (!reader) return\n\n const unSub = reader.gestures.hooks.register(\n \"beforeTapGesture\",\n ({ event$ }) =>\n event$.pipe(\n withLatestFrom(reader?.annotations.candidates$),\n map(([context, candidates]) => {\n if (!context.page) return true\n\n const {\n spineItem,\n spineItemPageIndex,\n spineItemPagePosition,\n pageSize,\n } = context.page\n\n const hasTapOnTopRightCorner = isPositionInArea(\n spineItemPagePosition,\n {\n type: \"corner\",\n corner: \"top-right\",\n size: 10,\n unit: \"%\",\n },\n pageSize,\n )\n\n if (hasTapOnTopRightCorner) {\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n spineItemPageIndex,\n )\n\n if (!pageEntry) return true\n\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex ===\n pageEntry.absolutePageIndex &&\n bookmark.meta.range === undefined,\n )\n\n if (bookmarkForPage) {\n reader?.annotations.delete(bookmarkForPage.resource.id)\n\n return false\n }\n\n const canBookmarkPage = candidates?.[pageEntry.absolutePageIndex]\n\n if (canBookmarkPage) {\n reader?.annotations.annotateAbsolutePage({\n absolutePageIndex: pageEntry.absolutePageIndex,\n })\n\n return false\n }\n }\n\n return true\n }),\n ),\n )\n\n return unSub\n }, [reader, bookmarks])\n}\n","\"use client\"\n\nimport {\n Toaster as ChakraToaster,\n Portal,\n Spinner,\n Stack,\n Toast,\n createToaster,\n} from \"@chakra-ui/react\"\n\ntype Toaster = ReturnType<typeof createToaster>\n\nexport const toaster: Toaster = createToaster({\n placement: \"bottom-end\",\n pauseOnPageIdle: true,\n})\n\nexport const Toaster = () => {\n return (\n <Portal>\n <ChakraToaster toaster={toaster} insetInline={{ mdDown: \"4\" }}>\n {(toast) => (\n <Toast.Root width={{ md: \"sm\" }}>\n {toast.type === \"loading\" ? (\n <Spinner size=\"sm\" color=\"blue.solid\" />\n ) : (\n <Toast.Indicator />\n )}\n <Stack gap=\"1\" flex=\"1\" maxWidth=\"100%\">\n {toast.title && <Toast.Title>{toast.title}</Toast.Title>}\n {toast.description && (\n <Toast.Description>{toast.description}</Toast.Description>\n )}\n </Stack>\n {toast.action && (\n <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>\n )}\n {toast.meta?.closable && <Toast.CloseTrigger />}\n </Toast.Root>\n )}\n </ChakraToaster>\n </Portal>\n )\n}\n","import { useLayoutEffect, useMemo, useState } from \"react\"\n\nexport type UseMeasureRect = Pick<\n DOMRectReadOnly,\n \"x\" | \"y\" | \"top\" | \"left\" | \"right\" | \"bottom\" | \"height\" | \"width\"\n>\nexport type UseMeasureRef<E extends Element = Element> = (element: E) => void\nexport type UseMeasureResult<E extends Element = Element> = [\n UseMeasureRef<E>,\n UseMeasureRect,\n E | null,\n]\n\nconst defaultState: UseMeasureRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n}\n\nexport function useMeasure<E extends Element = Element>(): UseMeasureResult<E> {\n const [element, setElement] = useState<E | null>(null)\n const [rect, setRect] = useState<UseMeasureRect>(defaultState)\n\n const observer = useMemo(\n () =>\n new ResizeObserver((entries) => {\n if (entries[0]) {\n const { x, y, width, height, top, left, bottom, right } =\n entries[0].contentRect\n setRect({ x, y, width, height, top, left, bottom, right })\n }\n }),\n [],\n )\n\n useLayoutEffect(() => {\n if (!element) return\n\n observer.observe(element)\n\n return () => {\n observer.disconnect()\n }\n }, [element, observer])\n\n return [setElement, rect, element]\n}\n","import {\n type SpineItem,\n isShallowEqual,\n observeIntersection,\n} from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport {\n distinctUntilChanged,\n first,\n map,\n startWith,\n switchMap,\n tap,\n throttleTime,\n} from \"rxjs\"\nimport { NEVER } from \"rxjs\"\nimport { filter } from \"rxjs\"\nimport type { UseMeasureRect } from \"../common/useMeasure\"\nimport { useReader } from \"../context/useReader\"\nimport { hasGalleryEnhancer } from \"../context/useReader\"\n\nexport const useAttachSnapshot = (\n element: Element | null,\n item: SpineItem,\n measures: UseMeasureRect,\n) => {\n const reader = useReader()\n const readerWithGalleryEnhancer = hasGalleryEnhancer(reader)\n ? reader\n : undefined\n\n useSubscribe(() => {\n if (!readerWithGalleryEnhancer || !element) return NEVER\n\n const itemLayoutChanged$ = item.layout.layout$.pipe(\n startWith(item.layout.layoutInfo),\n distinctUntilChanged(isShallowEqual),\n )\n\n const isIntemIntersecting$ = observeIntersection(\n element as HTMLElement,\n ).pipe(map((entries) => entries.some((e) => e.isIntersecting)))\n\n return itemLayoutChanged$.pipe(\n throttleTime(100, undefined, { trailing: true }),\n switchMap(() => {\n return isIntemIntersecting$\n .pipe(\n tap((isVisible) => {\n // if the layout change and the item is not visible anymore, cleanup the element\n if (!isVisible) {\n element.innerHTML = \"\"\n }\n }),\n filter((isVisible) => isVisible),\n first(),\n )\n .pipe(\n switchMap(() => {\n element.innerHTML = \"\"\n\n return readerWithGalleryEnhancer?.gallery.snapshot(\n item,\n element,\n measures,\n )\n }),\n )\n }),\n )\n }, [readerWithGalleryEnhancer, item, measures, element])\n}\n","import { Box, Button, Text } from \"@chakra-ui/react\"\nimport type { SpineItem } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useMeasure } from \"../common/useMeasure\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { useReader } from \"../context/useReader\"\nimport { useAttachSnapshot } from \"./useAttachSnapshot\"\n\nconst GalleryItem = memo(\n ({ item, onNavigated }: { item: SpineItem; onNavigated: () => void }) => {\n const [setElement, measures, element] = useMeasure()\n const reader = useReader()\n\n useAttachSnapshot(element, item, measures)\n\n const locatedResource = useObserve(\n () => reader?.locateResource(item, { mode: \"shallow\" }),\n [reader, item],\n )\n\n return (\n <Box\n width=\"100%\"\n aspectRatio=\"2/3\"\n border=\"1px solid\"\n borderColor=\"border\"\n borderRadius=\"md\"\n data-grid-item\n cursor=\"pointer\"\n position=\"relative\"\n overflow=\"hidden\"\n onClick={() => {\n onNavigated()\n reader?.navigation.goToSpineItem({ indexOrId: item })\n }}\n >\n <Box\n height=\"100%\"\n width=\"100%\"\n overflow=\"hidden\"\n pointerEvents=\"none\"\n ref={setElement}\n />\n <Text\n position=\"absolute\"\n bottom={0}\n left=\"0\"\n right=\"0\"\n textAlign=\"center\"\n bgColor=\"white\"\n p={4}\n fontSize=\"xs\"\n >\n Page {(locatedResource?.meta?.absolutePageIndex ?? 0) + 1}\n </Text>\n </Box>\n )\n },\n)\n\nexport const GalleryDialog = memo(\n ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {\n const reader = useReader()\n const items = useObserve(() => reader?.spineItemsManager.items$, [reader])\n\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Gallery</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Box\n gridTemplateColumns={[\n \"repeat(2, minmax(0, 1fr))\",\n \"repeat(3, minmax(0, 1fr))\",\n ]}\n display=\"grid\"\n gap={[2, 4]}\n pt={2}\n data-grid\n >\n {items?.map((item) => (\n <GalleryItem\n key={item.item.id}\n item={item}\n onNavigated={() => {\n setOpen(false)\n }}\n />\n ))}\n </Box>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Button, Heading, HStack, Kbd, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuArrowBigLeft, LuArrowBigRight } from \"react-icons/lu\"\nimport { name, version } from \"../../package.json\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\n\nexport const HelpDialog = memo(\n ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Help</DialogTitle>\n </DialogHeader>\n <DialogBody\n overflowY=\"auto\"\n flex={1}\n display=\"flex\"\n flexDirection=\"column\"\n gap={4}\n >\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Shortcuts\n </Heading>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigRight />\n </Kbd>{\" \"}\n <Text>Navigate to right page</Text>\n </HStack>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigLeft />\n </Kbd>{\" \"}\n <Text>Navigate to left page</Text>\n </HStack>\n </Stack>\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Bookmarks\n </Heading>\n <HStack mb={1}>\n <Text>Tap on the top right corner of a page bookmark it</Text>\n </HStack>\n </Stack>\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </Stack>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { combineLatest, map, NEVER } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, 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.update, 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 { watchKeys } from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport { EMPTY, finalize, NEVER, Subject, 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.state$.pipe(\n watchKeys([\"isZooming\", \"currentScale\"]),\n switchMap(({ isZooming, currentScale }) => {\n if (!isZooming || currentScale < 1) 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, [reader]) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.update(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.state.beginSpineItemIndex ?? 0,\n animation: false,\n })\n }\n },\n [reader, isUsingSpread, valueSignal, isScrubberWithinChapter],\n )\n\n /**\n * @note\n * Scrubber can navigate fast and without lock we may end up with\n * slowness due to the reader\n * paginating and loading items in between.\n * This is good practice (but not required) to throttle it.\n */\n useSubscribe(\n () =>\n reader?.navigation.throttleLock({\n duration: 100,\n trigger: valueSignal.subject,\n }),\n [reader, valueSignal],\n )\n\n // const marks =\n // max > 1\n // ? Array.from({ length: max + 1 }, (_, i) => i).reduce(\n // (acc: number[], val) => [...acc, val],\n // [],\n // )\n // : []\n\n const disabled =\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n if (disabled) return <Box style={props.style} />\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\n {...props}\n />\n )\n // return (\n // <Slider\n // value={[value]}\n // max={max}\n // min={min}\n // marks={marks}\n // onChange={e => {\n // debugger\n // }}\n // onValueChange={onChange}\n // // reverse={reverse}\n // orientation=\"horizontal\"\n // step={step}\n // />\n // )\n}\n","import { Box, Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport {\n LuChevronDown,\n LuCircleHelp,\n LuGalleryHorizontal,\n LuNotebookPen,\n LuSearch,\n LuTableOfContents,\n} from \"react-icons/lu\"\nimport { MdOutlineFitScreen } from \"react-icons/md\"\nimport { RiGalleryView2 } from \"react-icons/ri\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasGalleryEnhancer,\n hasRefitEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (\n item: \"annotations\" | \"search\" | \"help\" | \"toc\" | \"bookmarks\" | \"gallery\",\n ) => void\n }) => {\n const reader = useReader()\n const { refitMenuSignal } = useReaderContext()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const zoomState = useObserve(() => reader?.zoom.state$, [reader])\n const isScrollingMode = settings?.computedPageTurnMode === \"scrollable\"\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 px={0}\n >\n <HStack\n flex={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n maxWidth=\"100%\"\n px={4}\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <Scrubber\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"35px\",\n }}\n />\n </Stack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n disabled={\n !navigation?.canGoRightSpineItem &&\n !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? (\n <RxDoubleArrowDown />\n ) : (\n <RxDoubleArrowRight />\n )}\n </IconButton>\n </HStack>\n <HStack alignSelf=\"stretch\" alignItems=\"center\" justifyContent=\"center\">\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n width=\"100%\"\n >\n <Collapsible.Trigger\n paddingY=\"3\"\n width=\"100%\"\n display=\"flex\"\n justifyContent=\"center\"\n >\n <LuChevronDown\n style={{\n transform: isExtraOpen ? \"rotate(0deg)\" : \"rotate(180deg)\",\n }}\n />\n </Collapsible.Trigger>\n <Collapsible.Content display=\"flex\" justifyContent=\"center\">\n <Box display=\"flex\" overflowX=\"auto\" px={4}>\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"help\")}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"toc\")}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"search\")}\n >\n <LuSearch />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Bookmarks\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Annotations\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\n {hasRefitEnhancer(reader) && (\n <IconButton\n aria-label=\"Refit\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => {\n refitMenuSignal.next(true)\n }}\n disabled={!isScrollingMode}\n >\n <MdOutlineFitScreen />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Thumbnails\"\n size=\"lg\"\n variant={\n zoomState?.isZooming && zoomState.currentScale < 1\n ? \"solid\"\n : \"ghost\"\n }\n onClick={() => {\n if (zoomState?.isZooming) {\n reader?.zoom.exit()\n } else {\n reader?.zoom.enter({\n animate: true,\n scale: 0.5,\n })\n }\n }}\n >\n <LuGalleryHorizontal />\n </IconButton>\n {hasGalleryEnhancer(reader) && (\n <IconButton\n aria-label=\"Gallery\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"gallery\")}\n >\n <RiGalleryView2 />\n </IconButton>\n )}\n </Box>\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\n </QuickBar>\n )\n },\n)\n","import { useEffect } from \"react\"\n\nimport { useCallback } from \"react\"\n\nimport { useState } from \"react\"\n\nexport const useFullscreen = () => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const onToggleFullscreenClick = useCallback(() => {\n if (document.fullscreenElement) {\n return document\n .exitFullscreen()\n .catch(console.error)\n .then(() => {\n setIsFullscreen(false)\n })\n }\n\n return document.documentElement\n .requestFullscreen({ navigationUI: \"hide\" })\n .catch(console.error)\n .then(() => {\n setIsFullscreen(true)\n })\n }, [])\n\n useEffect(() => {\n function fullscreenchangeHandler() {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n document.addEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n }\n }, [])\n\n return {\n isFullscreen,\n onToggleFullscreenClick,\n }\n}\n","import { HStack, IconButton, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { IoIosArrowBack, IoMdMore } from \"react-icons/io\"\nimport { MdFullscreen, MdFullscreenExit } from \"react-icons/md\"\nimport { useObserve } from \"reactjrx\"\nimport { useFullscreen } from \"../common/useFullscreen\"\nimport { useReader } from \"../context/useReader\"\nimport { QuickBar } from \"./QuickBar\"\n\nexport const TopBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (item: \"more\" | \"back\") => void\n }) => {\n const reader = useReader()\n const manifest = useObserve(() => reader?.context.manifest$, [reader])\n const { isFullscreen, onToggleFullscreenClick } = useFullscreen()\n\n return (\n <QuickBar\n present={open}\n position=\"top\"\n height=\"80px\"\n justifyContent=\"space-between\"\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => onItemClick(\"back\")}\n >\n <IoIosArrowBack />\n </IconButton>\n <Stack\n flex={1}\n maxW={600}\n gap={1}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <Text truncate maxWidth=\"100%\">\n {manifest?.title}\n </Text>\n </Stack>\n <HStack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={() => onItemClick(\"more\")}\n >\n <IoMdMore />\n </IconButton>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onToggleFullscreenClick}\n >\n {isFullscreen ? <MdFullscreenExit /> : <MdFullscreen />}\n </IconButton>\n </HStack>\n </QuickBar>\n )\n },\n)\n","import { memo } from \"react\"\nimport { useSignalValue } from \"reactjrx\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onItemClick,\n }: {\n onItemClick: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\"\n | \"gallery\",\n ) => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n const { refitMenuSignal } = useReaderContext()\n const refitMenu = useSignalValue(refitMenuSignal)\n\n return (\n <>\n <TopBar open={quickMenuOpen && !refitMenu} onItemClick={onItemClick} />\n <BottomBar\n open={quickMenuOpen && !refitMenu}\n onItemClick={onItemClick}\n />\n </>\n )\n },\n)\n","import { Field as ChakraField } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface FieldProps extends Omit<ChakraField.RootProps, \"label\"> {\n label?: React.ReactNode\n helperText?: React.ReactNode\n errorText?: React.ReactNode\n optionalText?: React.ReactNode\n}\n\nexport const Field = React.forwardRef<HTMLDivElement, FieldProps>(\n function Field(props, ref) {\n const { label, children, helperText, errorText, optionalText, ...rest } =\n props\n return (\n <ChakraField.Root ref={ref} {...rest}>\n {label && (\n <ChakraField.Label>\n {label}\n <ChakraField.RequiredIndicator fallback={optionalText} />\n </ChakraField.Label>\n )}\n {children}\n {helperText && (\n <ChakraField.HelperText>{helperText}</ChakraField.HelperText>\n )}\n {errorText && (\n <ChakraField.ErrorText>{errorText}</ChakraField.ErrorText>\n )}\n </ChakraField.Root>\n )\n },\n)\n","import { RadioGroup as ChakraRadioGroup } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface RadioProps extends ChakraRadioGroup.ItemProps {\n rootRef?: React.Ref<HTMLDivElement>\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n function Radio(props, ref) {\n const { children, inputProps, rootRef, ...rest } = props\n return (\n <ChakraRadioGroup.Item ref={rootRef} {...rest}>\n <ChakraRadioGroup.ItemHiddenInput ref={ref} {...inputProps} />\n <ChakraRadioGroup.ItemIndicator />\n {children && (\n <ChakraRadioGroup.ItemText>{children}</ChakraRadioGroup.ItemText>\n )}\n </ChakraRadioGroup.Item>\n )\n },\n)\n\nexport const RadioGroup = ChakraRadioGroup.Root\n","import { Slider as ChakraSlider, For, HStack } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface SliderProps extends ChakraSlider.RootProps {\n marks?: Array<number | { value: number; label: React.ReactNode }>\n label?: React.ReactNode\n showValue?: boolean\n}\n\nexport const Slider = React.forwardRef<HTMLDivElement, SliderProps>(\n function Slider(props, ref) {\n const { marks: marksProp, label, showValue, ...rest } = props\n const value = props.defaultValue ?? props.value\n\n const marks = marksProp?.map((mark) => {\n if (typeof mark === \"number\") return { value: mark, label: undefined }\n return mark\n })\n\n const hasMarkLabel = !!marks?.some((mark) => mark.label)\n\n return (\n <ChakraSlider.Root ref={ref} thumbAlignment=\"center\" {...rest}>\n {label && !showValue && (\n <ChakraSlider.Label>{label}</ChakraSlider.Label>\n )}\n {label && showValue && (\n <HStack justify=\"space-between\">\n <ChakraSlider.Label>{label}</ChakraSlider.Label>\n <ChakraSlider.ValueText />\n </HStack>\n )}\n <ChakraSlider.Control data-has-mark-label={hasMarkLabel || undefined}>\n <ChakraSlider.Track>\n <ChakraSlider.Range />\n </ChakraSlider.Track>\n <SliderThumbs value={value} />\n <SliderMarks marks={marks} />\n </ChakraSlider.Control>\n </ChakraSlider.Root>\n )\n },\n)\n\nfunction SliderThumbs(props: { value?: number[] }) {\n const { value } = props\n return (\n <For each={value}>\n {(_, index) => (\n <ChakraSlider.Thumb key={index} index={index}>\n <ChakraSlider.HiddenInput />\n </ChakraSlider.Thumb>\n )}\n </For>\n )\n}\n\ninterface SliderMarksProps {\n marks?: Array<number | { value: number; label: React.ReactNode }>\n}\n\nconst SliderMarks = React.forwardRef<HTMLDivElement, SliderMarksProps>(\n function SliderMarks(props, ref) {\n const { marks } = props\n if (!marks?.length) return null\n\n return (\n <ChakraSlider.MarkerGroup ref={ref}>\n {marks.map((mark, index) => {\n const value = typeof mark === \"number\" ? mark : mark.value\n const label = typeof mark === \"number\" ? undefined : mark.label\n return (\n <ChakraSlider.Marker key={index} value={value}>\n <ChakraSlider.MarkerIndicator />\n {label}\n </ChakraSlider.Marker>\n )\n })}\n </ChakraSlider.MarkerGroup>\n )\n },\n)\n","import { Button, Fieldset, Stack } from \"@chakra-ui/react\"\nimport type { RefitEnhancerOptions } from \"@prose-reader/enhancer-refit\"\nimport { memo } from \"react\"\nimport { useObserve, useSignalValue } from \"reactjrx\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { Field } from \"../components/ui/field\"\nimport { Radio, RadioGroup } from \"../components/ui/radio\"\nimport { Slider } from \"../components/ui/slider\"\nimport { hasRefitEnhancer, useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\ntype OptionValue = RefitEnhancerOptions[\"viewportFit\"]\n\nexport const RefitDialog = memo(() => {\n const defaultCustomWidth = 60\n const { refitMenuSignal } = useReaderContext()\n const refitMenu = useSignalValue(refitMenuSignal)\n const reader = useReader()\n const readerWithRefit = hasRefitEnhancer(reader) ? reader : undefined\n const refitSettings = useObserve(\n () => readerWithRefit?.refit.settings$,\n [readerWithRefit],\n )\n\n return (\n <DialogRoot\n lazyMount\n open={refitMenu}\n onOpenChange={(e) => refitMenuSignal.next(e.open)}\n placement=\"center\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Viewport fit</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Fieldset.Root>\n <Fieldset.HelperText>\n Adjust the viewport for a more comfortable reading experience.\n </Fieldset.HelperText>\n <Fieldset.Content>\n <Field label=\"Profile\">\n <RadioGroup\n defaultValue={`fit` satisfies OptionValue}\n onValueChange={(e) => {\n const value = e.value as OptionValue\n readerWithRefit?.refit.update({\n viewportFit: value,\n customWidth: defaultCustomWidth,\n })\n }}\n value={refitSettings?.viewportFit ?? `fit`}\n >\n <Stack gap={2}>\n <Radio value={`desktop` satisfies OptionValue}>\n Desktop\n </Radio>\n <Radio value={`tablet` satisfies OptionValue}>Tablet</Radio>\n <Radio value={`fit` satisfies OptionValue}>\n Full width (default)\n </Radio>\n <Radio value={`custom` satisfies OptionValue}>Custom</Radio>\n </Stack>\n </RadioGroup>\n </Field>\n <Slider\n label=\"Maximum width (%)\"\n showValue\n max={100}\n min={10}\n step={1}\n disabled={refitSettings?.viewportFit !== `custom`}\n value={[refitSettings?.customWidth ?? defaultCustomWidth]}\n onValueChange={(e) => {\n const value = e.value[0] ?? 0\n\n readerWithRefit?.refit.update({\n customWidth: value,\n })\n }}\n />\n </Fieldset.Content>\n </Fieldset.Root>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n})\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { useConstant, useObserve } from \"reactjrx\"\nimport {\n BehaviorSubject,\n distinctUntilChanged,\n map,\n merge,\n of,\n switchMap,\n timer,\n} from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\n\nconst DEBOUNCE_TIME = 500\n\nexport const useSearch = () => {\n const searchSubject = useConstant(() => new BehaviorSubject(\"\"))\n const searchValue = useObserve(searchSubject)\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const search = useObserve(() => {\n return searchSubject.pipe(\n distinctUntilChanged(),\n switchMap((value) =>\n value === \"\" || !readerWithSearch\n ? of(undefined)\n : merge(\n of({\n type: `start` as const,\n data: undefined,\n }),\n timer(DEBOUNCE_TIME).pipe(\n switchMap(() => readerWithSearch.search.search(value)),\n map((data) => ({ type: `end` as const, data })),\n ),\n ),\n ),\n )\n }, [readerWithSearch, searchSubject])\n\n return {\n value: searchValue,\n setValue: searchSubject.next.bind(searchSubject),\n status: search?.type ?? \"idle\",\n data: search?.data,\n }\n}\n","import { Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\nimport { useSearch } from \"./useSearch\"\n\nexport const SearchDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const { value: searchValue, setValue, status, data } = useSearch()\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const consolidatedResults = useObserve(\n () => reader?.locateResource(data?.slice(0, 100) ?? []),\n [data],\n )\n\n return (\n <Stack flex={1} height=\"100%\" gap={2}>\n <Input\n placeholder=\"Type something...\"\n value={searchValue}\n onChange={onValueChange}\n flexShrink={0}\n variant=\"subtle\"\n name=\"search\"\n focusRing=\"none\"\n focusVisibleRing=\"none\"\n outline=\"none\"\n focusRingColor=\"transparent\"\n />\n <Stack\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n overflow=\"auto\"\n px={4}\n flex={1}\n >\n {status === \"start\" && <Text>Searching ...</Text>}\n {data?.length === 0 && <Text>No results</Text>}\n {status === \"end\" && (data?.length ?? 0) > 0 && (\n <Stack>\n <Text fontSize=\"md\">{data?.length} result(s)</Text>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={searchValue}\n cfi={result.meta.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Stack>\n </Stack>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1} p={0}>\n <SearchDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport React, { memo } from \"react\"\nimport { LuCircleCheck } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const TableOfContentsDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context, [reader]) ?? {}\n const { nav } = manifest ?? {}\n const pagination = usePagination()\n const toc = nav?.toc || []\n const { beginSpineItemIndex, beginPageIndexInSpineItem } = pagination ?? {}\n const currentSpineItemOrChapterPageIndex =\n (assumedRenditionLayout === \"reflowable\"\n ? beginPageIndexInSpineItem\n : beginSpineItemIndex) || 0\n\n let currentSubChapter = pagination?.beginChapterInfo\n\n while (currentSubChapter?.subChapter) {\n currentSubChapter = currentSubChapter?.subChapter\n }\n\n const buildTocForItem = (\n tocItem: (typeof toc)[number],\n index: number,\n lvl: number,\n ) => (\n <React.Fragment key={index}>\n <List.Item\n pl={4 * (lvl + 1)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Link\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToUrl(tocItem.href)\n }}\n href=\"#\"\n >\n {currentSubChapter?.path === tocItem.path && (\n <List.Indicator asChild>\n <LuCircleCheck />\n </List.Indicator>\n )}\n {currentSubChapter?.path !== tocItem.path && (\n <List.Indicator asChild visibility=\"hidden\">\n <LuCircleCheck />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text fontSize=\"md\">{tocItem.title || tocItem.path}</Text>\n {currentSubChapter?.path === tocItem.path && (\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Currently on page ${\n currentSpineItemOrChapterPageIndex + 1\n }`}</Text>\n )}\n </Stack>\n </Link>\n </List.Item>\n {tocItem.contents.length > 0 && (\n <List.Root as=\"div\" gap={2}>\n {tocItem.contents.map((tocItem, index) =>\n buildTocForItem(tocItem, index, lvl + 1),\n )}\n </List.Root>\n )}\n </React.Fragment>\n )\n\n return (\n <List.Root gap={3} overflowY=\"auto\" py={4} flex={1}>\n {nav?.toc.map((tocItem, index) => buildTocForItem(tocItem, index, 0))}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { TableOfContentsDialogContent } from \"./TableOfContentsDialogContent\"\n\nexport const TableOfContentsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Table of Contents</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <TableOfContentsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport { useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { BookmarkPageMarkers } from \"./annotations/bookmarks/BookmarkPageMarkers\"\nimport { useBookmarkOnCornerTap } from \"./annotations/bookmarks/useBookmarkOnCornerTap\"\nimport { Toaster } from \"./components/ui/toaster\"\nimport { GalleryDialog } from \"./gallery/GalleryDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { useInterceptExternalLinks } from \"./navigation/useInterceptExternalLinks\"\nimport { useNotifications } from \"./notifications/useNotifications\"\nimport { QuickMenu } from \"./quickmenu/QuickMenu\"\nimport { useQuickMenu } from \"./quickmenu/useQuickMenu\"\nimport { RefitDialog } from \"./refit/RefitDialog\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onItemClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onItemClick?: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\"\n | \"gallery\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpenWith, setIsAnnotationsOpenWith] = useState<\n \"bookmarks\" | \"annotations\" | undefined\n >(undefined)\n const [isGalleryOpen, setIsGalleryOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n const onNavigate = useCallback(() => {\n setIsTableOfContentsOpen(false)\n setIsHelpOpen(false)\n setIsSearchOpen(false)\n setIsAnnotationsOpenWith(undefined)\n setQuickMenuOpen(false)\n setIsGalleryOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpenWith(\"annotations\")\n } else if (item === \"search\") {\n setIsSearchOpen(true)\n } else if (item === \"help\") {\n setIsHelpOpen(true)\n } else if (item === \"toc\") {\n setIsTableOfContentsOpen(true)\n } else if (item === \"bookmarks\") {\n setIsAnnotationsOpenWith(\"bookmarks\")\n } else if (item === \"gallery\") {\n setIsGalleryOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\n\n useInterceptExternalLinks()\n useNotifications()\n useBookmarkOnCornerTap()\n\n return (\n <>\n {enableFloatingProgress && (\n <Presence\n present={!quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <FloatingProgress />\n </Presence>\n )}\n <GalleryDialog open={isGalleryOpen} setOpen={setIsGalleryOpen} />\n <RefitDialog />\n <QuickMenu onItemClick={_onItemClick} />\n <BookmarkPageMarkers />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={onNavigate}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={onNavigate}\n />\n <AnnotationsDialog\n openWith={isAnnotationsOpenWith}\n setOpen={(open) =>\n setIsAnnotationsOpenWith(open ? \"annotations\" : undefined)\n }\n onNavigate={onNavigate}\n />\n <Presence\n present={enableFloatingTime || quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n <Toaster />\n </>\n )\n}\n"],"names":["BOOKMARK_AREA_DATA_ATTRIBUTE","ReaderContext","createContext","signal","Subject","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useConstant","notificationsSubject","refitMenuSignal","onQuickMenuOpenChangeLiveRef","useLiveRef","value","useMemo","useEffect","useSubscribe","tap","jsx","CloseButton","React","props","ref","ChakraIconButton","LuX","DialogContent","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useReaderContext","useContext","useReader","hasSearchEnhancer","hasAnnotationsEnhancer","hasGalleryEnhancer","hasRefitEnhancer","useAnnotation","id","readerWithAnnotations","useObserve","map","items","item","filter","isDefined","switchMap","AnnotationListItem","onNavigate","allowLeftIcon","annotation","textContent","List","jsxs","Link","LuNotebookPen","Stack","Text","useAnnotations","highlights","useHighlights","annotations","AnnotationsList","useBookmarks","BookmarksList","AnnotationsDialogContent","defaultTab","tab","setTab","useState","Tabs","e","LuBookmark","AnnotationsDialog","openWith","setOpen","Button","Spine","spineElement","Fragment","createPortal","useSpineItem","absolutePageIndex","itemIndex","of","page","EMPTY","useSpineItemReady","spineItem","isReady","BookmarkPageMarker","left","top","width","isItemReady","bookmarks","bookmarkForPage","bookmark","markerSize","Presence","Box","BookmarkPageMarkers","pages","pageIndex","useReaderWithAnnotations","useBookmarkOnCornerTap","event$","withLatestFrom","context","candidates","spineItemPageIndex","spineItemPagePosition","pageSize","isPositionInArea","pageEntry","toaster","createToaster","Toaster","ChakraToaster","toast","Toast","Spinner","defaultState","useMeasure","element","setElement","rect","setRect","observer","entries","x","y","height","bottom","right","useLayoutEffect","useAttachSnapshot","measures","readerWithGalleryEnhancer","NEVER","itemLayoutChanged$","startWith","distinctUntilChanged","isShallowEqual","isIntemIntersecting$","observeIntersection","throttleTime","isVisible","first","GalleryItem","onNavigated","locatedResource","GalleryDialog","open","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","state","isOnlyImages","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","useInterceptExternalLinks","event","isHtmlTagElement","url","useNotifyZoom","watchKeys","isZooming","currentScale","abort","finalize","useNotifyFontScaleChange","fontScale","skip","useNotifications","mergeMap","notification","duration","sameNotification$","n","merge","timer","ToggleTip","showArrow","content","ChakraPopover","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","useSignalState","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","BottomBar","onItemClick","navigation","settings","zoomState","isScrollingMode","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","MdOutlineFitScreen","LuGalleryHorizontal","RiGalleryView2","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","refitMenu","Field","label","helperText","errorText","optionalText","ChakraField","Radio","inputProps","rootRef","ChakraRadioGroup","RadioGroup","Slider","marksProp","showValue","marks","mark","hasMarkLabel","ChakraSlider","SliderThumbs","SliderMarks","For","_","index","RefitDialog","readerWithRefit","refitSettings","Fieldset","SearchListItem","contextText","startOffset","text","cfi","onClick","before","after","DEBOUNCE_TIME","useSearch","searchSubject","BehaviorSubject","searchValue","readerWithSearch","search","data","SearchDialogContent","setValue","status","onValueChange","consolidatedResults","Input","result","j","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpenWith","setIsAnnotationsOpenWith","isGalleryOpen","setIsGalleryOpen","setQuickMenuOpen","_onItemClick"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/constants.ts","../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/context/useReaderContext.ts","../src/context/useReader.ts","../src/annotations/useAnnotation.ts","../src/annotations/AnnotationListItem.tsx","../src/annotations/useAnnotations.ts","../src/annotations/useHighlights.ts","../src/annotations/AnnotationsList.tsx","../src/annotations/bookmarks/useBookmarks.ts","../src/annotations/bookmarks/BookmarksList.tsx","../src/annotations/AnnotationsDialogContent.tsx","../src/annotations/AnnotationsDialog.tsx","../src/common/Spine.tsx","../src/common/useSpineItem.ts","../src/common/useSpineItemReady.ts","../src/annotations/bookmarks/BookmarkPageMarker.tsx","../src/annotations/bookmarks/BookmarkPageMarkers.tsx","../src/annotations/useReaderWithAnnotations.ts","../src/annotations/bookmarks/useBookmarkOnCornerTap.ts","../src/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/components/ui/field.tsx","../src/components/ui/radio.tsx","../src/components/ui/slider.tsx","../src/refit/RefitDialog.tsx","../src/search/SearchListItem.tsx","../src/search/useSearch.ts","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/toc/TableOfContentsDialog.tsx","../src/ReactReader.tsx"],"sourcesContent":["export const BOOKMARK_AREA_DATA_ATTRIBUTE = `data-bookmark-area`\n","import type { Reader } from \"@prose-reader/core\"\nimport type { EnhancerAPI as GesturesEnhancerAPI } from \"@prose-reader/enhancer-gestures\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\nimport { Subject } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\n\ntype ContextType = {\n reader: (Reader & GesturesEnhancerAPI) | undefined\n quickMenuSignal: Signal<boolean, undefined>\n notificationsSubject: Subject<ReaderNotification>\n refitMenuSignal: Signal<boolean, undefined>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n notificationsSubject: new Subject<ReaderNotification>(),\n refitMenuSignal: signal({ default: false }),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport type { EnhancerAPI as GestureEnhancerAPI } from \"@prose-reader/enhancer-gestures\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport { signal, useConstant, useLiveRef, useSubscribe } from \"reactjrx\"\nimport { Subject, tap } from \"rxjs\"\nimport type { ReaderNotification } from \"../notifications/types\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n quickMenuOpen,\n onQuickMenuOpenChange,\n }: {\n children?: React.ReactNode\n reader: (Reader & GestureEnhancerAPI) | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const quickMenuSignal = useConstant(() =>\n signal({\n default: quickMenuOpen,\n }),\n )\n const notificationsSubject = useConstant(\n () => new Subject<ReaderNotification>(),\n )\n const refitMenuSignal = useConstant(() =>\n signal({\n default: false,\n }),\n )\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n notificationsSubject,\n refitMenuSignal,\n }),\n [quickMenuSignal, reader, notificationsSubject, refitMenuSignal],\n )\n\n useEffect(() => {\n quickMenuSignal.next(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () => quickMenuSignal.pipe(tap(onQuickMenuOpenChangeLiveRef.current)),\n [quickMenuSignal, onQuickMenuOpenChangeLiveRef],\n )\n\n return (\n <ReaderContext.Provider value={value}>{children}</ReaderContext.Provider>\n )\n },\n)\n","import type { ButtonProps } from \"@chakra-ui/react\"\nimport { IconButton as ChakraIconButton } from \"@chakra-ui/react\"\nimport * as React from \"react\"\nimport { LuX } from \"react-icons/lu\"\n\nexport type CloseButtonProps = ButtonProps\n\nexport const CloseButton = React.forwardRef<\n HTMLButtonElement,\n CloseButtonProps\n>(function CloseButton(props, ref) {\n return (\n <ChakraIconButton variant=\"ghost\" aria-label=\"Close\" ref={ref} {...props}>\n {props.children ?? <LuX />}\n </ChakraIconButton>\n )\n})\n","import { Dialog as ChakraDialog, Portal } from \"@chakra-ui/react\"\nimport { CloseButton } from \"./close-button\"\nimport * as React from \"react\"\n\ninterface DialogContentProps extends ChakraDialog.ContentProps {\n portalled?: boolean\n portalRef?: React.RefObject<HTMLElement>\n backdrop?: boolean\n}\n\nexport const DialogContent = React.forwardRef<\n HTMLDivElement,\n DialogContentProps\n>(function DialogContent(props, ref) {\n const {\n children,\n portalled = true,\n portalRef,\n backdrop = true,\n ...rest\n } = props\n\n return (\n <Portal disabled={!portalled} container={portalRef}>\n {backdrop && <ChakraDialog.Backdrop />}\n <ChakraDialog.Positioner>\n <ChakraDialog.Content ref={ref} {...rest} asChild={false}>\n {children}\n </ChakraDialog.Content>\n </ChakraDialog.Positioner>\n </Portal>\n )\n})\n\nexport const DialogCloseTrigger = React.forwardRef<\n HTMLButtonElement,\n ChakraDialog.CloseTriggerProps\n>(function DialogCloseTrigger(props, ref) {\n return (\n <ChakraDialog.CloseTrigger\n position=\"absolute\"\n top=\"2\"\n insetEnd=\"2\"\n {...props}\n asChild\n >\n <CloseButton size=\"sm\" ref={ref}>\n {props.children}\n </CloseButton>\n </ChakraDialog.CloseTrigger>\n )\n})\n\nexport const DialogRoot = ChakraDialog.Root\nexport const DialogFooter = ChakraDialog.Footer\nexport const DialogHeader = ChakraDialog.Header\nexport const DialogBody = ChakraDialog.Body\nexport const DialogBackdrop = ChakraDialog.Backdrop\nexport const DialogTitle = ChakraDialog.Title\nexport const DialogDescription = ChakraDialog.Description\nexport const DialogTrigger = ChakraDialog.Trigger\nexport const DialogActionTrigger = ChakraDialog.ActionTrigger\n","import { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReaderContext = () => {\n return useContext(ReaderContext)\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerAPI } from \"@prose-reader/enhancer-annotations\"\nimport type { GalleryEnhancerAPI } from \"@prose-reader/enhancer-gallery\"\nimport type { RefitEnhancerAPI } from \"@prose-reader/enhancer-refit\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useReaderContext } from \"./useReaderContext\"\n\nexport const useReader = () => {\n const { reader } = useReaderContext()\n\n return reader\n}\n\nexport const hasSearchEnhancer = (\n reader?: Reader,\n): reader is Reader & SearchEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_SEARCH\" in reader\n}\n\nexport const hasAnnotationsEnhancer = (\n reader?: Reader,\n): reader is Reader & AnnotationsEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_ANNOTATIONS\" in reader\n}\n\nexport const hasGalleryEnhancer = (\n reader?: Reader,\n): reader is Reader & GalleryEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_GALLERY\" in reader\n}\n\nexport const hasRefitEnhancer = (\n reader?: Reader,\n): reader is Reader & RefitEnhancerAPI => {\n return !!reader && \"__PROSE_READER_ENHANCER_REFIT\" in reader\n}\n","import { isDefined, useObserve } from \"reactjrx\"\nimport { filter, map, switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useAnnotation = (id: string) => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.annotations$.pipe(\n map((items) => items.find((item) => item.id === id)),\n filter(isDefined),\n switchMap((item) => readerWithAnnotations.locateResource(item)),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport { LuNotebookPen } from \"react-icons/lu\"\nimport { useReader } from \"../context/useReader\"\nimport { useAnnotation } from \"./useAnnotation\"\n\nexport const AnnotationListItem = ({\n id,\n onNavigate,\n allowLeftIcon = true,\n}: {\n id: string\n onNavigate: () => void\n allowLeftIcon?: boolean\n}) => {\n const reader = useReader()\n const { data: annotation } = useAnnotation(id)\n const textContent =\n annotation?.meta.range?.toString() || annotation?.meta.node?.textContent\n\n return (\n <List.Item>\n <Link\n href=\"#\"\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToCfi(annotation?.meta.cfi ?? \"\")\n }}\n >\n {annotation?.resource?.notes ? (\n <List.Indicator asChild>\n <LuNotebookPen />\n </List.Indicator>\n ) : allowLeftIcon ? (\n <List.Indicator asChild visibility=\"hidden\">\n <LuNotebookPen />\n </List.Indicator>\n ) : null}\n <Stack gap={0}>\n {textContent ? (\n <Text lineClamp={2} fontSize=\"md\">\n {textContent}\n </Text>\n ) : (\n <Text lineClamp={2} fontSize=\"md\" fontStyle=\"italic\">\n Page {(annotation?.meta.absolutePageIndex ?? 0) + 1}\n </Text>\n )}\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Book page: ${\n annotation?.meta?.absolutePageIndex !== undefined\n ? annotation.meta.absolutePageIndex + 1\n : \"unknown (not loaded)\"\n }`}</Text>\n </Stack>\n </Link>\n </List.Item>\n )\n}\n","import { useObserve } from \"reactjrx\"\nimport { switchMap } from \"rxjs\"\nimport { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useAnnotations = () => {\n const reader = useReader()\n const readerWithAnnotations = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n const consolidatedHighlights = useObserve(\n () =>\n readerWithAnnotations?.annotations.annotations$.pipe(\n switchMap((highlights) =>\n readerWithAnnotations.locateResource(highlights),\n ),\n ),\n [readerWithAnnotations],\n )\n\n return { data: consolidatedHighlights }\n}\n","import { useAnnotations } from \"./useAnnotations\"\n\nexport const useHighlights = () => {\n const { data: annotations } = useAnnotations()\n\n return {\n data: annotations?.filter((annotation) => annotation.meta.isCfiRange),\n }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"./AnnotationListItem\"\nimport { useHighlights } from \"./useHighlights\"\n\nexport const AnnotationsList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useHighlights()\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {annotations?.map((item) => (\n <AnnotationListItem\n key={item.resource.id}\n id={item.resource.id}\n onNavigate={onNavigate}\n />\n ))}\n </List.Root>\n )\n}\n","import { useAnnotations } from \"../useAnnotations\"\n\nexport const useBookmarks = () => {\n const { data: annotations } = useAnnotations()\n\n return {\n data: annotations?.filter(\n (annotation) => !annotation.meta.isCfiRange && !annotation.resource.notes,\n ),\n }\n}\n","import { List } from \"@chakra-ui/react\"\nimport { AnnotationListItem } from \"../AnnotationListItem\"\nimport { useBookmarks } from \"./useBookmarks\"\n\nexport const BookmarksList = ({ onNavigate }: { onNavigate: () => void }) => {\n const { data: annotations } = useBookmarks()\n\n return (\n <List.Root overflowY=\"auto\" gap={3} pt={4} variant=\"plain\">\n {annotations?.map((item) => (\n <AnnotationListItem\n key={item.resource.id}\n id={item.resource.id}\n onNavigate={onNavigate}\n allowLeftIcon={false}\n />\n ))}\n </List.Root>\n )\n}\n","import { Tabs } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { LuBookmark, LuNotebookPen } from \"react-icons/lu\"\nimport { AnnotationsList } from \"./AnnotationsList\"\nimport { BookmarksList } from \"./bookmarks/BookmarksList\"\n\nexport const AnnotationsDialogContent = memo(\n ({\n onNavigate,\n defaultTab,\n }: {\n onNavigate: () => void\n defaultTab: \"bookmarks\" | \"annotations\" | undefined\n }) => {\n const [tab, setTab] = useState(defaultTab ?? \"bookmarks\")\n\n return (\n <Tabs.Root\n value={tab}\n onValueChange={(e) => setTab(e.value as \"bookmarks\" | \"annotations\")}\n >\n <Tabs.List>\n <Tabs.Trigger value=\"bookmarks\">\n <LuBookmark />\n Bookmarks\n </Tabs.Trigger>\n <Tabs.Trigger value=\"annotations\">\n <LuNotebookPen />\n Annotations\n </Tabs.Trigger>\n <Tabs.Indicator />\n </Tabs.List>\n <Tabs.Content value=\"bookmarks\">\n <BookmarksList onNavigate={onNavigate} />\n </Tabs.Content>\n <Tabs.Content value=\"annotations\">\n <AnnotationsList onNavigate={onNavigate} />\n </Tabs.Content>\n </Tabs.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { AnnotationsDialogContent } from \"./AnnotationsDialogContent\"\n\nexport const AnnotationsDialog = memo(\n ({\n openWith,\n setOpen,\n onNavigate,\n }: {\n openWith: \"bookmarks\" | \"annotations\" | undefined\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={!!openWith}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Annotations</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <AnnotationsDialogContent\n onNavigate={onNavigate}\n defaultTab={openWith}\n />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { memo } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\n\nexport const Spine = memo(({ children }: { children: React.ReactNode }) => {\n const reader = useReader()\n const spineElement = useObserve(() => reader?.spine.element$, [reader])\n\n if (!spineElement) return null\n\n return <>{createPortal(children, spineElement)}</>\n})\n","import { useObserve } from \"reactjrx\"\nimport { EMPTY, map, of } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const useSpineItem = ({\n absolutePageIndex,\n itemIndex,\n}: {\n absolutePageIndex?: number\n itemIndex?: number\n}) => {\n const reader = useReader()\n\n const spineItem = useObserve(() => {\n if (!reader) return EMPTY\n\n if (itemIndex !== undefined)\n return of(reader.spine.spineItemsManager.get(itemIndex))\n\n if (absolutePageIndex !== undefined) {\n return reader.spine.pages\n .observeFromAbsolutePageIndex(absolutePageIndex)\n .pipe(\n map((page) => reader.spine.spineItemsManager.get(page?.itemIndex)),\n )\n }\n\n return EMPTY\n }, [itemIndex, absolutePageIndex, reader])\n\n return {\n spineItem,\n }\n}\n","import { useObserve } from \"reactjrx\"\nimport { of } from \"rxjs\"\nimport { useSpineItem } from \"./useSpineItem\"\n\nexport const useSpineItemReady = ({\n absolutePageIndex,\n itemIndex,\n}: {\n absolutePageIndex?: number\n itemIndex?: number\n}) => {\n const { spineItem } = useSpineItem({ absolutePageIndex, itemIndex })\n const isReady = useObserve(\n () => spineItem?.isReady$ ?? of(false),\n [spineItem],\n )\n\n return { spineItem, isReady }\n}\n","import { Box, Presence } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { useSpineItemReady } from \"../../common/useSpineItemReady\"\nimport { BOOKMARK_AREA_DATA_ATTRIBUTE } from \"../../constants\"\nimport { useAnnotations } from \"../useAnnotations\"\n\nexport const BookmarkPageMarker = memo(\n ({\n absolutePageIndex,\n left,\n top,\n width,\n }: {\n absolutePageIndex: number\n left: number\n top: number\n width: number\n }) => {\n const { isReady: isItemReady } = useSpineItemReady({\n absolutePageIndex,\n })\n const { data: bookmarks } = useAnnotations()\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex === absolutePageIndex &&\n bookmark.meta.range === undefined,\n )\n\n /**\n * Stale bookmarks means we cannot assert at the moment whether the page is marked or not.\n * In this case we just hide the bookmark button. You may want to have different UX to handle\n * this case.\n *\n * This also avoid having a flash where you show an non bookmarked icon and right away change it with\n * a valid marked page icon.\n */\n if (!isItemReady) return null\n\n const markerSize = (width * 0.1) / 2\n\n return (\n <Presence\n present={!!bookmarkForPage}\n lazyMount\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <Box\n data-bookmark-area={BOOKMARK_AREA_DATA_ATTRIBUTE}\n position=\"absolute\"\n left={left + width}\n transform=\"translateX(-100%)\"\n pointerEvents=\"none\"\n top={top}\n width={markerSize}\n height={markerSize}\n _before={{\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n borderTop: `${markerSize}px solid #03030373`,\n borderLeft: `${markerSize}px solid transparent`,\n }}\n />\n </Presence>\n )\n },\n)\n","import { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { Spine } from \"../../common/Spine\"\nimport { useReader } from \"../../context/useReader\"\nimport { BookmarkPageMarker } from \"./BookmarkPageMarker\"\n\nexport const BookmarkPageMarkers = memo(() => {\n const reader = useReader()\n const pages = useObserve(() => reader?.layoutInfo$, [reader])\n\n return (\n <Spine>\n {pages?.pages.map(\n ({ absoluteLayout: { left, top, width } }, pageIndex) => (\n <BookmarkPageMarker\n key={pageIndex}\n absolutePageIndex={pageIndex}\n left={left}\n top={top}\n width={width}\n />\n ),\n )}\n </Spine>\n )\n})\n","import { hasAnnotationsEnhancer, useReader } from \"../context/useReader\"\n\nexport const useReaderWithAnnotations = () => {\n const reader = useReader()\n const readerWithBookmarks = hasAnnotationsEnhancer(reader)\n ? reader\n : undefined\n\n return readerWithBookmarks\n}\n","import { isPositionInArea } from \"@prose-reader/enhancer-gestures\"\nimport { useEffect } from \"react\"\nimport { map, withLatestFrom } from \"rxjs\"\nimport { useAnnotations } from \"../useAnnotations\"\nimport { useReaderWithAnnotations } from \"../useReaderWithAnnotations\"\n\nexport const useBookmarkOnCornerTap = () => {\n const reader = useReaderWithAnnotations()\n const { data: bookmarks } = useAnnotations()\n\n useEffect(() => {\n if (!reader) return\n\n const unSub = reader.gestures.hooks.register(\n \"beforeTapGesture\",\n ({ event$ }) =>\n event$.pipe(\n withLatestFrom(reader?.annotations.candidates$),\n map(([context, candidates]) => {\n if (!context.page) return true\n\n const {\n spineItem,\n spineItemPageIndex,\n spineItemPagePosition,\n pageSize,\n } = context.page\n\n const hasTapOnTopRightCorner = isPositionInArea(\n spineItemPagePosition,\n {\n type: \"corner\",\n corner: \"top-right\",\n size: 10,\n unit: \"%\",\n },\n pageSize,\n )\n\n if (hasTapOnTopRightCorner) {\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n spineItemPageIndex,\n )\n\n if (!pageEntry) return true\n\n const bookmarkForPage = bookmarks?.find(\n (bookmark) =>\n bookmark?.meta?.absolutePageIndex ===\n pageEntry.absolutePageIndex &&\n bookmark.meta.range === undefined,\n )\n\n if (bookmarkForPage) {\n reader?.annotations.delete(bookmarkForPage.resource.id)\n\n return false\n }\n\n const canBookmarkPage = candidates?.[pageEntry.absolutePageIndex]\n\n if (canBookmarkPage) {\n reader?.annotations.annotateAbsolutePage({\n absolutePageIndex: pageEntry.absolutePageIndex,\n })\n\n return false\n }\n }\n\n return true\n }),\n ),\n )\n\n return unSub\n }, [reader, bookmarks])\n}\n","\"use client\"\n\nimport {\n Toaster as ChakraToaster,\n Portal,\n Spinner,\n Stack,\n Toast,\n createToaster,\n} from \"@chakra-ui/react\"\n\ntype Toaster = ReturnType<typeof createToaster>\n\nexport const toaster: Toaster = createToaster({\n placement: \"bottom-end\",\n pauseOnPageIdle: true,\n})\n\nexport const Toaster = () => {\n return (\n <Portal>\n <ChakraToaster toaster={toaster} insetInline={{ mdDown: \"4\" }}>\n {(toast) => (\n <Toast.Root width={{ md: \"sm\" }}>\n {toast.type === \"loading\" ? (\n <Spinner size=\"sm\" color=\"blue.solid\" />\n ) : (\n <Toast.Indicator />\n )}\n <Stack gap=\"1\" flex=\"1\" maxWidth=\"100%\">\n {toast.title && <Toast.Title>{toast.title}</Toast.Title>}\n {toast.description && (\n <Toast.Description>{toast.description}</Toast.Description>\n )}\n </Stack>\n {toast.action && (\n <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>\n )}\n {toast.meta?.closable && <Toast.CloseTrigger />}\n </Toast.Root>\n )}\n </ChakraToaster>\n </Portal>\n )\n}\n","import { useLayoutEffect, useMemo, useState } from \"react\"\n\nexport type UseMeasureRect = Pick<\n DOMRectReadOnly,\n \"x\" | \"y\" | \"top\" | \"left\" | \"right\" | \"bottom\" | \"height\" | \"width\"\n>\nexport type UseMeasureRef<E extends Element = Element> = (element: E) => void\nexport type UseMeasureResult<E extends Element = Element> = [\n UseMeasureRef<E>,\n UseMeasureRect,\n E | null,\n]\n\nconst defaultState: UseMeasureRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n}\n\nexport function useMeasure<E extends Element = Element>(): UseMeasureResult<E> {\n const [element, setElement] = useState<E | null>(null)\n const [rect, setRect] = useState<UseMeasureRect>(defaultState)\n\n const observer = useMemo(\n () =>\n new ResizeObserver((entries) => {\n if (entries[0]) {\n const { x, y, width, height, top, left, bottom, right } =\n entries[0].contentRect\n setRect({ x, y, width, height, top, left, bottom, right })\n }\n }),\n [],\n )\n\n useLayoutEffect(() => {\n if (!element) return\n\n observer.observe(element)\n\n return () => {\n observer.disconnect()\n }\n }, [element, observer])\n\n return [setElement, rect, element]\n}\n","import {\n type SpineItem,\n isShallowEqual,\n observeIntersection,\n} from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport {\n distinctUntilChanged,\n first,\n map,\n startWith,\n switchMap,\n tap,\n throttleTime,\n} from \"rxjs\"\nimport { NEVER } from \"rxjs\"\nimport { filter } from \"rxjs\"\nimport type { UseMeasureRect } from \"../common/useMeasure\"\nimport { useReader } from \"../context/useReader\"\nimport { hasGalleryEnhancer } from \"../context/useReader\"\n\nexport const useAttachSnapshot = (\n element: Element | null,\n item: SpineItem,\n measures: UseMeasureRect,\n) => {\n const reader = useReader()\n const readerWithGalleryEnhancer = hasGalleryEnhancer(reader)\n ? reader\n : undefined\n\n useSubscribe(() => {\n if (!readerWithGalleryEnhancer || !element) return NEVER\n\n const itemLayoutChanged$ = item.layout.layout$.pipe(\n startWith(item.layout.layoutInfo),\n distinctUntilChanged(isShallowEqual),\n )\n\n const isIntemIntersecting$ = observeIntersection(\n element as HTMLElement,\n ).pipe(map((entries) => entries.some((e) => e.isIntersecting)))\n\n return itemLayoutChanged$.pipe(\n throttleTime(100, undefined, { trailing: true }),\n switchMap(() => {\n return isIntemIntersecting$\n .pipe(\n tap((isVisible) => {\n // if the layout change and the item is not visible anymore, cleanup the element\n if (!isVisible) {\n element.innerHTML = \"\"\n }\n }),\n filter((isVisible) => isVisible),\n first(),\n )\n .pipe(\n switchMap(() => {\n element.innerHTML = \"\"\n\n return readerWithGalleryEnhancer?.gallery.snapshot(\n item,\n element,\n measures,\n )\n }),\n )\n }),\n )\n }, [readerWithGalleryEnhancer, item, measures, element])\n}\n","import { Box, Button, Text } from \"@chakra-ui/react\"\nimport type { SpineItem } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useMeasure } from \"../common/useMeasure\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { useReader } from \"../context/useReader\"\nimport { useAttachSnapshot } from \"./useAttachSnapshot\"\n\nconst GalleryItem = memo(\n ({ item, onNavigated }: { item: SpineItem; onNavigated: () => void }) => {\n const [setElement, measures, element] = useMeasure()\n const reader = useReader()\n\n useAttachSnapshot(element, item, measures)\n\n const locatedResource = useObserve(\n () => reader?.locateResource(item, { mode: \"shallow\" }),\n [reader, item],\n )\n\n return (\n <Box\n width=\"100%\"\n aspectRatio=\"2/3\"\n border=\"1px solid\"\n borderColor=\"border\"\n borderRadius=\"md\"\n data-grid-item\n cursor=\"pointer\"\n position=\"relative\"\n overflow=\"hidden\"\n onClick={() => {\n onNavigated()\n reader?.navigation.goToSpineItem({ indexOrId: item })\n }}\n >\n <Box\n height=\"100%\"\n width=\"100%\"\n overflow=\"hidden\"\n pointerEvents=\"none\"\n ref={setElement}\n />\n <Text\n position=\"absolute\"\n bottom={0}\n left=\"0\"\n right=\"0\"\n textAlign=\"center\"\n bgColor=\"white\"\n p={4}\n fontSize=\"xs\"\n >\n Page {(locatedResource?.meta?.absolutePageIndex ?? 0) + 1}\n </Text>\n </Box>\n )\n },\n)\n\nexport const GalleryDialog = memo(\n ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {\n const reader = useReader()\n const items = useObserve(() => reader?.spineItemsManager.items$, [reader])\n\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Gallery</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Box\n gridTemplateColumns={[\n \"repeat(2, minmax(0, 1fr))\",\n \"repeat(3, minmax(0, 1fr))\",\n ]}\n display=\"grid\"\n gap={[2, 4]}\n pt={2}\n data-grid\n >\n {items?.map((item) => (\n <GalleryItem\n key={item.item.id}\n item={item}\n onNavigated={() => {\n setOpen(false)\n }}\n />\n ))}\n </Box>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Button, Heading, HStack, Kbd, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuArrowBigLeft, LuArrowBigRight } from \"react-icons/lu\"\nimport { name, version } from \"../../package.json\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\n\nexport const HelpDialog = memo(\n ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Help</DialogTitle>\n </DialogHeader>\n <DialogBody\n overflowY=\"auto\"\n flex={1}\n display=\"flex\"\n flexDirection=\"column\"\n gap={4}\n >\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Shortcuts\n </Heading>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigRight />\n </Kbd>{\" \"}\n <Text>Navigate to right page</Text>\n </HStack>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigLeft />\n </Kbd>{\" \"}\n <Text>Navigate to left page</Text>\n </HStack>\n </Stack>\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Bookmarks\n </Heading>\n <HStack mb={1}>\n <Text>Tap on the top right corner of a page bookmark it</Text>\n </HStack>\n </Stack>\n <Stack>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </Stack>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { combineLatest, map, NEVER } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, 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.update, 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 { watchKeys } from \"@prose-reader/core\"\nimport { useSubscribe } from \"reactjrx\"\nimport { EMPTY, finalize, NEVER, Subject, 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.state$.pipe(\n watchKeys([\"isZooming\", \"currentScale\"]),\n switchMap(({ isZooming, currentScale }) => {\n if (!isZooming || currentScale < 1) 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, [reader]) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.update(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.state.beginSpineItemIndex ?? 0,\n animation: false,\n })\n }\n },\n [reader, isUsingSpread, valueSignal, isScrubberWithinChapter],\n )\n\n /**\n * @note\n * Scrubber can navigate fast and without lock we may end up with\n * slowness due to the reader\n * paginating and loading items in between.\n * This is good practice (but not required) to throttle it.\n */\n useSubscribe(\n () =>\n reader?.navigation.throttleLock({\n duration: 100,\n trigger: valueSignal.subject,\n }),\n [reader, valueSignal],\n )\n\n // const marks =\n // max > 1\n // ? Array.from({ length: max + 1 }, (_, i) => i).reduce(\n // (acc: number[], val) => [...acc, val],\n // [],\n // )\n // : []\n\n const disabled =\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n if (disabled) return <Box style={props.style} />\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\n {...props}\n />\n )\n // return (\n // <Slider\n // value={[value]}\n // max={max}\n // min={min}\n // marks={marks}\n // onChange={e => {\n // debugger\n // }}\n // onValueChange={onChange}\n // // reverse={reverse}\n // orientation=\"horizontal\"\n // step={step}\n // />\n // )\n}\n","import { Box, Collapsible, HStack, IconButton, Stack } from \"@chakra-ui/react\"\nimport { memo, useState } from \"react\"\nimport { BsBookmarks } from \"react-icons/bs\"\nimport {\n LuChevronDown,\n LuCircleHelp,\n LuGalleryHorizontal,\n LuNotebookPen,\n LuSearch,\n LuTableOfContents,\n} from \"react-icons/lu\"\nimport { MdOutlineFitScreen } from \"react-icons/md\"\nimport { RiGalleryView2 } from \"react-icons/ri\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport {\n hasAnnotationsEnhancer,\n hasGalleryEnhancer,\n hasRefitEnhancer,\n hasSearchEnhancer,\n useReader,\n} from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (\n item: \"annotations\" | \"search\" | \"help\" | \"toc\" | \"bookmarks\" | \"gallery\",\n ) => void\n }) => {\n const reader = useReader()\n const { refitMenuSignal } = useReaderContext()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const zoomState = useObserve(() => reader?.zoom.state$, [reader])\n const isScrollingMode = settings?.computedPageTurnMode === \"scrollable\"\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 px={0}\n >\n <HStack\n flex={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n maxWidth=\"100%\"\n px={4}\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <Scrubber\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"35px\",\n }}\n />\n </Stack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n disabled={\n !navigation?.canGoRightSpineItem &&\n !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? (\n <RxDoubleArrowDown />\n ) : (\n <RxDoubleArrowRight />\n )}\n </IconButton>\n </HStack>\n <HStack alignSelf=\"stretch\" alignItems=\"center\" justifyContent=\"center\">\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n width=\"100%\"\n >\n <Collapsible.Trigger\n paddingY=\"3\"\n width=\"100%\"\n display=\"flex\"\n justifyContent=\"center\"\n >\n <LuChevronDown\n style={{\n transform: isExtraOpen ? \"rotate(0deg)\" : \"rotate(180deg)\",\n }}\n />\n </Collapsible.Trigger>\n <Collapsible.Content display=\"flex\" justifyContent=\"center\">\n <Box display=\"flex\" overflowX=\"auto\" px={4} pb={1}>\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"help\")}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"toc\")}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"search\")}\n >\n <LuSearch />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Bookmarks\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"bookmarks\")}\n >\n <BsBookmarks />\n </IconButton>\n )}\n {hasAnnotationsEnhancer(reader) && (\n <IconButton\n aria-label=\"Annotations\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"annotations\")}\n >\n <LuNotebookPen />\n </IconButton>\n )}\n {hasRefitEnhancer(reader) && (\n <IconButton\n aria-label=\"Refit\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => {\n refitMenuSignal.next(true)\n }}\n disabled={!isScrollingMode}\n >\n <MdOutlineFitScreen />\n </IconButton>\n )}\n <IconButton\n aria-label=\"Thumbnails\"\n size=\"lg\"\n variant={\n zoomState?.isZooming && zoomState.currentScale < 1\n ? \"solid\"\n : \"ghost\"\n }\n onClick={() => {\n if (zoomState?.isZooming) {\n reader?.zoom.exit()\n } else {\n reader?.zoom.enter({\n animate: true,\n scale: 0.5,\n })\n }\n }}\n >\n <LuGalleryHorizontal />\n </IconButton>\n {hasGalleryEnhancer(reader) && (\n <IconButton\n aria-label=\"Gallery\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={() => onItemClick(\"gallery\")}\n >\n <RiGalleryView2 />\n </IconButton>\n )}\n </Box>\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\n </QuickBar>\n )\n },\n)\n","import { useEffect } from \"react\"\n\nimport { useCallback } from \"react\"\n\nimport { useState } from \"react\"\n\nexport const useFullscreen = () => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const onToggleFullscreenClick = useCallback(() => {\n if (document.fullscreenElement) {\n return document\n .exitFullscreen()\n .catch(console.error)\n .then(() => {\n setIsFullscreen(false)\n })\n }\n\n return document.documentElement\n .requestFullscreen({ navigationUI: \"hide\" })\n .catch(console.error)\n .then(() => {\n setIsFullscreen(true)\n })\n }, [])\n\n useEffect(() => {\n function fullscreenchangeHandler() {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n document.addEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", fullscreenchangeHandler)\n }\n }, [])\n\n return {\n isFullscreen,\n onToggleFullscreenClick,\n }\n}\n","import { HStack, IconButton, Stack, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { IoIosArrowBack, IoMdMore } from \"react-icons/io\"\nimport { MdFullscreen, MdFullscreenExit } from \"react-icons/md\"\nimport { useObserve } from \"reactjrx\"\nimport { useFullscreen } from \"../common/useFullscreen\"\nimport { useReader } from \"../context/useReader\"\nimport { QuickBar } from \"./QuickBar\"\n\nexport const TopBar = memo(\n ({\n open,\n onItemClick,\n }: {\n open: boolean\n onItemClick: (item: \"more\" | \"back\") => void\n }) => {\n const reader = useReader()\n const manifest = useObserve(() => reader?.context.manifest$, [reader])\n const { isFullscreen, onToggleFullscreenClick } = useFullscreen()\n\n return (\n <QuickBar\n present={open}\n position=\"top\"\n height=\"80px\"\n justifyContent=\"space-between\"\n >\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => onItemClick(\"back\")}\n >\n <IoIosArrowBack />\n </IconButton>\n <Stack\n flex={1}\n maxW={600}\n gap={1}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <Text truncate maxWidth=\"100%\">\n {manifest?.title}\n </Text>\n </Stack>\n <HStack>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={() => onItemClick(\"more\")}\n >\n <IoMdMore />\n </IconButton>\n <IconButton\n aria-label=\"right\"\n size=\"lg\"\n flexShrink={0}\n variant=\"ghost\"\n onClick={onToggleFullscreenClick}\n >\n {isFullscreen ? <MdFullscreenExit /> : <MdFullscreen />}\n </IconButton>\n </HStack>\n </QuickBar>\n )\n },\n)\n","import { memo } from \"react\"\nimport { useSignalValue } from \"reactjrx\"\nimport { useReaderContext } from \"../context/useReaderContext\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onItemClick,\n }: {\n onItemClick: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\"\n | \"gallery\",\n ) => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n const { refitMenuSignal } = useReaderContext()\n const refitMenu = useSignalValue(refitMenuSignal)\n\n return (\n <>\n <TopBar open={quickMenuOpen && !refitMenu} onItemClick={onItemClick} />\n <BottomBar\n open={quickMenuOpen && !refitMenu}\n onItemClick={onItemClick}\n />\n </>\n )\n },\n)\n","import { Field as ChakraField } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface FieldProps extends Omit<ChakraField.RootProps, \"label\"> {\n label?: React.ReactNode\n helperText?: React.ReactNode\n errorText?: React.ReactNode\n optionalText?: React.ReactNode\n}\n\nexport const Field = React.forwardRef<HTMLDivElement, FieldProps>(\n function Field(props, ref) {\n const { label, children, helperText, errorText, optionalText, ...rest } =\n props\n return (\n <ChakraField.Root ref={ref} {...rest}>\n {label && (\n <ChakraField.Label>\n {label}\n <ChakraField.RequiredIndicator fallback={optionalText} />\n </ChakraField.Label>\n )}\n {children}\n {helperText && (\n <ChakraField.HelperText>{helperText}</ChakraField.HelperText>\n )}\n {errorText && (\n <ChakraField.ErrorText>{errorText}</ChakraField.ErrorText>\n )}\n </ChakraField.Root>\n )\n },\n)\n","import { RadioGroup as ChakraRadioGroup } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface RadioProps extends ChakraRadioGroup.ItemProps {\n rootRef?: React.Ref<HTMLDivElement>\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n function Radio(props, ref) {\n const { children, inputProps, rootRef, ...rest } = props\n return (\n <ChakraRadioGroup.Item ref={rootRef} {...rest}>\n <ChakraRadioGroup.ItemHiddenInput ref={ref} {...inputProps} />\n <ChakraRadioGroup.ItemIndicator />\n {children && (\n <ChakraRadioGroup.ItemText>{children}</ChakraRadioGroup.ItemText>\n )}\n </ChakraRadioGroup.Item>\n )\n },\n)\n\nexport const RadioGroup = ChakraRadioGroup.Root\n","import { Slider as ChakraSlider, For, HStack } from \"@chakra-ui/react\"\nimport * as React from \"react\"\n\nexport interface SliderProps extends ChakraSlider.RootProps {\n marks?: Array<number | { value: number; label: React.ReactNode }>\n label?: React.ReactNode\n showValue?: boolean\n}\n\nexport const Slider = React.forwardRef<HTMLDivElement, SliderProps>(\n function Slider(props, ref) {\n const { marks: marksProp, label, showValue, ...rest } = props\n const value = props.defaultValue ?? props.value\n\n const marks = marksProp?.map((mark) => {\n if (typeof mark === \"number\") return { value: mark, label: undefined }\n return mark\n })\n\n const hasMarkLabel = !!marks?.some((mark) => mark.label)\n\n return (\n <ChakraSlider.Root ref={ref} thumbAlignment=\"center\" {...rest}>\n {label && !showValue && (\n <ChakraSlider.Label>{label}</ChakraSlider.Label>\n )}\n {label && showValue && (\n <HStack justify=\"space-between\">\n <ChakraSlider.Label>{label}</ChakraSlider.Label>\n <ChakraSlider.ValueText />\n </HStack>\n )}\n <ChakraSlider.Control data-has-mark-label={hasMarkLabel || undefined}>\n <ChakraSlider.Track>\n <ChakraSlider.Range />\n </ChakraSlider.Track>\n <SliderThumbs value={value} />\n <SliderMarks marks={marks} />\n </ChakraSlider.Control>\n </ChakraSlider.Root>\n )\n },\n)\n\nfunction SliderThumbs(props: { value?: number[] }) {\n const { value } = props\n return (\n <For each={value}>\n {(_, index) => (\n <ChakraSlider.Thumb key={index} index={index}>\n <ChakraSlider.HiddenInput />\n </ChakraSlider.Thumb>\n )}\n </For>\n )\n}\n\ninterface SliderMarksProps {\n marks?: Array<number | { value: number; label: React.ReactNode }>\n}\n\nconst SliderMarks = React.forwardRef<HTMLDivElement, SliderMarksProps>(\n function SliderMarks(props, ref) {\n const { marks } = props\n if (!marks?.length) return null\n\n return (\n <ChakraSlider.MarkerGroup ref={ref}>\n {marks.map((mark, index) => {\n const value = typeof mark === \"number\" ? mark : mark.value\n const label = typeof mark === \"number\" ? undefined : mark.label\n return (\n <ChakraSlider.Marker key={index} value={value}>\n <ChakraSlider.MarkerIndicator />\n {label}\n </ChakraSlider.Marker>\n )\n })}\n </ChakraSlider.MarkerGroup>\n )\n },\n)\n","import { Button, Fieldset, Stack } from \"@chakra-ui/react\"\nimport type { RefitEnhancerOptions } from \"@prose-reader/enhancer-refit\"\nimport { memo } from \"react\"\nimport { useObserve, useSignalValue } from \"reactjrx\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { Field } from \"../components/ui/field\"\nimport { Radio, RadioGroup } from \"../components/ui/radio\"\nimport { Slider } from \"../components/ui/slider\"\nimport { hasRefitEnhancer, useReader } from \"../context/useReader\"\nimport { useReaderContext } from \"../context/useReaderContext\"\n\ntype OptionValue = RefitEnhancerOptions[\"viewportFit\"]\n\nexport const RefitDialog = memo(() => {\n const defaultCustomWidth = 60\n const { refitMenuSignal } = useReaderContext()\n const refitMenu = useSignalValue(refitMenuSignal)\n const reader = useReader()\n const readerWithRefit = hasRefitEnhancer(reader) ? reader : undefined\n const refitSettings = useObserve(\n () => readerWithRefit?.refit.settings$,\n [readerWithRefit],\n )\n\n return (\n <DialogRoot\n lazyMount\n open={refitMenu}\n onOpenChange={(e) => refitMenuSignal.next(e.open)}\n placement=\"center\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Viewport fit</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Fieldset.Root>\n <Fieldset.HelperText>\n Adjust the viewport for a more comfortable reading experience.\n </Fieldset.HelperText>\n <Fieldset.Content>\n <Field label=\"Profile\">\n <RadioGroup\n defaultValue={`fit` satisfies OptionValue}\n onValueChange={(e) => {\n const value = e.value as OptionValue\n readerWithRefit?.refit.update({\n viewportFit: value,\n customWidth: defaultCustomWidth,\n })\n }}\n value={refitSettings?.viewportFit ?? `fit`}\n >\n <Stack gap={2}>\n <Radio value={`desktop` satisfies OptionValue}>\n Desktop\n </Radio>\n <Radio value={`tablet` satisfies OptionValue}>Tablet</Radio>\n <Radio value={`fit` satisfies OptionValue}>\n Full width (default)\n </Radio>\n <Radio value={`custom` satisfies OptionValue}>Custom</Radio>\n </Stack>\n </RadioGroup>\n </Field>\n <Slider\n label=\"Maximum width (%)\"\n showValue\n max={100}\n min={10}\n step={1}\n disabled={refitSettings?.viewportFit !== `custom`}\n value={[refitSettings?.customWidth ?? defaultCustomWidth]}\n onValueChange={(e) => {\n const value = e.value[0] ?? 0\n\n readerWithRefit?.refit.update({\n customWidth: value,\n })\n }}\n />\n </Fieldset.Content>\n </Fieldset.Root>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n})\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { useConstant, useObserve } from \"reactjrx\"\nimport {\n BehaviorSubject,\n distinctUntilChanged,\n map,\n merge,\n of,\n switchMap,\n timer,\n} from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\n\nconst DEBOUNCE_TIME = 500\n\nexport const useSearch = () => {\n const searchSubject = useConstant(() => new BehaviorSubject(\"\"))\n const searchValue = useObserve(searchSubject)\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const search = useObserve(() => {\n return searchSubject.pipe(\n distinctUntilChanged(),\n switchMap((value) =>\n value === \"\" || !readerWithSearch\n ? of(undefined)\n : merge(\n of({\n type: `start` as const,\n data: undefined,\n }),\n timer(DEBOUNCE_TIME).pipe(\n switchMap(() => readerWithSearch.search.search(value)),\n map((data) => ({ type: `end` as const, data })),\n ),\n ),\n ),\n )\n }, [readerWithSearch, searchSubject])\n\n return {\n value: searchValue,\n setValue: searchSubject.next.bind(searchSubject),\n status: search?.type ?? \"idle\",\n data: search?.data,\n }\n}\n","import { Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\nimport { useSearch } from \"./useSearch\"\n\nexport const SearchDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const { value: searchValue, setValue, status, data } = useSearch()\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const consolidatedResults = useObserve(\n () => reader?.locateResource(data?.slice(0, 100) ?? []),\n [data],\n )\n\n return (\n <Stack flex={1} height=\"100%\" gap={2}>\n <Input\n placeholder=\"Type something...\"\n value={searchValue}\n onChange={onValueChange}\n flexShrink={0}\n variant=\"subtle\"\n name=\"search\"\n focusRing=\"none\"\n focusVisibleRing=\"none\"\n outline=\"none\"\n focusRingColor=\"transparent\"\n />\n <Stack\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n overflow=\"auto\"\n px={4}\n flex={1}\n >\n {status === \"start\" && <Text>Searching ...</Text>}\n {data?.length === 0 && <Text>No results</Text>}\n {status === \"end\" && (data?.length ?? 0) > 0 && (\n <Stack>\n <Text fontSize=\"md\">{data?.length} result(s)</Text>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={searchValue}\n cfi={result.meta.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Stack>\n </Stack>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1} p={0}>\n <SearchDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Link, List, Stack, Text } from \"@chakra-ui/react\"\nimport React, { memo } from \"react\"\nimport { LuCircleCheck } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const TableOfContentsDialogContent = memo(\n ({ onNavigate }: { onNavigate: () => void }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context, [reader]) ?? {}\n const { nav } = manifest ?? {}\n const pagination = usePagination()\n const toc = nav?.toc || []\n const { beginSpineItemIndex, beginPageIndexInSpineItem } = pagination ?? {}\n const currentSpineItemOrChapterPageIndex =\n (assumedRenditionLayout === \"reflowable\"\n ? beginPageIndexInSpineItem\n : beginSpineItemIndex) || 0\n\n let currentSubChapter = pagination?.beginChapterInfo\n\n while (currentSubChapter?.subChapter) {\n currentSubChapter = currentSubChapter?.subChapter\n }\n\n const buildTocForItem = (\n tocItem: (typeof toc)[number],\n index: number,\n lvl: number,\n ) => (\n <React.Fragment key={index}>\n <List.Item\n pl={4 * (lvl + 1)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Link\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToUrl(tocItem.href)\n }}\n href=\"#\"\n >\n {currentSubChapter?.path === tocItem.path && (\n <List.Indicator asChild>\n <LuCircleCheck />\n </List.Indicator>\n )}\n {currentSubChapter?.path !== tocItem.path && (\n <List.Indicator asChild visibility=\"hidden\">\n <LuCircleCheck />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text fontSize=\"md\">{tocItem.title || tocItem.path}</Text>\n {currentSubChapter?.path === tocItem.path && (\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Currently on page ${\n currentSpineItemOrChapterPageIndex + 1\n }`}</Text>\n )}\n </Stack>\n </Link>\n </List.Item>\n {tocItem.contents.length > 0 && (\n <List.Root as=\"div\" gap={2}>\n {tocItem.contents.map((tocItem, index) =>\n buildTocForItem(tocItem, index, lvl + 1),\n )}\n </List.Root>\n )}\n </React.Fragment>\n )\n\n return (\n <List.Root gap={3} overflowY=\"auto\" py={4} flex={1}>\n {nav?.toc.map((tocItem, index) => buildTocForItem(tocItem, index, 0))}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { TableOfContentsDialogContent } from \"./TableOfContentsDialogContent\"\n\nexport const TableOfContentsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Table of Contents</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <TableOfContentsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport { useCallback, useState } from \"react\"\nimport { AnnotationsDialog } from \"./annotations/AnnotationsDialog\"\nimport { BookmarkPageMarkers } from \"./annotations/bookmarks/BookmarkPageMarkers\"\nimport { useBookmarkOnCornerTap } from \"./annotations/bookmarks/useBookmarkOnCornerTap\"\nimport { Toaster } from \"./components/ui/toaster\"\nimport { GalleryDialog } from \"./gallery/GalleryDialog\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { useInterceptExternalLinks } from \"./navigation/useInterceptExternalLinks\"\nimport { useNotifications } from \"./notifications/useNotifications\"\nimport { QuickMenu } from \"./quickmenu/QuickMenu\"\nimport { useQuickMenu } from \"./quickmenu/useQuickMenu\"\nimport { RefitDialog } from \"./refit/RefitDialog\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onItemClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onItemClick?: (\n item:\n | \"annotations\"\n | \"search\"\n | \"help\"\n | \"toc\"\n | \"bookmarks\"\n | \"more\"\n | \"back\"\n | \"gallery\",\n ) => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [isAnnotationsOpenWith, setIsAnnotationsOpenWith] = useState<\n \"bookmarks\" | \"annotations\" | undefined\n >(undefined)\n const [isGalleryOpen, setIsGalleryOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\n\n const onNavigate = useCallback(() => {\n setIsTableOfContentsOpen(false)\n setIsHelpOpen(false)\n setIsSearchOpen(false)\n setIsAnnotationsOpenWith(undefined)\n setQuickMenuOpen(false)\n setIsGalleryOpen(false)\n }, [setQuickMenuOpen])\n\n const _onItemClick: NonNullable<typeof onItemClick> = useCallback(\n (item) => {\n if (item === \"annotations\") {\n setIsAnnotationsOpenWith(\"annotations\")\n } else if (item === \"search\") {\n setIsSearchOpen(true)\n } else if (item === \"help\") {\n setIsHelpOpen(true)\n } else if (item === \"toc\") {\n setIsTableOfContentsOpen(true)\n } else if (item === \"bookmarks\") {\n setIsAnnotationsOpenWith(\"bookmarks\")\n } else if (item === \"gallery\") {\n setIsGalleryOpen(true)\n }\n onItemClick?.(item)\n },\n [onItemClick],\n )\n\n useInterceptExternalLinks()\n useNotifications()\n useBookmarkOnCornerTap()\n\n return (\n <>\n {enableFloatingProgress && (\n <Presence\n present={!quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"moderate\"\n >\n <FloatingProgress />\n </Presence>\n )}\n <GalleryDialog open={isGalleryOpen} setOpen={setIsGalleryOpen} />\n <RefitDialog />\n <QuickMenu onItemClick={_onItemClick} />\n <BookmarkPageMarkers />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={onNavigate}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={onNavigate}\n />\n <AnnotationsDialog\n openWith={isAnnotationsOpenWith}\n setOpen={(open) =>\n setIsAnnotationsOpenWith(open ? \"annotations\" : undefined)\n }\n onNavigate={onNavigate}\n />\n <Presence\n present={enableFloatingTime || quickMenuOpen}\n animationName={{ _open: \"fade-in\", _closed: \"fade-out\" }}\n animationDuration=\"slow\"\n overflow=\"hidden\"\n >\n <FloatingTime />\n </Presence>\n <Toaster />\n </>\n )\n}\n"],"names":["BOOKMARK_AREA_DATA_ATTRIBUTE","ReaderContext","createContext","signal","Subject","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useConstant","notificationsSubject","refitMenuSignal","onQuickMenuOpenChangeLiveRef","useLiveRef","value","useMemo","useEffect","useSubscribe","tap","jsx","CloseButton","React","props","ref","ChakraIconButton","LuX","DialogContent","portalled","portalRef","backdrop","rest","Portal","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","useReaderContext","useContext","useReader","hasSearchEnhancer","hasAnnotationsEnhancer","hasGalleryEnhancer","hasRefitEnhancer","useAnnotation","id","readerWithAnnotations","useObserve","map","items","item","filter","isDefined","switchMap","AnnotationListItem","onNavigate","allowLeftIcon","annotation","textContent","List","jsxs","Link","LuNotebookPen","Stack","Text","useAnnotations","highlights","useHighlights","annotations","AnnotationsList","useBookmarks","BookmarksList","AnnotationsDialogContent","defaultTab","tab","setTab","useState","Tabs","e","LuBookmark","AnnotationsDialog","openWith","setOpen","Button","Spine","spineElement","Fragment","createPortal","useSpineItem","absolutePageIndex","itemIndex","of","page","EMPTY","useSpineItemReady","spineItem","isReady","BookmarkPageMarker","left","top","width","isItemReady","bookmarks","bookmarkForPage","bookmark","markerSize","Presence","Box","BookmarkPageMarkers","pages","pageIndex","useReaderWithAnnotations","useBookmarkOnCornerTap","event$","withLatestFrom","context","candidates","spineItemPageIndex","spineItemPagePosition","pageSize","isPositionInArea","pageEntry","toaster","createToaster","Toaster","ChakraToaster","toast","Toast","Spinner","defaultState","useMeasure","element","setElement","rect","setRect","observer","entries","x","y","height","bottom","right","useLayoutEffect","useAttachSnapshot","measures","readerWithGalleryEnhancer","NEVER","itemLayoutChanged$","startWith","distinctUntilChanged","isShallowEqual","isIntemIntersecting$","observeIntersection","throttleTime","isVisible","first","GalleryItem","onNavigated","locatedResource","GalleryDialog","open","HelpDialog","Heading","HStack","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","usePagination","combineLatest","state","isOnlyImages","FloatingProgress","pagination","roundedProgress","displayableProgress","useTime","time","setTime","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","useInterceptExternalLinks","event","isHtmlTagElement","url","useNotifyZoom","watchKeys","isZooming","currentScale","abort","finalize","useNotifyFontScaleChange","fontScale","skip","useNotifications","mergeMap","notification","duration","sameNotification$","n","merge","timer","ToggleTip","showArrow","content","ChakraPopover","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","QuickBar","position","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","useSignalState","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","BottomBar","onItemClick","navigation","settings","zoomState","isScrollingMode","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","BsBookmarks","MdOutlineFitScreen","LuGalleryHorizontal","RiGalleryView2","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","refitMenu","Field","label","helperText","errorText","optionalText","ChakraField","Radio","inputProps","rootRef","ChakraRadioGroup","RadioGroup","Slider","marksProp","showValue","marks","mark","hasMarkLabel","ChakraSlider","SliderThumbs","SliderMarks","For","_","index","RefitDialog","readerWithRefit","refitSettings","Fieldset","SearchListItem","contextText","startOffset","text","cfi","onClick","before","after","DEBOUNCE_TIME","useSearch","searchSubject","BehaviorSubject","searchValue","readerWithSearch","search","data","SearchDialogContent","setValue","status","onValueChange","consolidatedResults","Input","result","j","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","lvl","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","isAnnotationsOpenWith","setIsAnnotationsOpenWith","isGalleryOpen","setIsGalleryOpen","setQuickMenuOpen","_onItemClick"],"mappings":"05CAAaA,EAA+B,qBCc/BC,EAAsCC,EAAAA,cAA2B,CAC5E,OAAQ,OACR,gBAAiBC,EAAAA,OAAO,CAAE,QAAS,GAAO,EAC1C,qBAAsB,IAAIC,EAAAA,QAC1B,gBAAiBD,EAAAA,OAAO,CAAE,QAAS,GAAO,CAC5C,CAAC,ECXYE,GAAsBC,EAAAA,KACjC,CAAC,CACC,SAAAC,EACA,OAAAC,EACA,cAAAC,EACA,sBAAAC,CAAA,IAMI,CACJ,MAAMC,EAAkBC,EAAAA,YAAY,IAClCT,SAAO,CACL,QAASM,CAAA,CACV,CAAA,EAEGI,EAAuBD,EAAAA,YAC3B,IAAM,IAAIR,EAAAA,OAA4B,EAElCU,EAAkBF,EAAAA,YAAY,IAClCT,SAAO,CACL,QAAS,EAAA,CACV,CAAA,EAEGY,EAA+BC,EAAAA,WAAWN,CAAqB,EAE/DO,EAAQC,EAAAA,QACZ,KAAO,CACL,gBAAAP,EACA,OAAAH,EACA,qBAAAK,EACA,gBAAAC,CAAA,GAEF,CAACH,EAAiBH,EAAQK,EAAsBC,CAAe,CAAA,EAGjEK,OAAAA,EAAAA,UAAU,IAAM,CACdR,EAAgB,KAAKF,CAAa,CAAA,EACjC,CAACA,EAAeE,CAAe,CAAC,EAEnCS,EAAAA,aACE,IAAMT,EAAgB,KAAKU,EAAAA,IAAIN,EAA6B,OAAO,CAAC,EACpE,CAACJ,EAAiBI,CAA4B,CAAA,EAI9CO,EAAAA,IAACrB,EAAc,SAAd,CAAuB,MAAAgB,EAAe,SAAAV,CAAA,CAAS,CAAA,CAGtD,ECnDagB,GAAcC,EAAM,WAG/B,SAAqBC,EAAOC,EAAK,CACjC,OACEJ,EAAAA,IAACK,EAAAA,WAAA,CAAiB,QAAQ,QAAQ,aAAW,QAAQ,IAAAD,EAAW,GAAGD,EAChE,SAAAA,EAAM,UAAYH,EAAAA,IAACM,EAAAA,MAAI,EAC1B,CAEJ,CAAC,ECNYC,EAAgBL,EAAM,WAGjC,SAAuBC,EAAOC,EAAK,CACnC,KAAM,CACJ,SAAAnB,EACA,UAAAuB,EAAY,GACZ,UAAAC,EACA,SAAAC,EAAW,GACX,GAAGC,CAAA,EACDR,EAEJ,cACGS,EAAAA,OAAA,CAAO,SAAU,CAACJ,EAAW,UAAWC,EACtC,SAAA,CAAAC,GAAYV,EAAAA,IAACa,SAAa,SAAb,CAAA,CAAsB,EACpCb,EAAAA,IAACa,EAAAA,OAAa,WAAb,CACC,eAACA,EAAAA,OAAa,QAAb,CAAqB,IAAAT,EAAW,GAAGO,EAAM,QAAS,GAChD,SAAA1B,EACH,CAAA,CACF,CAAA,EACF,CAEJ,CAAC,EAEY6B,EAAqBZ,EAAM,WAGtC,SAA4BC,EAAOC,EAAK,CACxC,OACEJ,EAAAA,IAACa,EAAAA,OAAa,aAAb,CACC,SAAS,WACT,IAAI,IACJ,SAAS,IACR,GAAGV,EACJ,QAAO,GAEP,eAACF,GAAA,CAAY,KAAK,KAAK,IAAAG,EACpB,WAAM,QAAA,CACT,CAAA,CAAA,CAGN,CAAC,EAEYW,EAAaF,EAAAA,OAAa,KAC1BG,EAAeH,EAAAA,OAAa,OAC5BI,EAAeJ,EAAAA,OAAa,OAC5BK,EAAaL,EAAAA,OAAa,KACTA,EAAAA,OAAa,SACpC,MAAMM,EAAcN,EAAAA,OAAa,MACPA,EAAAA,OAAa,YACjBA,EAAAA,OAAa,QACnC,MAAMO,EAAsBP,EAAAA,OAAa,cC1DnCQ,EAAmB,IACvBC,EAAAA,WAAW3C,CAAa,ECGpB4C,EAAY,IAAM,CAC7B,KAAM,CAAE,OAAArC,CAAA,EAAWmC,EAAA,EAEnB,OAAOnC,CACT,EAEasC,EACXtC,GAEO,CAAC,CAACA,GAAU,mCAAoCA,EAG5CuC,EACXvC,GAEO,CAAC,CAACA,GAAU,wCAAyCA,EAGjDwC,EACXxC,GAEO,CAAC,CAACA,GAAU,oCAAqCA,EAG7CyC,EACXzC,GAEO,CAAC,CAACA,GAAU,kCAAmCA,EC9B3C0C,GAAiBC,GAAe,CAC3C,MAAM3C,EAASqC,EAAA,EACTO,EAAwBL,EAAuBvC,CAAM,EACvDA,EACA,OAYJ,MAAO,CAAE,KAVsB6C,EAAAA,WAC7B,IACED,GAAuB,YAAY,aAAa,KAC9CE,MAAKC,GAAUA,EAAM,KAAMC,GAASA,EAAK,KAAOL,CAAE,CAAC,EACnDM,EAAAA,OAAOC,EAAAA,SAAS,EAChBC,EAAAA,UAAWH,GAASJ,EAAsB,eAAeI,CAAI,CAAC,CAAA,EAElE,CAACJ,CAAqB,CAAA,CAGT,CACjB,EChBaQ,EAAqB,CAAC,CACjC,GAAAT,EACA,WAAAU,EACA,cAAAC,EAAgB,EAClB,IAIM,CACJ,MAAMtD,EAASqC,EAAA,EACT,CAAE,KAAMkB,GAAeb,GAAcC,CAAE,EACvCa,EACJD,GAAY,KAAK,OAAO,YAAcA,GAAY,KAAK,MAAM,YAE/D,OACEzC,EAAAA,IAAC2C,EAAAA,KAAK,KAAL,CACC,SAAAC,EAAAA,KAACC,EAAAA,KAAA,CACC,KAAK,IACL,QAAS,IAAM,CACbN,EAAA,EAEArD,GAAQ,WAAW,QAAQuD,GAAY,KAAK,KAAO,EAAE,CAAA,EAGtD,SAAA,CAAAA,GAAY,UAAU,MACrBzC,EAAAA,IAAC2C,EAAAA,KAAK,UAAL,CAAe,QAAO,GACrB,SAAA3C,EAAAA,IAAC8C,EAAAA,cAAA,CAAA,CAAc,CAAA,CACjB,EACEN,EACFxC,EAAAA,IAAC2C,EAAAA,KAAK,UAAL,CAAe,QAAO,GAAC,WAAW,SACjC,SAAA3C,EAAAA,IAAC8C,EAAAA,cAAA,CAAA,CAAc,CAAA,CACjB,EACE,KACJF,EAAAA,KAACG,EAAAA,MAAA,CAAM,IAAK,EACT,SAAA,CAAAL,EACC1C,EAAAA,IAACgD,EAAAA,KAAA,CAAK,UAAW,EAAG,SAAS,KAC1B,SAAAN,CAAA,CACH,EAEAE,OAACI,EAAAA,MAAK,UAAW,EAAG,SAAS,KAAK,UAAU,SAAS,SAAA,CAAA,SAC5CP,GAAY,KAAK,mBAAqB,GAAK,CAAA,EACpD,EAEFzC,EAAAA,IAACgD,EAAAA,KAAA,CACC,UAAU,SACV,WAAW,OACX,SAAS,KACT,SAAA,cACAP,GAAY,MAAM,oBAAsB,OACpCA,EAAW,KAAK,kBAAoB,EACpC,sBACN,EAAA,CAAA,CAAG,CAAA,CACL,CAAA,CAAA,CAAA,EAEJ,CAEJ,ECzDaQ,EAAiB,IAAM,CAClC,MAAM/D,EAASqC,EAAA,EACTO,EAAwBL,EAAuBvC,CAAM,EACvDA,EACA,OAYJ,MAAO,CAAE,KAVsB6C,EAAAA,WAC7B,IACED,GAAuB,YAAY,aAAa,KAC9CO,EAAAA,UAAWa,GACTpB,EAAsB,eAAeoB,CAAU,CAAA,CACjD,EAEJ,CAACpB,CAAqB,CAAA,CAGT,CACjB,ECnBaqB,GAAgB,IAAM,CACjC,KAAM,CAAE,KAAMC,CAAA,EAAgBH,EAAA,EAE9B,MAAO,CACL,KAAMG,GAAa,OAAQX,GAAeA,EAAW,KAAK,UAAU,CAAA,CAExE,ECJaY,GAAkB,CAAC,CAAE,WAAAd,KAA6C,CAC7E,KAAM,CAAE,KAAMa,CAAA,EAAgBD,GAAA,EAE9B,OACEnD,EAAAA,IAAC2C,EAAAA,KAAK,KAAL,CAAU,UAAU,OAAO,IAAK,EAAG,GAAI,EAAG,QAAQ,QAChD,SAAAS,GAAa,IAAKlB,GACjBlC,EAAAA,IAACsC,EAAA,CAEC,GAAIJ,EAAK,SAAS,GAClB,WAAAK,CAAA,EAFKL,EAAK,SAAS,EAAA,CAItB,EACH,CAEJ,EChBaoB,GAAe,IAAM,CAChC,KAAM,CAAE,KAAMF,CAAA,EAAgBH,EAAA,EAE9B,MAAO,CACL,KAAMG,GAAa,OAChBX,GAAe,CAACA,EAAW,KAAK,YAAc,CAACA,EAAW,SAAS,KAAA,CACtE,CAEJ,ECNac,GAAgB,CAAC,CAAE,WAAAhB,KAA6C,CAC3E,KAAM,CAAE,KAAMa,CAAA,EAAgBE,GAAA,EAE9B,OACEtD,EAAAA,IAAC2C,EAAAA,KAAK,KAAL,CAAU,UAAU,OAAO,IAAK,EAAG,GAAI,EAAG,QAAQ,QAChD,SAAAS,GAAa,IAAKlB,GACjBlC,EAAAA,IAACsC,EAAA,CAEC,GAAIJ,EAAK,SAAS,GAClB,WAAAK,EACA,cAAe,EAAA,EAHVL,EAAK,SAAS,EAAA,CAKtB,EACH,CAEJ,ECbasB,GAA2BxE,EAAAA,KACtC,CAAC,CACC,WAAAuD,EACA,WAAAkB,CAAA,IAII,CACJ,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAASH,GAAc,WAAW,EAExD,OACEb,EAAAA,KAACiB,EAAAA,KAAK,KAAL,CACC,MAAOH,EACP,cAAgBI,GAAMH,EAAOG,EAAE,KAAoC,EAEnE,SAAA,CAAAlB,EAAAA,KAACiB,EAAAA,KAAK,KAAL,CACC,SAAA,CAAAjB,EAAAA,KAACiB,EAAAA,KAAK,QAAL,CAAa,MAAM,YAClB,SAAA,CAAA7D,EAAAA,IAAC+D,EAAAA,WAAA,EAAW,EAAE,WAAA,EAEhB,EACAnB,EAAAA,KAACiB,EAAAA,KAAK,QAAL,CAAa,MAAM,cAClB,SAAA,CAAA7D,EAAAA,IAAC8C,EAAAA,cAAA,EAAc,EAAE,aAAA,EAEnB,EACA9C,MAAC6D,EAAAA,KAAK,UAAL,CAAA,CAAe,CAAA,EAClB,EACA7D,EAAAA,IAAC6D,EAAAA,KAAK,QAAL,CAAa,MAAM,YAClB,SAAA7D,EAAAA,IAACuD,GAAA,CAAc,WAAAhB,CAAA,CAAwB,CAAA,CACzC,EACAvC,EAAAA,IAAC6D,EAAAA,KAAK,QAAL,CAAa,MAAM,cAClB,SAAA7D,MAACqD,GAAA,CAAgB,WAAAd,CAAA,CAAwB,CAAA,CAC3C,CAAA,CAAA,CAAA,CACF,CAGN,EC3BayB,GAAoBhF,EAAAA,KAC/B,CAAC,CACC,SAAAiF,EACA,QAAAC,EACA,WAAA3B,CAAA,IAOEvC,EAAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAM,CAAC,CAACkD,EACR,aAAeH,GAAMI,EAAQJ,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAA,EAC5B,eAAe,SAEf,SAAAlB,EAAAA,KAACrC,EAAA,CAAc,OAAO,OACpB,SAAA,CAAAP,MAACiB,EAAA,CACC,SAAAjB,EAAAA,IAACmB,EAAA,CAAY,SAAA,aAAA,CAAW,EAC1B,EACAnB,EAAAA,IAACkB,EAAA,CAAW,KAAM,EAChB,SAAAlB,EAAAA,IAACwD,GAAA,CACC,WAAAjB,EACA,WAAY0B,CAAA,CAAA,EAEhB,EACAjE,EAAAA,IAACgB,EAAA,CACC,SAAAhB,EAAAA,IAACoB,EAAA,CAAoB,QAAO,GAC1B,SAAApB,EAAAA,IAACmE,EAAAA,OAAA,CAAO,QAAQ,UAAU,SAAA,QAAA,CAAM,CAAA,CAClC,EACF,QACCrD,EAAA,CAAA,CAAmB,CAAA,CAAA,CACtB,CAAA,CAAA,CAIR,EChDasD,GAAQpF,EAAAA,KAAK,CAAC,CAAE,SAAAC,KAA8C,CACzE,MAAMC,EAASqC,EAAA,EACT8C,EAAetC,EAAAA,WAAW,IAAM7C,GAAQ,MAAM,SAAU,CAACA,CAAM,CAAC,EAEtE,OAAKmF,EAEErE,EAAAA,IAAAsE,EAAAA,SAAA,CAAG,SAAAC,GAAAA,aAAatF,EAAUoF,CAAY,EAAE,EAFrB,IAG5B,CAAC,ECRYG,GAAe,CAAC,CAC3B,kBAAAC,EACA,UAAAC,CACF,IAGM,CACJ,MAAMxF,EAASqC,EAAA,EAmBf,MAAO,CACL,UAlBgBQ,EAAAA,WAAW,IACtB7C,EAEDwF,IAAc,OACTC,EAAAA,GAAGzF,EAAO,MAAM,kBAAkB,IAAIwF,CAAS,CAAC,EAErDD,IAAsB,OACjBvF,EAAO,MAAM,MACjB,6BAA6BuF,CAAiB,EAC9C,KACCzC,MAAK4C,GAAS1F,EAAO,MAAM,kBAAkB,IAAI0F,GAAM,SAAS,CAAC,CAAA,EAIhEC,EAAAA,MAbaA,EAAAA,MAcnB,CAACH,EAAWD,EAAmBvF,CAAM,CAAC,CAGvC,CAEJ,EC7Ba4F,GAAoB,CAAC,CAChC,kBAAAL,EACA,UAAAC,CACF,IAGM,CACJ,KAAM,CAAE,UAAAK,CAAA,EAAcP,GAAa,CAAE,kBAAAC,EAAmB,UAAAC,EAAW,EAC7DM,EAAUjD,EAAAA,WACd,IAAMgD,GAAW,UAAYJ,EAAAA,GAAG,EAAK,EACrC,CAACI,CAAS,CAAA,EAGZ,MAAO,CAAE,UAAAA,EAAW,QAAAC,CAAA,CACtB,ECZaC,GAAqBjG,EAAAA,KAChC,CAAC,CACC,kBAAAyF,EACA,KAAAS,EACA,IAAAC,EACA,MAAAC,CAAA,IAMI,CACJ,KAAM,CAAE,QAASC,CAAA,EAAgBP,GAAkB,CACjD,kBAAAL,CAAA,CACD,EACK,CAAE,KAAMa,CAAA,EAAcrC,EAAA,EACtBsC,EAAkBD,GAAW,KAChCE,GACCA,GAAU,MAAM,oBAAsBf,GACtCe,EAAS,KAAK,QAAU,MAAA,EAW5B,GAAI,CAACH,EAAa,OAAO,KAEzB,MAAMI,EAAcL,EAAQ,GAAO,EAEnC,OACEpF,EAAAA,IAAC0F,EAAAA,SAAA,CACC,QAAS,CAAC,CAACH,EACX,UAAS,GACT,cAAe,CAAE,MAAO,UAAW,QAAS,UAAA,EAC5C,kBAAkB,WAElB,SAAAvF,EAAAA,IAAC2F,EAAAA,IAAA,CACC,qBAAoBjH,EACpB,SAAS,WACT,KAAMwG,EAAOE,EACb,UAAU,oBACV,cAAc,OACd,IAAAD,EACA,MAAOM,EACP,OAAQA,EACR,QAAS,CACP,QAAS,KACT,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAO,EACP,OAAQ,EACR,UAAW,GAAGA,CAAU,qBACxB,WAAY,GAAGA,CAAU,sBAAA,CAC3B,CAAA,CACF,CAAA,CACF,CAGN,EChEaG,GAAsB5G,EAAAA,KAAK,IAAM,CAC5C,MAAME,EAASqC,EAAA,EACTsE,EAAQ9D,EAAAA,WAAW,IAAM7C,GAAQ,YAAa,CAACA,CAAM,CAAC,EAE5D,OACEc,EAAAA,IAACoE,GAAA,CACE,SAAAyB,GAAO,MAAM,IACZ,CAAC,CAAE,eAAgB,CAAE,KAAAX,EAAM,IAAAC,EAAK,MAAAC,CAAA,CAAM,EAAKU,IACzC9F,EAAAA,IAACiF,GAAA,CAEC,kBAAmBa,EACnB,KAAAZ,EACA,IAAAC,EACA,MAAAC,CAAA,EAJKU,CAAA,CAKP,EAGN,CAEJ,CAAC,ECvBYC,GAA2B,IAAM,CAC5C,MAAM7G,EAASqC,EAAA,EAKf,OAJ4BE,EAAuBvC,CAAM,EACrDA,EACA,MAGN,ECHa8G,GAAyB,IAAM,CAC1C,MAAM9G,EAAS6G,GAAA,EACT,CAAE,KAAMT,CAAA,EAAcrC,EAAA,EAE5BpD,EAAAA,UAAU,IACHX,EAESA,EAAO,SAAS,MAAM,SAClC,mBACA,CAAC,CAAE,OAAA+G,KACDA,EAAO,KACLC,iBAAehH,GAAQ,YAAY,WAAW,EAC9C8C,EAAAA,IAAI,CAAC,CAACmE,EAASC,CAAU,IAAM,CAC7B,GAAI,CAACD,EAAQ,KAAM,MAAO,GAE1B,KAAM,CACJ,UAAApB,EACA,mBAAAsB,EACA,sBAAAC,EACA,SAAAC,CAAA,EACEJ,EAAQ,KAaZ,GAX+BK,GAAAA,iBAC7BF,EACA,CACE,KAAM,SACN,OAAQ,YACR,KAAM,GACN,KAAM,GAAA,EAERC,CAAA,EAG0B,CAC1B,MAAME,EAAYvH,EAAO,MAAM,MAAM,uBACnC6F,EACAsB,CAAA,EAGF,GAAI,CAACI,EAAW,MAAO,GAEvB,MAAMlB,EAAkBD,GAAW,KAChCE,GACCA,GAAU,MAAM,oBACdiB,EAAU,mBACZjB,EAAS,KAAK,QAAU,MAAA,EAG5B,GAAID,EACF,OAAArG,GAAQ,YAAY,OAAOqG,EAAgB,SAAS,EAAE,EAE/C,GAKT,GAFwBa,IAAaK,EAAU,iBAAiB,EAG9D,OAAAvH,GAAQ,YAAY,qBAAqB,CACvC,kBAAmBuH,EAAU,iBAAA,CAC9B,EAEM,EACT,CAGF,MAAO,EAAA,CACR,CAAA,CACH,EA9DS,OAkEZ,CAACvH,EAAQoG,CAAS,CAAC,CACxB,ECjEaoB,EAAmBC,EAAAA,cAAc,CAC5C,UAAW,aACX,gBAAiB,EACnB,CAAC,EAEYC,GAAU,IAEnB5G,MAACY,EAAAA,QACC,SAAAZ,EAAAA,IAAC6G,UAAA,CAAc,QAAAH,EAAkB,YAAa,CAAE,OAAQ,GAAA,EACrD,SAACI,GACAlE,OAACmE,EAAAA,MAAM,KAAN,CAAW,MAAO,CAAE,GAAI,MACtB,SAAA,CAAAD,EAAM,OAAS,UACd9G,EAAAA,IAACgH,EAAAA,QAAA,CAAQ,KAAK,KAAK,MAAM,YAAA,CAAa,EAEtChH,EAAAA,IAAC+G,EAAAA,MAAM,UAAN,CAAA,CAAgB,SAElBhE,EAAAA,MAAA,CAAM,IAAI,IAAI,KAAK,IAAI,SAAS,OAC9B,SAAA,CAAA+D,EAAM,OAAS9G,EAAAA,IAAC+G,EAAAA,MAAM,MAAN,CAAa,WAAM,MAAM,EACzCD,EAAM,aACL9G,EAAAA,IAAC+G,EAAAA,MAAM,YAAN,CAAmB,WAAM,WAAA,CAAY,CAAA,EAE1C,EACCD,EAAM,QACL9G,EAAAA,IAAC+G,QAAM,cAAN,CAAqB,SAAAD,EAAM,OAAO,MAAM,EAE1CA,EAAM,MAAM,UAAY9G,EAAAA,IAAC+G,EAAAA,MAAM,aAAN,CAAA,CAAmB,CAAA,CAAA,CAC/C,EAEJ,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,EAAIxD,EAAAA,SAAmB,IAAI,EAC/C,CAACyD,EAAMC,CAAO,EAAI1D,EAAAA,SAAyBqD,EAAY,EAEvDM,EAAW3H,EAAAA,QACf,IACE,IAAI,eAAgB4H,GAAY,CAC9B,GAAIA,EAAQ,CAAC,EAAG,CACd,KAAM,CAAE,EAAAC,EAAG,EAAAC,EAAG,MAAAtC,EAAO,OAAAuC,EAAQ,IAAAxC,EAAK,KAAAD,EAAM,OAAA0C,EAAQ,MAAAC,CAAA,EAC9CL,EAAQ,CAAC,EAAE,YACbF,EAAQ,CAAE,EAAAG,EAAG,EAAAC,EAAG,MAAAtC,EAAO,OAAAuC,EAAQ,IAAAxC,EAAK,KAAAD,EAAM,OAAA0C,EAAQ,MAAAC,EAAO,CAAA,CAC3D,CACD,EACH,CAAA,CAAC,EAGHC,OAAAA,EAAAA,gBAAgB,IAAM,CACpB,GAAKX,EAEL,OAAAI,EAAS,QAAQJ,CAAO,EAEjB,IAAM,CACXI,EAAS,WAAA,CAAW,CACtB,EACC,CAACJ,EAASI,CAAQ,CAAC,EAEf,CAACH,EAAYC,EAAMF,CAAO,CACnC,CC9BO,MAAMY,GAAoB,CAC/BZ,EACAjF,EACA8F,IACG,CACH,MAAM9I,EAASqC,EAAA,EACT0G,EAA4BvG,EAAmBxC,CAAM,EACvDA,EACA,OAEJY,EAAAA,aAAa,IAAM,CACjB,GAAI,CAACmI,GAA6B,CAACd,EAAS,OAAOe,EAAAA,MAEnD,MAAMC,EAAqBjG,EAAK,OAAO,QAAQ,KAC7CkG,YAAUlG,EAAK,OAAO,UAAU,EAChCmG,EAAAA,qBAAqBC,EAAAA,cAAc,CAAA,EAG/BC,EAAuBC,EAAAA,oBAC3BrB,CAAA,EACA,KAAKnF,EAAAA,IAAKwF,GAAYA,EAAQ,KAAM1D,GAAMA,EAAE,cAAc,CAAC,CAAC,EAE9D,OAAOqE,EAAmB,KACxBM,EAAAA,aAAa,IAAK,OAAW,CAAE,SAAU,GAAM,EAC/CpG,EAAAA,UAAU,IACDkG,EACJ,KACCxI,EAAAA,IAAK2I,GAAc,CAEZA,IACHvB,EAAQ,UAAY,GACtB,CACD,EACDhF,SAAQuG,GAAcA,CAAS,EAC/BC,EAAAA,MAAA,CAAM,EAEP,KACCtG,EAAAA,UAAU,KACR8E,EAAQ,UAAY,GAEbc,GAA2B,QAAQ,SACxC/F,EACAiF,EACAa,CAAA,EAEH,CAAA,CAEN,CAAA,CACH,EACC,CAACC,EAA2B/F,EAAM8F,EAAUb,CAAO,CAAC,CACzD,ECrDMyB,GAAc5J,EAAAA,KAClB,CAAC,CAAE,KAAAkD,EAAM,YAAA2G,KAAgE,CACvE,KAAM,CAACzB,EAAYY,EAAUb,CAAO,EAAID,GAAA,EAClChI,EAASqC,EAAA,EAEfwG,GAAkBZ,EAASjF,EAAM8F,CAAQ,EAEzC,MAAMc,EAAkB/G,EAAAA,WACtB,IAAM7C,GAAQ,eAAegD,EAAM,CAAE,KAAM,UAAW,EACtD,CAAChD,EAAQgD,CAAI,CAAA,EAGf,OACEU,EAAAA,KAAC+C,EAAAA,IAAA,CACC,MAAM,OACN,YAAY,MACZ,OAAO,YACP,YAAY,SACZ,aAAa,KACb,iBAAc,GACd,OAAO,UACP,SAAS,WACT,SAAS,SACT,QAAS,IAAM,CACbkD,EAAA,EACA3J,GAAQ,WAAW,cAAc,CAAE,UAAWgD,EAAM,CAAA,EAGtD,SAAA,CAAAlC,EAAAA,IAAC2F,EAAAA,IAAA,CACC,OAAO,OACP,MAAM,OACN,SAAS,SACT,cAAc,OACd,IAAKyB,CAAA,CAAA,EAEPxE,EAAAA,KAACI,EAAAA,KAAA,CACC,SAAS,WACT,OAAQ,EACR,KAAK,IACL,MAAM,IACN,UAAU,SACV,QAAQ,QACR,EAAG,EACH,SAAS,KACV,SAAA,CAAA,SACQ8F,GAAiB,MAAM,mBAAqB,GAAK,CAAA,CAAA,CAAA,CAC1D,CAAA,CAAA,CACF,CAGN,EAEaC,GAAgB/J,EAAAA,KAC3B,CAAC,CAAE,KAAAgK,EAAM,QAAA9E,KAAmE,CAC1E,MAAMhF,EAASqC,EAAA,EACTU,EAAQF,EAAAA,WAAW,IAAM7C,GAAQ,kBAAkB,OAAQ,CAACA,CAAM,CAAC,EAEzE,OACEc,EAAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiI,EACA,aAAelF,GAAMI,EAAQJ,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAA,EAC5B,eAAe,SAEf,SAAAlB,EAAAA,KAACrC,EAAA,CAAc,OAAO,OACpB,SAAA,CAAAP,MAACiB,EAAA,CACC,SAAAjB,EAAAA,IAACmB,EAAA,CAAY,SAAA,SAAA,CAAO,EACtB,QACCD,EAAA,CACC,SAAAlB,EAAAA,IAAC2F,EAAAA,IAAA,CACC,oBAAqB,CACnB,4BACA,2BAAA,EAEF,QAAQ,OACR,IAAK,CAAC,EAAG,CAAC,EACV,GAAI,EACJ,YAAS,GAER,SAAA1D,GAAO,IAAKC,GACXlC,EAAAA,IAAC4I,GAAA,CAEC,KAAA1G,EACA,YAAa,IAAM,CACjBgC,EAAQ,EAAK,CAAA,CACf,EAJKhC,EAAK,KAAK,EAAA,CAMlB,CAAA,CAAA,EAEL,EACAlC,EAAAA,IAACgB,EAAA,CACC,SAAAhB,EAAAA,IAACoB,EAAA,CAAoB,QAAO,GAC1B,SAAApB,EAAAA,IAACmE,EAAAA,OAAA,CAAO,QAAQ,UAAU,SAAA,QAAA,CAAM,CAAA,CAClC,EACF,QACCrD,EAAA,CAAA,CAAmB,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,+CCzGamI,GAAajK,EAAAA,KACxB,CAAC,CAAE,KAAAgK,EAAM,QAAA9E,KAELlE,EAAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiI,EACA,aAAelF,GAAMI,EAAQJ,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAA,EAC5B,eAAe,SAEf,gBAACvD,EAAA,CACC,SAAA,CAAAP,MAACiB,EAAA,CACC,SAAAjB,EAAAA,IAACmB,EAAA,CAAY,SAAA,MAAA,CAAI,EACnB,EACAyB,EAAAA,KAAC1B,EAAA,CACC,UAAU,OACV,KAAM,EACN,QAAQ,OACR,cAAc,SACd,IAAK,EAEL,SAAA,CAAA0B,OAACG,EAAAA,MAAA,CACC,SAAA,CAAA/C,EAAAA,IAACkJ,EAAAA,SAAQ,GAAI,EAAG,GAAG,KAAK,KAAK,KAAK,SAAA,WAAA,CAElC,EACAtG,EAAAA,KAACuG,EAAAA,OAAA,CAAO,GAAI,EACV,SAAA,CAAAnJ,EAAAA,IAACoJ,EAAAA,IAAA,CACC,SAAApJ,EAAAA,IAACqJ,EAAAA,gBAAA,CAAA,CAAgB,EACnB,EAAO,IACPrJ,EAAAA,IAACgD,EAAAA,MAAK,SAAA,wBAAA,CAAsB,CAAA,EAC9B,EACAJ,EAAAA,KAACuG,EAAAA,OAAA,CAAO,GAAI,EACV,SAAA,CAAAnJ,EAAAA,IAACoJ,EAAAA,IAAA,CACC,SAAApJ,EAAAA,IAACsJ,EAAAA,eAAA,CAAA,CAAe,EAClB,EAAO,IACPtJ,EAAAA,IAACgD,EAAAA,MAAK,SAAA,uBAAA,CAAqB,CAAA,CAAA,CAC7B,CAAA,EACF,SACCD,EAAAA,MAAA,CACC,SAAA,CAAA/C,EAAAA,IAACkJ,EAAAA,SAAQ,GAAI,EAAG,GAAG,KAAK,KAAK,KAAK,SAAA,WAAA,CAElC,QACCC,EAAAA,OAAA,CAAO,GAAI,EACV,SAAAnJ,EAAAA,IAACgD,OAAA,CAAK,6DAAiD,CAAA,CACzD,CAAA,EACF,SACCD,EAAAA,MAAA,CACC,SAAA,CAAA/C,EAAAA,IAACkJ,EAAAA,SAAQ,GAAI,EAAG,GAAG,KAAK,KAAK,KAAK,SAAA,OAAA,CAElC,SACClG,EAAAA,KAAA,CACE,SAAA,CAAAuG,GAAK,aAAWC,EAAA,CAAA,CACnB,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,EAEFxJ,EAAAA,IAACgB,EAAA,CACC,SAAAhB,EAAAA,IAACoB,EAAA,CAAoB,QAAO,GAC1B,SAAApB,EAAAA,IAACmE,EAAAA,OAAA,CAAO,QAAQ,UAAU,SAAA,QAAA,CAAM,CAAA,CAClC,EACF,QACCrD,EAAA,CAAA,CAAmB,CAAA,CAAA,CACtB,CAAA,CAAA,CAIR,EC5Ea2I,EAAgB,IAEZ,CACf,MAAMvK,EAASqC,EAAA,EAEf,OAAOQ,EAAAA,WACL,IACG7C,EAEGwK,EAAAA,cAAc,CAACxK,EAAO,WAAW,OAAQA,EAAO,OAAO,CAAC,EAAE,KACxD8C,EAAAA,IAAI,CAAC,CAAC2H,EAAOxD,CAAO,IAAM,CACxB,MAAMyD,EAAezD,EAAQ,UAAU,WAAW,MAAOjE,GACvDA,EAAK,WAAW,WAAW,QAAQ,CAAA,EAGrC,MAAO,CACL,GAAGyH,EACH,YAAa,CAACxD,EAAQ,qBAAuB,CAACyD,CAAA,CAChD,CACD,CAAA,EAXH1B,QAaN,CAAChJ,CAAM,CAAA,CAEX,ECzBa2K,GAAmB,IAAM,CACpC,MAAMC,EAAaL,EAAA,EACbM,EAAkB,KAAK,OAC1BD,GAAY,0BAA4B,GAAK,GAAA,EAE1CE,EAAsBD,EAAkB,EAAIA,EAAkB,EAEpE,OAAID,GAAY,2BAA6B,OAAkB,KAG7D9J,EAAAA,IAAC2F,EAAAA,IAAA,CAAI,SAAS,WAAW,MAAO,EAAG,OAAQ,EAAG,EAAG,EAAG,MAAO,QACzD,SAAA/C,EAAAA,KAACI,EAAAA,KAAA,CAAK,SAAS,KAAM,SAAA,CAAAgH,EAAoB,IAAA,CAAA,CAAE,CAAA,CAC7C,CAEJ,ECdaC,GAAU,IAAM,CAC3B,KAAM,CAACC,EAAMC,CAAO,EAAIvG,EAAAA,SAAS,IAAI,IAAM,EAE3C/D,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMuK,EAAW,YAAY,IAAM,CACjCD,EAAQ,IAAI,IAAM,CAAA,EACjB,GAAS,EAEZ,MAAO,IAAM,cAAcC,CAAQ,CAAA,EAClC,EAAE,EAEEF,CACT,EAEaG,GAAiBlK,GAAqB,CACjD,MAAM+J,EAAOD,GAAA,EAEb,OACEjK,MAACgD,EAAAA,MAAK,SAAS,KAAM,GAAG7C,EACrB,SAAA+J,EAAK,mBAAmB,UAAU,SAAU,CAC3C,KAAM,UACN,OAAQ,SAAA,CACT,EACH,CAEJ,ECzBaI,EAAe,IAAM,CAChC,KAAM,CAAE,gBAAAjL,CAAA,EAAoBgC,EAAA,EAI5B,MAAO,CAFWkJ,EAAAA,eAAelL,CAAe,EAE7BA,EAAgB,OAAQA,CAAe,CAC5D,ECLamL,GAAe,IAAM,CAChC,KAAM,CAACrL,CAAa,EAAImL,EAAA,EAExB,OACEtK,EAAAA,IAAC2F,EAAAA,IAAA,CACC,SAAS,WACT,KAAM,EACN,OAAQ,EACR,EAAG,EACH,MAAOxG,EAAgB,OAAY,wBAEnC,eAACkL,GAAA,CAAA,CAAc,CAAA,CAAA,CAGrB,ECdaI,GAA4B,IAAM,CAC7C,MAAMvL,EAASqC,EAAA,EAEfzB,EAAAA,aACE,IACEZ,GAAQ,OAAO,UAAWwL,GAAU,CAClC,GAAIA,EAAM,OAAS,SAAWC,EAAAA,iBAAiBD,EAAM,OAAQ,GAAG,EAAG,CACjE,GAAI,CAACA,EAAM,OAAO,KAAM,OAExB,MAAME,EAAM,IAAI,IAAIF,EAAM,OAAO,IAAI,EAEjC,OAAO,SAAS,OAASE,EAAI,MACd,QACf,iDAAA,GAIA,OAAO,KAAKF,EAAM,OAAO,KAAM,SAAS,CAE5C,CACF,CACD,EACH,CAACxL,CAAM,CAAA,CAEX,ECtBa2L,GAAgB,IAAM,CACjC,MAAM3L,EAASqC,EAAA,EACT,CAAE,qBAAAhC,CAAA,EAAyB8B,EAAA,EAEjCvB,EAAAA,aACE,IACEZ,GAAQ,KAAK,OAAO,KAClB4L,YAAU,CAAC,YAAa,cAAc,CAAC,EACvCzI,EAAAA,UAAU,CAAC,CAAE,UAAA0I,EAAW,aAAAC,KAAmB,CACzC,GAAI,CAACD,GAAaC,EAAe,EAAG,OAAOnG,EAAAA,MAE3C,MAAMoG,EAAQ,IAAInM,UAElB,OAAAS,EAAqB,KAAK,CACxB,IAAK,OACL,MAAO,UACP,SAAU,OACV,MAAA0L,CAAA,CACD,EAEM/C,EAAAA,MAAM,KACXgD,EAAAA,SAAS,IAAM,CACbD,EAAM,KAAA,EACNA,EAAM,SAAA,CAAS,CAChB,CAAA,CACH,CACD,CAAA,EAEL,CAAC/L,CAAM,CAAA,CAEX,ECjBMiM,GAA2B,IAAM,CACrC,MAAMjM,EAASqC,EAAA,EACT,CAAE,qBAAAhC,CAAA,EAAyB8B,EAAA,EAEjCvB,EAAAA,aACE,IACEZ,GAAQ,SAAS,QAAQ,KACvB8C,EAAAA,IAAI,CAAC,CAAE,UAAAoJ,CAAA,IAAgBA,CAAS,EAChC/C,uBAAA,EACAgD,EAAAA,KAAK,CAAC,EACNtL,EAAAA,IAAKqL,GAAc,CACjB7L,EAAqB,KAAK,CACxB,IAAK,kBACL,MAAO,oBACP,YAAa,GAAG6L,EAAY,GAAG,IAAA,CAChC,CAAA,CACF,CAAA,EAEL,CAAClM,EAAQK,CAAoB,CAAA,CAEjC,EAEa+L,GAAmB,IAAM,CACpC,KAAM,CAAE,qBAAA/L,CAAA,EAAyB8B,EAAA,EAEjC8J,GAAA,EACAN,GAAA,EAEA/K,EAAAA,aACE,IACEP,EAAqB,KACnB4C,EAAAA,OAAOC,EAAAA,SAAS,EAChBmJ,EAAAA,SAAUC,GAAiB,CACzB,MAAMC,EAAWD,EAAa,UAAY,IAEpC1E,EAAQJ,EAAQ,OAAO,CAC3B,MAAO8E,EAAa,MACpB,YAAaA,EAAa,YAC1B,SAAAC,CAAA,CACD,EAEKC,EAAoBnM,EAAqB,KAC7C8L,EAAAA,KAAK,CAAC,EACNlJ,SAAQwJ,GAAM,CAAC,CAACH,EAAa,KAAOG,GAAG,MAAQH,EAAa,GAAG,CAAA,EAGjE,OAAOI,EAAAA,MACLC,EAAAA,MAAMJ,CAAQ,EACdD,EAAa,OAAStD,EAAAA,MACtBwD,CAAA,EACA,KACA/C,QAAA,EACAuC,EAAAA,SAAS,IAAM,CACbxE,EAAQ,QAAQI,CAAK,CAAA,CACtB,CAAA,CACH,CACD,CAAA,EAEL,CAACvH,CAAoB,CAAA,CAEzB,ECpEauM,GAAY5L,EAAM,WAC7B,SAAmBC,EAAOC,EAAK,CAC7B,KAAM,CACJ,UAAA2L,EACA,SAAA9M,EACA,UAAAuB,EAAY,GACZ,QAAAwL,EACA,UAAAvL,EACA,GAAGE,CAAA,EACDR,EAEJ,OACEyC,EAAAA,KAACqJ,EAAAA,QAAc,KAAd,CACE,GAAGtL,EACJ,YAAa,CAAE,GAAGA,EAAK,YAAa,OAAQ,CAAA,EAE5C,SAAA,CAAAX,EAAAA,IAACiM,EAAAA,QAAc,QAAd,CAAsB,QAAO,GAAE,SAAAhN,EAAS,EACzCe,EAAAA,IAACY,EAAAA,OAAA,CAAO,SAAU,CAACJ,EAAW,UAAWC,EACvC,SAAAT,EAAAA,IAACiM,EAAAA,QAAc,WAAd,CACC,SAAArJ,EAAAA,KAACqJ,EAAAA,QAAc,QAAd,CACC,MAAM,OACN,GAAG,IACH,GAAG,IACH,UAAU,KACV,QAAQ,KACR,IAAA7L,EAEC,SAAA,CAAA2L,GACC/L,EAAAA,IAACiM,UAAc,MAAd,CACC,eAACA,UAAc,SAAd,CAAA,CAAuB,EAC1B,EAEDD,CAAA,CAAA,CAAA,EAEL,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CAGN,EAEaE,GAAUhM,EAAM,WAG3B,SAAiBC,EAAOC,EAAK,CAC7B,KAAM,CAAE,SAAAnB,EAAU,GAAG0B,CAAA,EAASR,EAC9B,aACG2L,GAAA,CAAU,QAAS7M,EAAW,GAAG0B,EAAM,IAAAP,EACtC,SAAAJ,EAAAA,IAACmM,EAAAA,WAAA,CACC,QAAQ,QACR,aAAW,OACX,KAAK,MACL,aAAa,OAEb,eAACC,GAAAA,2BAAA,CAAA,CAA2B,CAAA,CAAA,EAEhC,CAEJ,CAAC,ECjEYC,GAAcnM,EAAM,WAG/B,SAAqBC,EAAOC,EAAK,CACjC,OACEJ,EAAAA,IAACsM,EAAAA,SAAe,MAAf,CAAsB,GAAGnM,EAAO,IAAAC,EAC/B,SAAAJ,EAAAA,IAACsM,EAAAA,SAAe,MAAf,CAAA,CAAqB,CAAA,CACxB,CAEJ,CAAC,EAM4BpM,EAAM,WAGjC,SAAuBC,EAAOC,EAAK,CACnC,KAAM,CAAE,SAAAnB,EAAU,KAAAsN,EAAM,GAAG5L,GAASR,EACpC,cACGmM,EAAAA,SAAe,MAAf,CAAsB,GAAG3L,EAAM,IAAAP,EAC7B,SAAA,CAAAnB,EACAsN,GAAQvM,EAAAA,IAACkM,GAAA,CAAS,SAAAK,CAAA,CAAK,CAAA,EAC1B,CAEJ,CAAC,EAEM,MAAMC,GAAeF,EAAAA,SAAe,KAC9BG,GAAoBH,EAAAA,SAAe,UC/BnCI,EAAuB,IAAM,CACxC,MAAM5C,EAAaL,EAAA,EACbkD,EAAiB7C,GAAY,qBAAuB,EAEpD8C,GACH9C,GAAY,+BAAiC,GAAK,EAE/C+C,GAAsB/C,GAAY,6BAA+B,GAAK,EAEtEgD,GACHhD,GAAY,YACTA,GAAY,0BACZA,GAAY,yBAA2B,EACvCiD,GACHjD,GAAY,YACTA,GAAY,wBACZA,GAAY,uBAAyB,EAErC,CAACkD,EAAgB,EAAGC,EAAiB,CAAC,EAAI,CAC9CH,EACAC,CAAA,EACA,KAAK,CAACG,EAAGC,IAAMD,EAAIC,CAAC,EAEhBC,EACJtD,GAAY,4BACVA,GAAY,yBACdA,GAAY,sBAAwBA,GAAY,kBAE5CuD,EAAwBvD,GAAY,YACtCA,GAAY,8BACZA,GAAY,mBAEhB,MAAO,CACL,eAAA6C,EACA,eAAAG,EACA,aAAAC,EACA,qBAAAH,EACA,mBAAAC,EACA,wBAAAO,EACA,sBAAAC,EACA,cAAAL,EACA,eAAAC,CAAA,CAEJ,ECpCaK,GAAwB,IAAM,CACzC,MAAMxD,EAAaL,EAAA,EACb,CACJ,eAAAkD,EACA,cAAAK,EACA,eAAAC,EACA,sBAAAI,EACA,wBAAAD,CAAA,EACEV,EAAA,EACEa,EAAW,KAAK,OAAOzD,GAAY,0BAA4B,GAAK,GAAG,EAEvE0D,EACJC,GAEIA,GAAa,WACR,GAAGA,EAAY,KAAK,MAAMD,EAAgBC,EAAY,UAAU,CAAC,GAEnEA,GAAa,OAAS,GAGzBC,EAAeF,EAAgB1D,GAAY,gBAAgB,EAEjE,OACElH,OAACG,EAAAA,OAAM,WAAW,SAAS,IAAK,EAAG,KAAK,OAAO,SAAS,OACtD,SAAA,CAAA/C,EAAAA,IAACwM,GAAA,CAAa,MAAOe,EAAU,KAAK,KAAK,MAAO,IAC9C,SAAA3K,EAAAA,KAACuG,EAAAA,OAAA,CAAO,eAAe,gBACrB,SAAA,CAAAnJ,EAAAA,IAACqM,GAAA,CAAY,MAAO,GAAA,CAAK,EACzBrM,EAAAA,IAACyM,GAAA,CAAmB,SAAA,GAAGc,CAAQ,GAAA,CAAI,CAAA,CAAA,CACrC,CAAA,CACF,EACAvN,MAACgD,EAAAA,KAAA,CAAK,SAAQ,GAAC,SAAS,OAAO,SAAS,KAAK,GAAI,EAC9C,SAAA0K,EAAe,YAAYA,CAAY,GAAK,IAC/C,EACC,CAACf,GACA/J,EAAAA,KAACuG,EAAAA,OAAA,CACC,SAAA,CAAAnJ,MAACgD,EAAAA,MAAK,SAAS,KACZ,WACG,GAAGgK,EAAgB,CAAC,MAAMC,EAAiB,CAAC,OAAOI,CAAqB,GACxE,GAAGL,EAAgB,CAAC,OAAOK,CAAqB,GACtD,EACC,CAAC,CAACvD,GAAY,aACblH,EAAAA,KAAA0B,EAAAA,SAAA,CACE,SAAA,CAAAtE,EAAAA,IAACgD,EAAAA,MAAK,SAAA,GAAA,CAAC,EACPJ,EAAAA,KAACI,EAAAA,KAAA,CAAK,SAAS,KAAK,SAAA,CAAA,KACf8G,GAAY,wBAA0B,GAAK,EAAE,GAAA,CAAA,CAClD,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EAEJ,CAEJ,EC1Da6D,EAAW3O,EAAAA,KACtB,CAAC,CACC,SAAAC,EACA,SAAA2O,EACA,GAAGjN,CAAA,IAGDX,EAAAA,IAAC0F,EAAAA,SAAA,CACC,QAAQ,OACR,cAAc,MACd,MAAM,OACN,SAAS,WACR,GAAIkI,IAAa,SAAW,CAAE,OAAQ,GAAM,CAAE,IAAK,CAAA,EACpD,cACEA,IAAa,SACT,CACE,MAAO,6BACP,QAAS,2BAAA,EAEX,CACE,MAAO,0BACP,QAAS,wBAAA,EAGjB,kBAAkB,WAClB,QAAQ,WACR,WAAW,SACX,eAAe,SACf,OAAO,KACP,EAAG,EACF,GAAGjN,EAEH,SAAA1B,CAAA,CAAA,CAIT,EClCM4O,GAAiBC,EAAAA,OAAOC,EAAQ,EAEzBC,GAAehP,EAAAA,KAAMmB,GAE9BH,EAAAA,IAAC2F,EAAAA,IAAA,CACC,QAAQ,WACR,IAAK,CACH,OAAQ,YACR,kBAAmB,uBACnB,gBAAiB,2BAAA,EAGnB,SAAA3F,EAAAA,IAAC6N,GAAA,CACC,SAAU,GACV,MAAO,CACL,QAAS,CAAA,EAEX,IAAK,CACH,sCAAuC,CACrC,UAAW,yCAAA,EAEb,+BAAgC,CAC9B,UAAW,uCAAA,EAEb,kDAAmD,CACjD,UAAW,yCAAA,CACb,EAEF,OAAQ,CACN,KAAM,CACJ,OAAQ,MACR,IAAK,MACL,UAAW,mBACX,gBAAiB,sBAAA,EAEnB,MAAO,CACL,OAAQ,MACR,IAAK,MACL,UAAW,mBACX,gBAAiB,oBAAA,EAEnB,OAAQ,CACN,MAAO,OACP,OAAQ,OACR,IAAK,MACL,YAAa,qBACb,UAAW,aAAa1N,EAAM,QAAU,MAAQ,MAAM,UACtD,gBAAiB,YACjB,UAAW,KAAA,CACb,EAED,GAAGA,CAAA,CAAA,CACN,CAAA,CAGL,ECpDK8N,GAAkB,IAAM,CAE5B,MAAMC,EADazE,EAAA,GACe,cAC5B,CAAE,eAAgB0E,EAAiB,sBAAAd,EAAwB,CAAA,EAC/DX,EAAA,EACI0B,EAAcF,EAChB,KAAK,OAAOC,GAAmB,GAAK,CAAC,EACrCA,EACE,CAACxO,EAAO0O,CAAW,EAAIC,EAAAA,eAAe,IAC1CzP,SAAO,CACL,QAASuP,GAAe,CAAA,CACzB,CAAA,EAEGG,EAAM,EACNC,EAAM,KAAK,IACf,EACAN,EACI,KAAK,OAAOb,EAAwB,GAAK,CAAC,EAC1CA,EAAwB,CAAA,EAG9BxN,OAAAA,EAAAA,UAAU,IAAM,CACdwO,EAAY,OAAOD,GAAe,CAAC,CAAA,EAClC,CAACA,EAAaC,CAAW,CAAC,EAEtB,CACL,MAAA1O,EACA,YAAA0O,EACA,IAAAE,EACA,IAAAC,CAAA,CAEJ,EAEaC,GAAYtO,GAA+C,CACtE,MAAMjB,EAASqC,EAAA,EACTuI,EAAaL,EAAA,EACb,CAAE,SAAAiF,CAAA,EAAa3M,aAAW,IAAM7C,GAAQ,QAAS,CAACA,CAAM,CAAC,GAAK,CAAA,EAC9DyP,EAAUD,GAAU,mBAAqB,MACzCR,EAAgBpE,GAAY,cAC5B,CAAE,sBAAAuD,EAAwB,EAAG,qBAAAT,CAAA,EACjCF,EAAA,EACIkC,EAAO,EACPC,EAA0BjC,EAC1B,CAAE,MAAAjN,EAAO,YAAA0O,EAAa,IAAAE,EAAK,IAAAC,CAAA,EAAQP,GAAA,EAEnCa,EACJC,EAAAA,YACGC,GAAW,CACV,KAAM,CAACrP,EAAQ,CAAC,EAAI,MAAM,QAAQqP,CAAM,EAAIA,EAAS,CAACA,CAAM,EAE5DX,EAAY,OAAO1O,CAAK,EAExB,MAAMmG,GAAYoI,EACd,KAAK,MAAMvO,CAAK,EAAI,EACpB,KAAK,MAAMA,CAAK,EAEfkP,EAMH3P,GAAQ,WAAW,oBAAoB,CACrC,UAAA4G,GACA,YAAa5G,EAAO,WAAW,MAAM,qBAAuB,EAC5D,UAAW,EAAA,CACZ,EATDA,GAAQ,WAAW,sBAAsB,CACvC,kBAAmB4G,GACnB,UAAW,EAAA,CACZ,CAOH,EAEF,CAAC5G,EAAQgP,EAAeG,EAAaQ,CAAuB,CAAA,EAkChE,OAxBA/O,EAAAA,aACE,IACEZ,GAAQ,WAAW,aAAa,CAC9B,SAAU,IACV,QAASmP,EAAY,OAAA,CACtB,EACH,CAACnP,EAAQmP,CAAW,CAAA,EAYpBhB,IAA0B,GACzBa,GAAiBb,IAA0B,EAKzBrN,MAAC2F,EAAAA,IAAA,CAAI,MAAOxF,EAAM,MAAO,EAG5CH,EAAAA,IAACgO,GAAA,CACC,MAAO,CAACrO,CAAK,EACb,IAAA6O,EACA,IAAAD,EACA,QAAAI,EACA,KAAAC,EACA,SAAAE,EACC,GAAG3O,CAAA,CAAA,CAkBV,EC3Ga8O,GAAYjQ,EAAAA,KACvB,CAAC,CACC,KAAAgK,EACA,YAAAkG,CAAA,IAMI,CACJ,MAAMhQ,EAASqC,EAAA,EACT,CAAE,gBAAA/B,CAAA,EAAoB6B,EAAA,EACtB8N,EAAapN,EAAAA,WAAW,IAAM7C,GAAQ,WAAW,OAAQ,CAACA,CAAM,CAAC,EACjEkQ,EAAWrN,EAAAA,WAAW,IAAM7C,GAAQ,SAAS,QAAS,CAACA,CAAM,CAAC,EAC9DmQ,EAAYtN,EAAAA,WAAW,IAAM7C,GAAQ,KAAK,OAAQ,CAACA,CAAM,CAAC,EAC1DoQ,EAAkBF,GAAU,uBAAyB,aACrDG,EACJH,GAAU,4BAA8B,WACpC,CAACI,EAAaC,CAAc,EAAI7L,EAAAA,SAAS,EAAI,EAEnD,OACEhB,EAAAA,KAAC+K,EAAA,CACC,QAAS3E,EACT,SAAS,SACT,QAAQ,OACR,cAAc,SACd,SAAS,OACT,GAAI,EACJ,GAAI,EAEJ,SAAA,CAAApG,EAAAA,KAACuG,EAAAA,OAAA,CACC,KAAM,EACN,WAAW,SACX,eAAe,SACf,SAAS,OACT,GAAI,EAEJ,SAAA,CAAAnJ,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,WAAY,EACZ,QAAS,IAAMjN,GAAQ,WAAW,uBAAA,EAClC,SACE,CAACiQ,GAAY,oBAAsB,CAACA,GAAY,kBAGjD,SAAAI,EAAsBvP,MAAC0P,EAAAA,gBAAA,CAAA,CAAgB,QAAMC,EAAAA,kBAAA,CAAA,CAAkB,CAAA,CAAA,EAElE/M,EAAAA,KAACG,EAAAA,MAAA,CACC,KAAM,EACN,KAAM,IACN,IAAK,EACL,WAAW,SACX,SAAS,OACT,GAAI,EAEJ,SAAA,CAAA/C,EAAAA,IAACsN,GAAA,EAAsB,EACvBtN,EAAAA,IAACyO,GAAA,CACC,MAAO,CACL,MAAO,OACP,SAAU,QACV,OAAQ,MAAA,CACV,CAAA,CACF,CAAA,CAAA,EAEFzO,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,SACE,CAACgD,GAAY,qBACb,CAACA,GAAY,qBAEf,QAAS,IAAM,CACbjQ,GAAQ,WAAW,2BAAA,CAA2B,EAG/C,SAAAqQ,EACCvP,MAAC4P,EAAAA,kBAAA,CAAA,CAAkB,QAElBC,EAAAA,mBAAA,CAAA,CAAmB,CAAA,CAAA,CAExB,CAAA,CAAA,QAED1G,EAAAA,OAAA,CAAO,UAAU,UAAU,WAAW,SAAS,eAAe,SAC7D,SAAAvG,EAAAA,KAACkN,EAAAA,YAAY,KAAZ,CACC,KAAMN,EACN,KAAM,EACN,aAAc,CAAC,CAAE,KAAAxG,KAAW,CAC1ByG,EAAezG,CAAI,CAAA,EAErB,MAAM,OAEN,SAAA,CAAAhJ,EAAAA,IAAC8P,EAAAA,YAAY,QAAZ,CACC,SAAS,IACT,MAAM,OACN,QAAQ,OACR,eAAe,SAEf,SAAA9P,EAAAA,IAAC+P,EAAAA,cAAA,CACC,MAAO,CACL,UAAWP,EAAc,eAAiB,gBAAA,CAC5C,CAAA,CACF,CAAA,QAEDM,EAAAA,YAAY,QAAZ,CAAoB,QAAQ,OAAO,eAAe,SACjD,SAAAlN,EAAAA,KAAC+C,EAAAA,IAAA,CAAI,QAAQ,OAAO,UAAU,OAAO,GAAI,EAAG,GAAI,EAC9C,SAAA,CAAA3F,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAM+C,EAAY,MAAM,EAEjC,eAACc,EAAAA,aAAA,CAAA,CAAa,CAAA,CAAA,EAEhBhQ,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,oBACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAM+C,EAAY,KAAK,EAEhC,eAACe,EAAAA,kBAAA,CAAA,CAAkB,CAAA,CAAA,EAEpBzO,EAAkBtC,CAAM,GACvBc,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,SACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAM+C,EAAY,QAAQ,EAEnC,eAACgB,EAAAA,SAAA,CAAA,CAAS,CAAA,CAAA,EAGbzO,EAAuBvC,CAAM,GAC5Bc,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,YACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAM+C,EAAY,WAAW,EAEtC,eAACiB,GAAAA,YAAA,CAAA,CAAY,CAAA,CAAA,EAGhB1O,EAAuBvC,CAAM,GAC5Bc,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,cACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAM+C,EAAY,aAAa,EAExC,eAACpM,EAAAA,cAAA,CAAA,CAAc,CAAA,CAAA,EAGlBnB,EAAiBzC,CAAM,GACtBc,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAM,CACb3M,EAAgB,KAAK,EAAI,CAAA,EAE3B,SAAU,CAAC8P,EAEX,eAACc,EAAAA,mBAAA,CAAA,CAAmB,CAAA,CAAA,EAGxBpQ,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,aACX,KAAK,KACL,QACEkD,GAAW,WAAaA,EAAU,aAAe,EAC7C,QACA,QAEN,QAAS,IAAM,CACTA,GAAW,UACbnQ,GAAQ,KAAK,KAAA,EAEbA,GAAQ,KAAK,MAAM,CACjB,QAAS,GACT,MAAO,EAAA,CACR,CACH,EAGF,eAACmR,EAAAA,oBAAA,CAAA,CAAoB,CAAA,CAAA,EAEtB3O,EAAmBxC,CAAM,GACxBc,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,UACX,KAAK,KACL,QAAQ,QACR,QAAS,IAAM+C,EAAY,SAAS,EAEpC,eAACoB,GAAAA,eAAA,CAAA,CAAe,CAAA,CAAA,CAClB,CAAA,CAEJ,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAAA,CACF,CAGN,ECxOaC,GAAgB,IAAM,CACjC,KAAM,CAACC,EAAcC,CAAe,EAAI7M,EAAAA,SAAS,EAAK,EAEhD8M,EAA0B3B,EAAAA,YAAY,IACtC,SAAS,kBACJ,SACJ,iBACA,MAAM,QAAQ,KAAK,EACnB,KAAK,IAAM,CACV0B,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,EAEL5Q,OAAAA,EAAAA,UAAU,IAAM,CACd,SAAS8Q,GAA0B,CACjCF,EAAgB,CAAC,CAAC,SAAS,iBAAiB,CAAA,CAG9C,gBAAS,iBAAiB,mBAAoBE,CAAuB,EAE9D,IAAM,CACX,SAAS,oBAAoB,mBAAoBA,CAAuB,CAAA,CAC1E,EACC,EAAE,EAEE,CACL,aAAAH,EACA,wBAAAE,CAAA,CAEJ,EClCaE,GAAS5R,EAAAA,KACpB,CAAC,CACC,KAAAgK,EACA,YAAAkG,CAAA,IAII,CACJ,MAAMhQ,EAASqC,EAAA,EACTmN,EAAW3M,EAAAA,WAAW,IAAM7C,GAAQ,QAAQ,UAAW,CAACA,CAAM,CAAC,EAC/D,CAAE,aAAAsR,EAAc,wBAAAE,CAAA,EAA4BH,GAAA,EAElD,OACE3N,EAAAA,KAAC+K,EAAA,CACC,QAAS3E,EACT,SAAS,MACT,OAAO,OACP,eAAe,gBAEf,SAAA,CAAAhJ,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,WAAY,EACZ,QAAS,IAAM+C,EAAY,MAAM,EAEjC,eAAC2B,EAAAA,eAAA,CAAA,CAAe,CAAA,CAAA,EAElB7Q,EAAAA,IAAC+C,EAAAA,MAAA,CACC,KAAM,EACN,KAAM,IACN,IAAK,EACL,WAAW,SACX,SAAS,OACT,GAAI,EAEJ,eAACC,OAAA,CAAK,SAAQ,GAAC,SAAS,OACrB,YAAU,KAAA,CACb,CAAA,CAAA,SAEDmG,EAAAA,OAAA,CACC,SAAA,CAAAnJ,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,QAAS,IAAM+C,EAAY,MAAM,EAEjC,eAAC4B,EAAAA,SAAA,CAAA,CAAS,CAAA,CAAA,EAEZ9Q,EAAAA,IAACmM,EAAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,QAASuE,EAER,SAAAF,EAAexQ,MAAC+Q,EAAAA,iBAAA,CAAA,CAAiB,QAAMC,EAAAA,aAAA,CAAA,CAAa,CAAA,CAAA,CACvD,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CAGN,ECjEaC,GAAYjS,EAAAA,KACvB,CAAC,CACC,YAAAkQ,CAAA,IAaI,CACJ,KAAM,CAAC/P,CAAa,EAAImL,EAAA,EAClB,CAAE,gBAAA9K,CAAA,EAAoB6B,EAAA,EACtB6P,EAAY3G,EAAAA,eAAe/K,CAAe,EAEhD,OACEoD,EAAAA,KAAA0B,WAAA,CACE,SAAA,CAAAtE,EAAAA,IAAC4Q,GAAA,CAAO,KAAMzR,GAAiB,CAAC+R,EAAW,YAAAhC,EAA0B,EACrElP,EAAAA,IAACiP,GAAA,CACC,KAAM9P,GAAiB,CAAC+R,EACxB,YAAAhC,CAAA,CAAA,CACF,EACF,CAAA,CAGN,EC3BaiC,GAAQjR,EAAM,WACzB,SAAeC,EAAOC,EAAK,CACzB,KAAM,CAAE,MAAAgR,EAAO,SAAAnS,EAAU,WAAAoS,EAAY,UAAAC,EAAW,aAAAC,EAAc,GAAG5Q,GAC/DR,EACF,cACGqR,EAAAA,MAAY,KAAZ,CAAiB,IAAApR,EAAW,GAAGO,EAC7B,SAAA,CAAAyQ,GACCxO,EAAAA,KAAC4O,EAAAA,MAAY,MAAZ,CACE,SAAA,CAAAJ,EACDpR,EAAAA,IAACwR,EAAAA,MAAY,kBAAZ,CAA8B,SAAUD,CAAA,CAAc,CAAA,EACzD,EAEDtS,EACAoS,GACCrR,EAAAA,IAACwR,EAAAA,MAAY,WAAZ,CAAwB,SAAAH,EAAW,EAErCC,GACCtR,EAAAA,IAACwR,EAAAA,MAAY,UAAZ,CAAuB,SAAAF,CAAA,CAAU,CAAA,EAEtC,CAAA,CAGN,ECxBaG,EAAQvR,EAAM,WACzB,SAAeC,EAAOC,EAAK,CACzB,KAAM,CAAE,SAAAnB,EAAU,WAAAyS,EAAY,QAAAC,EAAS,GAAGhR,GAASR,EACnD,cACGyR,EAAAA,WAAiB,KAAjB,CAAsB,IAAKD,EAAU,GAAGhR,EACvC,SAAA,CAAAX,EAAAA,IAAC4R,EAAAA,WAAiB,gBAAjB,CAAiC,IAAAxR,EAAW,GAAGsR,CAAA,CAAY,EAC5D1R,MAAC4R,EAAAA,WAAiB,cAAjB,EAA+B,EAC/B3S,GACCe,EAAAA,IAAC4R,EAAAA,WAAiB,SAAjB,CAA2B,SAAA3S,CAAA,CAAS,CAAA,EAEzC,CAAA,CAGN,EAEa4S,GAAaD,EAAAA,WAAiB,KCd9BE,GAAS5R,EAAM,WAC1B,SAAgBC,EAAOC,EAAK,CAC1B,KAAM,CAAE,MAAO2R,EAAW,MAAAX,EAAO,UAAAY,EAAW,GAAGrR,GAASR,EAClDR,EAAQQ,EAAM,cAAgBA,EAAM,MAEpC8R,EAAQF,GAAW,IAAKG,GACxB,OAAOA,GAAS,SAAiB,CAAE,MAAOA,EAAM,MAAO,MAAA,EACpDA,CACR,EAEKC,EAAe,CAAC,CAACF,GAAO,KAAMC,GAASA,EAAK,KAAK,EAEvD,OACEtP,EAAAA,KAACwP,SAAa,KAAb,CAAkB,IAAAhS,EAAU,eAAe,SAAU,GAAGO,EACtD,SAAA,CAAAyQ,GAAS,CAACY,GACThS,MAACoS,EAAAA,OAAa,MAAb,CAAoB,SAAAhB,EAAM,EAE5BA,GAASY,GACRpP,OAACuG,EAAAA,OAAA,CAAO,QAAQ,gBACd,SAAA,CAAAnJ,EAAAA,IAACoS,EAAAA,OAAa,MAAb,CAAoB,SAAAhB,CAAA,CAAM,EAC3BpR,MAACoS,EAAAA,OAAa,UAAb,CAAA,CAAuB,CAAA,EAC1B,SAEDA,EAAAA,OAAa,QAAb,CAAqB,sBAAqBD,GAAgB,OACzD,SAAA,CAAAnS,MAACoS,EAAAA,OAAa,MAAb,CACC,eAACA,SAAa,MAAb,CAAA,CAAmB,EACtB,EACApS,MAACqS,IAAa,MAAA1S,EAAc,EAC5BK,MAACsS,IAAY,MAAAL,CAAA,CAAc,CAAA,CAAA,CAC7B,CAAA,EACF,CAAA,CAGN,EAEA,SAASI,GAAalS,EAA6B,CACjD,KAAM,CAAE,MAAAR,GAAUQ,EAClB,aACGoS,MAAA,CAAI,KAAM5S,EACR,SAAA,CAAC6S,EAAGC,IACHzS,MAACoS,EAAAA,OAAa,MAAb,CAA+B,MAAAK,EAC9B,SAAAzS,MAACoS,EAAAA,OAAa,YAAb,EAAyB,CAAA,EADHK,CAEzB,EAEJ,CAEJ,CAMA,MAAMH,GAAcpS,EAAM,WACxB,SAAqBC,EAAOC,EAAK,CAC/B,KAAM,CAAE,MAAA6R,GAAU9R,EAClB,OAAK8R,GAAO,OAGVjS,MAACoS,EAAAA,OAAa,YAAb,CAAyB,IAAAhS,EACvB,SAAA6R,EAAM,IAAI,CAACC,EAAMO,IAAU,CAC1B,MAAM9S,EAAQ,OAAOuS,GAAS,SAAWA,EAAOA,EAAK,MAC/Cd,EAAQ,OAAOc,GAAS,SAAW,OAAYA,EAAK,MAC1D,OACEtP,EAAAA,KAACwP,EAAAA,OAAa,OAAb,CAAgC,MAAAzS,EAC/B,SAAA,CAAAK,MAACoS,EAAAA,OAAa,gBAAb,EAA6B,EAC7BhB,CAAA,CAAA,EAFuBqB,CAG1B,CAAA,CAEH,EACH,EAdyB,IAczB,CAGN,EC3DaC,GAAc1T,EAAAA,KAAK,IAAM,CAEpC,KAAM,CAAE,gBAAAQ,CAAA,EAAoB6B,EAAA,EACtB6P,EAAY3G,EAAAA,eAAe/K,CAAe,EAC1CN,EAASqC,EAAA,EACToR,EAAkBhR,EAAiBzC,CAAM,EAAIA,EAAS,OACtD0T,EAAgB7Q,EAAAA,WACpB,IAAM4Q,GAAiB,MAAM,UAC7B,CAACA,CAAe,CAAA,EAGlB,OACE3S,EAAAA,IAACe,EAAA,CACC,UAAS,GACT,KAAMmQ,EACN,aAAepN,GAAMtE,EAAgB,KAAKsE,EAAE,IAAI,EAChD,UAAU,SAEV,gBAACvD,EAAA,CACC,SAAA,CAAAP,MAACiB,EAAA,CACC,SAAAjB,EAAAA,IAACmB,EAAA,CAAY,SAAA,cAAA,CAAY,EAC3B,EACAnB,EAAAA,IAACkB,EAAA,CACC,SAAA0B,EAAAA,KAACiQ,WAAS,KAAT,CACC,SAAA,CAAA7S,EAAAA,IAAC6S,EAAAA,SAAS,WAAT,CAAoB,SAAA,gEAAA,CAErB,EACAjQ,EAAAA,KAACiQ,EAAAA,SAAS,QAAT,CACC,SAAA,CAAA7S,EAAAA,IAACmR,GAAA,CAAM,MAAM,UACX,SAAAnR,EAAAA,IAAC6R,GAAA,CACC,aAAc,MACd,cAAgB/N,GAAM,CACpB,MAAMnE,EAAQmE,EAAE,MAChB6O,GAAiB,MAAM,OAAO,CAC5B,YAAahT,EACb,YAAa,EAAA,CACd,CAAA,EAEH,MAAOiT,GAAe,aAAe,MAErC,SAAAhQ,EAAAA,KAACG,EAAAA,MAAA,CAAM,IAAK,EACV,SAAA,CAAA/C,EAAAA,IAACyR,EAAA,CAAM,MAAO,UAAiC,SAAA,UAE/C,EACAzR,EAAAA,IAACyR,EAAA,CAAM,MAAO,SAAgC,SAAA,SAAM,EACpDzR,EAAAA,IAACyR,EAAA,CAAM,MAAO,MAA6B,SAAA,uBAE3C,EACAzR,EAAAA,IAACyR,EAAA,CAAM,MAAO,SAAgC,SAAA,QAAA,CAAM,CAAA,CAAA,CACtD,CAAA,CAAA,EAEJ,EACAzR,EAAAA,IAAC8R,GAAA,CACC,MAAM,oBACN,UAAS,GACT,IAAK,IACL,IAAK,GACL,KAAM,EACN,SAAUc,GAAe,cAAgB,SACzC,MAAO,CAACA,GAAe,aAAe,EAAkB,EACxD,cAAgB9O,GAAM,CACpB,MAAMnE,EAAQmE,EAAE,MAAM,CAAC,GAAK,EAE5B6O,GAAiB,MAAM,OAAO,CAC5B,YAAahT,CAAA,CACd,CAAA,CACH,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,EACAK,EAAAA,IAACgB,EAAA,CACC,SAAAhB,EAAAA,IAACoB,EAAA,CAAoB,QAAO,GAC1B,SAAApB,EAAAA,IAACmE,EAAAA,OAAA,CAAO,QAAQ,UAAU,SAAA,OAAA,CAAK,CAAA,CACjC,EACF,QACCrD,EAAA,CAAA,CAAmB,CAAA,CAAA,CACtB,CAAA,CAAA,CAGN,CAAC,ECnGYgS,GAAiB9T,EAAAA,KAC5B,CAAC,CACC,YAAA+T,EAAc,GACd,YAAAC,EAAc,EACd,KAAAC,EACA,IAAAC,EAAM,IACN,QAAAC,EACA,kBAAA1O,CAAA,IASI,CAEJ,MAAM2O,EAASL,EAAY,UACzB,KAAK,IAAIC,EAAc,GAAiB,CAAC,EACzC,KAAK,IAAIA,EAAa,CAAC,CAAA,EAEnBK,EAAQN,EAAY,UACxB,KAAK,IAAIC,EAAcC,EAAK,OAAQF,EAAY,OAAS,CAAC,EAC1D,KAAK,IACHC,EAAcC,EAAK,OAAS,GAC5BF,EAAY,OAAS,CAAA,CACvB,EAGF,OACEnQ,EAAAA,KAACC,EAAAA,KAAA,CACC,KAAMqQ,EACN,MAAO,CAAE,OAAQ,EAAG,SAAU,QAAA,EAC9B,QAAUpP,GAAM,CACdA,EAAE,eAAA,EAEFqP,EAAQD,CAAG,CAAA,EAEb,QAAQ,OACR,cAAc,SACd,WAAW,aACX,IAAK,EAEL,SAAA,CAAAtQ,EAAAA,KAACI,EAAAA,KAAA,CAAK,UAAW,EAAG,GAAG,OAAO,MAAO,CAAE,QAAS,OAAA,EAAW,SAAA,CAAA,IACvDoQ,EACFpT,EAAAA,IAAC,KAAG,SAAAiT,CAAA,CAAK,EACRI,EAAM,GAAA,EACT,QACCrQ,EAAAA,KAAA,CAAK,SAAS,KAAK,MAAM,WAAW,MAAO,CAAE,eAAgB,MAAA,EAC3D,SAAA,cAAcyB,IAAsB,OAAYA,EAAoB,EAAI,sBAAsB,EAAA,CACjG,CAAA,CAAA,CAAA,CACF,CAGN,EC9CM6O,GAAgB,IAETC,GAAY,IAAM,CAC7B,MAAMC,EAAgBlU,EAAAA,YAAY,IAAM,IAAImU,EAAAA,gBAAgB,EAAE,CAAC,EACzDC,EAAc3R,EAAAA,WAAWyR,CAAa,EACtCtU,EAASqC,EAAA,EACToS,EAAmBnS,EAAkBtC,CAAM,EAAIA,EAAS,OAExD0U,EAAS7R,EAAAA,WAAW,IACjByR,EAAc,KACnBnL,uBAAA,EACAhG,EAAAA,UAAW1C,GACTA,IAAU,IAAM,CAACgU,EACbhP,EAAAA,GAAG,MAAS,EACZiH,EAAAA,MACEjH,KAAG,CACD,KAAM,QACN,KAAM,MAAA,CACP,EACDkH,EAAAA,MAAMyH,EAAa,EAAE,KACnBjR,EAAAA,UAAU,IAAMsR,EAAiB,OAAO,OAAOhU,CAAK,CAAC,EACrDqC,EAAAA,IAAK6R,IAAU,CAAE,KAAM,MAAgB,KAAAA,GAAO,CAAA,CAChD,CACF,CACN,EAED,CAACF,EAAkBH,CAAa,CAAC,EAEpC,MAAO,CACL,MAAOE,EACP,SAAUF,EAAc,KAAK,KAAKA,CAAa,EAC/C,OAAQI,GAAQ,MAAQ,OACxB,KAAMA,GAAQ,IAAA,CAElB,ECtCaE,GAAsB9U,EAAAA,KACjC,CAAC,CAAE,WAAAuD,CAAA,IAA6C,CAC9C,MAAMrD,EAASqC,EAAA,EACT,CAAE,MAAOmS,EAAa,SAAAK,EAAU,OAAAC,EAAQ,KAAAH,CAAA,EAASN,GAAA,EAEjDU,EAAiBnQ,GAA2C,CAChEiQ,EAASjQ,EAAE,OAAO,KAAK,CAAA,EAGnBqP,EAAUpE,EAAAA,YACbmE,GAAgB,CACf3Q,EAAA,EACArD,GAAQ,WAAW,QAAQgU,CAAG,CAAA,EAEhC,CAAChU,EAAQqD,CAAU,CAAA,EAGf2R,EAAsBnS,EAAAA,WAC1B,IAAM7C,GAAQ,eAAe2U,GAAM,MAAM,EAAG,GAAG,GAAK,EAAE,EACtD,CAACA,CAAI,CAAA,EAGP,cACG9Q,QAAA,CAAM,KAAM,EAAG,OAAO,OAAO,IAAK,EACjC,SAAA,CAAA/C,EAAAA,IAACmU,EAAAA,MAAA,CACC,YAAY,oBACZ,MAAOT,EACP,SAAUO,EACV,WAAY,EACZ,QAAQ,SACR,KAAK,SACL,UAAU,OACV,iBAAiB,OACjB,QAAQ,OACR,eAAe,aAAA,CAAA,EAEjBrR,EAAAA,KAACG,EAAAA,MAAA,CACC,MAAO,CAAE,SAAU,SAAU,UAAW,MAAA,EACxC,SAAS,OACT,GAAI,EACJ,KAAM,EAEL,SAAA,CAAAiR,IAAW,SAAWhU,EAAAA,IAACgD,EAAAA,KAAA,CAAK,SAAA,gBAAa,EACzC6Q,GAAM,SAAW,GAAK7T,EAAAA,IAACgD,EAAAA,MAAK,SAAA,aAAU,EACtCgR,IAAW,QAAUH,GAAM,QAAU,GAAK,UACxC9Q,QAAA,CACC,SAAA,CAAAH,EAAAA,KAACI,EAAAA,KAAA,CAAK,SAAS,KAAM,SAAA,CAAA6Q,GAAM,OAAO,YAAA,EAAU,EAC5C7T,MAAC+C,EAAAA,OAAM,IAAK,EACT,YAAqB,IAAI,CAACqR,EAAQC,IAE/BrU,EAAAA,IAAC8S,GAAA,CAEC,YACEsB,EAAO,MAAM,OAAO,eAAe,eAC/B,aAAe,GAErB,UAAWA,EAAO,MAAM,cACxB,YAAaA,EAAO,MAAM,OAAO,aAAe,EAChD,KAAMV,EACN,IAAKU,EAAO,KAAK,IACjB,QAAAjB,EACA,kBAAmBiB,EAAO,MAAM,iBAAA,EAV3BC,CAAA,CAaV,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAEJ,EACF,CAAA,CAGN,EClEaC,GAAetV,EAAAA,KAC1B,CAAC,CACC,KAAAgK,EACA,QAAA9E,EACA,WAAA3B,CAAA,IAOEvC,EAAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiI,EACA,aAAelF,GAAMI,EAAQJ,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAA,EAC5B,eAAe,SAEf,SAAAlB,EAAAA,KAACrC,EAAA,CAAc,OAAO,OACpB,SAAA,CAAAP,MAACiB,EAAA,CACC,SAAAjB,EAAAA,IAACmB,EAAA,CAAY,SAAA,QAAA,CAAM,EACrB,EACAnB,EAAAA,IAACkB,GAAW,KAAM,EAAG,EAAG,EACtB,SAAAlB,EAAAA,IAAC8T,GAAA,CAAoB,WAAAvR,CAAA,CAAwB,CAAA,CAC/C,EACAvC,EAAAA,IAACgB,EAAA,CACC,SAAAhB,EAAAA,IAACoB,EAAA,CAAoB,QAAO,GAC1B,SAAApB,EAAAA,IAACmE,EAAAA,OAAA,CAAO,QAAQ,UAAU,SAAA,QAAA,CAAM,CAAA,CAClC,EACF,QACCrD,EAAA,CAAA,CAAmB,CAAA,CAAA,CACtB,CAAA,CAAA,CAIR,EC3CayT,GAA+BvV,EAAAA,KAC1C,CAAC,CAAE,WAAAuD,CAAA,IAA6C,CAC9C,MAAMrD,EAASqC,EAAA,EACT,CAAE,SAAAmN,EAAU,uBAAA8F,CAAA,EAChBzS,EAAAA,WAAW,IAAM7C,GAAQ,QAAS,CAACA,CAAM,CAAC,GAAK,CAAA,EAC3C,CAAE,IAAAuV,GAAQ/F,GAAY,CAAA,EACtB5E,EAAaL,EAAA,EACPgL,GAAK,IACjB,KAAM,CAAE,oBAAAC,EAAqB,0BAAAC,CAAA,EAA8B7K,GAAc,CAAA,EACnE8K,GACHJ,IAA2B,aACxBG,EACAD,IAAwB,EAE9B,IAAIG,EAAoB/K,GAAY,iBAEpC,KAAO+K,GAAmB,YACxBA,EAAoBA,GAAmB,WAGzC,MAAMC,EAAkB,CACtBC,EACAtC,EACAuC,IAEApS,EAAAA,KAAC1C,EAAM,SAAN,CACC,SAAA,CAAAF,EAAAA,IAAC2C,EAAAA,KAAK,KAAL,CACC,GAAI,GAAKqS,EAAM,GACf,MAAO,CACL,QAAS,OACT,WAAY,QAAA,EAGd,SAAApS,EAAAA,KAACC,EAAAA,KAAA,CACC,QAAS,IAAM,CACbN,EAAA,EAEArD,GAAQ,WAAW,QAAQ6V,EAAQ,IAAI,CAAA,EAEzC,KAAK,IAEJ,SAAA,CAAAF,GAAmB,OAASE,EAAQ,MACnC/U,EAAAA,IAAC2C,EAAAA,KAAK,UAAL,CAAe,QAAO,GACrB,SAAA3C,EAAAA,IAACiV,EAAAA,cAAA,CAAA,CAAc,CAAA,CACjB,EAEDJ,GAAmB,OAASE,EAAQ,YAClCpS,EAAAA,KAAK,UAAL,CAAe,QAAO,GAAC,WAAW,SACjC,SAAA3C,EAAAA,IAACiV,EAAAA,gBAAc,EACjB,EAEFrS,EAAAA,KAACG,EAAAA,MAAA,CAAM,IAAK,EACV,SAAA,CAAA/C,MAACgD,EAAAA,MAAK,SAAS,KAAM,SAAA+R,EAAQ,OAASA,EAAQ,KAAK,EAClDF,GAAmB,OAASE,EAAQ,MACnC/U,EAAAA,IAACgD,EAAAA,KAAA,CACC,UAAU,SACV,WAAW,OACX,SAAS,KACT,SAAA,qBACA4R,EAAqC,CACvC,EAAA,CAAA,CAAG,CAAA,CAEP,CAAA,CAAA,CAAA,CACF,CAAA,EAEDG,EAAQ,SAAS,OAAS,GACzB/U,EAAAA,IAAC2C,EAAAA,KAAK,KAAL,CAAU,GAAG,MAAM,IAAK,EACtB,WAAQ,SAAS,IAAI,CAACoS,EAAStC,IAC9BqC,EAAgBC,EAAStC,EAAOuC,EAAM,CAAC,CAAA,CACzC,CACF,CAAA,CAAA,EA7CiBvC,CA+CrB,EAGF,OACEzS,MAAC2C,EAAAA,KAAK,KAAL,CAAU,IAAK,EAAG,UAAU,OAAO,GAAI,EAAG,KAAM,EAC9C,SAAA8R,GAAK,IAAI,IAAI,CAACM,EAAStC,IAAUqC,EAAgBC,EAAStC,EAAO,CAAC,CAAC,CAAA,CACtE,CAAA,CAGN,EC1EayC,GAAwBlW,EAAAA,KACnC,CAAC,CACC,KAAAgK,EACA,QAAA9E,EACA,WAAA3B,CAAA,IAOEvC,EAAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAiI,EACA,aAAelF,GAAMI,EAAQJ,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAA,EAC5B,eAAe,SAEf,gBAACvD,EAAA,CACC,SAAA,CAAAP,MAACiB,EAAA,CACC,SAAAjB,EAAAA,IAACmB,EAAA,CAAY,SAAA,mBAAA,CAAiB,EAChC,EACAnB,EAAAA,IAACkB,GAAW,UAAU,OAAO,KAAM,EACjC,SAAAlB,EAAAA,IAACuU,GAAA,CAA6B,WAAAhS,CAAA,CAAwB,CAAA,CACxD,EACAvC,EAAAA,IAACgB,EAAA,CACC,SAAAhB,EAAAA,IAACoB,EAAA,CAAoB,QAAO,GAC1B,SAAApB,EAAAA,IAACmE,EAAAA,OAAA,CAAO,QAAQ,UAAU,SAAA,QAAA,CAAM,CAAA,CAClC,EACF,QACCrD,EAAA,CAAA,CAAmB,CAAA,CAAA,CACtB,CAAA,CAAA,CAIR,EChCaqU,GAAc,CAAC,CAC1B,mBAAAC,EAAqB,GACrB,uBAAAC,EAAyB,GACzB,YAAAnG,CACF,IAcM,CACJ,KAAM,CAACoG,EAAuBC,CAAwB,EAAI3R,EAAAA,SAAS,EAAK,EAClE,CAAC4R,EAAYC,CAAa,EAAI7R,EAAAA,SAAS,EAAK,EAC5C,CAAC8R,EAAcC,CAAe,EAAI/R,EAAAA,SAAS,EAAK,EAChD,CAACgS,EAAuBC,CAAwB,EAAIjS,EAAAA,SAExD,MAAS,EACL,CAACkS,EAAeC,CAAgB,EAAInS,EAAAA,SAAS,EAAK,EAClD,CAACzE,EAAe6W,CAAgB,EAAI1L,EAAA,EAEpC/H,EAAawM,EAAAA,YAAY,IAAM,CACnCwG,EAAyB,EAAK,EAC9BE,EAAc,EAAK,EACnBE,EAAgB,EAAK,EACrBE,EAAyB,MAAS,EAClCG,EAAiB,EAAK,EACtBD,EAAiB,EAAK,CAAA,EACrB,CAACC,CAAgB,CAAC,EAEfC,EAAgDlH,EAAAA,YACnD7M,GAAS,CACJA,IAAS,cACX2T,EAAyB,aAAa,EAC7B3T,IAAS,SAClByT,EAAgB,EAAI,EACXzT,IAAS,OAClBuT,EAAc,EAAI,EACTvT,IAAS,MAClBqT,EAAyB,EAAI,EACpBrT,IAAS,YAClB2T,EAAyB,WAAW,EAC3B3T,IAAS,WAClB6T,EAAiB,EAAI,EAEvB7G,IAAchN,CAAI,CAAA,EAEpB,CAACgN,CAAW,CAAA,EAGd,OAAAzE,GAAA,EACAa,GAAA,EACAtF,GAAA,EAGEpD,EAAAA,KAAA0B,WAAA,CACG,SAAA,CAAA+Q,GACCrV,EAAAA,IAAC0F,EAAAA,SAAA,CACC,QAAS,CAACvG,EACV,cAAe,CAAE,MAAO,UAAW,QAAS,UAAA,EAC5C,kBAAkB,WAElB,eAAC0K,GAAA,CAAA,CAAiB,CAAA,CAAA,EAGtB7J,EAAAA,IAAC+I,GAAA,CAAc,KAAM+M,EAAe,QAASC,EAAkB,QAC9DrD,GAAA,EAAY,EACb1S,EAAAA,IAACiR,GAAA,CAAU,YAAagF,CAAA,CAAc,QACrCrQ,GAAA,EAAoB,EACrB5F,EAAAA,IAACiJ,GAAA,CAAW,KAAMuM,EAAY,QAASC,EAAe,EACtDzV,EAAAA,IAACkV,GAAA,CACC,KAAMI,EACN,QAASC,EACT,WAAAhT,CAAA,CAAA,EAEFvC,EAAAA,IAACsU,GAAA,CACC,KAAMoB,EACN,QAASC,EACT,WAAApT,CAAA,CAAA,EAEFvC,EAAAA,IAACgE,GAAA,CACC,SAAU4R,EACV,QAAU5M,GACR6M,EAAyB7M,EAAO,cAAgB,MAAS,EAE3D,WAAAzG,CAAA,CAAA,EAEFvC,EAAAA,IAAC0F,EAAAA,SAAA,CACC,QAAS0P,GAAsBjW,EAC/B,cAAe,CAAE,MAAO,UAAW,QAAS,UAAA,EAC5C,kBAAkB,OAClB,SAAS,SAET,eAACqL,GAAA,CAAA,CAAa,CAAA,CAAA,QAEf5D,GAAA,CAAA,CAAQ,CAAA,EACX,CAEJ"}