'use client';
import * as React from 'react';
import { AnimatePresence, motion } from 'motion/react';
import { FileIcon, FolderIcon, FolderOpenIcon } from 'lucide-react';
import { cn } from '@workspace/ui/lib/utils';
import {
Accordion,
AccordionContent,
AccordionItem,
AccordionItemProps,
AccordionTrigger,
AccordionTriggerProps,
useAccordionItem,
} from '@/registry/radix/accordion';
import {
MotionHighlight,
MotionHighlightItem,
} from '@/registry/effects/motion-highlight';
type FileButtonProps = React.ComponentProps<'div'> & {
icons?: {
close: React.ReactNode;
open: React.ReactNode;
};
icon?: React.ReactNode;
open?: boolean;
sideComponent?: React.ReactNode;
};
function FileButton({
children,
className,
icons,
icon,
open,
sideComponent,
...props
}: FileButtonProps) {
return (
{icon
? typeof icon !== 'string'
? icon
: null
: icons && (
{open
? typeof icons.open !== 'string'
? icons.open
: null
: typeof icons.close !== 'string'
? icons.close
: null}
)}
{children}
{sideComponent}
);
}
type FilesProps = React.ComponentProps<'div'> & {
children: React.ReactNode;
activeClassName?: string;
defaultOpen?: string[];
open?: string[];
onOpenChange?: (open: string[]) => void;
};
function Files({
children,
className,
activeClassName,
defaultOpen,
open,
onOpenChange,
...props
}: FilesProps) {
return (
);
}
type FolderTriggerProps = AccordionTriggerProps & {
sideComponent?: React.ReactNode;
};
function FolderTrigger({
children,
className,
sideComponent,
...props
}: FolderTriggerProps) {
const { isOpen } = useAccordionItem();
return (
, close: }}
className={className}
sideComponent={sideComponent}
>
{children}
);
}
type FolderProps = Omit<
AccordionItemProps,
'value' | 'onValueChange' | 'defaultValue' | 'children'
> & {
children?: React.ReactNode;
name: string;
open?: string[];
onOpenChange?: (open: string[]) => void;
defaultOpen?: string[];
sideComponent?: React.ReactNode;
};
function Folder({
children,
className,
name,
open,
defaultOpen,
onOpenChange,
sideComponent,
...props
}: FolderProps) {
return (
{name}
{children && (
{children}
)}
);
}
type FileProps = Omit, 'children'> & {
name: string;
sideComponent?: React.ReactNode;
};
function File({ name, className, sideComponent, ...props }: FileProps) {
return (
}
className={className}
sideComponent={sideComponent}
{...props}
>
{name}
);
}
export {
Files,
Folder,
File,
type FilesProps,
type FolderProps,
type FileProps,
};