UNPKG

ivt

Version:

Ivt Components Library

137 lines (131 loc) 6.21 kB
import { c as cn$1, a as clsx } from './utils-BDcRwQMd.mjs'; import React__default from 'react'; import { t as twMerge } from './bundle-mjs-CXmmFvYo.mjs'; import { M as Menubar, b as MenubarMenu, c as MenubarTrigger, d as MenubarContent, h as MenubarItem } from './menubar-oWKK9_Ik.mjs'; import { A as Accordion, a as AccordionItem, b as AccordionTrigger, c as AccordionContent } from './accordion-BcAmhbBS.mjs'; import { C as ChevronLeft } from './chevron-left-Baq244Ce.mjs'; import { C as ChevronRight } from './chevron-right-Dq6zFe5E.mjs'; import { B as Button } from './button-CZpmCmNo.mjs'; function LayoutActions({ children, className }) { return /*#__PURE__*/ React__default.createElement("div", { className: cn$1("mt-4 mb-6 flex flex-wrap items-center justify-between gap-4 px-4", className) }, children); } function cn(...inputs) { return twMerge(clsx(inputs)); } /** * Componente genérico de menubar para navegação entre páginas. * Ajustado para ser agnóstico de framework (Next.js ou React puro). * * @example * ```tsx * // Exemplo com Next.js * const router = useRouter(); * const pathname = usePathname(); * * <GenericHeadingMenubar * menuItems={menuItems} * currentPath={pathname} * onNavigate={(path) => router.push(path)} * /> * ``` */ const GenericHeadingMenubar = ({ menuItems, className, classNameMenubar, classNameTrigger, classNameContent, classNameItem, children, disabled, defaultIsActive, currentPath = "", onNavigate })=>{ /** * Determina se um item do menu está ativo */ const isMenuItemActive = (menu)=>{ // Se o item tem uma função customizada, usa ela if (menu.isActive) { return menu.isActive(currentPath); } // Se foi passada uma função padrão, usa ela if (defaultIsActive) { return defaultIsActive(menu.value, currentPath); } // Fallback: compara o pathname com o path do menu return menu.path ? currentPath === menu.path : false; }; /** * Handler padrão de clique (navega para o path) */ const handleMenuClick = (menu)=>{ if (menu.onClick) { menu.onClick(); return; } // Se tem sub-itens, não navega automaticamente ao clicar no trigger if (menu.subItems && menu.subItems.length > 0) { return; } if (onNavigate && menu.path) { onNavigate(menu.path); } }; return /*#__PURE__*/ React__default.createElement(LayoutActions, { className: className }, menuItems && menuItems.length > 0 && /*#__PURE__*/ React__default.createElement(Menubar, { className: classNameMenubar }, menuItems.map((menu)=>/*#__PURE__*/ React__default.createElement(MenubarMenu, { key: menu.value }, /*#__PURE__*/ React__default.createElement(MenubarTrigger, { onClick: ()=>handleMenuClick(menu), className: cn("flex items-center gap-1 disabled:opacity-50 aria-disabled:opacity-50", isMenuItemActive(menu) && "bg-accent text-accent-foreground", classNameTrigger), disabled: disabled, "aria-disabled": disabled }, menu.label), menu.subItems && /*#__PURE__*/ React__default.createElement(MenubarContent, { className: classNameContent }, menu.subItems.map((item)=>/*#__PURE__*/ React__default.createElement(MenubarItem, { key: item.label, onClick: item.onClick, className: classNameItem }, item.label)))))), children); }; const Header = ({ title, description, className, classNameDescription, children, defaultValue = "item-1", defaultOpen = false, menu })=>{ const [value, setValue] = React__default.useState(defaultOpen ? defaultValue : ""); const isOpen = value === defaultValue; return /*#__PURE__*/ React__default.createElement("header", { className: cn$1("text-content-high max-w-5xl px-4 py-1 text-xl", className) }, /*#__PURE__*/ React__default.createElement(Accordion, { type: "single", collapsible: true, className: "w-full", value: value, onValueChange: setValue }, /*#__PURE__*/ React__default.createElement(AccordionItem, { className: "border-b-0", value: defaultValue }, /*#__PURE__*/ React__default.createElement(AccordionTrigger, { iconPosition: "left", className: "justify-start gap-2 py-2 text-xl font-bold" }, title), /*#__PURE__*/ React__default.createElement(AccordionContent, { className: "text-content-medium text-base" }, /*#__PURE__*/ React__default.createElement("p", { className: cn$1("text-content-medium text-base", classNameDescription) }, description), isOpen && menu && /*#__PURE__*/ React__default.createElement("div", { className: "my-4 text-foreground" }, menu), children))), !isOpen && menu && /*#__PURE__*/ React__default.createElement("div", { className: "my-4" }, menu)); }; const StepNavigator = ({ currentIndex, totalSteps, onPrev, onNext, disabled = false, prevLabel = "Anterior", nextLabel = "Próximo", hideEdgeButtons = true, className })=>{ const isFirst = currentIndex === 0; const isLast = currentIndex === totalSteps - 1; return /*#__PURE__*/ React__default.createElement("div", { className: cn$1("flex items-center gap-2", className) }, (!hideEdgeButtons || !isFirst) && /*#__PURE__*/ React__default.createElement(Button, { type: "button", variant: "secondary", onClick: onPrev, disabled: disabled || isFirst }, /*#__PURE__*/ React__default.createElement(ChevronLeft, { className: "size-4" }), prevLabel), (!hideEdgeButtons || !isLast) && /*#__PURE__*/ React__default.createElement(Button, { type: "button", variant: "secondary", onClick: onNext, disabled: disabled || isLast }, nextLabel, /*#__PURE__*/ React__default.createElement(ChevronRight, { className: "size-4" }))); }; export { GenericHeadingMenubar as G, Header as H, LayoutActions as L, StepNavigator as S }; //# sourceMappingURL=StepNavigator-DXnlZUw2.mjs.map