import { PageLayout, SharedLayout } from "./quartz/cfg" import * as Component from "./quartz/components" // components shared across all pages export const sharedPageComponents: SharedLayout = { head: Component.Head(), header: [], afterBody: [], footer: Component.Footer({ links: { GitHub: "https://github.com/plastic-labs/blog", "Discord Community": "https://discord.gg/plasticlabs", "plasticlabs.ai": "https://plasticlabs.ai" }, }), } // components for pages that display a single page (e.g. a single note) export const defaultContentPageLayout: PageLayout = { beforeBody: [ Component.ConditionalRender({ component: Component.Breadcrumbs(), condition: (page) => page.fileData.slug !== "index", }), Component.ArticleTitle(), Component.ArticleSubtitle(), Component.ContentMeta(), Component.TagList(), ], left: [ Component.PageTitle(), Component.MobileOnly(Component.Spacer()), Component.Flex({ components: [ { Component: Component.Search(), grow: true, }, { Component: Component.Darkmode() }, { Component: Component.ReaderMode() }, ], }), Component.Explorer({ sortFn: (a, b) => { // Sort folders first, then files by date (newest first) if (a.isFolder && b.isFolder) { // Both folders: alphabetical return a.displayName.localeCompare(b.displayName, undefined, { numeric: true, sensitivity: "base", }) } if (a.isFolder) return -1 // Folders before files if (b.isFolder) return 1 // Folders before files // Both files: sort by date descending (newest first) // Note: dates come from JSON as strings, need to convert to Date objects const aDate = a.data?.date ? new Date(a.data.date).getTime() : 0 const bDate = b.data?.date ? new Date(b.data.date).getTime() : 0 if (aDate !== bDate) { return bDate - aDate // Descending order (newest first) } // Same date or no dates: alphabetical fallback return a.displayName.localeCompare(b.displayName, undefined, { numeric: true, sensitivity: "base", }) }, }), ], right: [ Component.ConditionalRender({ component: Component.Graph({ localGraph: { depth: -1, scale: 0.9, repelForce: 0.5, centerForce: 0.3, linkDistance: 30, fontSize: 0.6, opacityScale: 1, showTags: true, }, }), condition: (page) => page.fileData.slug === "index", }), Component.ConditionalRender({ component: Component.Graph(), condition: (page) => page.fileData.slug !== "index", }), Component.DesktopOnly(Component.TableOfContents()), ], } // components for pages that display lists of pages (e.g. tags or folders) export const defaultListPageLayout: PageLayout = { beforeBody: [Component.Breadcrumbs(), Component.ArticleTitle(), Component.ContentMeta()], left: [ Component.PageTitle(), Component.MobileOnly(Component.Spacer()), Component.Flex({ components: [ { Component: Component.Search(), grow: true, }, { Component: Component.Darkmode() }, ], }), Component.Explorer({ sortFn: (a, b) => { // Sort folders first, then files by date (newest first) if (a.isFolder && b.isFolder) { // Both folders: alphabetical return a.displayName.localeCompare(b.displayName, undefined, { numeric: true, sensitivity: "base", }) } if (a.isFolder) return -1 // Folders before files if (b.isFolder) return 1 // Folders before files // Both files: sort by date descending (newest first) // Note: dates come from JSON as strings, need to convert to Date objects const aDate = a.data?.date ? new Date(a.data.date).getTime() : 0 const bDate = b.data?.date ? new Date(b.data.date).getTime() : 0 if (aDate !== bDate) { return bDate - aDate // Descending order (newest first) } // Same date or no dates: alphabetical fallback return a.displayName.localeCompare(b.displayName, undefined, { numeric: true, sensitivity: "base", }) }, }), ], right: [], }