mirror of
https://github.com/supabase/supabase.git
synced 2026-05-06 08:56:46 -04:00
56de26fe22
This PR migrates the whole monorepo to use Tailwind v4: - Removed `@tailwindcss/container-queries` plugin since it's included by default in v4, - Bump all instances of Tailwind to v4. Made minimal changes to the shared config to remove non-supported features (`alpha` mentions), - Migrate all apps to be compatible with v4 configs, - Fix the `typography.css` import in 3 apps, - Add missing rules which were included by default in v3, - Run `pnpm dlx @tailwindcss/upgrade` on all apps, which renames a lot of classes - Rename all misnamed classes according to https://tailwindcss.com/docs/upgrade-guide#renamed-utilities in all apps. --------- Co-authored-by: Jordi Enric <jordi.err@gmail.com>
187 lines
7.1 KiB
TypeScript
187 lines
7.1 KiB
TypeScript
'use client'
|
|
|
|
import Link from 'next/link'
|
|
import * as React from 'react'
|
|
// import { Icons } from '@/components/icons'
|
|
import {
|
|
buttonVariants,
|
|
cn,
|
|
NavigationMenu,
|
|
NavigationMenuContent,
|
|
NavigationMenuItem,
|
|
NavigationMenuLink,
|
|
NavigationMenuList,
|
|
NavigationMenuTrigger,
|
|
navigationMenuTriggerStyle,
|
|
NavigationMenuViewport,
|
|
ScrollArea,
|
|
ScrollBar,
|
|
} from 'ui'
|
|
|
|
const components: { title: string; href: string; description: string }[] = [
|
|
{
|
|
title: 'Alert Dialog',
|
|
href: '/docs/primitives/alert-dialog',
|
|
description:
|
|
'A modal dialog that interrupts the user with important content and expects a response.',
|
|
},
|
|
{
|
|
title: 'Hover Card',
|
|
href: '/docs/primitives/hover-card',
|
|
description: 'For sighted users to preview content available behind a link.',
|
|
},
|
|
{
|
|
title: 'Progress',
|
|
href: '/docs/primitives/progress',
|
|
description:
|
|
'Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.',
|
|
},
|
|
{
|
|
title: 'Scroll-area',
|
|
href: '/docs/primitives/scroll-area',
|
|
description: 'Visually or semantically separates content.',
|
|
},
|
|
{
|
|
title: 'Tabs',
|
|
href: '/docs/primitives/tabs',
|
|
description:
|
|
'A set of layered sections of content—known as tab panels—that are displayed one at a time.',
|
|
},
|
|
{
|
|
title: 'Tooltip',
|
|
href: '/docs/primitives/tooltip',
|
|
description:
|
|
'A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.',
|
|
},
|
|
]
|
|
|
|
export default function NavigationMenuDemo() {
|
|
return (
|
|
<NavigationMenu renderViewport={false} className="max-w-[500px] border rounded-md">
|
|
<ScrollArea>
|
|
<NavigationMenuList className="w-full p-3">
|
|
<NavigationMenuItem>
|
|
<NavigationMenuContent>
|
|
<ul className="grid gap-3 p-6 md:w-[400px] lg:w-[500px] lg:grid-cols-[.75fr_1fr]">
|
|
<li className="row-span-3">
|
|
<NavigationMenuLink asChild>
|
|
<a
|
|
className="flex h-full w-full select-none flex-col justify-end rounded-md bg-linear-to-b from-muted/50 to-muted p-6 no-underline outline-hidden focus:shadow-md"
|
|
href="/"
|
|
>
|
|
{/* <Icons.logo className="h-6 w-6" /> */}
|
|
shadcn/ui
|
|
<p className="text-sm leading-tight text-foreground-muted">
|
|
Beautifully designed components that you can copy and paste into your apps.
|
|
Accessible. Customizable. Open Source.
|
|
</p>
|
|
</a>
|
|
</NavigationMenuLink>
|
|
</li>
|
|
<ListItem href="/docs" title="Introduction">
|
|
Re-usable components built using Radix UI and Tailwind CSS.
|
|
</ListItem>
|
|
<ListItem href="/docs/installation" title="Installation">
|
|
How to install dependencies and structure your app.
|
|
</ListItem>
|
|
<ListItem href="/docs/primitives/typography" title="Typography">
|
|
Styles for headings, paragraphs, lists...etc
|
|
</ListItem>
|
|
</ul>
|
|
</NavigationMenuContent>
|
|
</NavigationMenuItem>
|
|
<NavigationMenuItem>
|
|
<NavigationMenuTrigger className={cn(buttonVariants({ type: 'text', size: 'small' }))}>
|
|
Components
|
|
</NavigationMenuTrigger>
|
|
<NavigationMenuContent>
|
|
<ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[600px] ">
|
|
{components.map((component) => (
|
|
<ListItem key={component.title} title={component.title} href={component.href}>
|
|
{component.description}
|
|
</ListItem>
|
|
))}
|
|
</ul>
|
|
</NavigationMenuContent>
|
|
</NavigationMenuItem>
|
|
<NavigationMenuItem>
|
|
<NavigationMenuTrigger className={cn(buttonVariants({ type: 'text', size: 'small' }))}>
|
|
Components
|
|
</NavigationMenuTrigger>
|
|
<NavigationMenuContent>
|
|
<ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[600px] ">
|
|
{components.map((component) => (
|
|
<ListItem key={component.title} title={component.title} href={component.href}>
|
|
{component.description}
|
|
</ListItem>
|
|
))}
|
|
</ul>
|
|
</NavigationMenuContent>
|
|
</NavigationMenuItem>
|
|
<NavigationMenuItem>
|
|
<NavigationMenuTrigger className={cn(buttonVariants({ type: 'text', size: 'small' }))}>
|
|
Components
|
|
</NavigationMenuTrigger>
|
|
<NavigationMenuContent>
|
|
<ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[600px] ">
|
|
{components.map((component) => (
|
|
<ListItem key={component.title} title={component.title} href={component.href}>
|
|
{component.description}
|
|
</ListItem>
|
|
))}
|
|
</ul>
|
|
</NavigationMenuContent>
|
|
</NavigationMenuItem>
|
|
<NavigationMenuItem>
|
|
<NavigationMenuTrigger className={cn(buttonVariants({ type: 'text', size: 'small' }))}>
|
|
Components
|
|
</NavigationMenuTrigger>
|
|
<NavigationMenuContent>
|
|
<ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[600px] ">
|
|
{components.map((component) => (
|
|
<ListItem key={component.title} title={component.title} href={component.href}>
|
|
{component.description}
|
|
</ListItem>
|
|
))}
|
|
</ul>
|
|
</NavigationMenuContent>
|
|
</NavigationMenuItem>
|
|
<NavigationMenuItem>
|
|
<NavigationMenuLink
|
|
href="/docs"
|
|
className={buttonVariants({ type: 'text', size: 'small' })}
|
|
>
|
|
Documentation
|
|
</NavigationMenuLink>
|
|
</NavigationMenuItem>
|
|
</NavigationMenuList>
|
|
<ScrollBar orientation="horizontal" />
|
|
</ScrollArea>
|
|
<NavigationMenuViewport containerProps={{ className: 'w-full' }} />
|
|
</NavigationMenu>
|
|
)
|
|
}
|
|
|
|
const ListItem = React.forwardRef<React.ElementRef<'a'>, React.ComponentPropsWithoutRef<'a'>>(
|
|
({ className, title, children, ...props }, ref) => {
|
|
return (
|
|
<li>
|
|
<NavigationMenuLink asChild>
|
|
<a
|
|
ref={ref}
|
|
className={cn(
|
|
'block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-hidden transition-colors hover:bg-surface-100 hover:text-accent-foreground focus:bg-surface-100 focus:text-accent-foreground',
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
<div className="text-sm font-medium leading-none">{title}</div>
|
|
<p className="line-clamp-2 text-sm leading-snug text-foreground-muted">{children}</p>
|
|
</a>
|
|
</NavigationMenuLink>
|
|
</li>
|
|
)
|
|
}
|
|
)
|
|
ListItem.displayName = 'ListItem'
|