Skip to content

Commit

Permalink
style: project cards accordion
Browse files Browse the repository at this point in the history
  • Loading branch information
Amama-Fatima committed May 2, 2024
1 parent 5f3773c commit 4ef5ac2
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 6 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
},
"dependencies": {
"@hookform/resolvers": "^3.3.4",
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-checkbox": "^1.0.4",
"@radix-ui/react-dialog": "^1.0.5",
Expand Down
58 changes: 58 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 16 additions & 6 deletions src/components/project-card.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import React from 'react';

import { Icons } from '@/components/icons';
import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger,
} from '@/components/ui/accordion';
import { Badge } from '@/components/ui/badge';
import {
Card,
Expand Down Expand Up @@ -70,12 +76,16 @@ const ProjectCard = ({
</CardDescription>
</CardHeader>
<CardContent>
<p className='text-muted-foreground text-lg'>
Details: <span className='text-neutral-50'>{description}</span>
</p>
<p className='text-muted-foreground text-lg'>
Team: <span className='text-neutral-50'>{team}</span>
</p>
<Accordion type='single' collapsible className='w-full'>
<AccordionItem value='description'>
<AccordionTrigger>Details</AccordionTrigger>
<AccordionContent>{description}</AccordionContent>
</AccordionItem>
<AccordionItem value='team'>
<AccordionTrigger>Team</AccordionTrigger>
<AccordionContent>{team}</AccordionContent>
</AccordionItem>
</Accordion>
</CardContent>
<CardFooter className='flex-row-reverse'>
<Badge variant='outline' className='flex gap-2 border-4'>
Expand Down
58 changes: 58 additions & 0 deletions src/components/ui/accordion.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
'use client';

import * as AccordionPrimitive from '@radix-ui/react-accordion';
import { ChevronDown } from 'lucide-react';
import * as React from 'react';

import { cn } from '@/lib/utils';

const Accordion = AccordionPrimitive.Root;

const AccordionItem = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
>(({ className, ...props }, ref) => (
<AccordionPrimitive.Item
ref={ref}
className={cn('border-b', className)}
{...props}
/>
));
AccordionItem.displayName = 'AccordionItem';

const AccordionTrigger = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
>(({ className, children, ...props }, ref) => (
<AccordionPrimitive.Header className='flex'>
<AccordionPrimitive.Trigger
ref={ref}
className={cn(
'flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',
className
)}
{...props}
>
{children}
<ChevronDown className='h-4 w-4 shrink-0 transition-transform duration-200' />
</AccordionPrimitive.Trigger>
</AccordionPrimitive.Header>
));
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;

const AccordionContent = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
>(({ className, children, ...props }, ref) => (
<AccordionPrimitive.Content
ref={ref}
className='overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down'
{...props}
>
<div className={cn('pb-4 pt-0', className)}>{children}</div>
</AccordionPrimitive.Content>
));

AccordionContent.displayName = AccordionPrimitive.Content.displayName;

export { Accordion, AccordionContent, AccordionItem, AccordionTrigger };

0 comments on commit 4ef5ac2

Please sign in to comment.