ivt
Version:
Ivt Components Library
137 lines (131 loc) • 6.21 kB
JavaScript
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