iGRPIGRP 3.0Documentation

Primitives e Custom

Os 56 blocos de base do Design System, alinhados com o shadcn/ui, e as 4 composições iGRP da camada Custom — quando usá-los e como acrescentar um componente.

Além dos componentes IGRP* da camada Horizon, o Design System exporta duas camadas: os Primitives, os blocos de base, e os Custom, composições próprias da plataforma. Todos saem da raiz do pacote:

'use client';

import { Button, Dialog, DialogContent, DialogTitle } from '@igrp/igrp-framework-react-design-system';
import { IGRPStatsCardMini } from '@igrp/igrp-framework-react-design-system';

Os Primitives são exportados com o nome do shadcn, sem prefixo nem sufixo: Button, Dialog, Table, Sheet… Os Horizon e os Custom usam o prefixo IGRP.

Secção em construção

Esta página dá a visão geral; o detalhe de cada componente será completado.

Primitive ou Horizon

PrimitivesHorizon
Para quêBlocos de base: estilo mínimo, máxima flexibilidadeComponentes opinativos para os padrões comuns do iGRP
Assenta emRadix UI e variantes CVANos Primitives (são wrappers)
PropsProps HTML/React + variantes (variant, size, asChild)Props iGRP (label, helperText, showIcon, iconName, loading…)
FormuláriosNenhuma ligaçãoLigados ao IGRPForm e ao react-hook-form
Usa quandoPrecisas de controlo total ou de uma composição própriaQueres formulários, botões com ícone/carregamento, campos com label…

Prefere sempre o Horizon

Desce para um Primitive só quando o componente Horizon é demasiado opinativo para o caso. O gerador do Studio emite componentes Horizon (e o IGRPStatusBanner da camada Custom), nunca Primitives.

// Primitive — um botão estilizado; tudo o resto é contigo
<Button variant="outline" size="sm">Guardar</Button>

// Horizon — ícone, estado de carregamento e atributos iGRP
<IGRPButton showIcon iconName="ArrowRight" loading={isSubmitting} loadingText="A guardar...">
  Guardar
</IGRPButton>

Catálogo dos Primitives

Cada linha é um ficheiro em src/components/primitives/. A coluna Exports lista o componente raiz; as partes (DialogTitle, TableRow…) seguem a nomenclatura do shadcn.

Formulário

ExportsPara quêHorizon equivalente
Form, FormField, FormItem, FormLabel, FormControl, FormMessage, useFormFieldContexto react-hook-form (sem submissão nem Zod)IGRPForm
Field, FieldLabel, FieldError, FieldSet…Estrutura de campo: label, descrição, erro, grupos—
InputCampo de textoIGRPInputText, IGRPInputNumber, IGRPInputPassword, IGRPInputUrl, IGRPInputSearch
InputGroup, InputGroupInput, InputGroupAddon…Campo com ícone, botão ou prefixoIGRPInputAddOn
InputOTP, InputOTPSlot…Código de uso único (OTP)—
TextareaTexto multilinhaIGRPTextarea
LabelLabel acessívelIGRPLabel
CheckboxCaixa de seleçãoIGRPCheckbox
RadioGroup, RadioGroupItemEscolha únicaIGRPRadioGroup
SwitchInterruptor on/offIGRPSwitch
Select, SelectTrigger, SelectItem…Lista de opçõesIGRPSelect
NativeSelect, NativeSelectOption<select> nativo estilizado—
SliderValor num intervalo—
CalendarCalendárioIGRPCalendarSingle, IGRPCalendarRange, IGRPCalendarMultiple
Toggle, ToggleGroupBotões de alternar—
ButtonBotãoIGRPButton
ButtonGroupGrupo de botões encostados—

Overlays

ExportsPara quêHorizon equivalente
Dialog, DialogContent, DialogTitle…Diálogo modal (DialogTitle obrigatório)IGRPModalDialog
AlertDialog…ConfirmaçãoIGRPAlertDialog
Sheet, SheetContent, SheetTitle…Painel lateral—
Drawer, DrawerContent, DrawerTitle…Painel inferior (bottom sheet)—
Popover, PopoverContent…Conteúdo flutuante ancorado—
HoverCard…Cartão ao passar o rato—
Tooltip, TooltipProvider…Dica curta—
DropdownMenu, DropdownMenuItem…Menu de açõesIGRPDropdownMenu
ContextMenu…Menu do botão direito—
Command, CommandDialog, CommandInput…Lista pesquisável, paleta de comandosIGRPCommand, IGRPCombobox
ExportsPara quêHorizon equivalente
NavigationMenu…Menu de navegaçãoIGRPMenuNavigation
Menubar, MenubarMenu…Barra de menusIGRPMenubar
Sidebar, SidebarMenu, SidebarProvider…Barra lateral da aplicação—
Breadcrumb, BreadcrumbList…Trilho de navegação—
Pagination…Paginação—
Tabs, TabsList, TabsTrigger, TabsContentSeparadoresIGRPTabs
Stepper, StepperItem…Passos numerados— (para processos, IGRPStepperProcess)

Dados e layout

ExportsPara quêHorizon equivalente
Table, TableRow, TableCell…Tabela HTML estilizadaIGRPDataTable
Card, CardHeader, CardContent…Superfície em cartãoIGRPCard, IGRPCardDetails, IGRPInfoCard, IGRPStatsCard
Item, ItemContent, ItemActions…Linha de lista com media e ações—
ChartContainer, ChartTooltip, ChartLegend…Base para gráficos RechartsIGRPAreaChart, IGRPLineChart, IGRPPieChart…
Accordion, AccordionItem…Secções colapsáveisIGRPAccordion
Collapsible…Um bloco que abre e fecha—
Carousel, CarouselItem…Carrossel—
ScrollAreaÁrea com scroll estilizado—
ResizablePanelGroup, ResizablePanel, ResizableHandlePainéis redimensionáveis—
SeparatorLinha divisóriaIGRPSeparator
AspectRatioProporção fixa—
Avatar, AvatarImage, AvatarFallbackAvatar (fallback obrigatório)IGRPAvatar
BadgeEtiquetaIGRPBadge
Kbd, KbdGroupTecla de atalho—

Feedback

ExportsPara quêHorizon equivalente
Alert, AlertTitle, AlertDescriptionMensagem em blocoIGRPAlert, IGRPBanner
Empty, EmptyTitle…Estado vazio—
ToasterToasts (com toast() do sonner)IGRPToaster / useIGRPToast
ProgressBarra de progresso—
SkeletonPlaceholder de carregamento—
SpinnerIndicador de carregamentoIGRPLoadingSpinner

Outros

ExportsPara quêHorizon equivalente
Cropper, CropperImage, CropperCropAreaRecorte de imagemIGRPImageCropper

Diferenças face ao shadcn

Estes Primitives divergem de propósito do shadcn — tem-nas em conta antes de copiar código do site do shadcn.

PrimitiveDiferença
ButtonTamanhos extra xs, icon-xs, icon-sm, icon-lg, além de sm, default, lg, icon
AccordionAccordionTrigger aceita iconName, showIcon e iconPlacement (o indicador pode ser escondido, trocado ou ir para o início); respeita prefers-reduced-motion
FormFormItem usa flex flex-col gap-2 em vez de grid; FormMessage tem role="alert" para os leitores de ecrã anunciarem os erros
PopoverPopoverContent aceita container, para abrir dentro de um Dialog ou Drawer sem partir o foco
RadioGroupRadioGroupItem tem variant (default, outline, soft) e size (sm, md, lg)

Componentes Custom

Composições iGRP sobre os Horizon e os Primitives, em src/components/custom/. As cores aceitam primary, secondary, success, warning, info, destructive e indigo; os estilos aceitam solid, soft e outline.

IGRPStatsCardMini

Cartão de indicador compacto: título, valor e ícone com contorno, numa só cor. Aceita as props de conteúdo do IGRPStatsCard, mas a aparência resume-se a variant.

PropTipoDescrição
titlestringTítulo
valuestring | numberValor em destaque
iconNamestringÍcone Lucide
variantcorCor do valor e do ícone (por defeito primary)
titleSize / valueSizetamanhoPor defeito sm / 2xl
onClick() => voidTorna o cartão clicável
<IGRPStatsCardMini title="Pedidos abertos" value={128} iconName="Inbox" variant="info" />

IGRPStatsCardTopBorderColored

Cartão de indicador com uma borda colorida no topo e o ícone à direita.

PropTipoDescrição
titlestringTítulo
valuestring | numberValor em destaque
iconNamestringÍcone Lucide
cardVariantcorCor da borda e do ícone
<IGRPStatsCardTopBorderColored title="Concluídos" value="94%" iconName="CircleCheck" cardVariant="success" />

IGRPStatusBanner

Gerado pelo Studio

Faixa de estado: um IGRPAlert com um ponto colorido e o texto, mais um IGRPBadge à direita.

PropTipoDescrição
textstringTexto do estado
color / variantcor / estiloCor e estilo da faixa (por defeito success / soft)
badgeTextstringTexto do badge
badgeColor / badgeVariantcor / estiloCor e estilo do badge (por defeito primary / outline)
<IGRPStatusBanner text="Pedido em análise" color="warning" badgeText="Em curso" badgeColor="warning" />

IGRPUserAvatar

Avatar de utilizador: mostra a imagem e, se não houver ou falhar, o conteúdo de fallback.

PropTipoDescrição
imagestring | nullURL da imagem
altstringTexto alternativo (por defeito Current User)
fallbackContentReactNodeObrigatório. Normalmente as iniciais
fallbackClassstringClasses do fallback
<IGRPUserAvatar image={user.avatarUrl} alt={user.name} fallbackContent="AS" />

Acrescentar um componente

Existe no shadcn? Primeiro um Primitive

Copia-o do shadcn para src/components/primitives/, comparando com o upstream (o fluxo --diff do CLI do shadcn, num diretório temporário).

Todas as aplicações vão querer o mesmo? Um wrapper Horizon

Se todas as aplicações precisam das mesmas labels, ícones, estado de carregamento ou ligação ao formulário, acrescenta um componente IGRP* em src/components/horizon/ por cima do Primitive.

É específico do domínio iGRP? Custom

Variantes de cartões de indicadores, avatares, faixas de estado e afins vão para src/components/custom/.

Cada Primitive guarda no comentário inicial a data da última sincronização com o shadcn (por exemplo /* shadcn: 2026-09-15 */; // shadcn: … também é aceite). Para saber se o upstream mudou desde então, a partir de packages/design-system/:

pnpm drift:shadcn          # node scripts/check-shadcn-drift.mjs
pnpm drift:shadcn:update   # novo baseline, depois de rever as mudanças

Se o upstream mudou algo de que divergimos de propósito, regista a diferença em COMPONENTS.md antes de atualizar o baseline.

Explorar no Storybook

O monorepo tem um Storybook com os componentes, no pacote packages/design-system-storybook:

cd shared/frontend/nextjs/packages/design-system-storybook
pnpm storybook   # http://localhost:6006
How is this guide?

Última atualização: