From 535afe2393fafe6ea18bc4254c79132967825238 Mon Sep 17 00:00:00 2001 From: Innei Date: Sat, 5 Oct 2024 22:12:37 +0800 Subject: [PATCH] feat(toc): redesign toc item in wide mode Signed-off-by: Innei --- apps/renderer/src/atoms/sidebar.ts | 7 +++- .../components/ui/markdown/components/Toc.tsx | 39 +++++++++++++++++-- .../ui/markdown/components/TocItem.tsx | 30 +++++++++++--- .../feeds/[feedId]/[entryId]/index.tsx | 8 ++-- apps/renderer/src/pages/(main)/layout.tsx | 13 +++++-- 5 files changed, 81 insertions(+), 16 deletions(-) diff --git a/apps/renderer/src/atoms/sidebar.ts b/apps/renderer/src/atoms/sidebar.ts index 8eb66b845f..1300157a24 100644 --- a/apps/renderer/src/atoms/sidebar.ts +++ b/apps/renderer/src/atoms/sidebar.ts @@ -48,6 +48,9 @@ viewAtom.onMount = () => { setSidebarActiveView(view) } } -export const [, , useFeedColumnShow, , , setFeedColumnShow] = createAtomHooks(atom(true)) +export const [, , useFeedColumnShow, , getFeedColumnShow, setFeedColumnShow] = createAtomHooks( + atom(true), +) -export const [, , useFeedColumnTempShow, , , setFeedColumnTempShow] = createAtomHooks(atom(false)) +export const [, , useFeedColumnTempShow, , getFeedColumnTempShow, setFeedColumnTempShow] = + createAtomHooks(atom(false)) diff --git a/apps/renderer/src/components/ui/markdown/components/Toc.tsx b/apps/renderer/src/components/ui/markdown/components/Toc.tsx index bb43dc2702..4ee4ee682a 100644 --- a/apps/renderer/src/components/ui/markdown/components/Toc.tsx +++ b/apps/renderer/src/components/ui/markdown/components/Toc.tsx @@ -19,6 +19,7 @@ import { springScrollToElement } from "~/lib/scroller" import { cn } from "~/lib/utils" import { useGetWrappedElementPosition, + useWrappedElementPosition, useWrappedElementSize, } from "~/providers/wrapped-element-provider" @@ -81,7 +82,7 @@ export const Toc: Component = ({ className }) => { [toc], ) - const [_, setTreeRef] = useState() + const [_, setTreeRef] = useState() const scrollContainerElement = useScrollViewElement() @@ -195,12 +196,44 @@ export const Toc: Component = ({ className }) => { const [hoverShow, setHoverShow] = useState(false) + const renderContentElementPosition = useWrappedElementPosition() + const renderContentElementSize = useWrappedElementSize() + + const xAxis = renderContentElementPosition.x + renderContentElementSize.w + const w = window.innerWidth + + const shouldShowTitle = w - xAxis > 300 + if (toc.length === 0) return null + + if (shouldShowTitle) + return ( +
+ {toc.map((heading, index) => ( + + ))} +
+ ) return (
-
    { range={index === currentScrollRange[0] ? currentScrollRange[1] : 0} /> ))} -
+
diff --git a/apps/renderer/src/components/ui/markdown/components/TocItem.tsx b/apps/renderer/src/components/ui/markdown/components/TocItem.tsx index db1627fe34..6b04d390ea 100644 --- a/apps/renderer/src/components/ui/markdown/components/TocItem.tsx +++ b/apps/renderer/src/components/ui/markdown/components/TocItem.tsx @@ -3,6 +3,8 @@ import { memo, useCallback, useRef } from "react" import { cn } from "~/lib/utils" +import { EllipsisHorizontalTextWithTooltip } from "../../typography" + export interface ITocItem { depth: number title: string @@ -20,20 +22,29 @@ export interface TocItemProps { isScrollOut: boolean range: number + variant?: "line" | "title-line" } export const TocItem: FC = memo((props) => { - const { onClick, heading, isScrollOut, range } = props + const { onClick, heading, isScrollOut, range, variant = "line", rootDepth } = props const { $heading, anchorId, depth, index, title } = heading const $ref = useRef(null) + const isTitleLine = variant === "title-line" return (