Files
supabase/apps/studio/components/layouts/AppLayout/AppLayoutDropdown.tsx
T
Francesco Sansalvadore b997b7fb13 feat(studio): org project branch mobile selector (#43238)
- add new
[OrgSelector](https://github.com/supabase/supabase/pull/43238/changes#diff-214b339101a9c06864ea2755ac7246eb4c971ce74c5d3169b1385a28ee1d4227)
and
[ProjectBranchSelector](https://github.com/supabase/supabase/pull/43238/changes#diff-82d25c128c306b61bea7481026f58f670a229874f23ca3a1a1d78ddeabde21e0)
components to the mobile navigation, replacing the previous which took
up a lot of horizontal space
- org/project/branch dropdowns now open up in the bottom MobileSheetNav
for a better mobile ux
- desktop nav remains unchanged
2026-03-11 16:25:22 +01:00

74 lines
2.1 KiB
TypeScript

import { AlertCircle, ChevronsUpDown } from 'lucide-react'
import Link from 'next/link'
import { forwardRef, type ReactNode } from 'react'
import { Button, cn, Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_ } from 'ui'
interface AppLayoutDropdownErrorProps {
message: string
}
export function AppLayoutDropdownError({ message }: AppLayoutDropdownErrorProps) {
return (
<div className="flex items-center space-x-2 text-amber-900">
<AlertCircle size={16} strokeWidth={1.5} />
<p className="text-sm">{message}</p>
</div>
)
}
interface AppLayoutDropdownTriggerButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
className?: string
}
export const AppLayoutDropdownTriggerButton = forwardRef<
HTMLButtonElement,
AppLayoutDropdownTriggerButtonProps
>(({ className, ...props }, ref) => (
<Button
ref={ref}
size="tiny"
className={cn('px-1.5 py-4 [&_svg]:w-5 [&_svg]:h-5 ml-1', className)}
iconRight={<ChevronsUpDown strokeWidth={1.5} />}
{...props}
type="text"
/>
))
AppLayoutDropdownTriggerButton.displayName = 'AppLayoutDropdownTriggerButton'
export interface AppLayoutDropdownWithPopoverProps {
linkHref: string
linkContent: ReactNode
linkClassName?: string
commandContent: ReactNode
open: boolean
onOpenChange: (open: boolean) => void
triggerButtonClassName?: string
}
export function AppLayoutDropdownWithPopover({
linkHref,
linkContent,
linkClassName = 'flex items-center gap-2 flex-shrink-0 text-sm',
commandContent,
open,
onOpenChange,
triggerButtonClassName,
}: AppLayoutDropdownWithPopoverProps) {
return (
<Popover_Shadcn_ open={open} onOpenChange={onOpenChange} modal={false}>
<div className="flex items-center flex-shrink-0">
<Link href={linkHref} className={linkClassName}>
{linkContent}
</Link>
<PopoverTrigger_Shadcn_ asChild>
<AppLayoutDropdownTriggerButton className={triggerButtonClassName} />
</PopoverTrigger_Shadcn_>
</div>
<PopoverContent_Shadcn_ className="p-0" side="bottom" align="start">
{commandContent}
</PopoverContent_Shadcn_>
</Popover_Shadcn_>
)
}