diff --git a/app/page.tsx b/app/page.tsx index 76ca52f..fe59767 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -25,7 +25,7 @@ export default function Home() { )} > - 🚀 New Version - Release v1.15.2 + 🚀 New Version - Release v1.16.0 diff --git a/components/contexts/AccordionContext.ts b/components/contexts/AccordionContext.ts new file mode 100644 index 0000000..ac073bf --- /dev/null +++ b/components/contexts/AccordionContext.ts @@ -0,0 +1,4 @@ +import { createContext } from 'react'; + +// Create a context to check if a component is inside an accordion group +export const AccordionGroupContext = createContext<{ inGroup: boolean } | null>(null); \ No newline at end of file diff --git a/components/markdown/AccordionGroupMdx.tsx b/components/markdown/AccordionGroupMdx.tsx new file mode 100644 index 0000000..c5f5c7c --- /dev/null +++ b/components/markdown/AccordionGroupMdx.tsx @@ -0,0 +1,31 @@ +"use client" + +import React, { ReactNode } from "react"; +import clsx from "clsx"; +import { AccordionGroupContext } from "@/components/contexts/AccordionContext"; + +interface AccordionGroupProps { + children: ReactNode; + className?: string; +} + +const AccordionGroup: React.FC = ({ children, className }) => { + + return ( + // Wrap all children with the AccordionGroupContext.Provider + // so that any nested accordions know they are inside a group. + // This enables group-specific behavior in child components. + +
+ {children} +
+
+ ); +}; + +export default AccordionGroup; \ No newline at end of file diff --git a/components/markdown/AccordionMdx.tsx b/components/markdown/AccordionMdx.tsx index 45e23c6..8e26e04 100644 --- a/components/markdown/AccordionMdx.tsx +++ b/components/markdown/AccordionMdx.tsx @@ -1,9 +1,10 @@ "use client"; -import { ReactNode, useState } from 'react'; +import { ReactNode, useState, useContext } from 'react'; import { ChevronRight } from 'lucide-react'; import * as Icons from "lucide-react"; import { cn } from '@/lib/utils'; +import { AccordionGroupContext } from '@/components/contexts/AccordionContext'; type AccordionProps = { title: string; @@ -18,16 +19,26 @@ const Accordion: React.FC = ({ defaultOpen = false, icon, }: AccordionProps) => { + const groupContext = useContext(AccordionGroupContext); + const isInGroup = groupContext?.inGroup === true; const [isOpen, setIsOpen] = useState(defaultOpen); - const Icon = icon ? (Icons[icon] as React.FC<{ className?: string }>) : null; + // The main wrapper div for the accordion. + // All styling logic for the accordion container is handled here. return ( -
+
{isOpen && ( -
+
{children}
)} @@ -48,4 +59,4 @@ const Accordion: React.FC = ({ ); }; -export default Accordion; +export default Accordion; \ No newline at end of file diff --git a/lib/markdown.ts b/lib/markdown.ts index 341bf23..a59eca6 100644 --- a/lib/markdown.ts +++ b/lib/markdown.ts @@ -45,6 +45,7 @@ import CardGroup from "@/components/markdown/CardGroupMdx"; import Kbd from "@/components/markdown/KeyboardMdx"; import { Release, Changes } from "@/components/markdown/ReleaseMdx"; import { File, Files, Folder } from "@/components/markdown/FileTreeMdx"; +import AccordionGroup from "@/components/markdown/AccordionGroupMdx"; // add custom components const components = { @@ -73,6 +74,7 @@ const components = { File, Files, Folder, + AccordionGroup }; // can be used for other pages like blogs, Guides etc diff --git a/package.json b/package.json index cd8c40a..303530a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "docubook", - "version": "1.15.3", + "version": "1.16.0", "private": true, "scripts": { "dev": "next dev",