ivt
Version:
Ivt Components Library
1 lines • 14.2 kB
Source Map (JSON)
{"version":3,"file":"StepNavigator-DXnlZUw2.mjs","sources":["../../src/components/default/layout/LayoutActions.tsx","../../src/components/default/base/GenericHeadingMenubar.tsx","../../src/components/default/base/Header.tsx","../../src/components/default/base/StepNavigator.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface LayoutActionsProps {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n}\n\nexport function LayoutActions({ children, className }: LayoutActionsProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"mt-4 mb-6 flex flex-wrap items-center justify-between gap-4 px-4\", className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n\tMenubar,\n\tMenubarContent,\n\tMenubarItem,\n\tMenubarMenu,\n\tMenubarTrigger,\n} from \"@/components/ui/menubar\";\nimport { LayoutActions } from \"../layout\";\n\nfunction cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n\nexport type MenuItemConfig = {\n\tvalue: string;\n\tlabel: string;\n\tpath?: string;\n\tonClick?: () => void;\n\tsubItems?: { label: string; onClick: () => void }[];\n\t/** Função customizada para determinar se o item está ativo */\n\tisActive?: (pathname: string) => boolean;\n};\n\nexport interface GenericHeadingMenubarProps {\n\t/** Configuração dos itens do menu */\n\tmenuItems: MenuItemConfig[];\n\t/** Classes CSS adicionais para o container */\n\tclassName?: string;\n\t/** Classes CSS adicionais para o Menubar */\n\tclassNameMenubar?: string;\n\t/** Classes CSS adicionais para o Trigger */\n\tclassNameTrigger?: string;\n\t/** Classes CSS adicionais para o Content (dropdown) */\n\tclassNameContent?: string;\n\t/** Classes CSS adicionais para os Itens do dropdown */\n\tclassNameItem?: string;\n\t/** Conteúdo adicional a ser renderizado ao lado do menu */\n\tchildren?: React.ReactNode;\n\t/** Desabilita todos os itens do menu */\n\tdisabled?: boolean;\n\t/** Função customizada para determinar se um item está ativo (fallback) */\n\tdefaultIsActive?: (menuValue: string, pathname: string) => boolean;\n\t/** Caminho atual da rota (para highlight do ativo). Compatível com Next.js e React Router. */\n\tcurrentPath?: string;\n\t/** Função executada ao solicitar navegação (ex: router.push ou navigate). */\n\tonNavigate?: (path: string) => void;\n}\n\n/**\n * Componente genérico de menubar para navegação entre páginas.\n * Ajustado para ser agnóstico de framework (Next.js ou React puro).\n *\n * @example\n * ```tsx\n * // Exemplo com Next.js\n * const router = useRouter();\n * const pathname = usePathname();\n *\n * <GenericHeadingMenubar\n * menuItems={menuItems}\n * currentPath={pathname}\n * onNavigate={(path) => router.push(path)}\n * />\n * ```\n */\nexport const GenericHeadingMenubar: React.FC<GenericHeadingMenubarProps> = ({\n\tmenuItems,\n\tclassName,\n\tclassNameMenubar,\n\tclassNameTrigger,\n\tclassNameContent,\n\tclassNameItem,\n\tchildren,\n\tdisabled,\n\tdefaultIsActive,\n\tcurrentPath = \"\",\n\tonNavigate,\n}) => {\n\t/**\n\t * Determina se um item do menu está ativo\n\t */\n\tconst isMenuItemActive = (menu: MenuItemConfig): boolean => {\n\t\t// Se o item tem uma função customizada, usa ela\n\t\tif (menu.isActive) {\n\t\t\treturn menu.isActive(currentPath);\n\t\t}\n\n\t\t// Se foi passada uma função padrão, usa ela\n\t\tif (defaultIsActive) {\n\t\t\treturn defaultIsActive(menu.value, currentPath);\n\t\t}\n\n\t\t// Fallback: compara o pathname com o path do menu\n\t\treturn menu.path ? currentPath === menu.path : false;\n\t};\n\n\t/**\n\t * Handler padrão de clique (navega para o path)\n\t */\n\tconst handleMenuClick = (menu: MenuItemConfig) => {\n\t\tif (menu.onClick) {\n\t\t\tmenu.onClick();\n\t\t\treturn;\n\t\t}\n\n\t\t// Se tem sub-itens, não navega automaticamente ao clicar no trigger\n\t\tif (menu.subItems && menu.subItems.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (onNavigate && menu.path) {\n\t\t\tonNavigate(menu.path);\n\t\t}\n\t};\n\n\treturn (\n\t\t<LayoutActions className={className}>\n\t\t\t{menuItems && menuItems.length > 0 && (\n\t\t\t\t<Menubar className={classNameMenubar}>\n\t\t\t\t\t{menuItems.map((menu) => (\n\t\t\t\t\t\t<MenubarMenu key={menu.value}>\n\t\t\t\t\t\t\t<MenubarTrigger\n\t\t\t\t\t\t\t\tonClick={() => handleMenuClick(menu)}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex items-center gap-1 disabled:opacity-50 aria-disabled:opacity-50\",\n\t\t\t\t\t\t\t\t\tisMenuItemActive(menu) && \"bg-accent text-accent-foreground\",\n\t\t\t\t\t\t\t\t\tclassNameTrigger,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\taria-disabled={disabled}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{menu.label}\n\t\t\t\t\t\t\t</MenubarTrigger>\n\n\t\t\t\t\t\t\t{menu.subItems && (\n\t\t\t\t\t\t\t\t<MenubarContent className={classNameContent}>\n\t\t\t\t\t\t\t\t\t{menu.subItems.map((item) => (\n\t\t\t\t\t\t\t\t\t\t<MenubarItem key={item.label} onClick={item.onClick} className={classNameItem}>\n\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t</MenubarItem>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</MenubarContent>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</MenubarMenu>\n\t\t\t\t\t))}\n\t\t\t\t</Menubar>\n\t\t\t)}\n\t\t\t{children}\n\t\t</LayoutActions>\n\t);\n};\n","\"use client\";\n\nimport React from \"react\";\nimport {\n\tAccordion,\n\tAccordionContent,\n\tAccordionItem,\n\tAccordionTrigger,\n} from \"@/components/ui/accordion\";\nimport { cn } from \"@/lib/utils\";\n\ninterface HeaderProps {\n\ttitle: string;\n\tdescription: string;\n\tclassName?: string;\n\tclassNameDescription?: string;\n\tchildren?: React.ReactNode;\n\tdefaultValue?: string;\n\tdefaultOpen?: boolean;\n\tmenu?: React.ReactNode;\n}\n\nexport const Header: React.FC<HeaderProps> = ({\n\ttitle,\n\tdescription,\n\tclassName,\n\tclassNameDescription,\n\tchildren,\n\tdefaultValue = \"item-1\",\n\tdefaultOpen = false,\n\tmenu,\n}) => {\n\tconst [value, setValue] = React.useState<string>(defaultOpen ? defaultValue : \"\");\n\n\tconst isOpen = value === defaultValue;\n\n\treturn (\n\t\t<header className={cn(\"text-content-high max-w-5xl px-4 py-1 text-xl\", className)}>\n\t\t\t<Accordion\n\t\t\t\ttype=\"single\"\n\t\t\t\tcollapsible\n\t\t\t\tclassName=\"w-full\"\n\t\t\t\tvalue={value}\n\t\t\t\tonValueChange={setValue}\n\t\t\t>\n\t\t\t\t<AccordionItem className=\"border-b-0\" value={defaultValue}>\n\t\t\t\t\t<AccordionTrigger\n\t\t\t\t\t\ticonPosition=\"left\"\n\t\t\t\t\t\tclassName=\"justify-start gap-2 py-2 text-xl font-bold\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t<AccordionContent className=\"text-content-medium text-base\">\n\t\t\t\t\t\t<p className={cn(\"text-content-medium text-base\", classNameDescription)}>\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t{isOpen && menu && <div className=\"my-4 text-foreground\">{menu}</div>}\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</AccordionContent>\n\t\t\t\t</AccordionItem>\n\t\t\t</Accordion>\n\t\t\t{!isOpen && menu && <div className=\"my-4\">{menu}</div>}\n\t\t</header>\n\t);\n};\n","\"use client\";\n\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\nimport React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface StepNavigatorProps {\n\t/** Índice atual do passo */\n\tcurrentIndex: number;\n\t/** Total de passos */\n\ttotalSteps: number;\n\t/** Ação ao clicar em \"Anterior\" */\n\tonPrev: () => void;\n\t/** Ação ao clicar em \"Próximo\" */\n\tonNext: () => void;\n\t/** Desabilita os botões (ex: loading) */\n\tdisabled?: boolean;\n\t/** Personalização opcional dos rótulos */\n\tprevLabel?: string;\n\tnextLabel?: string;\n\t/** Controla se deve ocultar os botões ao chegar nas extremidades */\n\thideEdgeButtons?: boolean;\n\tclassName?: string;\n}\n\nexport const StepNavigator: React.FC<StepNavigatorProps> = ({\n\tcurrentIndex,\n\ttotalSteps,\n\tonPrev,\n\tonNext,\n\tdisabled = false,\n\tprevLabel = \"Anterior\",\n\tnextLabel = \"Próximo\",\n\thideEdgeButtons = true,\n\tclassName,\n}) => {\n\tconst isFirst = currentIndex === 0;\n\tconst isLast = currentIndex === totalSteps - 1;\n\n\treturn (\n\t\t<div className={cn(\"flex items-center gap-2\", className)}>\n\t\t\t{(!hideEdgeButtons || !isFirst) && (\n\t\t\t\t<Button type=\"button\" variant=\"secondary\" onClick={onPrev} disabled={disabled || isFirst}>\n\t\t\t\t\t<ChevronLeftIcon className=\"size-4\" />\n\t\t\t\t\t{prevLabel}\n\t\t\t\t</Button>\n\t\t\t)}\n\n\t\t\t{(!hideEdgeButtons || !isLast) && (\n\t\t\t\t<Button type=\"button\" variant=\"secondary\" onClick={onNext} disabled={disabled || isLast}>\n\t\t\t\t\t{nextLabel}\n\t\t\t\t\t<ChevronRightIcon className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"names":["LayoutActions","children","className","React","div","cn","inputs","twMerge","clsx","GenericHeadingMenubar","menuItems","classNameMenubar","classNameTrigger","classNameContent","classNameItem","disabled","defaultIsActive","currentPath","onNavigate","isMenuItemActive","menu","isActive","value","path","handleMenuClick","onClick","subItems","length","Menubar","map","MenubarMenu","key","MenubarTrigger","aria-disabled","label","MenubarContent","item","MenubarItem","Header","title","description","classNameDescription","defaultValue","defaultOpen","setValue","useState","isOpen","header","Accordion","type","collapsible","onValueChange","AccordionItem","AccordionTrigger","iconPosition","AccordionContent","p","StepNavigator","currentIndex","totalSteps","onPrev","onNext","prevLabel","nextLabel","hideEdgeButtons","isFirst","isLast","Button","variant","ChevronLeftIcon","ChevronRightIcon"],"mappings":"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"}