wip: add action bar for selected blocks

New UI component: ButtonGroup.
This commit is contained in:
Tienson Qin
2025-02-27 00:07:58 +08:00
parent a51b26c161
commit 82ca4bc9e5
4 changed files with 107 additions and 9 deletions

View File

@@ -0,0 +1,53 @@
import { Children, ReactElement, cloneElement } from 'react';
import { ButtonProps } from '@/components/ui/button';
import { cn } from '@/lib/utils';
interface ButtonGroupProps {
className?: string;
orientation?: 'horizontal' | 'vertical';
children: ReactElement<ButtonProps>[];
}
export const ButtonGroup = ({
className,
orientation = 'horizontal',
children,
}: ButtonGroupProps) => {
const totalButtons = Children.count(children);
const isHorizontal = orientation === 'horizontal';
const isVertical = orientation === 'vertical';
return (
<div
className={cn(
'flex',
{
'flex-col': isVertical,
'w-fit': isVertical,
},
className
)}
>
{Children.map(children, (child, index) => {
const isFirst = index === 0;
const isLast = index === totalButtons - 1;
return cloneElement(child, {
className: cn(
{
'rounded-l-none': isHorizontal && !isFirst,
'rounded-r-none': isHorizontal && !isLast,
'border-l-0': isHorizontal && !isFirst,
'rounded-t-none': isVertical && !isFirst,
'rounded-b-none': isVertical && !isLast,
'border-t-0': isVertical && !isFirst,
},
child.props.className
),
});
})}
</div>
);
};

View File

@@ -1,4 +1,5 @@
import { Button } from '@/components/ui/button'
import { ButtonGroup } from '@/components/ui/button-group'
import { Slider, SliderTrack, SliderRange, SliderThumb } from '@/components/ui/slider'
import {
DropdownMenu,
@@ -99,7 +100,7 @@ declare global {
}
const shadui = {
Link, Button,
Link, Button, ButtonGroup,
Slider, SliderTrack, SliderRange, SliderThumb,
DropdownMenu,
DropdownMenuContent,