Skip to content

Commit 25d140f

Browse files
committed
fix: make sidebar reachable on mobile and use dynamic viewport units
On viewports below md the only SidebarTrigger was rendered inside the sidebar itself, which becomes a closed off-canvas drawer on mobile - so the conversation list, new-conversation button, and theme toggle were unreachable on phones. Add a mobile-only header with a SidebarTrigger outside the drawer. Also replace h-screen/basis-[100vh] with dvh units so the layout tracks the visual viewport when mobile browsers show/hide the URL bar and keyboard.
1 parent 6d9bb04 commit 25d140f

2 files changed

Lines changed: 27 additions & 8 deletions

File tree

src/App.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useEffect, useState } from 'react'
22
import Chat from './Chat.tsx'
33
import { AppSidebar } from './components/app-sidebar.tsx'
4+
import { MobileHeader } from './components/mobile-header.tsx'
45
import { ThemeProvider } from './components/theme-provider.tsx'
56
import { SidebarProvider } from './components/ui/sidebar.tsx'
67
import { Toaster } from './components/ui/sonner.tsx'
@@ -35,14 +36,17 @@ export default function App() {
3536
<SidebarProvider defaultOpen>
3637
<AppSidebar />
3738

38-
<div className="flex flex-col justify-center flex-1 h-screen overflow-hidden">
39-
<div
40-
className={cn(
41-
'flex flex-col max-w-4xl mx-auto relative w-full basis-[100vh] overflow-hidden',
42-
'has-[.stick-to-bottom:empty]:overflow-visible has-[.stick-to-bottom:empty]:basis-[0px] transition-[flex-basis] duration-200',
43-
)}
44-
>
45-
{ready && <Chat />}
39+
<div className="flex flex-col flex-1 h-dvh overflow-hidden">
40+
<MobileHeader />
41+
<div className="flex flex-col justify-center flex-1 min-h-0">
42+
<div
43+
className={cn(
44+
'flex flex-col max-w-4xl mx-auto relative w-full basis-[100dvh] overflow-hidden',
45+
'has-[.stick-to-bottom:empty]:overflow-visible has-[.stick-to-bottom:empty]:basis-[0px] transition-[flex-basis] duration-200',
46+
)}
47+
>
48+
{ready && <Chat />}
49+
</div>
4650
</div>
4751
</div>
4852
</SidebarProvider>

src/components/mobile-header.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { SidebarTrigger } from '@/components/ui/sidebar'
2+
3+
import logoSvg from '../assets/logo.svg'
4+
5+
export function MobileHeader() {
6+
return (
7+
<header className="flex shrink-0 items-center gap-2 border-b p-2 md:hidden">
8+
<SidebarTrigger />
9+
<h1 className="text-l font-medium">
10+
<img src={logoSvg} className="inline h-4 mr-2 mb-1" />
11+
Pydantic AI
12+
</h1>
13+
</header>
14+
)
15+
}

0 commit comments

Comments
 (0)