diff --git a/src/components/frontmatter-sidebar.tsx b/src/components/frontmatter-sidebar.tsx new file mode 100644 index 00000000..86d879fe --- /dev/null +++ b/src/components/frontmatter-sidebar.tsx @@ -0,0 +1,30 @@ +import { useAtom } from "jotai" +import { frontmatterSidebarAtom } from "../global-state" +import { IconButton } from "./icon-button" +import { ArrowLeftIcon16 } from "./icons" +import { Frontmatter } from "./markdown" + +export function FrontmatterSidebar({ frontmatter }: { frontmatter: Record }) { + const [isOpen, setIsOpen] = useAtom(frontmatterSidebarAtom) + + if (!isOpen) return null + + return ( +
+
+ Properties + setIsOpen(false)} + > + + +
+
+ +
+
+ ) +} diff --git a/src/components/markdown.tsx b/src/components/markdown.tsx index a5822864..6d749609 100644 --- a/src/components/markdown.tsx +++ b/src/components/markdown.tsx @@ -1,7 +1,7 @@ import * as HoverCard from "@radix-ui/react-hover-card" import { Link } from "@tanstack/react-router" import { isToday } from "date-fns" -import { useAtomValue } from "jotai" +import { useAtom, useAtomValue } from "jotai" import { selectAtom } from "jotai/utils" import React, { useMemo } from "react" import ReactMarkdown from "react-markdown" @@ -12,7 +12,7 @@ import rehypeRaw from "rehype-raw" import remarkGfm from "remark-gfm" import remarkMath from "remark-math" import { z } from "zod" -import { notesAtom } from "../global-state" +import { notesAtom, frontmatterSidebarAtom, widthAtom } from "../global-state" import { UPLOADS_DIR } from "../hooks/attach-file" import { useNoteById } from "../hooks/note" import { useSearchNotes } from "../hooks/search" @@ -41,10 +41,12 @@ import { Details } from "./details" import { FilePreview } from "./file-preview" import { GitHubAvatar } from "./github-avatar" import { + ArrowRightIcon16, BlueskyIcon16, ErrorIcon16, GitHubIcon16, InstagramIcon16, + SidebarIcon16, TwitterIcon16, YouTubeIcon16, } from "./icons" @@ -55,6 +57,8 @@ import { SyntaxHighlighter, TemplateSyntaxHighlighter } from "./syntax-highlight import { TagLink } from "./tag-link" import { Tooltip } from "./tooltip" import { WebsiteFavicon } from "./website-favicon" +import { IconButton } from "./icon-button" +import { FrontmatterSidebar } from "./frontmatter-sidebar" export type MarkdownProps = { children: string @@ -85,6 +89,8 @@ export const Markdown = React.memo( }), ) }, [frontmatter]) + const [isFrontmatterSidebarOpen, setIsFrontmatterSidebarOpen] = useAtom(frontmatterSidebarAtom) + const width = useAtomValue(widthAtom) // Split the content into title and body so we can display // the frontmatter below the title but above the body. @@ -166,14 +172,32 @@ export const Markdown = React.memo( ) : null} -
+
+ {!hideFrontmatter && !isObjectEmpty(filteredFrontmatter) && ( + + )}
{title ? {title} : null} {filteredFrontmatter && !hideFrontmatter && - !isObjectEmpty(filteredFrontmatter) ? ( + !isObjectEmpty(filteredFrontmatter) && + !isFrontmatterSidebarOpen ? (
- Properties + + Properties + setIsFrontmatterSidebarOpen(!isFrontmatterSidebarOpen)} + > + + +
@@ -207,6 +231,7 @@ export const Markdown = React.memo( }
+ )}
@@ -297,7 +322,7 @@ function BookCover({ isbn }: { isbn: string }) { ) } -function Frontmatter({ +export function Frontmatter({ frontmatter, className, }: { diff --git a/src/global-state.ts b/src/global-state.ts index d88237cb..7d3c0e57 100644 --- a/src/global-state.ts +++ b/src/global-state.ts @@ -739,6 +739,8 @@ export const fontAtom = atomWithStorage<"sans" | "serif" | "handwriting">("font" export const sidebarAtom = atomWithStorage<"expanded" | "collapsed">("sidebar", "expanded") +export const frontmatterSidebarAtom = atomWithStorage("frontmatter-sidebar", false) + export const widthAtom = atomWithStorage<"fixed" | "fill">("width", "fixed") // -----------------------------------------------------------------------------