mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-23 01:01:27 +00:00
85 lines
2.7 KiB
TypeScript
85 lines
2.7 KiB
TypeScript
import type { VariantProps } from 'class-variance-authority';
|
|
import type { LucideIcon } from 'lucide-react-native';
|
|
import * as React from 'react';
|
|
import { toggleTextVariants, toggleVariants } from '@/components/ui/toggle';
|
|
import { TextClassContext } from '@/components/ui/text';
|
|
import * as ToggleGroupPrimitive from '@rn-primitives/toggle-group';
|
|
import { cn } from '@/lib/utils';
|
|
|
|
const ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants> | null>(null);
|
|
|
|
const ToggleGroup = React.forwardRef<
|
|
ToggleGroupPrimitive.RootRef,
|
|
ToggleGroupPrimitive.RootProps & VariantProps<typeof toggleVariants>
|
|
>(({ className, variant, size, children, ...props }, ref) => (
|
|
<ToggleGroupPrimitive.Root
|
|
ref={ref}
|
|
className={cn('flex flex-row items-center justify-center gap-1', className)}
|
|
{...props}
|
|
>
|
|
<ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>
|
|
</ToggleGroupPrimitive.Root>
|
|
));
|
|
|
|
ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
|
|
|
|
function useToggleGroupContext() {
|
|
const context = React.useContext(ToggleGroupContext);
|
|
if (context === null) {
|
|
throw new Error(
|
|
'ToggleGroup compound components cannot be rendered outside the ToggleGroup component'
|
|
);
|
|
}
|
|
return context;
|
|
}
|
|
|
|
const ToggleGroupItem = React.forwardRef<
|
|
ToggleGroupPrimitive.ItemRef,
|
|
ToggleGroupPrimitive.ItemProps & VariantProps<typeof toggleVariants>
|
|
>(({ className, children, variant, size, ...props }, ref) => {
|
|
const context = useToggleGroupContext();
|
|
const { value } = ToggleGroupPrimitive.useRootContext();
|
|
|
|
return (
|
|
<TextClassContext.Provider
|
|
value={cn(
|
|
toggleTextVariants({ variant, size }),
|
|
ToggleGroupPrimitive.utils.getIsSelected(value, props.value)
|
|
? 'text-accent-foreground'
|
|
: 'web:group-hover:text-muted-foreground'
|
|
)}
|
|
>
|
|
<ToggleGroupPrimitive.Item
|
|
ref={ref}
|
|
className={cn(
|
|
toggleVariants({
|
|
variant: context.variant || variant,
|
|
size: context.size || size,
|
|
}),
|
|
props.disabled && 'web:pointer-events-none opacity-50',
|
|
ToggleGroupPrimitive.utils.getIsSelected(value, props.value) && 'bg-accent',
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
{children}
|
|
</ToggleGroupPrimitive.Item>
|
|
</TextClassContext.Provider>
|
|
);
|
|
});
|
|
|
|
ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
|
|
|
|
function ToggleGroupIcon({
|
|
className,
|
|
icon: Icon,
|
|
...props
|
|
}: React.ComponentPropsWithoutRef<LucideIcon> & {
|
|
icon: LucideIcon;
|
|
}) {
|
|
const textClass = React.useContext(TextClassContext);
|
|
return <Icon className={cn(textClass, className)} {...props} />;
|
|
}
|
|
|
|
export { ToggleGroup, ToggleGroupIcon, ToggleGroupItem };
|