@vertisanpro/flowbite-react
Version:
Non-Official React components built for Flowbite and Tailwind CSS
27 lines (26 loc) • 2.32 kB
JavaScript
'use client';
import { HiChevronDown } from '@vertisanpro/react-icons/hi';
import { twMerge } from '@vertisanpro/tailwind-merge';
import { nanoid } from 'nanoid';
import React, { useEffect, useMemo, useState } from 'react';
import { mergeDeep } from '../../helpers/merge-deep';
import { Tooltip } from '../Tooltip';
import { useSidebarContext } from './SidebarContext';
import { SidebarItemContext } from './SidebarItemContext';
export const SidebarCollapse = ({ children, className, icon: Icon, label, chevronIcon: ChevronIcon = HiChevronDown, renderChevronIcon, open = false, theme: customTheme = {}, ...props }) => {
const id = useMemo(() => nanoid(), []);
const [isOpen, setOpen] = useState(open);
const { theme: rootTheme, isCollapsed } = useSidebarContext();
const theme = mergeDeep(rootTheme.collapse, customTheme);
useEffect(() => setOpen(open), [open]);
const Wrapper = ({ children }) => (React.createElement("li", null, isCollapsed && !isOpen ? (React.createElement(Tooltip, { content: label, placement: "right" }, children)) : (children)));
return (React.createElement(Wrapper, null,
React.createElement("button", { id: `flowbite-sidebar-collapse-${id}`, onClick: () => setOpen(!isOpen), title: label, type: "button", className: twMerge(theme.button, className), ...props },
Icon && (React.createElement(Icon, { "aria-hidden": true, "data-testid": "flowbite-sidebar-collapse-icon", className: twMerge(theme.icon.base, theme.icon.open[isOpen ? 'on' : 'off']) })),
isCollapsed ? (React.createElement("span", { className: "sr-only" }, label)) : (React.createElement(React.Fragment, null,
React.createElement("span", { "data-testid": "flowbite-sidebar-collapse-label", className: theme.label.base }, label),
renderChevronIcon ? (renderChevronIcon(theme, isOpen)) : (React.createElement(ChevronIcon, { "aria-hidden": true, className: twMerge(theme.label.icon.base, theme.label.icon.open[isOpen ? 'on' : 'off']) }))))),
React.createElement("ul", { "aria-labelledby": `flowbite-sidebar-collapse-${id}`, hidden: !isOpen, className: theme.list },
React.createElement(SidebarItemContext.Provider, { value: { isInsideCollapse: true } }, children))));
};
SidebarCollapse.displayName = 'Sidebar.Collapse';