forked from cardosofelipe/fast-next-template
- Added grid and list view modes to AgentTypeList with user preference management. - Enhanced filtering with category selection alongside existing search and status filters. - Updated AgentTypeDetail with category badges and improved layout. - Added unit tests for grid/list views and category filtering in AgentTypeList. - Introduced `@radix-ui/react-toggle-group` for view mode toggle in AgentTypeList.
94 lines
2.8 KiB
TypeScript
94 lines
2.8 KiB
TypeScript
'use client';
|
|
|
|
import * as React from 'react';
|
|
import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
|
|
import { type VariantProps, cva } from 'class-variance-authority';
|
|
|
|
import { cn } from '@/lib/utils';
|
|
|
|
const toggleGroupVariants = cva(
|
|
'inline-flex items-center justify-center rounded-md border bg-transparent',
|
|
{
|
|
variants: {
|
|
variant: {
|
|
default: 'bg-transparent',
|
|
outline: 'border border-input',
|
|
},
|
|
},
|
|
defaultVariants: {
|
|
variant: 'outline',
|
|
},
|
|
}
|
|
);
|
|
|
|
const toggleGroupItemVariants = cva(
|
|
'inline-flex items-center justify-center whitespace-nowrap text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground',
|
|
{
|
|
variants: {
|
|
variant: {
|
|
default: 'bg-transparent hover:bg-muted hover:text-muted-foreground',
|
|
outline: 'bg-transparent hover:bg-accent hover:text-accent-foreground',
|
|
},
|
|
size: {
|
|
default: 'h-10 px-3',
|
|
sm: 'h-9 px-2.5',
|
|
lg: 'h-11 px-5',
|
|
},
|
|
},
|
|
defaultVariants: {
|
|
variant: 'default',
|
|
size: 'default',
|
|
},
|
|
}
|
|
);
|
|
|
|
const ToggleGroupContext = React.createContext<VariantProps<typeof toggleGroupItemVariants>>({
|
|
size: 'default',
|
|
variant: 'default',
|
|
});
|
|
|
|
const ToggleGroup = React.forwardRef<
|
|
React.ElementRef<typeof ToggleGroupPrimitive.Root>,
|
|
React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &
|
|
VariantProps<typeof toggleGroupVariants> &
|
|
VariantProps<typeof toggleGroupItemVariants>
|
|
>(({ className, variant, size, children, ...props }, ref) => (
|
|
<ToggleGroupPrimitive.Root
|
|
ref={ref}
|
|
className={cn(toggleGroupVariants({ variant }), className)}
|
|
{...props}
|
|
>
|
|
<ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>
|
|
</ToggleGroupPrimitive.Root>
|
|
));
|
|
|
|
ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
|
|
|
|
const ToggleGroupItem = React.forwardRef<
|
|
React.ElementRef<typeof ToggleGroupPrimitive.Item>,
|
|
React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &
|
|
VariantProps<typeof toggleGroupItemVariants>
|
|
>(({ className, children, variant, size, ...props }, ref) => {
|
|
const context = React.useContext(ToggleGroupContext);
|
|
|
|
return (
|
|
<ToggleGroupPrimitive.Item
|
|
ref={ref}
|
|
className={cn(
|
|
toggleGroupItemVariants({
|
|
variant: context.variant || variant,
|
|
size: context.size || size,
|
|
}),
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
{children}
|
|
</ToggleGroupPrimitive.Item>
|
|
);
|
|
});
|
|
|
|
ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
|
|
|
|
export { ToggleGroup, ToggleGroupItem };
|