openpanel/documentation/src/refine-theme/doc-toc-mobile.tsx
2024-02-05 10:23:04 +01:00

114 lines
5.4 KiB
TypeScript

import React from "react";
import clsx from "clsx";
import { useTOC } from "./doc-toc";
import { Disclosure, Transition } from "@headlessui/react";
import { TriangleDownIcon } from "./icons/triangle-down";
export const DocTOCMobile = () => {
const { hasTOC, activeId, toc } = useTOC();
if (!hasTOC) {
return null;
}
return (
<div
className={clsx(
"xl:hidden block w-full mb-10",
"max-w-screen-content-sm",
)}
>
<Disclosure>
{({ open }) => (
<div
className={clsx(
"rounded-lg",
"border gray-300 dark:border-gray-700",
"bg-gray-100 dark:bg-gray-700",
)}
>
<Disclosure.Button
className={clsx(
"w-full",
"flex items-center gap-2",
"px-2 py-2",
)}
>
<TriangleDownIcon
className={clsx(
"h-5 w-5",
"text-gray-500",
"transition-transform duration-200 ease-in-out",
{
"transform -rotate-90": !open,
},
)}
/>
<span
className={clsx(
"text-base",
"text-gray-800 dark:text-gray-100",
)}
>
On this page
</span>
</Disclosure.Button>
<Transition
show={open}
enter="transition ease-out duration-100"
enterFrom="transform opacity-0 scale-y-95"
enterTo="transform opacity-100 scale-y-100"
leave="transition ease-in duration-75"
leaveFrom="transform opacity-100 scale-y-100"
leaveTo="transform opacity-0 scale-y-95"
>
<Disclosure.Panel className="h-[328px] rounded-bl-lg rounded-br-lg overflow-auto bg-gray-0 dark:bg-gray-800">
<ul className="p-4">
{toc.map(({ id, value, level }) => {
const isActive = activeId === id;
return (
<a
key={id}
href={`#${id}`}
className={clsx(
"refine-toc-item",
level === 2 && "pl-4",
level === 3 && "pl-6",
level === 4 && "pl-8",
"py-2 pr-4",
"rounded-[18px]",
"transition-colors duration-200 ease-in-out",
"block",
"text-sm",
"leading-5",
"no-underline hover:no-underline",
{
"text-gray-800 dark:text-gray-300":
!isActive,
"text-refine-react-light-link dark:text-refine-react-dark-link":
isActive,
"bg-refine-blue-2-light dark:bg-refine-blue dark:bg-opacity-10":
isActive,
"hover:bg-gray-100 dark:hover:bg-gray-700":
!isActive,
"hover:text-gray-800 dark:hover:text-gray-300":
!isActive,
},
)}
dangerouslySetInnerHTML={{
__html: value,
}}
/>
);
})}
</ul>
</Disclosure.Panel>
</Transition>
</div>
)}
</Disclosure>
</div>
);
};