@prose-reader/react-reader 1.174.0 → 1.175.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.
Files changed (70) hide show
  1. package/dist/common/useFullscreen.d.ts +4 -0
  2. package/dist/components/ui/avatar.d.ts +16 -0
  3. package/dist/components/ui/checkbox.d.ts +8 -0
  4. package/dist/components/ui/close-button.d.ts +4 -0
  5. package/dist/components/ui/color-mode.d.ts +19 -0
  6. package/dist/components/ui/dialog.d.ts +19 -0
  7. package/dist/components/ui/drawer.d.ts +19 -0
  8. package/dist/components/ui/field.d.ts +9 -0
  9. package/dist/components/ui/input-group.d.ts +12 -0
  10. package/dist/components/ui/popover.d.ts +17 -0
  11. package/dist/components/ui/progress.d.ts +9 -0
  12. package/dist/components/ui/provider.d.ts +2 -0
  13. package/dist/components/ui/radio.d.ts +8 -0
  14. package/dist/components/ui/slider.d.ts +11 -0
  15. package/dist/components/ui/toggle-tip.d.ts +10 -0
  16. package/dist/components/ui/tooltip.d.ts +11 -0
  17. package/dist/context/ReactReaderProvider.d.ts +5 -0
  18. package/dist/context/context.d.ts +3 -0
  19. package/dist/context/useReader.d.ts +2 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.js +379 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/index.umd.cjs +2 -0
  24. package/dist/index.umd.cjs.map +1 -0
  25. package/dist/navigation/QuickMenu/BottomBar.d.ts +3 -0
  26. package/dist/navigation/QuickMenu/PaginationInfoSection.d.ts +1 -0
  27. package/dist/navigation/QuickMenu/QuickBar.d.ts +4 -0
  28. package/dist/navigation/QuickMenu/QuickMenu.d.ts +5 -0
  29. package/dist/navigation/QuickMenu/Scrubber.d.ts +1 -0
  30. package/dist/navigation/QuickMenu/TimeIndicator.d.ts +3 -0
  31. package/dist/navigation/QuickMenu/TopBar.d.ts +5 -0
  32. package/dist/navigation/useNavigationContext.d.ts +11 -0
  33. package/dist/pagination/usePagination.d.ts +4 -0
  34. package/dist/settings/useSettings.d.ts +2 -0
  35. package/package.json +5 -2
  36. package/src/common/useFullscreen.ts +0 -44
  37. package/src/components/ui/avatar.tsx +0 -74
  38. package/src/components/ui/checkbox.tsx +0 -25
  39. package/src/components/ui/close-button.tsx +0 -17
  40. package/src/components/ui/color-mode.tsx +0 -75
  41. package/src/components/ui/dialog.tsx +0 -62
  42. package/src/components/ui/drawer.tsx +0 -52
  43. package/src/components/ui/field.tsx +0 -33
  44. package/src/components/ui/input-group.tsx +0 -53
  45. package/src/components/ui/popover.tsx +0 -59
  46. package/src/components/ui/progress.tsx +0 -34
  47. package/src/components/ui/provider.tsx +0 -12
  48. package/src/components/ui/radio.tsx +0 -24
  49. package/src/components/ui/slider.tsx +0 -82
  50. package/src/components/ui/toggle-tip.tsx +0 -70
  51. package/src/components/ui/tooltip.tsx +0 -46
  52. package/src/context/ReactReaderProvider.tsx +0 -14
  53. package/src/context/context.ts +0 -6
  54. package/src/context/useReader.ts +0 -9
  55. package/src/index.ts +0 -2
  56. package/src/navigation/QuickMenu/BottomBar.tsx +0 -65
  57. package/src/navigation/QuickMenu/PaginationInfoSection.tsx +0 -62
  58. package/src/navigation/QuickMenu/QuickBar.tsx +0 -40
  59. package/src/navigation/QuickMenu/QuickMenu.tsx +0 -22
  60. package/src/navigation/QuickMenu/Scrubber.tsx +0 -138
  61. package/src/navigation/QuickMenu/TimeIndicator.tsx +0 -29
  62. package/src/navigation/QuickMenu/TopBar.tsx +0 -72
  63. package/src/navigation/useNavigationContext.ts +0 -46
  64. package/src/pagination/usePagination.ts +0 -29
  65. package/src/settings/useSettings.ts +0 -9
  66. package/src/vite-env.d.ts +0 -1
  67. package/tsconfig.app.json +0 -26
  68. package/tsconfig.json +0 -7
  69. package/tsconfig.node.json +0 -22
  70. package/vite.config.ts +0 -32
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/context/context.ts","../src/context/useReader.ts","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/pagination/usePagination.ts","../src/navigation/useNavigationContext.ts","../src/navigation/QuickMenu/PaginationInfoSection.tsx","../src/navigation/QuickMenu/QuickBar.tsx","../src/navigation/QuickMenu/Scrubber.tsx","../src/navigation/QuickMenu/TimeIndicator.tsx","../src/navigation/QuickMenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/navigation/QuickMenu/TopBar.tsx","../src/navigation/QuickMenu/QuickMenu.tsx","../src/context/ReactReaderProvider.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\n\nexport const ReaderContext: Context<Reader | undefined> = createContext<\n Reader | undefined\n>(undefined)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReader = (): Reader | undefined => {\n const context = useContext(ReaderContext)\n\n return context\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 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 { 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 px={4}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\n)\n","import RcSlider from \"rc-slider\"\nimport { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { useObserve, useSignal, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport \"rc-slider/assets/index.css\"\nimport { useNavigationContext } from \"../useNavigationContext\"\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 RcSlider>[\"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 <RcSlider\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 { 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 { Box, IconButton, Stack } from \"@chakra-ui/react\"\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\"\nimport { TimeIndicator } from \"./TimeIndicator\"\n\nexport const BottomBar = ({ open }: { open: boolean }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection = settings?.computedPageTurnDirection === \"vertical\"\n\n return (\n <QuickBar present={open} position=\"bottom\" height={130}>\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <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 && !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? <RxDoubleArrowDown /> : <RxDoubleArrowRight />}\n </IconButton>\n <TimeIndicator position=\"absolute\" bottom={0} left={0} p={2} />\n </QuickBar>\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\"\n\nexport const QuickMenu = memo(\n ({\n open,\n onBackClick,\n onMoreClick,\n }: { open: boolean; onBackClick: () => void; onMoreClick: () => void }) => {\n return (\n <>\n <TopBar\n open={open}\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n />\n <BottomBar open={open} />\n </>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n }: { children?: React.ReactNode; reader: Reader | undefined }) => {\n return (\n <ReaderContext.Provider value={reader}>{children}</ReaderContext.Provider>\n )\n },\n)\n"],"names":["ReaderContext","createContext","useReader","useContext","ToggleTip","React","props","ref","showArrow","children","portalled","content","portalRef","rest","jsxs","ChakraPopover","jsx","Portal","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","info","ProgressRoot","ProgressValueText","usePagination","reader","useObserve","combineLatest","map","state","context","isOnlyImages","_a","item","NEVER","useNavigationContext","pagination","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","Stack","HStack","Text","Fragment","QuickBar","memo","position","Presence","useSliderValues","isUsingSpread","currentRealPage","currentPage","value","valueSignal","useSignal","min","max","useEffect","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","useSubscribe","RcSlider","useTime","time","setTime","useState","interval","TimeIndicator","BottomBar","open","navigation","settings","isVerticalDirection","RxDoubleArrowUp","RxDoubleArrowLeft","Box","RxDoubleArrowDown","RxDoubleArrowRight","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","onBackClick","onMoreClick","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","ReactReaderProvider"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ (function(c,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("react/jsx-runtime"),require("react"),require("@chakra-ui/react"),require("react-icons/rx"),require("reactjrx"),require("react-icons/hi"),require("rxjs"),require("rc-slider"),require("rc-slider/assets/index.css"),require("react-icons/io"),require("react-icons/md")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","@chakra-ui/react","react-icons/rx","reactjrx","react-icons/hi","rxjs","rc-slider","rc-slider/assets/index.css","react-icons/io","react-icons/md"],t):(c=typeof globalThis<"u"?globalThis:c||self,t(c["prose-react-reader"]={},c.jsxRuntime,c.React,c.react,c.rx,c.reactjrx,c.hi,c.rxjs,c.RcSlider,null,c.io,c.md))})(this,function(c,t,a,n,b,g,B,m,D,X,k,w){"use strict";function E(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const s in e)if(s!=="default"){const o=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(r,s,o.get?o:{enumerable:!0,get:()=>e[s]})}}return r.default=e,Object.freeze(r)}const p=E(a),O=a.createContext(void 0),P=()=>a.useContext(O),$=p.forwardRef(function(r,s){const{showArrow:o,children:l,portalled:i=!0,content:d,portalRef:f,...u}=r;return t.jsxs(n.Popover.Root,{...u,positioning:{...u.positioning,gutter:4},children:[t.jsx(n.Popover.Trigger,{asChild:!0,children:l}),t.jsx(n.Portal,{disabled:!i,container:f,children:t.jsx(n.Popover.Positioner,{children:t.jsxs(n.Popover.Content,{width:"auto",px:"2",py:"1",textStyle:"xs",rounded:"sm",ref:s,children:[o&&t.jsx(n.Popover.Arrow,{children:t.jsx(n.Popover.ArrowTip,{})}),d]})})})]})}),M=p.forwardRef(function(r,s){const{children:o,...l}=r;return t.jsx($,{content:o,...l,ref:s,children:t.jsx(n.IconButton,{variant:"ghost","aria-label":"info",size:"2xs",colorPalette:"gray",children:t.jsx(B.HiOutlineInformationCircle,{})})})}),F=p.forwardRef(function(r,s){return t.jsx(n.Progress.Track,{...r,ref:s,children:t.jsx(n.Progress.Range,{})})});p.forwardRef(function(r,s){const{children:o,info:l,...i}=r;return t.jsxs(n.Progress.Label,{...i,ref:s,children:[o,l&&t.jsx(M,{children:l})]})});const q=n.Progress.Root,z=n.Progress.ValueText,I=()=>{const e=P();return g.useObserve(()=>e?m.combineLatest([e.pagination.state$,e.context.state$]).pipe(m.map(([r,s])=>{var l;const o=(l=s.manifest)==null?void 0:l.spineItems.every(i=>{var d;return(d=i.mediaType)==null?void 0:d.startsWith("image/")});return{...r,hasChapters:!s.isFullyPrePaginated&&!o}})):m.NEVER,[e])},S=()=>{const e=I(),r=(e==null?void 0:e.numberOfTotalPages)===1,s=((e==null?void 0:e.beginNumberOfPagesInSpineItem)??0)>1,o=((e==null?void 0:e.endNumberOfPagesInSpineItem)??0)>1,l=(e!=null&&e.hasChapters?e==null?void 0:e.beginPageIndexInSpineItem:e==null?void 0:e.beginAbsolutePageIndex)??0,i=(e!=null&&e.hasChapters?e==null?void 0:e.endPageIndexInSpineItem:e==null?void 0:e.endAbsolutePageIndex)??0,[d=0,f=0]=[l,i].sort((x,v)=>x-v),u=(e==null?void 0:e.beginPageIndexInSpineItem)!==(e==null?void 0:e.endPageIndexInSpineItem)||(e==null?void 0:e.beginSpineItemIndex)!==(e==null?void 0:e.endSpineItemIndex),h=e!=null&&e.hasChapters?e==null?void 0:e.beginNumberOfPagesInSpineItem:e==null?void 0:e.numberOfTotalPages;return{hasOnlyOnePage:r,beginPageIndex:l,endPageIndex:i,isBeginWithinChapter:s,isEndWithinChapter:o,beginAndEndAreDifferent:u,totalApproximatePages:h,leftPageIndex:d,rightPageIndex:f}},W=()=>{const e=I(),{hasOnlyOnePage:r,leftPageIndex:s,rightPageIndex:o,totalApproximatePages:l,beginAndEndAreDifferent:i}=S(),d=Math.round(((e==null?void 0:e.percentageEstimateOfBook)??0)*100),f=h=>h!=null&&h.subChapter?`${h.title} / ${f(h.subChapter)}`:(h==null?void 0:h.title)||"",u=f(e==null?void 0:e.beginChapterInfo);return t.jsxs(n.Stack,{alignItems:"center",gap:1,maxW:"100%",overflow:"auto",children:[t.jsx(q,{value:d,size:"xs",width:150,children:t.jsxs(n.HStack,{justifyContent:"space-between",children:[t.jsx(F,{width:110}),t.jsx(z,{children:`${d}%`})]})}),t.jsx(n.Text,{truncate:!0,maxWidth:"100%",fontSize:"sm",mt:1,children:u?`Chapter: ${u}`:" "}),!r&&t.jsxs(n.HStack,{children:[t.jsx(n.Text,{fontSize:"xs",children:i?`${s+1} - ${o+1} of ${l}`:`${s+1} of ${l}`}),!!(e!=null&&e.hasChapters)&&t.jsxs(t.Fragment,{children:[t.jsx(n.Text,{children:"-"}),t.jsxs(n.Text,{fontSize:"xs",children:["(",((e==null?void 0:e.beginAbsolutePageIndex)??0)+1,")"]})]})]})]})},y=a.memo(({children:e,position:r,...s})=>t.jsx(n.Presence,{display:"flex",flexDirection:"row",width:"100%",position:"absolute",...r==="bottom"?{bottom:0}:{top:0},animationName:r==="bottom"?{_open:"slide-from-bottom, fade-in",_closed:"slide-to-bottom, fade-out"}:{_open:"slide-from-top, fade-in",_closed:"slide-to-top, fade-out"},animationDuration:"moderate",bgColor:"bg.panel",alignItems:"center",justifyContent:"center",shadow:"md",px:4,...s,children:e})),j=()=>{const e=I(),r=e==null?void 0:e.isUsingSpread,{beginPageIndex:s,totalApproximatePages:o=0}=S(),l=r?Math.floor((s||0)/2):s,[i,d]=g.useSignal({default:l||0}),f=0,u=Math.max(0,r?Math.floor((o-1)/2):o-1);return a.useEffect(()=>{d.setValue(l||0)},[l,d]),{value:i,valueSignal:d,min:f,max:u}},L=()=>{const e=P(),r=I(),{manifest:s}=g.useObserve(()=>e==null?void 0:e.context.state$,[])??{},o=(s==null?void 0:s.readingDirection)==="rtl",l=r==null?void 0:r.isUsingSpread,{totalApproximatePages:i=0,isBeginWithinChapter:d}=S(),f=1,u=d,{value:h,valueSignal:x,min:v,max:J}=j(),K=a.useCallback(T=>{const[C=0]=Array.isArray(T)?T:[T];x.setValue(C);const A=l?Math.floor(C)*2:Math.floor(C);u?e==null||e.navigation.goToPageOfSpineItem({pageIndex:A,spineItemId:e.pagination.getState().beginSpineItemIndex??0,animation:!1}):e==null||e.navigation.goToAbsolutePageIndex({absolutePageIndex:A,animation:!1})},[e,l,x,u]);return g.useSubscribe(()=>e==null?void 0:e.navigation.throttleLock({duration:100,trigger:x.subject}),[e,x]),i===1||l&&i===2?null:t.jsx(D,{value:[h],max:J,min:v,reverse:o,step:f,onChange:K})},_=()=>{const[e,r]=a.useState(new Date);return a.useEffect(()=>{const s=setInterval(()=>{r(new Date)},6e4);return()=>clearInterval(s)},[]),e},N=e=>{const r=_();return t.jsx(n.Text,{fontSize:"xs",...e,children:r.toLocaleTimeString(navigator.language,{hour:"2-digit",minute:"2-digit"})})},V=({open:e})=>{const r=P(),s=g.useObserve(()=>r==null?void 0:r.navigation.state$,[r]),o=g.useObserve(()=>r==null?void 0:r.settings.values$,[r]),l=(o==null?void 0:o.computedPageTurnDirection)==="vertical";return t.jsxs(y,{present:e,position:"bottom",height:130,children:[t.jsx(n.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:()=>r==null?void 0:r.navigation.goToLeftOrTopSpineItem(),disabled:!(s!=null&&s.canGoLeftSpineItem)&&!(s!=null&&s.canGoTopSpineItem),children:l?t.jsx(b.RxDoubleArrowUp,{}):t.jsx(b.RxDoubleArrowLeft,{})}),t.jsxs(n.Stack,{flex:1,maxW:400,gap:2,alignItems:"center",overflow:"auto",px:4,children:[t.jsx(W,{}),t.jsx(n.Box,{height:5,maxW:300,width:"100%",overflow:"visible",children:t.jsx(L,{})})]}),t.jsx(n.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",disabled:!(s!=null&&s.canGoRightSpineItem)&&!(s!=null&&s.canGoBottomSpineItem),onClick:()=>{r==null||r.navigation.goToRightOrBottomSpineItem()},children:l?t.jsx(b.RxDoubleArrowDown,{}):t.jsx(b.RxDoubleArrowRight,{})}),t.jsx(N,{position:"absolute",bottom:0,left:0,p:2})]})},U=()=>{const[e,r]=a.useState(!1),s=a.useCallback(()=>document.fullscreenElement?document.exitFullscreen().catch(console.error).then(()=>{r(!1)}):document.documentElement.requestFullscreen({navigationUI:"hide"}).catch(console.error).then(()=>{r(!0)}),[]);return a.useEffect(()=>{function o(){r(!!document.fullscreenElement)}return document.addEventListener("fullscreenchange",o),()=>{document.removeEventListener("fullscreenchange",o)}},[]),{isFullscreen:e,onToggleFullscreenClick:s}},H=({open:e,onBackClick:r,onMoreClick:s})=>{const o=P(),l=g.useObserve(()=>o==null?void 0:o.context.manifest$,[o]),{isFullscreen:i,onToggleFullscreenClick:d}=U();return t.jsxs(y,{present:e,position:"top",height:"80px",justifyContent:"space-between",children:[t.jsx(n.IconButton,{"aria-label":"left",size:"lg",variant:"ghost",flexShrink:0,onClick:r,children:t.jsx(k.IoIosArrowBack,{})}),t.jsx(n.Stack,{flex:1,maxW:600,gap:1,alignItems:"center",overflow:"auto",px:4,children:t.jsx(n.Text,{truncate:!0,maxWidth:"100%",children:l==null?void 0:l.title})}),t.jsxs(n.HStack,{children:[t.jsx(n.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:s,children:t.jsx(k.IoMdMore,{})}),t.jsx(n.IconButton,{"aria-label":"right",size:"lg",flexShrink:0,variant:"ghost",onClick:d,children:i?t.jsx(w.MdFullscreenExit,{}):t.jsx(w.MdFullscreen,{})})]})]})},G=a.memo(({open:e,onBackClick:r,onMoreClick:s})=>t.jsxs(t.Fragment,{children:[t.jsx(H,{open:e,onBackClick:r,onMoreClick:s}),t.jsx(V,{open:e})]})),Q=a.memo(({children:e,reader:r})=>t.jsx(O.Provider,{value:r,children:e}));c.QuickMenu=G,c.ReactReaderProvider=Q,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
2
+ //# sourceMappingURL=index.umd.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/context/context.ts","../src/context/useReader.ts","../src/components/ui/toggle-tip.tsx","../src/components/ui/progress.tsx","../src/pagination/usePagination.ts","../src/navigation/useNavigationContext.ts","../src/navigation/QuickMenu/PaginationInfoSection.tsx","../src/navigation/QuickMenu/QuickBar.tsx","../src/navigation/QuickMenu/Scrubber.tsx","../src/navigation/QuickMenu/TimeIndicator.tsx","../src/navigation/QuickMenu/BottomBar.tsx","../src/common/useFullscreen.ts","../src/navigation/QuickMenu/TopBar.tsx","../src/navigation/QuickMenu/QuickMenu.tsx","../src/context/ReactReaderProvider.tsx"],"sourcesContent":["import type { Reader } from \"@prose-reader/core\"\nimport { type Context, createContext } from \"react\"\n\nexport const ReaderContext: Context<Reader | undefined> = createContext<\n Reader | undefined\n>(undefined)\n","import type { Reader } from \"@prose-reader/core\"\nimport { useContext } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const useReader = (): Reader | undefined => {\n const context = useContext(ReaderContext)\n\n return context\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 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 { 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 px={4}\n {...rest}\n >\n {children}\n </Presence>\n )\n },\n)\n","import RcSlider from \"rc-slider\"\nimport { type ComponentProps, useCallback, useEffect } from \"react\"\nimport { useObserve, useSignal, useSubscribe } from \"reactjrx\"\nimport { useReader } from \"../../context/useReader\"\nimport { usePagination } from \"../../pagination/usePagination\"\nimport \"rc-slider/assets/index.css\"\nimport { useNavigationContext } from \"../useNavigationContext\"\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 RcSlider>[\"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 <RcSlider\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 { 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 { Box, IconButton, Stack } from \"@chakra-ui/react\"\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\"\nimport { TimeIndicator } from \"./TimeIndicator\"\n\nexport const BottomBar = ({ open }: { open: boolean }) => {\n const reader = useReader()\n const navigation = useObserve(() => reader?.navigation.state$, [reader])\n const settings = useObserve(() => reader?.settings.values$, [reader])\n const isVerticalDirection = settings?.computedPageTurnDirection === \"vertical\"\n\n return (\n <QuickBar present={open} position=\"bottom\" height={130}>\n <IconButton\n aria-label=\"left\"\n size=\"lg\"\n variant=\"ghost\"\n flexShrink={0}\n onClick={() => reader?.navigation.goToLeftOrTopSpineItem()}\n disabled={\n !navigation?.canGoLeftSpineItem && !navigation?.canGoTopSpineItem\n }\n >\n {isVerticalDirection ? <RxDoubleArrowUp /> : <RxDoubleArrowLeft />}\n </IconButton>\n <Stack\n flex={1}\n maxW={400}\n gap={2}\n alignItems=\"center\"\n overflow=\"auto\"\n px={4}\n >\n <PaginationInfoSection />\n <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 && !navigation?.canGoBottomSpineItem\n }\n onClick={() => {\n reader?.navigation.goToRightOrBottomSpineItem()\n }}\n >\n {isVerticalDirection ? <RxDoubleArrowDown /> : <RxDoubleArrowRight />}\n </IconButton>\n <TimeIndicator position=\"absolute\" bottom={0} left={0} p={2} />\n </QuickBar>\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\"\n\nexport const QuickMenu = memo(\n ({\n open,\n onBackClick,\n onMoreClick,\n }: { open: boolean; onBackClick: () => void; onMoreClick: () => void }) => {\n return (\n <>\n <TopBar\n open={open}\n onBackClick={onBackClick}\n onMoreClick={onMoreClick}\n />\n <BottomBar open={open} />\n </>\n )\n },\n)\n","import type { Reader } from \"@prose-reader/core\"\nimport { memo } from \"react\"\nimport { ReaderContext } from \"./context\"\n\nexport const ReactReaderProvider = memo(\n ({\n children,\n reader,\n }: { children?: React.ReactNode; reader: Reader | undefined }) => {\n return (\n <ReaderContext.Provider value={reader}>{children}</ReaderContext.Provider>\n )\n },\n)\n"],"names":["ReaderContext","createContext","useReader","useContext","ToggleTip","React","props","ref","showArrow","children","portalled","content","portalRef","rest","jsxs","ChakraPopover","jsx","Portal","InfoTip","IconButton","HiOutlineInformationCircle","ProgressBar","ChakraProgress","React__namespace","info","ProgressRoot","ProgressValueText","usePagination","reader","useObserve","combineLatest","map","state","context","isOnlyImages","_a","item","NEVER","useNavigationContext","pagination","hasOnlyOnePage","isBeginWithinChapter","isEndWithinChapter","beginPageIndex","endPageIndex","leftPageIndex","rightPageIndex","a","b","beginAndEndAreDifferent","totalApproximatePages","PaginationInfoSection","progress","buildTitleChain","chapterInfo","chapterTitle","Stack","HStack","Text","Fragment","QuickBar","memo","position","Presence","useSliderValues","isUsingSpread","currentRealPage","currentPage","value","valueSignal","useSignal","min","max","useEffect","Scrubber","manifest","reverse","step","isScrubberWithinChapter","onChange","useCallback","values","pageIndex","useSubscribe","RcSlider","useTime","time","setTime","useState","interval","TimeIndicator","BottomBar","open","navigation","settings","isVerticalDirection","RxDoubleArrowUp","RxDoubleArrowLeft","Box","RxDoubleArrowDown","RxDoubleArrowRight","useFullscreen","isFullscreen","setIsFullscreen","onToggleFullscreenClick","fullscreenchangeHandler","TopBar","onBackClick","onMoreClick","IoIosArrowBack","IoMdMore","MdFullscreenExit","MdFullscreen","QuickMenu","ReactReaderProvider"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const BottomBar: ({ open }: {
2
+ open: boolean;
3
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const PaginationInfoSection: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { PresenceProps } from '@chakra-ui/react';
2
+ export declare const QuickBar: import('react').MemoExoticComponent<({ children, position, ...rest }: {
3
+ position: "top" | "bottom";
4
+ } & PresenceProps) => import("react/jsx-runtime").JSX.Element>;
@@ -0,0 +1,5 @@
1
+ export declare const QuickMenu: import('react').MemoExoticComponent<({ open, onBackClick, onMoreClick, }: {
2
+ open: boolean;
3
+ onBackClick: () => void;
4
+ onMoreClick: () => void;
5
+ }) => import("react/jsx-runtime").JSX.Element>;
@@ -0,0 +1 @@
1
+ export declare const Scrubber: () => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,3 @@
1
+ import { TextProps } from '@chakra-ui/react';
2
+ export declare const useTime: () => Date;
3
+ export declare const TimeIndicator: (props: TextProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ export declare const TopBar: ({ open, onBackClick, onMoreClick, }: {
2
+ open: boolean;
3
+ onBackClick: () => void;
4
+ onMoreClick: () => void;
5
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ export declare const useNavigationContext: () => {
2
+ hasOnlyOnePage: boolean;
3
+ beginPageIndex: number;
4
+ endPageIndex: number;
5
+ isBeginWithinChapter: boolean;
6
+ isEndWithinChapter: boolean;
7
+ beginAndEndAreDifferent: boolean;
8
+ totalApproximatePages: number | undefined;
9
+ leftPageIndex: number;
10
+ rightPageIndex: number;
11
+ };
@@ -0,0 +1,4 @@
1
+ import { Reader } from '@prose-reader/core';
2
+ export declare const usePagination: () => (Reader["pagination"]["state"] & {
3
+ hasChapters: boolean;
4
+ }) | undefined;
@@ -0,0 +1,2 @@
1
+ import { Reader } from '@prose-reader/core';
2
+ export declare const useSettings: () => Reader["settings"]["values"] | undefined;
package/package.json CHANGED
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "name": "@prose-reader/react-reader",
3
3
  "private": false,
4
- "version": "1.174.0",
4
+ "version": "1.175.0",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {
8
8
  ".": "./dist/index.js"
9
9
  },
10
+ "files": [
11
+ "/dist"
12
+ ],
10
13
  "scripts": {
11
14
  "start": "vite build --watch --mode development",
12
15
  "build": "tsc -b && vite build"
@@ -33,5 +36,5 @@
33
36
  "react-icons": "^5.4.0",
34
37
  "reactjrx": "1.x"
35
38
  },
36
- "gitHead": "0480c80fdd90be870b286be1473fa382e980c6d9"
39
+ "gitHead": "5d5a76d77e610c666c6ea827883540ba69ee4b24"
37
40
  }
@@ -1,44 +0,0 @@
1
- import { useEffect } from "react"
2
-
3
- import { useCallback } from "react"
4
-
5
- import { useState } from "react"
6
-
7
- export const useFullscreen = () => {
8
- const [isFullscreen, setIsFullscreen] = useState(false)
9
-
10
- const onToggleFullscreenClick = useCallback(() => {
11
- if (document.fullscreenElement) {
12
- return document
13
- .exitFullscreen()
14
- .catch(console.error)
15
- .then(() => {
16
- setIsFullscreen(false)
17
- })
18
- }
19
-
20
- return document.documentElement
21
- .requestFullscreen({ navigationUI: "hide" })
22
- .catch(console.error)
23
- .then(() => {
24
- setIsFullscreen(true)
25
- })
26
- }, [])
27
-
28
- useEffect(() => {
29
- function fullscreenchangeHandler() {
30
- setIsFullscreen(!!document.fullscreenElement)
31
- }
32
-
33
- document.addEventListener("fullscreenchange", fullscreenchangeHandler)
34
-
35
- return () => {
36
- document.removeEventListener("fullscreenchange", fullscreenchangeHandler)
37
- }
38
- }, [])
39
-
40
- return {
41
- isFullscreen,
42
- onToggleFullscreenClick,
43
- }
44
- }
@@ -1,74 +0,0 @@
1
- "use client"
2
-
3
- import type { GroupProps, SlotRecipeProps } from "@chakra-ui/react"
4
- import { Avatar as ChakraAvatar, Group } from "@chakra-ui/react"
5
- import * as React from "react"
6
-
7
- type ImageProps = React.ImgHTMLAttributes<HTMLImageElement>
8
-
9
- export interface AvatarProps extends ChakraAvatar.RootProps {
10
- name?: string
11
- src?: string
12
- srcSet?: string
13
- loading?: ImageProps["loading"]
14
- icon?: React.ReactElement
15
- fallback?: React.ReactNode
16
- }
17
-
18
- export const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(
19
- function Avatar(props, ref) {
20
- const { name, src, srcSet, loading, icon, fallback, children, ...rest } =
21
- props
22
- return (
23
- <ChakraAvatar.Root ref={ref} {...rest}>
24
- <AvatarFallback name={name} icon={icon}>
25
- {fallback}
26
- </AvatarFallback>
27
- <ChakraAvatar.Image src={src} srcSet={srcSet} loading={loading} />
28
- {children}
29
- </ChakraAvatar.Root>
30
- )
31
- },
32
- )
33
-
34
- interface AvatarFallbackProps extends ChakraAvatar.FallbackProps {
35
- name?: string
36
- icon?: React.ReactElement
37
- }
38
-
39
- const AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(
40
- function AvatarFallback(props, ref) {
41
- const { name, icon, children, ...rest } = props
42
- return (
43
- <ChakraAvatar.Fallback ref={ref} {...rest}>
44
- {children}
45
- {name != null && children == null && <>{getInitials(name)}</>}
46
- {name == null && children == null && (
47
- <ChakraAvatar.Icon asChild={!!icon}>{icon}</ChakraAvatar.Icon>
48
- )}
49
- </ChakraAvatar.Fallback>
50
- )
51
- },
52
- )
53
-
54
- function getInitials(name: string) {
55
- const names = name.trim().split(" ")
56
- const firstName = names[0] != null ? names[0] : ""
57
- const lastName = names.length > 1 ? names[names.length - 1] : ""
58
- return firstName && lastName
59
- ? `${firstName.charAt(0)}${lastName.charAt(0)}`
60
- : firstName.charAt(0)
61
- }
62
-
63
- interface AvatarGroupProps extends GroupProps, SlotRecipeProps<"avatar"> {}
64
-
65
- export const AvatarGroup = React.forwardRef<HTMLDivElement, AvatarGroupProps>(
66
- function AvatarGroup(props, ref) {
67
- const { size, variant, borderless, ...rest } = props
68
- return (
69
- <ChakraAvatar.PropsProvider value={{ size, variant, borderless }}>
70
- <Group gap="0" spaceX="-3" ref={ref} {...rest} />
71
- </ChakraAvatar.PropsProvider>
72
- )
73
- },
74
- )
@@ -1,25 +0,0 @@
1
- import { Checkbox as ChakraCheckbox } from "@chakra-ui/react"
2
- import * as React from "react"
3
-
4
- export interface CheckboxProps extends ChakraCheckbox.RootProps {
5
- icon?: React.ReactNode
6
- inputProps?: React.InputHTMLAttributes<HTMLInputElement>
7
- rootRef?: React.Ref<HTMLLabelElement>
8
- }
9
-
10
- export const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(
11
- function Checkbox(props, ref) {
12
- const { icon, children, inputProps, rootRef, ...rest } = props
13
- return (
14
- <ChakraCheckbox.Root ref={rootRef} {...rest}>
15
- <ChakraCheckbox.HiddenInput ref={ref} {...inputProps} />
16
- <ChakraCheckbox.Control>
17
- {icon || <ChakraCheckbox.Indicator />}
18
- </ChakraCheckbox.Control>
19
- {children != null && (
20
- <ChakraCheckbox.Label>{children}</ChakraCheckbox.Label>
21
- )}
22
- </ChakraCheckbox.Root>
23
- )
24
- },
25
- )
@@ -1,17 +0,0 @@
1
- import type { ButtonProps } from "@chakra-ui/react"
2
- import { IconButton as ChakraIconButton } from "@chakra-ui/react"
3
- import * as React from "react"
4
- import { LuX } from "react-icons/lu"
5
-
6
- export type CloseButtonProps = ButtonProps
7
-
8
- export const CloseButton = React.forwardRef<
9
- HTMLButtonElement,
10
- CloseButtonProps
11
- >(function CloseButton(props, ref) {
12
- return (
13
- <ChakraIconButton variant="ghost" aria-label="Close" ref={ref} {...props}>
14
- {props.children ?? <LuX />}
15
- </ChakraIconButton>
16
- )
17
- })
@@ -1,75 +0,0 @@
1
- "use client"
2
-
3
- import type { IconButtonProps } from "@chakra-ui/react"
4
- import { ClientOnly, IconButton, Skeleton } from "@chakra-ui/react"
5
- import { ThemeProvider, useTheme } from "next-themes"
6
- import type { ThemeProviderProps } from "next-themes"
7
- import * as React from "react"
8
- import { LuMoon, LuSun } from "react-icons/lu"
9
-
10
- export interface ColorModeProviderProps extends ThemeProviderProps {}
11
-
12
- export function ColorModeProvider(props: ColorModeProviderProps) {
13
- return (
14
- <ThemeProvider attribute="class" disableTransitionOnChange {...props} />
15
- )
16
- }
17
-
18
- export type ColorMode = "light" | "dark"
19
-
20
- export interface UseColorModeReturn {
21
- colorMode: ColorMode
22
- setColorMode: (colorMode: ColorMode) => void
23
- toggleColorMode: () => void
24
- }
25
-
26
- export function useColorMode(): UseColorModeReturn {
27
- const { resolvedTheme, setTheme } = useTheme()
28
- const toggleColorMode = () => {
29
- setTheme(resolvedTheme === "light" ? "dark" : "light")
30
- }
31
- return {
32
- colorMode: resolvedTheme as ColorMode,
33
- setColorMode: setTheme,
34
- toggleColorMode,
35
- }
36
- }
37
-
38
- export function useColorModeValue<T>(light: T, dark: T) {
39
- const { colorMode } = useColorMode()
40
- return colorMode === "dark" ? dark : light
41
- }
42
-
43
- export function ColorModeIcon() {
44
- const { colorMode } = useColorMode()
45
- return colorMode === "dark" ? <LuMoon /> : <LuSun />
46
- }
47
-
48
- interface ColorModeButtonProps extends Omit<IconButtonProps, "aria-label"> {}
49
-
50
- export const ColorModeButton = React.forwardRef<
51
- HTMLButtonElement,
52
- ColorModeButtonProps
53
- >(function ColorModeButton(props, ref) {
54
- const { toggleColorMode } = useColorMode()
55
- return (
56
- <ClientOnly fallback={<Skeleton boxSize="8" />}>
57
- <IconButton
58
- onClick={toggleColorMode}
59
- variant="ghost"
60
- aria-label="Toggle color mode"
61
- size="sm"
62
- ref={ref}
63
- {...props}
64
- css={{
65
- _icon: {
66
- width: "5",
67
- height: "5",
68
- },
69
- }}
70
- >
71
- <ColorModeIcon />
72
- </IconButton>
73
- </ClientOnly>
74
- )
75
- })
@@ -1,62 +0,0 @@
1
- import { Dialog as ChakraDialog, Portal } from "@chakra-ui/react"
2
- import { CloseButton } from "./close-button"
3
- import * as React from "react"
4
-
5
- interface DialogContentProps extends ChakraDialog.ContentProps {
6
- portalled?: boolean
7
- portalRef?: React.RefObject<HTMLElement>
8
- backdrop?: boolean
9
- }
10
-
11
- export const DialogContent = React.forwardRef<
12
- HTMLDivElement,
13
- DialogContentProps
14
- >(function DialogContent(props, ref) {
15
- const {
16
- children,
17
- portalled = true,
18
- portalRef,
19
- backdrop = true,
20
- ...rest
21
- } = props
22
-
23
- return (
24
- <Portal disabled={!portalled} container={portalRef}>
25
- {backdrop && <ChakraDialog.Backdrop />}
26
- <ChakraDialog.Positioner>
27
- <ChakraDialog.Content ref={ref} {...rest} asChild={false}>
28
- {children}
29
- </ChakraDialog.Content>
30
- </ChakraDialog.Positioner>
31
- </Portal>
32
- )
33
- })
34
-
35
- export const DialogCloseTrigger = React.forwardRef<
36
- HTMLButtonElement,
37
- ChakraDialog.CloseTriggerProps
38
- >(function DialogCloseTrigger(props, ref) {
39
- return (
40
- <ChakraDialog.CloseTrigger
41
- position="absolute"
42
- top="2"
43
- insetEnd="2"
44
- {...props}
45
- asChild
46
- >
47
- <CloseButton size="sm" ref={ref}>
48
- {props.children}
49
- </CloseButton>
50
- </ChakraDialog.CloseTrigger>
51
- )
52
- })
53
-
54
- export const DialogRoot = ChakraDialog.Root
55
- export const DialogFooter = ChakraDialog.Footer
56
- export const DialogHeader = ChakraDialog.Header
57
- export const DialogBody = ChakraDialog.Body
58
- export const DialogBackdrop = ChakraDialog.Backdrop
59
- export const DialogTitle = ChakraDialog.Title
60
- export const DialogDescription = ChakraDialog.Description
61
- export const DialogTrigger = ChakraDialog.Trigger
62
- export const DialogActionTrigger = ChakraDialog.ActionTrigger
@@ -1,52 +0,0 @@
1
- import { Drawer as ChakraDrawer, Portal } from "@chakra-ui/react"
2
- import { CloseButton } from "./close-button"
3
- import * as React from "react"
4
-
5
- interface DrawerContentProps extends ChakraDrawer.ContentProps {
6
- portalled?: boolean
7
- portalRef?: React.RefObject<HTMLElement>
8
- offset?: ChakraDrawer.ContentProps["padding"]
9
- }
10
-
11
- export const DrawerContent = React.forwardRef<
12
- HTMLDivElement,
13
- DrawerContentProps
14
- >(function DrawerContent(props, ref) {
15
- const { children, portalled = true, portalRef, offset, ...rest } = props
16
- return (
17
- <Portal disabled={!portalled} container={portalRef}>
18
- <ChakraDrawer.Positioner padding={offset}>
19
- <ChakraDrawer.Content ref={ref} {...rest} asChild={false}>
20
- {children}
21
- </ChakraDrawer.Content>
22
- </ChakraDrawer.Positioner>
23
- </Portal>
24
- )
25
- })
26
-
27
- export const DrawerCloseTrigger = React.forwardRef<
28
- HTMLButtonElement,
29
- ChakraDrawer.CloseTriggerProps
30
- >(function DrawerCloseTrigger(props, ref) {
31
- return (
32
- <ChakraDrawer.CloseTrigger
33
- position="absolute"
34
- top="2"
35
- insetEnd="2"
36
- {...props}
37
- asChild
38
- >
39
- <CloseButton size="sm" ref={ref} />
40
- </ChakraDrawer.CloseTrigger>
41
- )
42
- })
43
-
44
- export const DrawerTrigger = ChakraDrawer.Trigger
45
- export const DrawerRoot = ChakraDrawer.Root
46
- export const DrawerFooter = ChakraDrawer.Footer
47
- export const DrawerHeader = ChakraDrawer.Header
48
- export const DrawerBody = ChakraDrawer.Body
49
- export const DrawerBackdrop = ChakraDrawer.Backdrop
50
- export const DrawerDescription = ChakraDrawer.Description
51
- export const DrawerTitle = ChakraDrawer.Title
52
- export const DrawerActionTrigger = ChakraDrawer.ActionTrigger