fix: Simplify Help page layout (remove sticky)

- Sticky not possible when page is inside overflow-auto container
- Using standard flexbox layout where sidebar and content scroll together
- Separate mobile (fixed overlay) and desktop (inline) sidebars
- Clean, simple layout matching typical documentation patterns
This commit is contained in:
Dwindi Ramadhana
2026-01-04 12:37:40 +07:00
parent 54a1ec1c88
commit d65259db8a

View File

@@ -3,7 +3,6 @@ import { useSearchParams } from 'react-router-dom';
import { Book, ChevronRight, FileText, Settings, Layers, Puzzle, Menu, X } from 'lucide-react'; import { Book, ChevronRight, FileText, Settings, Layers, Puzzle, Menu, X } from 'lucide-react';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { useApp } from '@/contexts/AppContext';
import DocContent from './DocContent'; import DocContent from './DocContent';
import type { DocSection } from './types'; import type { DocSection } from './types';
@@ -22,23 +21,8 @@ export default function Help() {
const [expandedSections, setExpandedSections] = useState<Record<string, boolean>>({}); const [expandedSections, setExpandedSections] = useState<Record<string, boolean>>({});
const [sidebarOpen, setSidebarOpen] = useState(false); const [sidebarOpen, setSidebarOpen] = useState(false);
const { isStandalone } = useApp();
const currentSlug = searchParams.get('doc') || 'getting-started'; const currentSlug = searchParams.get('doc') || 'getting-started';
// Calculate sticky top position based on mode
// This matches the submenu bar logic in App.tsx:
// - Standalone/fullscreen: top-0 (header already handles offset)
// - WP Admin: top-[calc(7rem+32px)] = 144px (header 64px + topnav 48px + wp-admin bar 32px)
const sidebarStickyTop = isStandalone
? 'top-0'
: 'top-[calc(7rem+32px)]';
// Height calculation matches App.tsx Sidebar pattern
const sidebarHeight = isStandalone
? 'h-[calc(100vh-64px)]'
: 'h-[calc(100vh-7rem-32px)]';
// Fetch documentation registry // Fetch documentation registry
useEffect(() => { useEffect(() => {
const fetchDocs = async () => { const fetchDocs = async () => {
@@ -85,8 +69,8 @@ export default function Help() {
const isActive = (slug: string) => slug === currentSlug; const isActive = (slug: string) => slug === currentSlug;
return ( return (
<div className="flex"> <>
{/* Mobile menu button - only show on small screens */} {/* Mobile menu button */}
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
@@ -107,9 +91,7 @@ export default function Help() {
{/* Mobile sidebar - fixed overlay */} {/* Mobile sidebar - fixed overlay */}
<aside <aside
className={cn( className={cn(
"lg:hidden fixed left-0 z-40 w-72 bg-background border-r overflow-y-auto", "lg:hidden fixed left-0 top-0 bottom-0 z-40 w-72 bg-background border-r overflow-y-auto",
sidebarStickyTop,
sidebarHeight,
sidebarOpen ? "block" : "hidden" sidebarOpen ? "block" : "hidden"
)} )}
> >
@@ -123,14 +105,10 @@ export default function Help() {
/> />
</aside> </aside>
{/* Desktop sidebar - sticky */} {/* Desktop layout - simple flexbox, no sticky */}
<aside <div className="hidden lg:flex gap-0">
className={cn( {/* Desktop sidebar - flex-shrink-0 keeps it visible */}
"hidden lg:block w-72 flex-shrink-0 border-r bg-muted/30 overflow-y-auto sticky", <aside className="w-72 flex-shrink-0 border-r bg-muted/30 min-h-[600px]">
sidebarStickyTop,
sidebarHeight
)}
>
<SidebarContent <SidebarContent
loading={loading} loading={loading}
sections={sections} sections={sections}
@@ -141,13 +119,21 @@ export default function Help() {
/> />
</aside> </aside>
{/* Main content - uses page scroll */} {/* Desktop content */}
<main className="flex-1 min-w-0"> <main className="flex-1 min-w-0">
<div className="max-w-4xl mx-auto py-6 px-6 lg:px-10"> <div className="max-w-4xl mx-auto py-6 px-10">
<DocContent slug={currentSlug} /> <DocContent slug={currentSlug} />
</div> </div>
</main> </main>
</div> </div>
{/* Mobile content - shown when sidebar is hidden */}
<div className="lg:hidden">
<div className="max-w-4xl mx-auto py-6 px-6">
<DocContent slug={currentSlug} />
</div>
</div>
</>
); );
} }
@@ -169,7 +155,7 @@ function SidebarContent({
}) { }) {
return ( return (
<> <>
<div className="p-4 border-b bg-muted/30 sticky top-0"> <div className="p-4 border-b bg-muted/30">
<h2 className="text-lg font-semibold flex items-center gap-2"> <h2 className="text-lg font-semibold flex items-center gap-2">
<Book className="w-5 h-5" /> <Book className="w-5 h-5" />
Documentation Documentation