diff --git a/packages/chronicle/src/themes/default/Layout.module.css b/packages/chronicle/src/themes/default/Layout.module.css index f5fcef2..d73c21b 100644 --- a/packages/chronicle/src/themes/default/Layout.module.css +++ b/packages/chronicle/src/themes/default/Layout.module.css @@ -279,3 +279,119 @@ line-height: var(--rs-line-height-mini); flex-shrink: 0; } + +.mobileMenuBtn { + display: none; + align-items: center; + justify-content: center; + background: none; + border: none; + cursor: pointer; + padding: var(--rs-space-1); + color: var(--rs-color-foreground-base-primary); +} + +.mobileHeader { + display: none; + align-items: center; + justify-content: space-between; + height: var(--navbar-height); + padding: 0 var(--rs-space-5); + background: var(--rs-color-background-base-primary); + border-bottom: 0.5px solid var(--rs-color-border-base-primary); + backdrop-filter: blur(1px); +} + +.mobileMenu { + display: none; + position: fixed; + top: var(--navbar-height); + left: 0; + right: 0; + bottom: 0; + z-index: 100; + background: var(--rs-color-background-base-primary); + overflow-y: auto; + padding: var(--rs-space-7) var(--rs-space-5); +} + +.mobileMenu[data-open='true'] { + display: block; +} + +.mobileNav { + display: none; +} + +@media (max-width: 768px) { + .sidebar { + display: none; + } + + .mobileHeader { + display: flex; + } + + .mobileMenuBtn { + display: flex; + } + + .mobileMenu[data-open='true'] { + display: block; + } + + .subNav { + display: none; + } + + .content { + padding: var(--rs-space-10) var(--rs-space-5); + } + + .card { + width: 100%; + border-left: none; + box-shadow: none; + } + + .cardWrapper { + padding: 0; + } + + .mobileNav { + display: flex; + gap: var(--rs-space-10); + padding: var(--rs-space-3) var(--rs-space-5); + background: var(--rs-color-background-base-primary); + } + + .mobileNavLink { + flex: 1; + display: flex; + align-items: center; + gap: var(--rs-space-3); + padding: var(--rs-space-4) var(--rs-space-3); + border: 0.5px solid var(--rs-color-border-base-primary); + border-radius: var(--rs-radius-4); + text-decoration: none; + font-family: var(--rs-font-body); + font-size: var(--rs-font-size-regular); + font-weight: var(--rs-font-weight-medium); + line-height: var(--rs-line-height-regular); + letter-spacing: var(--rs-letter-spacing-regular); + color: var(--rs-color-foreground-base-tertiary); + min-width: 0; + } + + .mobileNavLink[data-direction='next'] { + justify-content: flex-end; + background: var(--rs-color-background-base-secondary); + color: var(--rs-color-foreground-base-primary); + } + + .mobileNavLabel { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} diff --git a/packages/chronicle/src/themes/default/Layout.tsx b/packages/chronicle/src/themes/default/Layout.tsx index faa9a51..67d8e57 100644 --- a/packages/chronicle/src/themes/default/Layout.tsx +++ b/packages/chronicle/src/themes/default/Layout.tsx @@ -4,7 +4,9 @@ import { CodeBracketSquareIcon, RectangleStackIcon, DocumentTextIcon, - Squares2X2Icon + Squares2X2Icon, + Bars3Icon, + XMarkIcon } from '@heroicons/react/24/outline'; import { Flex, IconButton, Button, Sidebar } from '@raystack/apsara'; import { PlayIcon } from '@radix-ui/react-icons'; @@ -70,6 +72,7 @@ export function Layout({ const navigate = useNavigate(); const { page, version } = usePageContext(); const scrollRef = useRef(null); + const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false); const isApiRoute = pathname === '/apis' || pathname.startsWith('/apis/'); const isApiBase = (basePath: string) => pathname === basePath || pathname.startsWith(`${basePath}/`); @@ -106,10 +109,72 @@ export function Layout({ requestAnimationFrame(() => { el.scrollTop = savedScrollTop; }); + setMobileSidebarOpen(false); }, [pathname]); return ( +
+ + + {config.search?.enabled && } + + + +
+
+ {showTopLinks ? ( +
+ {contentEntries.map(entry => ( + )} + classNames={{ root: styles.topLinkItem, text: styles.topLinkText }} + render={} + > + {entry.label} + + ))} + {apiEntries.map(api => ( + )} + classNames={{ root: styles.topLinkItem, text: styles.topLinkText }} + render={} + > + {api.name} API + + ))} +
+ ) : null} + {tree.children.map((item, i) => ( + isApiRoute ? ( + + ) : ( + + ) + ))} +
{hideSidebar ? null : ( {children} +
+ {prev ? ( + + + {prev.title} + + ) :
} + {next ? ( + + {next.title} + + + ) :
} +
diff --git a/packages/chronicle/src/themes/default/Page.module.css b/packages/chronicle/src/themes/default/Page.module.css index e8e78cd..10f17d1 100644 --- a/packages/chronicle/src/themes/default/Page.module.css +++ b/packages/chronicle/src/themes/default/Page.module.css @@ -134,3 +134,17 @@ .headerLoader { margin-bottom: var(--rs-space-5); } + +@media (max-width: 768px) { + .page { + gap: var(--rs-space-5); + } + + .article { + max-width: 100%; + } + + .title { + margin-bottom: var(--rs-space-5); + } +}