diff --git a/apps/web/app/(dashboard)/layout.tsx b/apps/web/app/(dashboard)/layout.tsx index e687907..0072ec3 100644 --- a/apps/web/app/(dashboard)/layout.tsx +++ b/apps/web/app/(dashboard)/layout.tsx @@ -1,15 +1,15 @@ -import Link from 'next/link'; import { Logo } from '@/components/logo'; -import { LayoutGrid, Server, Settings, FileClock, Package } from 'lucide-react'; +import { FileClock, LayoutGrid, Package, Server, Settings } from 'lucide-react'; +import Link from 'next/link'; export default function DashboardLayout({ children }: { children: React.ReactNode }) { return (
-
-
+
+
-
-
-
); diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index 3cca534..50c9dce 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -30,6 +30,10 @@ background: var(--color-bg); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; + /* Safety net against a stray wide element causing horizontal scroll on + mobile. `clip` (not `hidden`) does not create a scroll container, so it + leaves position: sticky intact. */ + overflow-x: clip; } body { background: var(--color-bg); diff --git a/apps/web/components/marketing-mobile-menu.tsx b/apps/web/components/marketing-mobile-menu.tsx new file mode 100644 index 0000000..34f8e85 --- /dev/null +++ b/apps/web/components/marketing-mobile-menu.tsx @@ -0,0 +1,47 @@ +'use client'; + +import { Menu, X } from 'lucide-react'; +import Link from 'next/link'; +import { useState } from 'react'; + +const LINKS = [ + { href: '/#how', label: 'How it works' }, + { href: '/templates', label: 'Templates' }, + { href: '/pricing', label: 'Pricing' }, + { href: '/docs', label: 'Docs' }, + { href: '/changelog', label: 'Changelog' }, +]; + +/** Hamburger menu shown below the md breakpoint, where the inline nav is hidden. */ +export function MarketingMobileMenu() { + const [open, setOpen] = useState(false); + return ( +
+ + {open && ( +
+ +
+ )} +
+ ); +}