@prose-reader/react-reader 1.185.0 → 1.187.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +433 -272
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/dist/src/ReactReader.d.ts +4 -4
- package/dist/src/context/useReader.d.ts +2 -0
- package/dist/src/navigation/QuickMenu/BottomBar.d.ts +2 -1
- package/dist/src/navigation/QuickMenu/QuickMenu.d.ts +2 -1
- package/dist/src/search/SearchDialog.d.ts +5 -0
- package/dist/src/search/SearchDialogContent.d.ts +4 -0
- package/dist/src/search/SearchListItem.d.ts +9 -0
- package/package.json +8 -2
- /package/dist/src/{navigation/help → help}/HelpDialog.d.ts +0 -0
- /package/dist/src/{navigation/toc → toc}/TableOfContentsDialog.d.ts +0 -0
- /package/dist/src/{navigation/toc → toc}/TableOfContentsDialogContent.d.ts +0 -0
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/context/useReader.ts","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/navigation/QuickMenu/TimeIndicator.tsx","../src/navigation/QuickMenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/navigation/QuickMenu/PaginationInfoSection.tsx","../src/navigation/QuickMenu/QuickBar.tsx","../src/navigation/QuickMenu/ThemedSlider.tsx","../src/navigation/QuickMenu/Scrubber.tsx","../src/navigation/QuickMenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/navigation/QuickMenu/TopBar.tsx","../src/navigation/QuickMenu/QuickMenu.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/navigation/help/HelpDialog.tsx","../src/navigation/toc/TableOfContentsDialogContent.tsx","../src/navigation/toc/TableOfContentsDialog.tsx","../src/ReactReader.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\n\ntype ContextType = {\n reader: Reader | undefined\n quickMenuSignal: Signal<boolean, boolean, undefined>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport { useLiveRef, useSignal, useSubscribe } from \"reactjrx\"\nimport { tap } from \"rxjs\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n quickMenuOpen,\n onQuickMenuOpenChange,\n }: {\n children?: React.ReactNode\n reader: Reader | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const [, quickMenuSignal] = useSignal({\n default: quickMenuOpen,\n })\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n }),\n [quickMenuSignal, reader],\n )\n\n useEffect(() => {\n quickMenuSignal.setValue(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () =>\n quickMenuSignal.subject.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 { Reader } from \"@prose-reader/core\"\nimport { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReader = (): Reader | undefined => {\n const { reader } = useContext(ReaderContext)\n\n return reader\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { NEVER, combineLatest, map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context.state$]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, Text } from \"@chakra-ui/react\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const FloatingProgress = () => {\n const pagination = usePagination()\n const roundedProgress = Math.floor(\n (pagination?.percentageEstimateOfBook ?? 0) * 100,\n )\n const displayableProgress = roundedProgress > 0 ? roundedProgress : 1\n\n if (pagination?.percentageEstimateOfBook === undefined) return null\n\n return (\n <Box position=\"absolute\" right={0} bottom={0} p={2} color={\"black\"}>\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n )\n}\n","import { Text, type TextProps } from \"@chakra-ui/react\"\nimport { useEffect, useState } from \"react\"\n\nexport const useTime = () => {\n const [time, setTime] = useState(new Date())\n\n useEffect(() => {\n const interval = setInterval(() => {\n setTime(new Date())\n }, 1000 * 60)\n\n return () => clearInterval(interval)\n }, [])\n\n return time\n}\n\nexport const TimeIndicator = (props: TextProps) => {\n const time = useTime()\n\n return (\n <Text fontSize=\"xs\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { useContext } from \"react\"\nimport { useSignalValue } from \"reactjrx\"\nimport { ReaderContext } from \"../../context/context\"\n\nexport const useQuickMenu = () => {\n const { quickMenuSignal } = useContext(ReaderContext)\n\n const quickMenu = useSignalValue(quickMenuSignal)\n\n return [quickMenu, quickMenuSignal.setValue, quickMenuSignal] as const\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { TimeIndicator } from \"./QuickMenu/TimeIndicator\"\nimport { useQuickMenu } from \"./QuickMenu/useQuickMenu\"\n\nexport const FloatingTime = () => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <Box\n position=\"absolute\"\n left={0}\n bottom={0}\n p={2}\n color={quickMenuOpen ? undefined : \"colorPalette.contrast\"}\n >\n <TimeIndicator />\n </Box>\n )\n}\n","import { 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 { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\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 { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { useObserve, useSignal, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\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] = useSignal({\n default: currentPage || 0,\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.setValue(currentPage || 0)\n }, [currentPage, valueSignal])\n\n return {\n value,\n valueSignal,\n min,\n max,\n }\n}\n\nexport const Scrubber = () => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, []) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.setValue(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.getState().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 if (\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n ) {\n return null\n }\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\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 { LuChevronDown } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp } from \"react-icons/lu\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onTableOfContentsClick,\n onHelpClick,\n }: {\n open: boolean\n onTableOfContentsClick: () => void\n onHelpClick: () => void\n }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection =\n settings?.computedPageTurnDirection === \"vertical\"\n const [isExtraOpen, setIsExtraOpen] = useState(true)\n\n return (\n <QuickBar\n present={open}\n position=\"bottom\"\n // height={130}\n >\n <Stack\n // border=\"1px solid red\"\n flex={1}\n >\n <HStack flex={1} alignItems=\"center\" justifyContent=\"center\">\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem &&\n !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? (\n <RxDoubleArrowUp />\n ) : (\n <RxDoubleArrowLeft />\n )}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"visible\"\n px={4}\n >\n <PaginationInfoSection />\n <Box height={5} maxW={300} width=\"100%\" overflow=\"visible\">\n <Scrubber />\n </Box>\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\n alignItems=\"center\"\n justifyContent=\"center\"\n // border=\"1px solid blue\"\n >\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\n // border=\"1px solid green\"\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\n display=\"flex\"\n justifyContent=\"center\"\n gap={2}\n >\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onHelpClick}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onTableOfContentsClick}\n >\n <LuTableOfContents />\n </IconButton>\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\n </Stack>\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 { 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 = ({\n open,\n onBackClick,\n onMoreClick,\n}: {\n open: boolean\n onBackClick: () => void\n onMoreClick: () => 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={onBackClick}\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={onMoreClick}\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","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onBackClick,\n onMoreClick,\n onTableOfContentsClick,\n onHelpClick,\n }: {\n onBackClick: () => void\n onMoreClick: () => void\n onTableOfContentsClick: () => void\n onHelpClick: () => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar\n open={quickMenuOpen}\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n />\n <BottomBar\n open={quickMenuOpen}\n onTableOfContentsClick={onTableOfContentsClick}\n onHelpClick={onHelpClick}\n />\n </>\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 { Button, HStack, Heading, Kbd, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuArrowBigLeft, LuArrowBigRight } from \"react-icons/lu\"\nimport { name, version } from \"../../../package.json\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../../components/ui/dialog\"\n\nexport const HelpDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Help</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Shortcuts\n </Heading>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigRight />\n </Kbd>{\" \"}\n <Text>Navigate to right page</Text>\n </HStack>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigLeft />\n </Kbd>{\" \"}\n <Text>Navigate to left page</Text>\n </HStack>\n <Heading mb={2} mt={4} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Link, Stack, Text } from \"@chakra-ui/react\"\n\nimport { List } from \"@chakra-ui/react\"\nimport React, { memo } from \"react\"\nimport { LuCircleCheck } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\n\nexport const TableOfContentsDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context.state$, [reader]) ?? {}\n const { nav } = manifest ?? {}\n const pagination = usePagination()\n const toc = nav?.toc || []\n const { beginSpineItemIndex, beginPageIndexInSpineItem } = pagination ?? {}\n const currentSpineItemOrChapterPageIndex =\n (assumedRenditionLayout === \"reflowable\"\n ? beginPageIndexInSpineItem\n : beginSpineItemIndex) || 0\n\n console.log({ assumedRenditionLayout, currentSpineItemOrChapterPageIndex })\n\n let currentSubChapter = pagination?.beginChapterInfo\n\n while (currentSubChapter?.subChapter) {\n currentSubChapter = currentSubChapter?.subChapter\n }\n\n const buildTocForItem = (\n tocItem: (typeof toc)[number],\n index: number,\n lvl: number,\n ) => (\n <React.Fragment key={index}>\n <List.Item\n pl={4 * (lvl + 1)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Link\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToUrl(tocItem.href)\n }}\n href=\"#\"\n >\n {currentSubChapter?.path === tocItem.path && (\n <List.Indicator asChild>\n <LuCircleCheck />\n </List.Indicator>\n )}\n {currentSubChapter?.path !== tocItem.path && (\n <List.Indicator asChild visibility=\"hidden\">\n <LuCircleCheck />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text fontSize=\"md\">{tocItem.title || tocItem.path}</Text>\n {currentSubChapter?.path === tocItem.path && (\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Currently on page ${\n currentSpineItemOrChapterPageIndex + 1\n }`}</Text>\n )}\n </Stack>\n </Link>\n </List.Item>\n {tocItem.contents.length > 0 && (\n <List.Root as=\"div\" gap={2}>\n {tocItem.contents.map((tocItem, index) =>\n buildTocForItem(tocItem, index, lvl + 1),\n )}\n </List.Root>\n )}\n </React.Fragment>\n )\n\n return (\n <List.Root gap={3} overflowY=\"auto\" py={4} flex={1}>\n {nav?.toc.map((tocItem, index) => buildTocForItem(tocItem, index, 0))}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../../components/ui/dialog\"\nimport { TableOfContentsDialogContent } from \"./TableOfContentsDialogContent\"\n\nexport const TableOfContentsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Table of Contents</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <TableOfContentsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport { type ComponentProps, useState } from \"react\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./navigation/QuickMenu/QuickMenu\"\nimport { useQuickMenu } from \"./navigation/QuickMenu/useQuickMenu\"\nimport { HelpDialog } from \"./navigation/help/HelpDialog\"\nimport { TableOfContentsDialog } from \"./navigation/toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n ...rest\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n} & Omit<\n ComponentProps<typeof QuickMenu>,\n \"onTableOfContentsClick\" | \"open\"\n>) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\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 <QuickMenu\n {...rest}\n onTableOfContentsClick={() => setIsTableOfContentsOpen(true)}\n onHelpClick={() => setIsHelpOpen(true)}\n />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={() => {\n setIsTableOfContentsOpen(false)\n setQuickMenuOpen(false)\n }}\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 </>\n )\n}\n"],"names":["ReaderContext","createContext","signal","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useSignal","onQuickMenuOpenChangeLiveRef","useLiveRef","value","useMemo","useEffect","useSubscribe","tap","jsx","useReader","useContext","usePagination","useObserve","combineLatest","map","state","context","isOnlyImages","_a","item","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","Box","jsxs","Text","useTime","time","setTime","useState","interval","TimeIndicator","props","useQuickMenu","useSignalValue","FloatingTime","ToggleTip","React","ref","showArrow","portalled","content","portalRef","rest","ChakraPopover","Portal","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","React__namespace","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","Stack","HStack","Fragment","QuickBar","position","Presence","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","open","onTableOfContentsClick","onHelpClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","onBackClick","onMoreClick","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","CloseButton","ChakraIconButton","LuX","DialogContent","backdrop","ChakraDialog","DialogCloseTrigger","DialogRoot","DialogFooter","DialogHeader","DialogBody","DialogTitle","DialogActionTrigger","HelpDialog","setOpen","e","Heading","Kbd","LuArrowBigRight","LuArrowBigLeft","name","version","Button","TableOfContentsDialogContent","onNavigate","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","index","lvl","List","Link","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","setQuickMenuOpen"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/context/context.ts","../src/context/ReactReaderProvider.tsx","../src/components/ui/close-button.tsx","../src/components/ui/dialog.tsx","../src/help/HelpDialog.tsx","../src/context/useReader.ts","../src/pagination/usePagination.ts","../src/navigation/FloatingProgress.tsx","../src/navigation/QuickMenu/TimeIndicator.tsx","../src/navigation/QuickMenu/useQuickMenu.ts","../src/navigation/FloatingTime.tsx","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/navigation/useNavigationContext.ts","../src/navigation/QuickMenu/PaginationInfoSection.tsx","../src/navigation/QuickMenu/QuickBar.tsx","../src/navigation/QuickMenu/ThemedSlider.tsx","../src/navigation/QuickMenu/Scrubber.tsx","../src/navigation/QuickMenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/navigation/QuickMenu/TopBar.tsx","../src/navigation/QuickMenu/QuickMenu.tsx","../src/search/SearchListItem.tsx","../src/search/SearchDialogContent.tsx","../src/search/SearchDialog.tsx","../src/toc/TableOfContentsDialogContent.tsx","../src/toc/TableOfContentsDialog.tsx","../src/ReactReader.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\nimport { type Signal, signal } from \"reactjrx\"\n\ntype ContextType = {\n reader: Reader | undefined\n quickMenuSignal: Signal<boolean, boolean, undefined>\n}\n\nexport const ReaderContext: Context<ContextType> = createContext<ContextType>({\n reader: undefined,\n quickMenuSignal: signal({ default: false }),\n})\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo, useEffect, useMemo } from \"react\"\nimport { useLiveRef, useSignal, useSubscribe } from \"reactjrx\"\nimport { tap } from \"rxjs\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n quickMenuOpen,\n onQuickMenuOpenChange,\n }: {\n children?: React.ReactNode\n reader: Reader | undefined\n quickMenuOpen: boolean\n onQuickMenuOpenChange: (open: boolean) => void\n }) => {\n const [, quickMenuSignal] = useSignal({\n default: quickMenuOpen,\n })\n const onQuickMenuOpenChangeLiveRef = useLiveRef(onQuickMenuOpenChange)\n\n const value = useMemo(\n () => ({\n quickMenuSignal,\n reader,\n }),\n [quickMenuSignal, reader],\n )\n\n useEffect(() => {\n quickMenuSignal.setValue(quickMenuOpen)\n }, [quickMenuOpen, quickMenuSignal])\n\n useSubscribe(\n () =>\n quickMenuSignal.subject.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 { Button, HStack, Heading, Kbd, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport { LuArrowBigLeft, LuArrowBigRight } from \"react-icons/lu\"\nimport { name, version } from \"../../package.json\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\n\nexport const HelpDialog = memo(\n ({\n open,\n setOpen,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Help</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <Heading mb={2} as=\"h3\" size=\"lg\">\n Shortcuts\n </Heading>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigRight />\n </Kbd>{\" \"}\n <Text>Navigate to right page</Text>\n </HStack>\n <HStack mb={1}>\n <Kbd>\n <LuArrowBigLeft />\n </Kbd>{\" \"}\n <Text>Navigate to left page</Text>\n </HStack>\n <Heading mb={2} mt={4} as=\"h3\" size=\"lg\">\n About\n </Heading>\n <Text>\n {name} version: {version}\n </Text>\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport type { SearchEnhancerAPI } from \"@prose-reader/enhancer-search\"\nimport { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReader = (): Reader | undefined => {\n const { reader } = useContext(ReaderContext)\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","import type { Reader } from \"@prose-reader/core\"\nimport { useObserve } from \"reactjrx\"\nimport { NEVER, combineLatest, map } from \"rxjs\"\nimport { useReader } from \"../context/useReader\"\n\nexport const usePagination = ():\n | (Reader[\"pagination\"][\"state\"] & { hasChapters: boolean })\n | undefined => {\n const reader = useReader()\n\n return useObserve(\n () =>\n !reader\n ? NEVER\n : combineLatest([reader.pagination.state$, reader.context.state$]).pipe(\n map(([state, context]) => {\n const isOnlyImages = context.manifest?.spineItems.every((item) =>\n item.mediaType?.startsWith(\"image/\"),\n )\n\n return {\n ...state,\n hasChapters: !context.isFullyPrePaginated && !isOnlyImages,\n }\n }),\n ),\n [reader],\n )\n}\n","import { Box, Text } from \"@chakra-ui/react\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const FloatingProgress = () => {\n const pagination = usePagination()\n const roundedProgress = Math.floor(\n (pagination?.percentageEstimateOfBook ?? 0) * 100,\n )\n const displayableProgress = roundedProgress > 0 ? roundedProgress : 1\n\n if (pagination?.percentageEstimateOfBook === undefined) return null\n\n return (\n <Box position=\"absolute\" right={0} bottom={0} p={2} color={\"black\"}>\n <Text fontSize=\"sm\">{displayableProgress} %</Text>\n </Box>\n )\n}\n","import { Text, type TextProps } from \"@chakra-ui/react\"\nimport { useEffect, useState } from \"react\"\n\nexport const useTime = () => {\n const [time, setTime] = useState(new Date())\n\n useEffect(() => {\n const interval = setInterval(() => {\n setTime(new Date())\n }, 1000 * 60)\n\n return () => clearInterval(interval)\n }, [])\n\n return time\n}\n\nexport const TimeIndicator = (props: TextProps) => {\n const time = useTime()\n\n return (\n <Text fontSize=\"xs\" {...props}>\n {time.toLocaleTimeString(navigator.language, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </Text>\n )\n}\n","import { useContext } from \"react\"\nimport { useSignalValue } from \"reactjrx\"\nimport { ReaderContext } from \"../../context/context\"\n\nexport const useQuickMenu = () => {\n const { quickMenuSignal } = useContext(ReaderContext)\n\n const quickMenu = useSignalValue(quickMenuSignal)\n\n return [quickMenu, quickMenuSignal.setValue, quickMenuSignal] as const\n}\n","import { Box } from \"@chakra-ui/react\"\nimport { TimeIndicator } from \"./QuickMenu/TimeIndicator\"\nimport { useQuickMenu } from \"./QuickMenu/useQuickMenu\"\n\nexport const FloatingTime = () => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <Box\n position=\"absolute\"\n left={0}\n bottom={0}\n p={2}\n color={quickMenuOpen ? undefined : \"colorPalette.contrast\"}\n >\n <TimeIndicator />\n </Box>\n )\n}\n","import { 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 { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\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 { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { useObserve, useSignal, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport { useNavigationContext } from \"../useNavigationContext\"\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] = useSignal({\n default: currentPage || 0,\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.setValue(currentPage || 0)\n }, [currentPage, valueSignal])\n\n return {\n value,\n valueSignal,\n min,\n max,\n }\n}\n\nexport const Scrubber = () => {\n const reader = useReader()\n const pagination = usePagination()\n const { manifest } = useObserve(() => reader?.context.state$, []) ?? {}\n const reverse = manifest?.readingDirection === \"rtl\"\n const isUsingSpread = pagination?.isUsingSpread\n const { totalApproximatePages = 0, isBeginWithinChapter } =\n useNavigationContext()\n const step = 1\n const isScrubberWithinChapter = isBeginWithinChapter\n const { value, valueSignal, min, max } = useSliderValues()\n\n const onChange: NonNullable<ComponentProps<typeof ThemedSlider>[\"onChange\"]> =\n useCallback(\n (values) => {\n const [value = 0] = Array.isArray(values) ? values : [values]\n\n valueSignal.setValue(value)\n\n const pageIndex = isUsingSpread\n ? Math.floor(value) * 2\n : Math.floor(value)\n\n if (!isScrubberWithinChapter) {\n reader?.navigation.goToAbsolutePageIndex({\n absolutePageIndex: pageIndex,\n animation: false,\n })\n } else {\n reader?.navigation.goToPageOfSpineItem({\n pageIndex,\n spineItemId: reader.pagination.getState().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 if (\n totalApproximatePages === 1 ||\n (isUsingSpread && totalApproximatePages === 2)\n ) {\n return null\n }\n\n // @tmp not available yet in chakra\n // if (reverse) return null\n\n return (\n <ThemedSlider\n value={[value]}\n max={max}\n min={min}\n reverse={reverse}\n step={step}\n onChange={onChange}\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 { LuChevronDown, LuSearch } from \"react-icons/lu\"\nimport { LuTableOfContents } from \"react-icons/lu\"\nimport { LuCircleHelp } from \"react-icons/lu\"\nimport {\n RxDoubleArrowDown,\n RxDoubleArrowLeft,\n RxDoubleArrowRight,\n RxDoubleArrowUp,\n} from \"react-icons/rx\"\nimport { useObserve } from \"reactjrx\"\nimport { hasSearchEnhancer, useReader } from \"../../context/useReader\"\nimport { PaginationInfoSection } from \"./PaginationInfoSection\"\nimport { QuickBar } from \"./QuickBar\"\nimport { Scrubber } from \"./Scrubber\"\n\nexport const BottomBar = memo(\n ({\n open,\n onTableOfContentsClick,\n onHelpClick,\n onSearchClick,\n }: {\n open: boolean\n onTableOfContentsClick: () => void\n onHelpClick: () => void\n onSearchClick: () => void\n }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection =\n settings?.computedPageTurnDirection === \"vertical\"\n const [isExtraOpen, setIsExtraOpen] = useState(true)\n\n return (\n <QuickBar\n present={open}\n position=\"bottom\"\n // height={130}\n >\n <Stack\n // border=\"1px solid red\"\n flex={1}\n >\n <HStack flex={1} alignItems=\"center\" justifyContent=\"center\">\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem &&\n !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? (\n <RxDoubleArrowUp />\n ) : (\n <RxDoubleArrowLeft />\n )}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"visible\"\n px={4}\n >\n <PaginationInfoSection />\n <Box height={5} maxW={300} width=\"100%\" overflow=\"visible\">\n <Scrubber />\n </Box>\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\n alignItems=\"center\"\n justifyContent=\"center\"\n // border=\"1px solid blue\"\n >\n <Collapsible.Root\n open={isExtraOpen}\n flex={1}\n onOpenChange={({ open }) => {\n setIsExtraOpen(open)\n }}\n >\n <Collapsible.Trigger\n paddingY=\"3\"\n // border=\"1px solid green\"\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\n display=\"flex\"\n justifyContent=\"center\"\n gap={2}\n >\n <IconButton\n aria-label=\"Help\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onHelpClick}\n >\n <LuCircleHelp />\n </IconButton>\n <IconButton\n aria-label=\"Table of contents\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onTableOfContentsClick}\n >\n <LuTableOfContents />\n </IconButton>\n {hasSearchEnhancer(reader) && (\n <IconButton\n aria-label=\"Search\"\n size=\"lg\"\n variant=\"ghost\"\n onClick={onSearchClick}\n >\n <LuSearch />\n </IconButton>\n )}\n </Collapsible.Content>\n </Collapsible.Root>\n </HStack>\n </Stack>\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 { 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 = ({\n open,\n onBackClick,\n onMoreClick,\n}: {\n open: boolean\n onBackClick: () => void\n onMoreClick: () => 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={onBackClick}\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={onMoreClick}\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","import { memo } from \"react\"\nimport { BottomBar } from \"./BottomBar\"\nimport { TopBar } from \"./TopBar\"\nimport { useQuickMenu } from \"./useQuickMenu\"\n\nexport const QuickMenu = memo(\n ({\n onBackClick,\n onMoreClick,\n onTableOfContentsClick,\n onHelpClick,\n onSearchClick,\n }: {\n onBackClick: () => void\n onMoreClick: () => void\n onTableOfContentsClick: () => void\n onHelpClick: () => void\n onSearchClick: () => void\n }) => {\n const [quickMenuOpen] = useQuickMenu()\n\n return (\n <>\n <TopBar\n open={quickMenuOpen}\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n />\n <BottomBar\n open={quickMenuOpen}\n onTableOfContentsClick={onTableOfContentsClick}\n onHelpClick={onHelpClick}\n onSearchClick={onSearchClick}\n />\n </>\n )\n },\n)\n","import { Link, Text } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\n\nexport const SearchListItem = memo(\n ({\n contextText = \"\",\n startOffset = 0,\n text,\n cfi = \"#\",\n onClick,\n absolutePageIndex,\n }: {\n pageIndex: number | undefined\n absolutePageIndex?: number\n contextText?: string\n startOffset?: number\n text: string\n cfi?: string\n onClick: (cfi: string) => void\n }) => {\n const charsAroundText = 15\n const before = contextText.substring(\n Math.max(startOffset - charsAroundText, 0),\n Math.max(startOffset, 0),\n )\n const after = contextText.substring(\n Math.min(startOffset + text.length, contextText.length - 1),\n Math.min(\n startOffset + text.length + charsAroundText,\n contextText.length - 1,\n ),\n )\n\n return (\n <Link\n href={cfi}\n style={{ margin: 5, overflow: \"hidden\" }}\n onClick={(e) => {\n e.preventDefault()\n\n onClick(cfi)\n }}\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-start\"\n gap={0}\n >\n <Text lineClamp={1} as=\"cite\" style={{ display: \"block\" }}>\n \"{before}\n <b>{text}</b>\n {after}\"\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" style={{ textDecoration: \"none\" }}>\n {`Book page: ${absolutePageIndex !== undefined ? absolutePageIndex + 1 : \"unknown (not loaded)\"}`}\n </Text>\n </Link>\n )\n },\n)\n","import { Box, Heading, Input, Stack, Text } from \"@chakra-ui/react\"\nimport type React from \"react\"\nimport { memo, useCallback, useState } from \"react\"\nimport { useObserve } from \"reactjrx\"\nimport { map, startWith } from \"rxjs\"\nimport { hasSearchEnhancer, useReader } from \"../context/useReader\"\nimport { SearchListItem } from \"./SearchListItem\"\n\nexport const SearchDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const [text, setText] = useState(\"\")\n const reader = useReader()\n const readerWithSearch = hasSearchEnhancer(reader) ? reader : undefined\n\n const onValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setText(e.target.value)\n }\n\n const onClick = useCallback(\n (cfi: string) => {\n onNavigate()\n reader?.navigation.goToCfi(cfi)\n },\n [reader, onNavigate],\n )\n\n const search = useObserve(\n () =>\n readerWithSearch?.search.search(text).pipe(\n map((data) => ({ type: `end` as const, data })),\n startWith({ type: `start` as const }),\n ),\n [reader, text],\n )\n const searching = search?.type === \"start\"\n const results = search?.type === \"end\" ? search.data : []\n const consolidatedResults = useObserve(\n () => reader?.pagination.locate(results.slice(0, 100)),\n [results],\n )\n\n return (\n <Stack flex={1} height=\"100%\">\n <Box px={4}>\n <Input\n placeholder=\"Type something...\"\n value={text}\n onChange={onValueChange}\n borderRadius={0}\n />\n </Box>\n <Box\n px={4}\n pb={4}\n mt={2}\n flex={1}\n style={{ overflow: \"hidden\", overflowY: \"auto\" }}\n >\n {searching && <Text>Searching ...</Text>}\n {!searching && results.length === 0 && <p>There are no results</p>}\n {!searching && results.length >= 0 && (\n <Stack>\n <Heading as=\"h2\" size=\"md\">\n {results.length} result(s)\n </Heading>\n <Stack gap={0}>\n {consolidatedResults?.map((result, j) => {\n return (\n <SearchListItem\n key={j}\n contextText={\n result.meta?.range?.startContainer.parentElement\n ?.textContent ?? \"\"\n }\n pageIndex={result.meta?.itemPageIndex}\n startOffset={result.meta?.range?.startOffset ?? 0}\n text={text}\n cfi={result.cfi}\n onClick={onClick}\n absolutePageIndex={result.meta?.absolutePageIndex}\n />\n )\n })}\n </Stack>\n </Stack>\n )}\n </Box>\n </Stack>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { SearchDialogContent } from \"./SearchDialogContent\"\n\nexport const SearchDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent height=\"100%\">\n <DialogHeader>\n <DialogTitle>Search</DialogTitle>\n </DialogHeader>\n <DialogBody flex={1}>\n <SearchDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Link, Stack, Text } from \"@chakra-ui/react\"\n\nimport { List } from \"@chakra-ui/react\"\nimport React, { memo } from \"react\"\nimport { LuCircleCheck } from \"react-icons/lu\"\nimport { useObserve } from \"reactjrx\"\nimport { useReader } from \"../context/useReader\"\nimport { usePagination } from \"../pagination/usePagination\"\n\nexport const TableOfContentsDialogContent = memo(\n ({\n onNavigate,\n }: {\n onNavigate: () => void\n }) => {\n const reader = useReader()\n const { manifest, assumedRenditionLayout } =\n useObserve(() => reader?.context.state$, [reader]) ?? {}\n const { nav } = manifest ?? {}\n const pagination = usePagination()\n const toc = nav?.toc || []\n const { beginSpineItemIndex, beginPageIndexInSpineItem } = pagination ?? {}\n const currentSpineItemOrChapterPageIndex =\n (assumedRenditionLayout === \"reflowable\"\n ? beginPageIndexInSpineItem\n : beginSpineItemIndex) || 0\n\n console.log({ assumedRenditionLayout, currentSpineItemOrChapterPageIndex })\n\n let currentSubChapter = pagination?.beginChapterInfo\n\n while (currentSubChapter?.subChapter) {\n currentSubChapter = currentSubChapter?.subChapter\n }\n\n const buildTocForItem = (\n tocItem: (typeof toc)[number],\n index: number,\n lvl: number,\n ) => (\n <React.Fragment key={index}>\n <List.Item\n pl={4 * (lvl + 1)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Link\n onClick={() => {\n onNavigate()\n\n reader?.navigation.goToUrl(tocItem.href)\n }}\n href=\"#\"\n >\n {currentSubChapter?.path === tocItem.path && (\n <List.Indicator asChild>\n <LuCircleCheck />\n </List.Indicator>\n )}\n {currentSubChapter?.path !== tocItem.path && (\n <List.Indicator asChild visibility=\"hidden\">\n <LuCircleCheck />\n </List.Indicator>\n )}\n <Stack gap={0}>\n <Text fontSize=\"md\">{tocItem.title || tocItem.path}</Text>\n {currentSubChapter?.path === tocItem.path && (\n <Text\n fontStyle=\"italic\"\n fontWeight=\"bold\"\n fontSize=\"sm\"\n >{`Currently on page ${\n currentSpineItemOrChapterPageIndex + 1\n }`}</Text>\n )}\n </Stack>\n </Link>\n </List.Item>\n {tocItem.contents.length > 0 && (\n <List.Root as=\"div\" gap={2}>\n {tocItem.contents.map((tocItem, index) =>\n buildTocForItem(tocItem, index, lvl + 1),\n )}\n </List.Root>\n )}\n </React.Fragment>\n )\n\n return (\n <List.Root gap={3} overflowY=\"auto\" py={4} flex={1}>\n {nav?.toc.map((tocItem, index) => buildTocForItem(tocItem, index, 0))}\n </List.Root>\n )\n },\n)\n","import { Button } from \"@chakra-ui/react\"\nimport { memo } from \"react\"\nimport {\n DialogActionTrigger,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogRoot,\n DialogTitle,\n} from \"../components/ui/dialog\"\nimport { TableOfContentsDialogContent } from \"./TableOfContentsDialogContent\"\n\nexport const TableOfContentsDialog = memo(\n ({\n open,\n setOpen,\n onNavigate,\n }: {\n open: boolean\n setOpen: (open: boolean) => void\n onNavigate: () => void\n }) => {\n return (\n <DialogRoot\n lazyMount\n placement=\"center\"\n open={open}\n onOpenChange={(e) => setOpen(e.open)}\n size={{ mdDown: \"full\", md: \"lg\" }}\n scrollBehavior=\"inside\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Table of Contents</DialogTitle>\n </DialogHeader>\n <DialogBody overflowY=\"auto\" flex={1}>\n <TableOfContentsDialogContent onNavigate={onNavigate} />\n </DialogBody>\n <DialogFooter>\n <DialogActionTrigger asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogActionTrigger>\n </DialogFooter>\n <DialogCloseTrigger />\n </DialogContent>\n </DialogRoot>\n )\n },\n)\n","import { Presence } from \"@chakra-ui/react\"\nimport { useState } from \"react\"\nimport { HelpDialog } from \"./help/HelpDialog\"\nimport { FloatingProgress } from \"./navigation/FloatingProgress\"\nimport { FloatingTime } from \"./navigation/FloatingTime\"\nimport { QuickMenu } from \"./navigation/QuickMenu/QuickMenu\"\nimport { useQuickMenu } from \"./navigation/QuickMenu/useQuickMenu\"\nimport { SearchDialog } from \"./search/SearchDialog\"\nimport { TableOfContentsDialog } from \"./toc/TableOfContentsDialog\"\n\nexport const ReactReader = ({\n enableFloatingTime = true,\n enableFloatingProgress = true,\n onBackClick,\n onMoreClick,\n}: {\n enableFloatingTime?: boolean\n enableFloatingProgress?: boolean\n onBackClick: () => void\n onMoreClick: () => void\n}) => {\n const [isTableOfContentsOpen, setIsTableOfContentsOpen] = useState(false)\n const [isHelpOpen, setIsHelpOpen] = useState(false)\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n const [quickMenuOpen, setQuickMenuOpen] = useQuickMenu()\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 <QuickMenu\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n onTableOfContentsClick={() => setIsTableOfContentsOpen(true)}\n onHelpClick={() => setIsHelpOpen(true)}\n onSearchClick={() => setIsSearchOpen(true)}\n />\n <HelpDialog open={isHelpOpen} setOpen={setIsHelpOpen} />\n <TableOfContentsDialog\n open={isTableOfContentsOpen}\n setOpen={setIsTableOfContentsOpen}\n onNavigate={() => {\n setIsTableOfContentsOpen(false)\n setQuickMenuOpen(false)\n }}\n />\n <SearchDialog\n open={isSearchOpen}\n setOpen={setIsSearchOpen}\n onNavigate={() => {\n setIsSearchOpen(false)\n setQuickMenuOpen(false)\n }}\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 </>\n )\n}\n"],"names":["ReaderContext","createContext","signal","ReactReaderProvider","memo","children","reader","quickMenuOpen","onQuickMenuOpenChange","quickMenuSignal","useSignal","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","HelpDialog","open","setOpen","e","jsxs","Heading","HStack","Kbd","LuArrowBigRight","Text","LuArrowBigLeft","name","version","Button","useReader","useContext","hasSearchEnhancer","usePagination","useObserve","combineLatest","map","state","context","isOnlyImages","_a","item","NEVER","FloatingProgress","pagination","roundedProgress","displayableProgress","Box","useTime","time","setTime","useState","interval","TimeIndicator","useQuickMenu","useSignalValue","FloatingTime","ToggleTip","showArrow","content","ChakraPopover","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","React__namespace","info","ProgressRoot","ProgressValueText","useNavigationContext","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","Stack","Fragment","QuickBar","position","Presence","ChakraRcSlider","chakra","RcSlider","ThemedSlider","useSliderValues","isUsingSpread","currentRealPage","currentPage","valueSignal","min","max","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","BottomBar","onTableOfContentsClick","onHelpClick","onSearchClick","navigation","settings","isVerticalDirection","isExtraOpen","setIsExtraOpen","RxDoubleArrowUp","RxDoubleArrowLeft","RxDoubleArrowDown","RxDoubleArrowRight","Collapsible","LuChevronDown","LuCircleHelp","LuTableOfContents","LuSearch","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","onBackClick","onMoreClick","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","SearchListItem","contextText","startOffset","text","cfi","onClick","absolutePageIndex","before","after","Link","SearchDialogContent","onNavigate","setText","readerWithSearch","onValueChange","search","data","startWith","searching","results","consolidatedResults","Input","result","j","_c","_b","_d","_f","_e","_g","SearchDialog","TableOfContentsDialogContent","assumedRenditionLayout","nav","beginSpineItemIndex","beginPageIndexInSpineItem","currentSpineItemOrChapterPageIndex","currentSubChapter","buildTocForItem","tocItem","index","lvl","List","LuCircleCheck","TableOfContentsDialog","ReactReader","enableFloatingTime","enableFloatingProgress","isTableOfContentsOpen","setIsTableOfContentsOpen","isHelpOpen","setIsHelpOpen","isSearchOpen","setIsSearchOpen","setQuickMenuOpen"],"mappings":"kmCASaA,EAAsCC,EAAAA,cAA2B,CAC5E,OAAQ,OACR,gBAAiBC,EAAA,OAAO,CAAE,QAAS,EAAO,CAAA,CAC5C,CAAC,ECNYC,EAAsBC,EAAA,KACjC,CAAC,CACC,SAAAC,EACA,OAAAC,EACA,cAAAC,EACA,sBAAAC,CAAA,IAMI,CACJ,KAAM,CAAG,CAAAC,CAAe,EAAIC,YAAU,CACpC,QAASH,CAAA,CACV,EACKI,EAA+BC,aAAWJ,CAAqB,EAE/DK,EAAQC,EAAA,QACZ,KAAO,CACL,gBAAAL,EACA,OAAAH,CAAA,GAEF,CAACG,EAAiBH,CAAM,CAC1B,EAEAS,OAAAA,EAAAA,UAAU,IAAM,CACdN,EAAgB,SAASF,CAAa,CAAA,EACrC,CAACA,EAAeE,CAAe,CAAC,EAEnCO,EAAA,aACE,IACEP,EAAgB,QAAQ,KAAKQ,EAAAA,IAAIN,EAA6B,OAAO,CAAC,EACxE,CAACF,EAAiBE,CAA4B,CAChD,EAGGO,EAAAA,IAAAlB,EAAc,SAAd,CAAuB,MAAAa,EAAe,SAAAR,CAAS,CAAA,CAAA,CAGtD,6CCtCac,EAAcC,EAAM,WAG/B,SAAqBC,EAAOC,EAAK,CACjC,OACGJ,EAAAA,IAAAK,EAAAA,WAAA,CAAiB,QAAQ,QAAQ,aAAW,QAAQ,IAAAD,EAAW,GAAGD,EAChE,SAAAA,EAAM,UAAYH,EAAA,IAACM,OAAI,CAAA,EAC1B,CAEJ,CAAC,ECNYC,EAAgBL,EAAM,WAGjC,SAAuBC,EAAOC,EAAK,CAC7B,KAAA,CACJ,SAAAjB,EACA,UAAAqB,EAAY,GACZ,UAAAC,EACA,SAAAC,EAAW,GACX,GAAGC,CAAA,EACDR,EAEJ,cACGS,EAAO,OAAA,CAAA,SAAU,CAACJ,EAAW,UAAWC,EACtC,SAAA,CAAYC,GAAAV,EAAA,IAACa,SAAa,SAAb,CAAA,CAAsB,EACnCb,EAAA,IAAAa,EAAA,OAAa,WAAb,CACC,eAACA,EAAAA,OAAa,QAAb,CAAqB,IAAAT,EAAW,GAAGO,EAAM,QAAS,GAChD,SAAAxB,CACH,CAAA,CACF,CAAA,CAAA,EACF,CAEJ,CAAC,EAEY2B,EAAqBZ,EAAM,WAGtC,SAA4BC,EAAOC,EAAK,CAEtC,OAAAJ,EAAA,IAACa,EAAAA,OAAa,aAAb,CACC,SAAS,WACT,IAAI,IACJ,SAAS,IACR,GAAGV,EACJ,QAAO,GAEP,eAACF,EAAY,CAAA,KAAK,KAAK,IAAAG,EACpB,WAAM,QACT,CAAA,CAAA,CACF,CAEJ,CAAC,EAEYW,EAAaF,EAAa,OAAA,KAC1BG,EAAeH,EAAa,OAAA,OAC5BI,EAAeJ,EAAa,OAAA,OAC5BK,EAAaL,EAAa,OAAA,KACTA,EAAAA,OAAa,SACpC,MAAMM,EAAcN,EAAa,OAAA,MACPA,EAAAA,OAAa,YACjBA,EAAAA,OAAa,QACnC,MAAMO,EAAsBP,EAAa,OAAA,cC9CnCQ,EAAanC,EAAA,KACxB,CAAC,CACC,KAAAoC,EACA,QAAAC,CAAA,IAMEvB,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAO,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,gBAACjB,EACC,CAAA,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,MAAI,CAAA,EACnB,EACCM,EAAA,KAAAP,EAAA,CAAW,UAAU,OAAO,KAAM,EACjC,SAAA,CAAAlB,EAAAA,IAAC0B,WAAQ,GAAI,EAAG,GAAG,KAAK,KAAK,KAAK,SAElC,WAAA,CAAA,EACAD,EAAAA,KAACE,EAAAA,OAAO,CAAA,GAAI,EACV,SAAA,CAAC3B,EAAA,IAAA4B,EAAA,IAAA,CACC,SAAC5B,EAAA,IAAA6B,EAAA,gBAAA,CAAgB,CAAA,EACnB,EAAO,IACP7B,EAAAA,IAAC8B,QAAK,SAAsB,wBAAA,CAAA,CAAA,EAC9B,EACAL,EAAAA,KAACE,EAAAA,OAAO,CAAA,GAAI,EACV,SAAA,CAAC3B,EAAA,IAAA4B,EAAA,IAAA,CACC,SAAC5B,EAAA,IAAA+B,EAAA,eAAA,CAAe,CAAA,EAClB,EAAO,IACP/B,EAAAA,IAAC8B,QAAK,SAAqB,uBAAA,CAAA,CAAA,EAC7B,EACA9B,EAAAA,IAAC0B,EAAAA,QAAQ,CAAA,GAAI,EAAG,GAAI,EAAG,GAAG,KAAK,KAAK,KAAK,SAEzC,OAAA,CAAA,SACCI,EAAAA,KACE,CAAA,SAAA,CAAAE,EAAK,aAAWC,CAAA,CACnB,CAAA,CAAA,EACF,EACCjC,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAkC,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCpB,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,EChEaqB,EAAY,IAA0B,CACjD,KAAM,CAAE,OAAA/C,CAAA,EAAWgD,EAAA,WAAWtD,CAAa,EAEpC,OAAAM,CACT,EAEaiD,EACXjD,GAEO,CAAC,CAACA,GAAU,mCAAoCA,ECT5CkD,EAAgB,IAEZ,CACf,MAAMlD,EAAS+C,EAAU,EAElB,OAAAI,EAAA,WACL,IACGnD,EAEGoD,EAAAA,cAAc,CAACpD,EAAO,WAAW,OAAQA,EAAO,QAAQ,MAAM,CAAC,EAAE,KAC/DqD,EAAAA,IAAI,CAAC,CAACC,EAAOC,CAAO,IAAM,OAClB,MAAAC,GAAeC,EAAAF,EAAQ,WAAR,YAAAE,EAAkB,WAAW,MAAOC,GACvD,OAAA,OAAAD,EAAAC,EAAK,YAAL,YAAAD,EAAgB,WAAW,YAGtB,MAAA,CACL,GAAGH,EACH,YAAa,CAACC,EAAQ,qBAAuB,CAACC,CAChD,CACD,CAAA,CACH,EAZAG,QAaN,CAAC3D,CAAM,CACT,CACF,ECzBa4D,GAAmB,IAAM,CACpC,MAAMC,EAAaX,EAAc,EAC3BY,EAAkB,KAAK,QAC1BD,GAAA,YAAAA,EAAY,2BAA4B,GAAK,GAChD,EACME,EAAsBD,EAAkB,EAAIA,EAAkB,EAEhE,OAAAD,GAAA,YAAAA,EAAY,4BAA6B,OAAkB,KAG5DjD,EAAA,IAAAoD,EAAA,IAAA,CAAI,SAAS,WAAW,MAAO,EAAG,OAAQ,EAAG,EAAG,EAAG,MAAO,QACzD,SAAC3B,EAAAA,KAAAK,EAAAA,KAAA,CAAK,SAAS,KAAM,SAAA,CAAAqB,EAAoB,IAAA,CAAA,CAAE,CAC7C,CAAA,CAEJ,ECdaE,GAAU,IAAM,CAC3B,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAS,IAAI,IAAM,EAE3C3D,OAAAA,EAAAA,UAAU,IAAM,CACR,MAAA4D,EAAW,YAAY,IAAM,CACzBF,EAAA,IAAI,IAAM,CAAA,EACjB,GAAS,EAEL,MAAA,IAAM,cAAcE,CAAQ,CACrC,EAAG,EAAE,EAEEH,CACT,EAEaI,GAAiBvD,GAAqB,CACjD,MAAMmD,EAAOD,GAAQ,EAGnB,OAAArD,MAAC8B,EAAAA,MAAK,SAAS,KAAM,GAAG3B,EACrB,SAAAmD,EAAK,mBAAmB,UAAU,SAAU,CAC3C,KAAM,UACN,OAAQ,SACT,CAAA,EACH,CAEJ,ECxBaK,EAAe,IAAM,CAChC,KAAM,CAAE,gBAAApE,CAAA,EAAoB6C,EAAA,WAAWtD,CAAa,EAIpD,MAAO,CAFW8E,iBAAerE,CAAe,EAE7BA,EAAgB,SAAUA,CAAe,CAC9D,ECNasE,GAAe,IAAM,CAC1B,KAAA,CAACxE,CAAa,EAAIsE,EAAa,EAGnC,OAAA3D,EAAA,IAACoD,EAAA,IAAA,CACC,SAAS,WACT,KAAM,EACN,OAAQ,EACR,EAAG,EACH,MAAO/D,EAAgB,OAAY,wBAEnC,eAACqE,GAAc,CAAA,CAAA,CAAA,CACjB,CAEJ,ECPaI,GAAY5D,EAAM,WAC7B,SAAmBC,EAAOC,EAAK,CACvB,KAAA,CACJ,UAAA2D,EACA,SAAA5E,EACA,UAAAqB,EAAY,GACZ,QAAAwD,EACA,UAAAvD,EACA,GAAGE,CAAA,EACDR,EAGF,OAAAsB,EAAA,KAACwC,EAAAA,QAAc,KAAd,CACE,GAAGtD,EACJ,YAAa,CAAE,GAAGA,EAAK,YAAa,OAAQ,CAAE,EAE9C,SAAA,CAAAX,EAAA,IAACiE,EAAc,QAAA,QAAd,CAAsB,QAAO,GAAE,SAAA9E,EAAS,EACzCa,EAAAA,IAACY,EAAAA,OAAO,CAAA,SAAU,CAACJ,EAAW,UAAWC,EACvC,SAAAT,EAAAA,IAACiE,EAAAA,QAAc,WAAd,CACC,SAAAxC,EAAA,KAACwC,EAAAA,QAAc,QAAd,CACC,MAAM,OACN,GAAG,IACH,GAAG,IACH,UAAU,KACV,QAAQ,KACR,IAAA7D,EAEC,SAAA,CACC2D,GAAA/D,EAAA,IAACiE,UAAc,MAAd,CACC,eAACA,UAAc,SAAd,CAAuB,CAAA,EAC1B,EAEDD,CAAA,CAAA,GAEL,CACF,CAAA,CAAA,CAAA,CACF,CAAA,CAGN,EAEaE,GAAUhE,EAAM,WAG3B,SAAiBC,EAAOC,EAAK,CAC7B,KAAM,CAAE,SAAAjB,EAAU,GAAGwB,CAAA,EAASR,EAC9B,aACG2D,GAAU,CAAA,QAAS3E,EAAW,GAAGwB,EAAM,IAAAP,EACtC,SAAAJ,EAAA,IAACmE,EAAA,WAAA,CACC,QAAQ,QACR,aAAW,OACX,KAAK,MACL,aAAa,OAEb,eAACC,EAAAA,2BAA2B,CAAA,CAAA,CAAA,CAAA,EAEhC,CAEJ,CAAC,ECjEYC,GAAcnE,EAAM,WAG/B,SAAqBC,EAAOC,EAAK,CAE/B,OAAAJ,EAAA,IAACsE,EAAe,SAAA,MAAf,CAAsB,GAAGnE,EAAO,IAAAC,EAC/B,SAACJ,EAAA,IAAAsE,EAAA,SAAe,MAAf,CAAA,CAAqB,CACxB,CAAA,CAEJ,CAAC,EAMkCC,EAAA,WAGjC,SAAuBpE,EAAOC,EAAK,CACnC,KAAM,CAAE,SAAAjB,EAAU,KAAAqF,EAAM,GAAG7D,CAAS,EAAAR,EACpC,cACGmE,EAAAA,SAAe,MAAf,CAAsB,GAAG3D,EAAM,IAAAP,EAC7B,SAAA,CAAAjB,EACAqF,GAASxE,EAAAA,IAAAkE,GAAA,CAAS,SAAKM,CAAA,CAAA,CAAA,EAC1B,CAEJ,CAAC,EAEM,MAAMC,GAAeH,EAAe,SAAA,KAC9BI,GAAoBJ,EAAe,SAAA,UC/BnCK,EAAuB,IAAM,CACxC,MAAM1B,EAAaX,EAAc,EAC3BsC,GAAiB3B,GAAA,YAAAA,EAAY,sBAAuB,EAEpD4B,IACH5B,GAAA,YAAAA,EAAY,gCAAiC,GAAK,EAE/C6B,IAAsB7B,GAAA,YAAAA,EAAY,8BAA+B,GAAK,EAEtE8B,GACH9B,GAAA,MAAAA,EAAY,YACTA,GAAA,YAAAA,EAAY,0BACZA,GAAA,YAAAA,EAAY,yBAA2B,EACvC+B,GACH/B,GAAA,MAAAA,EAAY,YACTA,GAAA,YAAAA,EAAY,wBACZA,GAAA,YAAAA,EAAY,uBAAyB,EAErC,CAACgC,EAAgB,EAAGC,EAAiB,CAAC,EAAI,CAC9CH,EACAC,GACA,KAAK,CAACG,EAAGC,IAAMD,EAAIC,CAAC,EAEhBC,GACJpC,GAAA,YAAAA,EAAY,8BACVA,GAAA,YAAAA,EAAY,2BACdA,GAAA,YAAAA,EAAY,wBAAwBA,GAAA,YAAAA,EAAY,mBAE5CqC,EAAwBrC,GAAA,MAAAA,EAAY,YACtCA,GAAA,YAAAA,EAAY,8BACZA,GAAA,YAAAA,EAAY,mBAET,MAAA,CACL,eAAA2B,EACA,eAAAG,EACA,aAAAC,EACA,qBAAAH,EACA,mBAAAC,EACA,wBAAAO,EACA,sBAAAC,EACA,cAAAL,EACA,eAAAC,CACF,CACF,ECpCaK,GAAwB,IAAM,CACzC,MAAMtC,EAAaX,EAAc,EAC3B,CACJ,eAAAsC,EACA,cAAAK,EACA,eAAAC,EACA,sBAAAI,EACA,wBAAAD,GACEV,EAAqB,EACnBa,EAAW,KAAK,QAAOvC,GAAA,YAAAA,EAAY,2BAA4B,GAAK,GAAG,EAEvEwC,EACJC,GAEIA,GAAA,MAAAA,EAAa,WACR,GAAGA,EAAY,KAAK,MAAMD,EAAgBC,EAAY,UAAU,CAAC,IAEnEA,GAAA,YAAAA,EAAa,QAAS,GAGzBC,EAAeF,EAAgBxC,GAAA,YAAAA,EAAY,gBAAgB,EAG/D,OAAAxB,OAACmE,EAAAA,OAAM,WAAW,SAAS,IAAK,EAAG,KAAK,OAAO,SAAS,OACtD,SAAA,CAAC5F,EAAA,IAAAyE,GAAA,CAAa,MAAOe,EAAU,KAAK,KAAK,MAAO,IAC9C,SAAA/D,EAAAA,KAACE,EAAAA,OAAO,CAAA,eAAe,gBACrB,SAAA,CAAC3B,EAAAA,IAAAqE,GAAA,CAAY,MAAO,GAAK,CAAA,EACxBrE,EAAA,IAAA0E,GAAA,CAAmB,SAAG,GAAAc,CAAQ,GAAI,CAAA,CAAA,CAAA,CACrC,CACF,CAAA,EACCxF,MAAA8B,EAAAA,KAAA,CAAK,SAAQ,GAAC,SAAS,OAAO,SAAS,KAAK,GAAI,EAC9C,SAAA6D,EAAe,YAAYA,CAAY,GAAK,IAC/C,EACC,CAACf,GACAnD,EAAAA,KAACE,EACC,OAAA,CAAA,SAAA,CAAA3B,MAAC8B,EAAAA,MAAK,SAAS,KACZ,WACG,GAAGmD,EAAgB,CAAC,MAAMC,EAAiB,CAAC,OAAOI,CAAqB,GACxE,GAAGL,EAAgB,CAAC,OAAOK,CAAqB,GACtD,EACC,CAAC,EAACrC,GAAA,MAAAA,EAAY,cAEXxB,EAAA,KAAAoE,EAAA,SAAA,CAAA,SAAA,CAAA7F,EAAAA,IAAC8B,QAAK,SAAC,GAAA,CAAA,EACPL,EAAAA,KAACK,EAAAA,KAAK,CAAA,SAAS,KAAK,SAAA,CAAA,MACfmB,GAAA,YAAAA,EAAY,yBAA0B,GAAK,EAAE,GAAA,CAClD,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,EAEJ,CAEJ,EC1Da6C,EAAW5G,EAAA,KACtB,CAAC,CACC,SAAAC,EACA,SAAA4G,EACA,GAAGpF,CAAA,IAGDX,EAAA,IAACgG,EAAA,SAAA,CACC,QAAQ,OACR,cAAc,MACd,MAAM,OACN,SAAS,WACR,GAAID,IAAa,SAAW,CAAE,OAAQ,GAAM,CAAE,IAAK,CAAE,EACtD,cACEA,IAAa,SACT,CACE,MAAO,6BACP,QAAS,2BAAA,EAEX,CACE,MAAO,0BACP,QAAS,wBACX,EAEN,kBAAkB,WAClB,QAAQ,WACR,WAAW,SACX,eAAe,SACf,OAAO,KACP,EAAG,EACF,GAAGpF,EAEH,SAAAxB,CAAA,CACH,CAGN,EClCM8G,GAAiBC,SAAOC,CAAQ,EAEzBC,GAAelH,EAAAA,KAAMiB,GAE9BH,EAAA,IAACoD,EAAA,IAAA,CACC,QAAQ,WACR,IAAK,CACH,OAAQ,YACR,kBAAmB,uBACnB,gBAAiB,2BACnB,EAEA,SAAApD,EAAA,IAACiG,GAAA,CACC,SAAU,GACV,MAAO,CACL,QAAS,CACX,EACA,IAAK,CACH,sCAAuC,CACrC,UAAW,yCACb,EACA,+BAAgC,CAC9B,UAAW,uCACb,EACA,kDAAmD,CACjD,UAAW,yCAAA,CAEf,EACA,OAAQ,CACN,KAAM,CACJ,OAAQ,MACR,IAAK,MACL,UAAW,mBACX,gBAAiB,sBACnB,EACA,MAAO,CACL,OAAQ,MACR,IAAK,MACL,UAAW,mBACX,gBAAiB,oBACnB,EACA,OAAQ,CACN,MAAO,OACP,OAAQ,OACR,IAAK,MACL,YAAa,qBACb,UAAW,aAAa9F,EAAM,QAAU,MAAQ,MAAM,UACtD,gBAAiB,YACjB,UAAW,KAAA,CAEf,EACC,GAAGA,CAAA,CAAA,CACN,CACF,CAEH,ECrDKkG,GAAkB,IAAM,CAC5B,MAAMpD,EAAaX,EAAc,EAC3BgE,EAAgBrD,GAAA,YAAAA,EAAY,cAC5B,CAAE,eAAgBsD,EAAiB,sBAAAjB,EAAwB,CAAA,EAC/DX,EAAqB,EACjB6B,EAAcF,EAChB,KAAK,OAAOC,GAAmB,GAAK,CAAC,EACrCA,EACE,CAAC5G,EAAO8G,CAAW,EAAIjH,YAAU,CACrC,QAASgH,GAAe,CAAA,CACzB,EACKE,EAAM,EACNC,EAAM,KAAK,IACf,EACAL,EACI,KAAK,OAAOhB,EAAwB,GAAK,CAAC,EAC1CA,EAAwB,CAC9B,EAEAzF,OAAAA,EAAAA,UAAU,IAAM,CACF4G,EAAA,SAASD,GAAe,CAAC,CAAA,EACpC,CAACA,EAAaC,CAAW,CAAC,EAEtB,CACL,MAAA9G,EACA,YAAA8G,EACA,IAAAC,EACA,IAAAC,CACF,CACF,EAEaC,GAAW,IAAM,CAC5B,MAAMxH,EAAS+C,EAAU,EACnBc,EAAaX,EAAc,EAC3B,CAAE,SAAAuE,CAAS,EAAItE,aAAW,IAAMnD,GAAA,YAAAA,EAAQ,QAAQ,OAAQ,CAAE,CAAA,GAAK,CAAC,EAChE0H,GAAUD,GAAA,YAAAA,EAAU,oBAAqB,MACzCP,EAAgBrD,GAAA,YAAAA,EAAY,cAC5B,CAAE,sBAAAqC,EAAwB,EAAG,qBAAAT,CAAA,EACjCF,EAAqB,EACjBoC,EAAO,EACPC,EAA0BnC,EAC1B,CAAE,MAAAlF,EAAO,YAAA8G,EAAa,IAAAC,EAAK,IAAAC,CAAA,EAAQN,GAAgB,EAEnDY,EACJC,EAAA,YACGC,GAAW,CACJ,KAAA,CAACxH,EAAQ,CAAC,EAAI,MAAM,QAAQwH,CAAM,EAAIA,EAAS,CAACA,CAAM,EAE5DV,EAAY,SAAS9G,CAAK,EAEpB,MAAAyH,EAAYd,EACd,KAAK,MAAM3G,CAAK,EAAI,EACpB,KAAK,MAAMA,CAAK,EAEfqH,EAMH5H,GAAA,MAAAA,EAAQ,WAAW,oBAAoB,CACrC,UAAAgI,EACA,YAAahI,EAAO,WAAW,WAAW,qBAAuB,EACjE,UAAW,EAAA,GARbA,GAAA,MAAAA,EAAQ,WAAW,sBAAsB,CACvC,kBAAmBgI,EACnB,UAAW,EAAA,EASjB,EACA,CAAChI,EAAQkH,EAAeG,EAAaO,CAAuB,CAC9D,EA0BF,OAjBAlH,EAAA,aACE,IACEV,GAAA,YAAAA,EAAQ,WAAW,aAAa,CAC9B,SAAU,IACV,QAASqH,EAAY,OAAA,GAEzB,CAACrH,EAAQqH,CAAW,CACtB,EAWEnB,IAA0B,GACzBgB,GAAiBhB,IAA0B,EAErC,KAOPtF,EAAA,IAACoG,GAAA,CACC,MAAO,CAACzG,CAAK,EACb,IAAAgH,EACA,IAAAD,EACA,QAAAI,EACA,KAAAC,EACA,SAAAE,CAAA,CACF,CAiBJ,ECvHaI,GAAYnI,EAAA,KACvB,CAAC,CACC,KAAAoC,EACA,uBAAAgG,EACA,YAAAC,EACA,cAAAC,CAAA,IAMI,CACJ,MAAMpI,EAAS+C,EAAU,EACnBsF,EAAalF,EAAAA,WAAW,IAAMnD,GAAA,YAAAA,EAAQ,WAAW,OAAQ,CAACA,CAAM,CAAC,EACjEsI,EAAWnF,EAAAA,WAAW,IAAMnD,GAAA,YAAAA,EAAQ,SAAS,QAAS,CAACA,CAAM,CAAC,EAC9DuI,GACJD,GAAA,YAAAA,EAAU,6BAA8B,WACpC,CAACE,EAAaC,CAAc,EAAIrE,EAAAA,SAAS,EAAI,EAGjD,OAAAxD,EAAA,IAAC8F,EAAA,CACC,QAASxE,EACT,SAAS,SAGT,SAAAG,EAAA,KAACmE,EAAA,MAAA,CAEC,KAAM,EAEN,SAAA,CAAAnE,OAACE,EAAAA,QAAO,KAAM,EAAG,WAAW,SAAS,eAAe,SAClD,SAAA,CAAA3B,EAAA,IAACmE,EAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,WAAY,EACZ,QAAS,IAAM/E,GAAA,YAAAA,EAAQ,WAAW,yBAClC,SACE,EAACqI,GAAA,MAAAA,EAAY,qBACb,EAACA,GAAA,MAAAA,EAAY,mBAGd,SACCE,EAAA3H,MAAC8H,EAAAA,gBAAgB,CAAA,CAAA,QAEhBC,EAAAA,kBAAkB,CAAA,CAAA,CAAA,CAEvB,EACAtG,EAAA,KAACmE,EAAA,MAAA,CACC,KAAM,EACN,KAAM,IACN,IAAK,EACL,WAAW,SACX,SAAS,UACT,GAAI,EAEJ,SAAA,CAAA5F,EAAA,IAACuF,GAAsB,EAAA,EACtBvF,EAAA,IAAAoD,EAAA,IAAA,CAAI,OAAQ,EAAG,KAAM,IAAK,MAAM,OAAO,SAAS,UAC/C,SAACpD,EAAAA,IAAA4G,GAAA,CAAA,CAAS,CACZ,CAAA,CAAA,CAAA,CACF,EACA5G,EAAA,IAACmE,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,SACE,EAACsD,GAAA,MAAAA,EAAY,sBACb,EAACA,GAAA,MAAAA,EAAY,sBAEf,QAAS,IAAM,CACbrI,GAAA,MAAAA,EAAQ,WAAW,4BACrB,EAEC,SACCuI,EAAA3H,MAACgI,EAAAA,kBAAkB,CAAA,CAAA,QAElBC,EAAAA,mBAAmB,CAAA,CAAA,CAAA,CAAA,CAExB,EACF,EACAjI,EAAA,IAAC2B,EAAA,OAAA,CACC,WAAW,SACX,eAAe,SAGf,SAAAF,EAAA,KAACyG,EAAAA,YAAY,KAAZ,CACC,KAAMN,EACN,KAAM,EACN,aAAc,CAAC,CAAE,KAAAtG,KAAW,CAC1BuG,EAAevG,CAAI,CACrB,EAEA,SAAA,CAAAtB,EAAA,IAACkI,EAAAA,YAAY,QAAZ,CACC,SAAS,IAET,MAAM,OACN,QAAQ,OACR,eAAe,SAEf,SAAAlI,EAAA,IAACmI,EAAA,cAAA,CACC,MAAO,CACL,UAAWP,EAAc,eAAiB,gBAAA,CAC5C,CAAA,CACF,CACF,EACAnG,EAAA,KAACyG,EAAAA,YAAY,QAAZ,CACC,QAAQ,OACR,eAAe,SACf,IAAK,EAEL,SAAA,CAAAlI,EAAA,IAACmE,EAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,QAASoD,EAET,eAACa,EAAAA,aAAa,CAAA,CAAA,CAAA,CAChB,EACApI,EAAA,IAACmE,EAAA,WAAA,CACC,aAAW,oBACX,KAAK,KACL,QAAQ,QACR,QAASmD,EAET,eAACe,EAAAA,kBAAkB,CAAA,CAAA,CAAA,CACrB,EACChG,EAAkBjD,CAAM,GACvBY,EAAA,IAACmE,EAAA,WAAA,CACC,aAAW,SACX,KAAK,KACL,QAAQ,QACR,QAASqD,EAET,eAACc,EAAAA,SAAS,CAAA,CAAA,CAAA,CAAA,CACZ,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CACF,CAAA,CAGN,EC1JaC,GAAgB,IAAM,CACjC,KAAM,CAACC,EAAcC,CAAe,EAAIjF,EAAAA,SAAS,EAAK,EAEhDkF,EAA0BxB,EAAAA,YAAY,IACtC,SAAS,kBACJ,SACJ,iBACA,MAAM,QAAQ,KAAK,EACnB,KAAK,IAAM,CACVuB,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,EAEL5I,OAAAA,EAAAA,UAAU,IAAM,CACd,SAAS8I,GAA0B,CACjBF,EAAA,CAAC,CAAC,SAAS,iBAAiB,CAAA,CAGrC,gBAAA,iBAAiB,mBAAoBE,CAAuB,EAE9D,IAAM,CACF,SAAA,oBAAoB,mBAAoBA,CAAuB,CAC1E,CACF,EAAG,EAAE,EAEE,CACL,aAAAH,EACA,wBAAAE,CACF,CACF,ECnCaE,GAAS,CAAC,CACrB,KAAAtH,EACA,YAAAuH,EACA,YAAAC,CACF,IAIM,CACJ,MAAM1J,EAAS+C,EAAU,EACnB0E,EAAWtE,EAAAA,WAAW,IAAMnD,GAAA,YAAAA,EAAQ,QAAQ,UAAW,CAACA,CAAM,CAAC,EAC/D,CAAE,aAAAoJ,EAAc,wBAAAE,CAAwB,EAAIH,GAAc,EAG9D,OAAA9G,EAAA,KAACqE,EAAA,CACC,QAASxE,EACT,SAAS,MACT,OAAO,OACP,eAAe,gBAEf,SAAA,CAAAtB,EAAA,IAACmE,EAAA,WAAA,CACC,aAAW,OACX,KAAK,KACL,QAAQ,QACR,WAAY,EACZ,QAAS0E,EAET,eAACE,EAAAA,eAAe,CAAA,CAAA,CAAA,CAClB,EACA/I,EAAA,IAAC4F,EAAA,MAAA,CACC,KAAM,EACN,KAAM,IACN,IAAK,EACL,WAAW,SACX,SAAS,OACT,GAAI,EAEJ,eAAC9D,OAAK,CAAA,SAAQ,GAAC,SAAS,OACrB,0BAAU,KACb,CAAA,CAAA,CACF,SACCH,EAAAA,OACC,CAAA,SAAA,CAAA3B,EAAA,IAACmE,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,QAAS2E,EAET,eAACE,EAAAA,SAAS,CAAA,CAAA,CAAA,CACZ,EACAhJ,EAAA,IAACmE,EAAA,WAAA,CACC,aAAW,QACX,KAAK,KACL,WAAY,EACZ,QAAQ,QACR,QAASuE,EAER,SAAeF,EAAAxI,MAACiJ,EAAAA,iBAAiB,CAAA,CAAA,QAAMC,EAAAA,aAAa,CAAA,CAAA,CAAA,CAAA,CACvD,CACF,CAAA,CAAA,CAAA,CACF,CAEJ,EClEaC,GAAYjK,EAAA,KACvB,CAAC,CACC,YAAA2J,EACA,YAAAC,EACA,uBAAAxB,EACA,YAAAC,EACA,cAAAC,CAAA,IAOI,CACE,KAAA,CAACnI,CAAa,EAAIsE,EAAa,EAErC,OAEIlC,EAAA,KAAAoE,WAAA,CAAA,SAAA,CAAA7F,EAAA,IAAC4I,GAAA,CACC,KAAMvJ,EACN,YAAAwJ,EACA,YAAAC,CAAA,CACF,EACA9I,EAAA,IAACqH,GAAA,CACC,KAAMhI,EACN,uBAAAiI,EACA,YAAAC,EACA,cAAAC,CAAA,CAAA,CACF,EACF,CAAA,CAGN,EClCa4B,GAAiBlK,EAAA,KAC5B,CAAC,CACC,YAAAmK,EAAc,GACd,YAAAC,EAAc,EACd,KAAAC,EACA,IAAAC,EAAM,IACN,QAAAC,EACA,kBAAAC,CAAA,IASI,CAEJ,MAAMC,EAASN,EAAY,UACzB,KAAK,IAAIC,EAAc,GAAiB,CAAC,EACzC,KAAK,IAAIA,EAAa,CAAC,CACzB,EACMM,EAAQP,EAAY,UACxB,KAAK,IAAIC,EAAcC,EAAK,OAAQF,EAAY,OAAS,CAAC,EAC1D,KAAK,IACHC,EAAcC,EAAK,OAAS,GAC5BF,EAAY,OAAS,CAAA,CAEzB,EAGE,OAAA5H,EAAA,KAACoI,EAAA,KAAA,CACC,KAAML,EACN,MAAO,CAAE,OAAQ,EAAG,SAAU,QAAS,EACvC,QAAUhI,GAAM,CACdA,EAAE,eAAe,EAEjBiI,EAAQD,CAAG,CACb,EACA,QAAQ,OACR,cAAc,SACd,WAAW,aACX,IAAK,EAEL,SAAA,CAAC/H,EAAAA,KAAAK,EAAA,KAAA,CAAK,UAAW,EAAG,GAAG,OAAO,MAAO,CAAE,QAAS,OAAA,EAAW,SAAA,CAAA,IACvD6H,EACF3J,EAAAA,IAAC,KAAG,SAAKuJ,CAAA,CAAA,EACRK,EAAM,GAAA,EACT,QACC9H,EAAAA,KAAK,CAAA,SAAS,KAAK,MAAM,WAAW,MAAO,CAAE,eAAgB,MAAA,EAC3D,SAAc,cAAA4H,IAAsB,OAAYA,EAAoB,EAAI,sBAAsB,EACjG,CAAA,CAAA,CAAA,CACF,CAAA,CAGN,EClDaI,GAAsB5K,EAAA,KACjC,CAAC,CACC,WAAA6K,CAAA,IAGI,CACJ,KAAM,CAACR,EAAMS,CAAO,EAAIxG,EAAAA,SAAS,EAAE,EAC7BpE,EAAS+C,EAAU,EACnB8H,EAAmB5H,EAAkBjD,CAAM,EAAIA,EAAS,OAExD8K,EAAiB1I,GAA2C,CACxDwI,EAAAxI,EAAE,OAAO,KAAK,CACxB,EAEMiI,EAAUvC,EAAA,YACbsC,GAAgB,CACJO,EAAA,EACH3K,GAAA,MAAAA,EAAA,WAAW,QAAQoK,EAC7B,EACA,CAACpK,EAAQ2K,CAAU,CACrB,EAEMI,EAAS5H,EAAA,WACb,IACE0H,GAAA,YAAAA,EAAkB,OAAO,OAAOV,GAAM,KACpC9G,MAAK2H,IAAU,CAAE,KAAM,MAAgB,KAAAA,GAAO,EAC9CC,EAAAA,UAAU,CAAE,KAAM,OAAkB,CAAA,GAExC,CAACjL,EAAQmK,CAAI,CACf,EACMe,GAAYH,GAAA,YAAAA,EAAQ,QAAS,QAC7BI,GAAUJ,GAAA,YAAAA,EAAQ,QAAS,MAAQA,EAAO,KAAO,CAAC,EAClDK,EAAsBjI,EAAA,WAC1B,IAAMnD,GAAA,YAAAA,EAAQ,WAAW,OAAOmL,EAAQ,MAAM,EAAG,GAAG,GACpD,CAACA,CAAO,CACV,EAEA,OACG9I,EAAAA,KAAAmE,EAAAA,MAAA,CAAM,KAAM,EAAG,OAAO,OACrB,SAAA,CAAC5F,EAAAA,IAAAoD,EAAAA,IAAA,CAAI,GAAI,EACP,SAAApD,EAAA,IAACyK,EAAA,MAAA,CACC,YAAY,oBACZ,MAAOlB,EACP,SAAUW,EACV,aAAc,CAAA,CAAA,EAElB,EACAzI,EAAA,KAAC2B,EAAA,IAAA,CACC,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,KAAM,EACN,MAAO,CAAE,SAAU,SAAU,UAAW,MAAO,EAE9C,SAAA,CAAakH,GAAAtK,EAAAA,IAAC8B,EAAAA,MAAK,SAAa,eAAA,CAAA,EAChC,CAACwI,GAAaC,EAAQ,SAAW,GAAKvK,EAAA,IAAC,KAAE,SAAoB,uBAAA,EAC7D,CAACsK,GAAaC,EAAQ,QAAU,UAC9B3E,EAAAA,MACC,CAAA,SAAA,CAAAnE,EAAA,KAACC,EAAQ,QAAA,CAAA,GAAG,KAAK,KAAK,KACnB,SAAA,CAAQ6I,EAAA,OAAO,YAAA,EAClB,EACAvK,MAAC4F,EAAAA,OAAM,IAAK,EACT,0BAAqB,IAAI,CAAC8E,EAAQC,IAAM,mBAErC,OAAA3K,EAAA,IAACoJ,GAAA,CAEC,cACEwB,GAAAC,GAAAhI,EAAA6H,EAAO,OAAP,YAAA7H,EAAa,QAAb,YAAAgI,EAAoB,eAAe,gBAAnC,YAAAD,EACI,cAAe,GAErB,WAAWE,EAAAJ,EAAO,OAAP,YAAAI,EAAa,cACxB,cAAaC,GAAAC,EAAAN,EAAO,OAAP,YAAAM,EAAa,QAAb,YAAAD,EAAoB,cAAe,EAChD,KAAAxB,EACA,IAAKmB,EAAO,IACZ,QAAAjB,EACA,mBAAmBwB,EAAAP,EAAO,OAAP,YAAAO,EAAa,iBAAA,EAV3BN,CAWP,CAAA,EAGN,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAAA,CAEJ,EACF,CAAA,CAGN,EChFaO,GAAehM,EAAA,KAC1B,CAAC,CACC,KAAAoC,EACA,QAAAC,EACA,WAAAwI,CAAA,IAOE/J,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAO,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,SAAAC,EAAA,KAAClB,EAAc,CAAA,OAAO,OACpB,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,QAAM,CAAA,EACrB,QACCD,EAAW,CAAA,KAAM,EAChB,SAAClB,EAAA,IAAA8J,GAAA,CAAoB,WAAAC,CAAwB,CAAA,EAC/C,EACC/J,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAkC,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCpB,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,ECzCaqK,GAA+BjM,EAAA,KAC1C,CAAC,CACC,WAAA6K,CAAA,IAGI,CACJ,MAAM3K,EAAS+C,EAAU,EACnB,CAAE,SAAA0E,EAAU,uBAAAuE,CAAuB,EACvC7I,aAAW,IAAMnD,GAAA,YAAAA,EAAQ,QAAQ,OAAQ,CAACA,CAAM,CAAC,GAAK,CAAC,EACnD,CAAE,IAAAiM,GAAQxE,GAAY,CAAC,EACvB5D,EAAaX,EAAc,EACrB+I,GAAA,MAAAA,EAAK,IACjB,KAAM,CAAE,oBAAAC,EAAqB,0BAAAC,CAA0B,EAAItI,GAAc,CAAC,EACpEuI,GACHJ,IAA2B,aACxBG,EACAD,IAAwB,EAE9B,QAAQ,IAAI,CAAE,uBAAAF,EAAwB,mCAAAI,CAAA,CAAoC,EAE1E,IAAIC,EAAoBxI,GAAA,YAAAA,EAAY,iBAEpC,KAAOwI,GAAA,MAAAA,EAAmB,YACxBA,EAAoBA,GAAA,YAAAA,EAAmB,WAGnC,MAAAC,EAAkB,CACtBC,EACAC,EACAC,IAECpK,EAAAA,KAAAvB,EAAM,SAAN,CACC,SAAA,CAAAF,EAAA,IAAC8L,EAAAA,KAAK,KAAL,CACC,GAAI,GAAKD,EAAM,GACf,MAAO,CACL,QAAS,OACT,WAAY,QACd,EAEA,SAAApK,EAAA,KAACoI,EAAA,KAAA,CACC,QAAS,IAAM,CACFE,EAAA,EAEH3K,GAAA,MAAAA,EAAA,WAAW,QAAQuM,EAAQ,KACrC,EACA,KAAK,IAEJ,SAAA,EAAmBF,GAAA,YAAAA,EAAA,QAASE,EAAQ,MAClC3L,EAAA,IAAA8L,EAAA,KAAK,UAAL,CAAe,QAAO,GACrB,SAAC9L,EAAAA,IAAA+L,EAAAA,cAAA,CAAA,CAAc,CACjB,CAAA,GAEDN,GAAA,YAAAA,EAAmB,QAASE,EAAQ,YAClCG,EAAAA,KAAK,UAAL,CAAe,QAAO,GAAC,WAAW,SACjC,SAAA9L,EAAA,IAAC+L,iBAAc,CAAA,EACjB,EAEFtK,EAAAA,KAACmE,EAAAA,MAAM,CAAA,IAAK,EACV,SAAA,CAAA5F,MAAC8B,EAAAA,MAAK,SAAS,KAAM,SAAQ6J,EAAA,OAASA,EAAQ,KAAK,GAClDF,GAAA,YAAAA,EAAmB,QAASE,EAAQ,MACnC3L,EAAA,IAAC8B,EAAA,KAAA,CACC,UAAU,SACV,WAAW,OACX,SAAS,KACT,SAAA,qBACA0J,EAAqC,CACvC,EAAA,CAAA,CAAG,CAEP,CAAA,CAAA,CAAA,CAAA,CACF,CACF,EACCG,EAAQ,SAAS,OAAS,GACxB3L,EAAA,IAAA8L,EAAA,KAAK,KAAL,CAAU,GAAG,MAAM,IAAK,EACtB,WAAQ,SAAS,IAAI,CAACH,EAASC,IAC9BF,EAAgBC,EAASC,EAAOC,EAAM,CAAC,CAAA,CAE3C,CAAA,CAAA,CAAA,EA7CiBD,CA+CrB,EAIA,OAAA5L,MAAC8L,EAAAA,KAAK,KAAL,CAAU,IAAK,EAAG,UAAU,OAAO,GAAI,EAAG,KAAM,EAC9C,SAAKT,GAAA,YAAAA,EAAA,IAAI,IAAI,CAACM,EAASC,IAAUF,EAAgBC,EAASC,EAAO,CAAC,EACrE,CAAA,CAAA,CAGN,EClFaI,GAAwB9M,EAAA,KACnC,CAAC,CACC,KAAAoC,EACA,QAAAC,EACA,WAAAwI,CAAA,IAOE/J,EAAA,IAACe,EAAA,CACC,UAAS,GACT,UAAU,SACV,KAAAO,EACA,aAAeE,GAAMD,EAAQC,EAAE,IAAI,EACnC,KAAM,CAAE,OAAQ,OAAQ,GAAI,IAAK,EACjC,eAAe,SAEf,gBAACjB,EACC,CAAA,SAAA,CAAAP,MAACiB,EACC,CAAA,SAAAjB,EAAA,IAACmB,EAAY,CAAA,SAAA,mBAAiB,CAAA,EAChC,EACAnB,EAAAA,IAACkB,GAAW,UAAU,OAAO,KAAM,EACjC,SAAAlB,EAAA,IAACmL,GAA6B,CAAA,WAAApB,CAAA,CAAwB,CACxD,CAAA,EACC/J,EAAA,IAAAgB,EAAA,CACC,SAAChB,EAAA,IAAAoB,EAAA,CAAoB,QAAO,GAC1B,SAACpB,EAAAA,IAAAkC,EAAA,OAAA,CAAO,QAAQ,UAAU,SAAM,QAAA,CAAA,CAClC,CAAA,EACF,QACCpB,EAAmB,CAAA,CAAA,CAAA,CACtB,CAAA,CAAA,CACF,CAGN,ECxCamL,GAAc,CAAC,CAC1B,mBAAAC,EAAqB,GACrB,uBAAAC,EAAyB,GACzB,YAAAtD,EACA,YAAAC,CACF,IAKM,CACJ,KAAM,CAACsD,EAAuBC,CAAwB,EAAI7I,EAAAA,SAAS,EAAK,EAClE,CAAC8I,EAAYC,CAAa,EAAI/I,EAAAA,SAAS,EAAK,EAC5C,CAACgJ,EAAcC,CAAe,EAAIjJ,EAAAA,SAAS,EAAK,EAChD,CAACnE,EAAeqN,CAAgB,EAAI/I,EAAa,EAEvD,OAEKlC,EAAA,KAAAoE,WAAA,CAAA,SAAA,CACCsG,GAAAnM,EAAA,IAACgG,EAAA,SAAA,CACC,QAAS,CAAC3G,EACV,cAAe,CAAE,MAAO,UAAW,QAAS,UAAW,EACvD,kBAAkB,WAElB,eAAC2D,GAAiB,CAAA,CAAA,CAAA,CACpB,EAEFhD,EAAA,IAACmJ,GAAA,CACC,YAAAN,EACA,YAAAC,EACA,uBAAwB,IAAMuD,EAAyB,EAAI,EAC3D,YAAa,IAAME,EAAc,EAAI,EACrC,cAAe,IAAME,EAAgB,EAAI,CAAA,CAC3C,EACCzM,EAAA,IAAAqB,EAAA,CAAW,KAAMiL,EAAY,QAASC,EAAe,EACtDvM,EAAA,IAACgM,GAAA,CACC,KAAMI,EACN,QAASC,EACT,WAAY,IAAM,CAChBA,EAAyB,EAAK,EAC9BK,EAAiB,EAAK,CAAA,CACxB,CACF,EACA1M,EAAA,IAACkL,GAAA,CACC,KAAMsB,EACN,QAASC,EACT,WAAY,IAAM,CAChBA,EAAgB,EAAK,EACrBC,EAAiB,EAAK,CAAA,CACxB,CACF,EACA1M,EAAA,IAACgG,EAAA,SAAA,CACC,QAASkG,GAAsB7M,EAC/B,cAAe,CAAE,MAAO,UAAW,QAAS,UAAW,EACvD,kBAAkB,OAClB,SAAS,SAET,eAACwE,GAAa,CAAA,CAAA,CAAA,CAAA,CAChB,EACF,CAEJ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
import { QuickMenu } from './navigation/QuickMenu/QuickMenu';
|
|
3
|
-
export declare const ReactReader: ({ enableFloatingTime, enableFloatingProgress, ...rest }: {
|
|
1
|
+
export declare const ReactReader: ({ enableFloatingTime, enableFloatingProgress, onBackClick, onMoreClick, }: {
|
|
4
2
|
enableFloatingTime?: boolean;
|
|
5
3
|
enableFloatingProgress?: boolean;
|
|
6
|
-
|
|
4
|
+
onBackClick: () => void;
|
|
5
|
+
onMoreClick: () => void;
|
|
6
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
import { Reader } from '@prose-reader/core';
|
|
2
|
+
import { SearchEnhancerAPI } from '@prose-reader/enhancer-search';
|
|
2
3
|
export declare const useReader: () => Reader | undefined;
|
|
4
|
+
export declare const hasSearchEnhancer: (reader?: Reader) => reader is Reader & SearchEnhancerAPI;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export declare const BottomBar: import('react').MemoExoticComponent<({ open, onTableOfContentsClick, onHelpClick, }: {
|
|
1
|
+
export declare const BottomBar: import('react').MemoExoticComponent<({ open, onTableOfContentsClick, onHelpClick, onSearchClick, }: {
|
|
2
2
|
open: boolean;
|
|
3
3
|
onTableOfContentsClick: () => void;
|
|
4
4
|
onHelpClick: () => void;
|
|
5
|
+
onSearchClick: () => void;
|
|
5
6
|
}) => import("react/jsx-runtime").JSX.Element>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export declare const QuickMenu: import('react').MemoExoticComponent<({ onBackClick, onMoreClick, onTableOfContentsClick, onHelpClick, }: {
|
|
1
|
+
export declare const QuickMenu: import('react').MemoExoticComponent<({ onBackClick, onMoreClick, onTableOfContentsClick, onHelpClick, onSearchClick, }: {
|
|
2
2
|
onBackClick: () => void;
|
|
3
3
|
onMoreClick: () => void;
|
|
4
4
|
onTableOfContentsClick: () => void;
|
|
5
5
|
onHelpClick: () => void;
|
|
6
|
+
onSearchClick: () => void;
|
|
6
7
|
}) => import("react/jsx-runtime").JSX.Element>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const SearchListItem: import('react').MemoExoticComponent<({ contextText, startOffset, text, cfi, onClick, absolutePageIndex, }: {
|
|
2
|
+
pageIndex: number | undefined;
|
|
3
|
+
absolutePageIndex?: number;
|
|
4
|
+
contextText?: string;
|
|
5
|
+
startOffset?: number;
|
|
6
|
+
text: string;
|
|
7
|
+
cfi?: string;
|
|
8
|
+
onClick: (cfi: string) => void;
|
|
9
|
+
}) => import("react/jsx-runtime").JSX.Element>;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prose-reader/react-reader",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.187.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
@@ -30,11 +30,17 @@
|
|
|
30
30
|
"@chakra-ui/react": "3.x",
|
|
31
31
|
"@emotion/react": "11.x",
|
|
32
32
|
"@prose-reader/core": "^1.169.0",
|
|
33
|
+
"@prose-reader/enhancer-search": "^1.169.0",
|
|
33
34
|
"rc-slider": "11.1.x",
|
|
34
35
|
"react": "19.x || 18.x",
|
|
35
36
|
"react-dom": "19.x || 18.x",
|
|
36
37
|
"react-icons": "^5.4.0",
|
|
37
38
|
"reactjrx": "1.x"
|
|
38
39
|
},
|
|
39
|
-
"
|
|
40
|
+
"peerDependenciesMeta": {
|
|
41
|
+
"@prose-reader/enhancer-search": {
|
|
42
|
+
"optional": true
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"gitHead": "659bb0401d13b671a3002190fbd22f861caf7059"
|
|
40
46
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|