Skip to content

Commit 1756358

Browse files
committed
feat: add faq section
1 parent 86d16c0 commit 1756358

File tree

6 files changed

+172
-2
lines changed

6 files changed

+172
-2
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"lint": "next lint"
1111
},
1212
"dependencies": {
13+
"@radix-ui/react-accordion": "^1.2.1",
1314
"@radix-ui/react-dialog": "^1.1.2",
1415
"@radix-ui/react-icons": "^1.3.0",
1516
"@radix-ui/react-navigation-menu": "^1.2.1",

pnpm-lock.yaml

Lines changed: 62 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/sections/faq.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import {
2+
Accordion,
3+
AccordionContent,
4+
AccordionItem,
5+
AccordionTrigger
6+
} from '@/components/ui/accordion'
7+
8+
import { DATA } from '@/data'
9+
10+
export const FAQ = () => {
11+
return (
12+
<section id='faq' className='container md:w-[700px] py-24 sm:py-32 m-auto'>
13+
<div className='text-center mb-8'>
14+
<h2 className='text-lg text-primary text-center mb-2 tracking-wider'>FAQS</h2>
15+
16+
<h2 className='text-3xl md:text-4xl text-center font-bold'>Common Questions</h2>
17+
</div>
18+
19+
<Accordion type='single' collapsible className='AccordionRoot'>
20+
{DATA.faq.map(({ question, answer }, idx) => (
21+
<AccordionItem key={idx} value={idx.toString()}>
22+
<AccordionTrigger className='text-left'>{question}</AccordionTrigger>
23+
24+
<AccordionContent>{answer}</AccordionContent>
25+
</AccordionItem>
26+
))}
27+
</Accordion>
28+
</section>
29+
)
30+
}

src/components/ui/accordion.tsx

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import * as React from "react"
2+
import * as AccordionPrimitive from "@radix-ui/react-accordion"
3+
import { ChevronDownIcon } from "@radix-ui/react-icons"
4+
5+
import { cn } from "@/lib/utils"
6+
7+
const Accordion = AccordionPrimitive.Root
8+
9+
const AccordionItem = React.forwardRef<
10+
React.ElementRef<typeof AccordionPrimitive.Item>,
11+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
12+
>(({ className, ...props }, ref) => (
13+
<AccordionPrimitive.Item
14+
ref={ref}
15+
className={cn("border-b", className)}
16+
{...props}
17+
/>
18+
))
19+
AccordionItem.displayName = "AccordionItem"
20+
21+
const AccordionTrigger = React.forwardRef<
22+
React.ElementRef<typeof AccordionPrimitive.Trigger>,
23+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
24+
>(({ className, children, ...props }, ref) => (
25+
<AccordionPrimitive.Header className="flex">
26+
<AccordionPrimitive.Trigger
27+
ref={ref}
28+
className={cn(
29+
"flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
30+
className
31+
)}
32+
{...props}
33+
>
34+
{children}
35+
<ChevronDownIcon className="h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" />
36+
</AccordionPrimitive.Trigger>
37+
</AccordionPrimitive.Header>
38+
))
39+
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
40+
41+
const AccordionContent = React.forwardRef<
42+
React.ElementRef<typeof AccordionPrimitive.Content>,
43+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
44+
>(({ className, children, ...props }, ref) => (
45+
<AccordionPrimitive.Content
46+
ref={ref}
47+
className="overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
48+
{...props}
49+
>
50+
<div className={cn("pb-4 pt-0", className)}>{children}</div>
51+
</AccordionPrimitive.Content>
52+
))
53+
AccordionContent.displayName = AccordionPrimitive.Content.displayName
54+
55+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }

src/pages/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import { ThemeProvider } from '@/components/theme-provider'
77
import { Header } from '@/components/common/header'
88
import { Footer } from '@/components/common/footer'
99
import { Hero } from '@/components/sections/hero'
10+
import { FAQ } from '@/components/sections/faq'
1011

1112
import { DATA } from '@/data'
1213

14+
import { cn } from '@/lib/utils'
15+
1316
const inter = Inter({ subsets: ['latin'] })
1417

1518
export const metadata = {
@@ -52,7 +55,7 @@ export const metadata = {
5255
export default function Home() {
5356
return (
5457
<ThemeProvider attribute='class' defaultTheme='system' enableSystem disableTransitionOnChange>
55-
<div className={inter.className}>
58+
<div className={cn([inter.className])}>
5659
<Head>
5760
<title>{metadata.title.default}</title>
5861
<meta name='description' content={metadata.description} />
@@ -76,6 +79,7 @@ export default function Home() {
7679

7780
<Header />
7881
<Hero />
82+
<FAQ />
7983
<Footer />
8084
</div>
8185
</ThemeProvider>

tailwind.config.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,31 @@ const config: Config = {
5858
sm: 'calc(var(--radius) - 4px)'
5959
},
6060
animation: {
61-
gradient: 'gradient 8s linear infinite'
61+
gradient: 'gradient 8s linear infinite',
62+
'accordion-down': 'accordion-down 0.2s ease-out',
63+
'accordion-up': 'accordion-up 0.2s ease-out'
6264
},
6365
keyframes: {
6466
gradient: {
6567
to: {
6668
backgroundPosition: 'var(--bg-size) 0'
6769
}
70+
},
71+
'accordion-down': {
72+
from: {
73+
height: '0'
74+
},
75+
to: {
76+
height: 'var(--radix-accordion-content-height)'
77+
}
78+
},
79+
'accordion-up': {
80+
from: {
81+
height: 'var(--radix-accordion-content-height)'
82+
},
83+
to: {
84+
height: '0'
85+
}
6886
}
6987
}
7088
}

0 commit comments

Comments
 (0)