From 4a72ff60347b361bc8693840a751a391d656aff6 Mon Sep 17 00:00:00 2001 From: theborakompanioni Date: Sat, 10 Jan 2026 11:44:27 +0100 Subject: [PATCH] chore(ui): add button group component --- src/components/orderbook/OrderbookContent.tsx | 46 +++++------- src/components/ui/button-group.tsx | 74 +++++++++++++++++++ 2 files changed, 94 insertions(+), 26 deletions(-) create mode 100644 src/components/ui/button-group.tsx diff --git a/src/components/orderbook/OrderbookContent.tsx b/src/components/orderbook/OrderbookContent.tsx index 13ce64fe..1e905817 100644 --- a/src/components/orderbook/OrderbookContent.tsx +++ b/src/components/orderbook/OrderbookContent.tsx @@ -24,6 +24,7 @@ import { jamSettingsStore } from '@/store/jamSettingsStore' import { jmSessionStore } from '@/store/jmSessionStore' import { DevBadge } from '../dev/DevBadge' import { Alert, AlertDescription } from '../ui/alert' +import { ButtonGroup } from '../ui/button-group' import { Label } from '../ui/label' import { OrderbookTable, type OrderTableEntry } from './OrderbookTable' @@ -276,40 +277,33 @@ export const OrderbookContent = ({ className }: OrderbookContentProps) => { {/* TODO: replace manual dropdown with shadcn component */}
- -
+ + - {showRefreshDropdown && ( -
- -
- )} -
+ + {showRefreshDropdown && ( +
+ +
+ )}
diff --git a/src/components/ui/button-group.tsx b/src/components/ui/button-group.tsx new file mode 100644 index 00000000..81e15344 --- /dev/null +++ b/src/components/ui/button-group.tsx @@ -0,0 +1,74 @@ +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' +import { Separator } from '@/components/ui/separator' +import { cn } from '@/lib/utils' + +const buttonGroupVariants = cva( + "flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2", + { + variants: { + orientation: { + horizontal: + '[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none', + vertical: + 'flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none', + }, + }, + defaultVariants: { + orientation: 'horizontal', + }, + }, +) + +function ButtonGroup({ + className, + orientation, + ...props +}: React.ComponentProps<'div'> & VariantProps) { + return ( +
+ ) +} + +function ButtonGroupText({ + className, + asChild = false, + ...props +}: React.ComponentProps<'div'> & { + asChild?: boolean +}) { + const Comp = asChild ? Slot : 'div' + + return ( + + ) +} + +function ButtonGroupSeparator({ + className, + orientation = 'vertical', + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText }