refactor(web): share placement parser across base ui primitives

This commit is contained in:
yyh 2026-03-02 14:57:06 +08:00
parent 6b55e50106
commit f65159bd00
No known key found for this signature in database
5 changed files with 22 additions and 32 deletions

View File

@ -3,16 +3,9 @@
import type { Placement } from '@floating-ui/react'
import { Menu } from '@base-ui/react/menu'
import * as React from 'react'
import { parsePlacement } from '@/app/components/base/ui/placement'
import { cn } from '@/utils/classnames'
function parsePlacement(placement: Placement) {
const [side, align] = placement.split('-') as [
'top' | 'bottom' | 'left' | 'right',
'start' | 'center' | 'end' | undefined,
]
return { side, align: align ?? 'center' as const }
}
export const DropdownMenu = Menu.Root
export const DropdownMenuTrigger = Menu.Trigger
export const DropdownMenuSub = Menu.SubmenuRoot

View File

@ -0,0 +1,18 @@
import type { Placement } from '@floating-ui/react'
type ParsedPlacement = {
side: 'top' | 'bottom' | 'left' | 'right'
align: 'start' | 'center' | 'end'
}
export function parsePlacement(placement: Placement): ParsedPlacement {
const [side, align] = placement.split('-') as [
ParsedPlacement['side'],
ParsedPlacement['align'] | undefined,
]
return {
side,
align: align ?? 'center',
}
}

View File

@ -3,16 +3,9 @@
import type { Placement } from '@floating-ui/react'
import { Popover as BasePopover } from '@base-ui/react/popover'
import * as React from 'react'
import { parsePlacement } from '@/app/components/base/ui/placement'
import { cn } from '@/utils/classnames'
function parsePlacement(placement: Placement) {
const [side, align] = placement.split('-') as [
'top' | 'bottom' | 'left' | 'right',
'start' | 'center' | 'end' | undefined,
]
return { side, align: align ?? 'center' as const }
}
export const Popover = BasePopover.Root
export const PopoverTrigger = BasePopover.Trigger
export const PopoverClose = BasePopover.Close

View File

@ -3,16 +3,9 @@
import type { Placement } from '@floating-ui/react'
import { Select as BaseSelect } from '@base-ui/react/select'
import * as React from 'react'
import { parsePlacement } from '@/app/components/base/ui/placement'
import { cn } from '@/utils/classnames'
function parsePlacement(placement: Placement) {
const [side, align] = placement.split('-') as [
'top' | 'bottom' | 'left' | 'right',
'start' | 'center' | 'end' | undefined,
]
return { side, align: align ?? 'center' as const }
}
export const Select = BaseSelect.Root
export const SelectValue = BaseSelect.Value
export const SelectGroup = BaseSelect.Group

View File

@ -3,16 +3,9 @@
import type { Placement } from '@floating-ui/react'
import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip'
import * as React from 'react'
import { parsePlacement } from '@/app/components/base/ui/placement'
import { cn } from '@/utils/classnames'
function parsePlacement(placement: Placement) {
const [side, align] = placement.split('-') as [
'top' | 'bottom' | 'left' | 'right',
'start' | 'center' | 'end' | undefined,
]
return { side, align: align ?? 'center' as const }
}
export type TooltipProps = {
position?: Placement
disabled?: boolean