@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.
- package/dist/common/useFullscreen.d.ts +4 -0
- package/dist/components/ui/avatar.d.ts +16 -0
- package/dist/components/ui/checkbox.d.ts +8 -0
- package/dist/components/ui/close-button.d.ts +4 -0
- package/dist/components/ui/color-mode.d.ts +19 -0
- package/dist/components/ui/dialog.d.ts +19 -0
- package/dist/components/ui/drawer.d.ts +19 -0
- package/dist/components/ui/field.d.ts +9 -0
- package/dist/components/ui/input-group.d.ts +12 -0
- package/dist/components/ui/popover.d.ts +17 -0
- package/dist/components/ui/progress.d.ts +9 -0
- package/dist/components/ui/provider.d.ts +2 -0
- package/dist/components/ui/radio.d.ts +8 -0
- package/dist/components/ui/slider.d.ts +11 -0
- package/dist/components/ui/toggle-tip.d.ts +10 -0
- package/dist/components/ui/tooltip.d.ts +11 -0
- package/dist/context/ReactReaderProvider.d.ts +5 -0
- package/dist/context/context.d.ts +3 -0
- package/dist/context/useReader.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +379 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.cjs +2 -0
- package/dist/index.umd.cjs.map +1 -0
- package/dist/navigation/QuickMenu/BottomBar.d.ts +3 -0
- package/dist/navigation/QuickMenu/PaginationInfoSection.d.ts +1 -0
- package/dist/navigation/QuickMenu/QuickBar.d.ts +4 -0
- package/dist/navigation/QuickMenu/QuickMenu.d.ts +5 -0
- package/dist/navigation/QuickMenu/Scrubber.d.ts +1 -0
- package/dist/navigation/QuickMenu/TimeIndicator.d.ts +3 -0
- package/dist/navigation/QuickMenu/TopBar.d.ts +5 -0
- package/dist/navigation/useNavigationContext.d.ts +11 -0
- package/dist/pagination/usePagination.d.ts +4 -0
- package/dist/settings/useSettings.d.ts +2 -0
- package/package.json +5 -2
- package/src/common/useFullscreen.ts +0 -44
- package/src/components/ui/avatar.tsx +0 -74
- package/src/components/ui/checkbox.tsx +0 -25
- package/src/components/ui/close-button.tsx +0 -17
- package/src/components/ui/color-mode.tsx +0 -75
- package/src/components/ui/dialog.tsx +0 -62
- package/src/components/ui/drawer.tsx +0 -52
- package/src/components/ui/field.tsx +0 -33
- package/src/components/ui/input-group.tsx +0 -53
- package/src/components/ui/popover.tsx +0 -59
- package/src/components/ui/progress.tsx +0 -34
- package/src/components/ui/provider.tsx +0 -12
- package/src/components/ui/radio.tsx +0 -24
- package/src/components/ui/slider.tsx +0 -82
- package/src/components/ui/toggle-tip.tsx +0 -70
- package/src/components/ui/tooltip.tsx +0 -46
- package/src/context/ReactReaderProvider.tsx +0 -14
- package/src/context/context.ts +0 -6
- package/src/context/useReader.ts +0 -9
- package/src/index.ts +0 -2
- package/src/navigation/QuickMenu/BottomBar.tsx +0 -65
- package/src/navigation/QuickMenu/PaginationInfoSection.tsx +0 -62
- package/src/navigation/QuickMenu/QuickBar.tsx +0 -40
- package/src/navigation/QuickMenu/QuickMenu.tsx +0 -22
- package/src/navigation/QuickMenu/Scrubber.tsx +0 -138
- package/src/navigation/QuickMenu/TimeIndicator.tsx +0 -29
- package/src/navigation/QuickMenu/TopBar.tsx +0 -72
- package/src/navigation/useNavigationContext.ts +0 -46
- package/src/pagination/usePagination.ts +0 -29
- package/src/settings/useSettings.ts +0 -9
- package/src/vite-env.d.ts +0 -1
- package/tsconfig.app.json +0 -26
- package/tsconfig.json +0 -7
- package/tsconfig.node.json +0 -22
- 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 @@
|
|
|
1
|
+
export declare const PaginationInfoSection: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const Scrubber: () => import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -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
|
+
};
|
package/package.json
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prose-reader/react-reader",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.
|
|
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": "
|
|
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
|