Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Instale o @heroicons/react para usar o conjunto oficial de ícones do Tailwind Labs. Os Heroicons vêm em três variantes: Outline (24px, traço de 1,5px), Solid (24px, preenchido) e Mini (20px, preenchido).
npm install @heroicons/react// app/components/heroicon-demo.tsx
"use client";
import { MagnifyingGlassIcon, Cog6ToothIcon } from "@heroicons/react/24/outline";
import { HomeIcon, BellIcon } from "@heroicons/react/24/solid";
import { ChevronDownIcon } from "@heroicons/react/20/solid";
export function HeroiconDemo() {
return (
<div className="flex items-center gap-4">
<MagnifyingGlassIcon className="h-6 w-6 text-gray-500" />
<Cog6ToothIcon className="h-6 w-6 text-gray-500" />
<HomeIcon className="h-6 w-6 text-blue-600" />
<BellIcon className="h-6 w-6 text-yellow-500" />
<ChevronDownIcon className="h-5 w-5 text-gray-400" />
</div>
);
}Uma barra de navegação que usa ícones outline para estados padrão e ícones solid para a rota ativa:
// app/components/nav-bar.tsx
"use client";
import { usePathname } from "next/navigation";
import Link from "next/link";
import {
HomeIcon as HomeOutline,
MagnifyingGlassIcon as SearchOutline,
BellIcon as BellOutline,
UserIcon as UserOutline,
} from "@heroicons/react/24/outline";
import {
HomeIcon as HomeSolid,
MagnifyingGlassIcon as SearchSolid,
BellIcon as BellSolid,
UserIcon as UserSolid,
} from "@heroicons/react/24/solid";
interface NavLink {
href: string;
label: string;
outlineIcon: React.ElementType;
solidIcon: React.ElementType;
}
const navLinks: NavLink[] = [
{ href: "/", label: "Home", outlineIcon: HomeOutline, solidIcon: HomeSolid },
{ href: "/search", label: "Search", outlineIcon: SearchOutline, solidIcon: SearchSolid },
{ href: "/notifications", label: "Notifications", outlineIcon: BellOutline, solidIcon: BellSolid },
{ href: "/profile", label: "Profile", outlineIcon: UserOutline, solidIcon: UserSolid },
];
export function NavBar() {
const pathname = usePathname();
return (
<nav className="fixed bottom-0 left-0 right-0 border-t border-gray-200 bg-white">
<div className="mx-auto flex max-w-md items-center justify-around py-2">
{navLinks.map(({ href, label, outlineIcon: OutlineIcon, solidIcon: SolidIcon }) => {
const isActive = pathname === href;
const Icon = isActive ? SolidIcon : OutlineIcon;
return (
<Link
key={href}
href={href}
aria-label={label}
aria-current={isActive ? "page" : undefined}
className={`flex flex-col items-center gap-1 px-3 py-1 ${
isActive ? "text-blue-600" : "text-gray-500 hover:text-gray-700"
}`}
>
<Icon className="h-6 w-6" />
<span className="text-xs">{label}</span>
</Link>
);
})}
</div>
</nav>
);
}@heroicons/react/24/outline -- Ícones 24x24 com traços de 1,5px, ideais para navegação e barras de ferramentas.@heroicons/react/24/solid -- Ícones preenchidos 24x24, ótimos para estados ativos e ênfase.@heroicons/react/20/solid -- Ícones preenchidos 20x20 (Mini), projetados para uso em linha com texto, botões e elementos de formulário.size ou color. Você controla dimensões e cor inteiramente através de className (ex: h-6 w-6 text-blue-500).Quando usar cada variante:
| Variante | Caminho de Importação | Tamanho | Caso de Uso |
|---|---|---|---|
| Outline | 24/outline | 24x24 | Barras de navegação, barras de ferramentas, configurações |
| Solid | 24/solid | 24x24 | Estados ativos, ações primárias, ênfase |
| Mini | 20/solid | 20x20 | Em linha com texto, dentro de botões, campos de formulário |
Botão de ícone com texto:
import { PlusIcon } from "@heroicons/react/20/solid";
export function AddButton() {
return (
<button className="inline-flex items-center gap-1.5 rounded-md bg-blue-600 px-3 py-2 text-sm font-medium text-white hover:bg-blue-700">
<PlusIcon className="h-5 w-5" />
Add Item
</button>
);
}Ícone animado:
import { ArrowPathIcon } from "@heroicons/react/24/outline";
export function RefreshButton({ isLoading }: { isLoading: boolean }) {
return (
<button aria-label="Refresh" className="p-2">
<ArrowPathIcon
className={`h-5 w-5 text-gray-600 ${isLoading ? "animate-spin" : ""}`}
/>
</button>
);
}React.ForwardRefExoticComponent<React.SVGProps<SVGSVGElement>>.className, style e atributos ARIA.HeroIcon dedicado exportado. Use React.ComponentType<React.SVGProps<SVGSVGElement>> para tipar props de ícones.type HeroIcon = React.ComponentType<React.SVGProps<SVGSVGElement>>;
interface MenuItem {
icon: HeroIcon;
label: string;
}size ou color. Definir size={24} falhará silenciosamente. Use className="h-6 w-6" em vez disso.HomeIcon). Você deve criar um alias para um ao importar ambas as variantes no mesmo arquivo.h-4 w-4, mas esteja ciente de que o peso visual pode não ser otimizado para esse tamanho.currentColor, certifique-se de que o elemento pai tenha a cor de texto correta definida.| Abordagem | Prós | Contras |
|---|---|---|
| Heroicons | Integração perfeita com Tailwind, oficial do Tailwind Labs | Conjunto menor (cerca de 300 ícones) |
| Lucide React | Conjunto maior de ícones, props de tamanho e cor | Requer configuração adicional de props |
| React Icons (Hi2) | Acesso aos Heroicons junto com outras famílias | Pacote maior, dependência indireta |
| Phosphor Icons | Múltiplos pesos (thin, light, regular, bold, fill, duotone) | Não é do ecossistema Tailwind |
@heroicons/react/24/outline -- 24x24, traços de 1,5px, para navegação e barras de ferramentas.@heroicons/react/24/solid -- 24x24, preenchido, para estados ativos e ênfase.@heroicons/react/20/solid -- 20x20, preenchido, para uso em linha com texto e botões.size ou color.className="h-6 w-6 text-blue-500".className.className="h-6 w-6" em vez disso.import { HomeIcon as HomeOutline } from "@heroicons/react/24/outline";
import { HomeIcon as HomeSolid } from "@heroicons/react/24/solid";Você deve criar um alias para uma importação, pois ambas as variantes compartilham o mesmo nome de componente.
pathname atual (de usePathname()) com o href de cada link.aria-current="page" é definido no link ativo para acessibilidade.<ArrowPathIcon
className={`h-5 w-5 ${isLoading ? "animate-spin" : ""}`}
/>Como a estilização é inteiramente via className, as utilidades de animação do Tailwind funcionam diretamente.
type HeroIcon = React.ComponentType<React.SVGProps<SVGSVGElement>>;
interface MenuItem {
icon: HeroIcon;
label: string;
}Não há uma exportação de tipo HeroIcon dedicada do pacote.
currentColor para seu traço ou preenchimento.h-4 w-4, mas o peso visual pode não ser otimizado para esse tamanho.Revisado por Chris St. John·Última atualização: 7 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥