| 
									
										
										
										
											2024-01-09 16:48:48 +08:00
										 |  |  | import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  | import { useActiveHeading } from "@/hooks/useActiveHeading"; | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  | import { TTOCItem } from "@/types/toc.type"; | 
					
						
							|  |  |  | import Link from "next/link"; | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  | import { twMerge } from "tailwind-merge"; | 
					
						
							| 
									
										
										
										
											2024-01-09 16:48:48 +08:00
										 |  |  | import { Separator } from "../ui/separator"; | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export const TOC = (props: { data: TTOCItem[] }) => { | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |   const activeId = useActiveHeading(props.data.map((item) => `#${item.anchorId}`)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |   return ( | 
					
						
							| 
									
										
										
										
											2024-01-09 16:48:48 +08:00
										 |  |  |     <Card className="sticky top-[5em] mx-5"> | 
					
						
							|  |  |  |       <CardHeader className="p-3"> | 
					
						
							|  |  |  |         <CardTitle className="text-lg text-center">{"TABLE OF CONTENTS"}</CardTitle> | 
					
						
							|  |  |  |       </CardHeader> | 
					
						
							|  |  |  |       <Separator /> | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |       <CardContent className="px-2 py-2 h-[60vh] overflow-y-auto flat-scrollbar-normal"> | 
					
						
							| 
									
										
										
										
											2024-01-09 16:48:48 +08:00
										 |  |  |         <ul> | 
					
						
							|  |  |  |           {props.data?.map((item) => ( | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |             <Link className={""} href={`#${item.anchorId}`} key={`toc-${item.anchorId}`}> | 
					
						
							| 
									
										
										
										
											2024-01-09 16:48:48 +08:00
										 |  |  |               <li | 
					
						
							| 
									
										
										
										
											2024-01-15 11:44:48 +08:00
										 |  |  |                 className={twMerge( | 
					
						
							|  |  |  |                   `py-2 text-sm rounded-lg hover:bg-gray-100 hover:dark:bg-gray-900`, | 
					
						
							|  |  |  |                   activeId === `#${item.anchorId}` ? "bg-gray-100 dark:bg-gray-900 text-sky-700 dark:text-sky-500" : "", | 
					
						
							|  |  |  |                 )} | 
					
						
							| 
									
										
										
										
											2024-01-09 16:48:48 +08:00
										 |  |  |                 style={{ paddingLeft: `${item.level - 1}em` }} | 
					
						
							|  |  |  |               >{`${item.title}`}</li> | 
					
						
							|  |  |  |             </Link> | 
					
						
							|  |  |  |           ))} | 
					
						
							|  |  |  |         </ul> | 
					
						
							|  |  |  |       </CardContent> | 
					
						
							|  |  |  |     </Card> | 
					
						
							| 
									
										
										
										
											2023-12-25 17:21:39 +08:00
										 |  |  |   ); | 
					
						
							|  |  |  | }; |