Pular para o conteúdo

Componentes

Área de trabalho

Paleta de comandos

Ações

↑↓ para mover · ↵ para escolher · Esc para fechar

Cada componente, com suas variantes, tamanhos e estados. Mude a aparência aqui e todas as amostras acompanham.

Tema

Densidade

Layout

Direção

Espelha o layout, a sombra dura e os ícones direcionais. O idioma define isto; altere aqui para ver qualquer direção em qualquer idioma.

Ações

Botão

Uma ação principal por tela. Ao carregar fica desabilitado e ocupado, e diz o que está fazendo.

Variantes

Padrão
Principal
Perigo
Fantasma

Tamanhos

Normal
Pequeno
Ícone
Ícone pequeno

Estados

Habilitado
Desabilitado
Carregando
Foco
Uso em Next.js
<button type="button" className="or-btn or-btn--primary">
  <Icon name="save" size={16} />
  Save changes
</button>
<button type="button" className="or-btn or-btn--icon or-btn--sm" aria-label="Notifications">
  <Icon name="bell" size={16} />
</button>
{/* Loading: disabled and busy, the label says what is happening. */}
<button type="button" className="or-btn or-btn--primary" disabled aria-busy="true">
  <Icon name="loader-circle" size={16} className="or-spin" />
  Saving…
</button>

Controle segmentado

Três ou quatro opções que valem na hora, lado a lado.

Estados

Selecionado
Foco
Uso em Next.js
<Seg
  label={t('settings.theme.label')}
  value={theme}
  options={THEMES.map((value) => ({ value, label: t(`settings.theme.${value}`) }))}
  onChange={setTheme}
/>

Menu

Uma lista de ações atrás de um botão. Esc ou um clique fora fecha.

Estados

Fechado
Aberto
Uso em Next.js
<Menu
  trigger={({ open, toggle }) => (
    <button type="button" className="or-btn or-btn--ghost" aria-haspopup="true" aria-expanded={open} onClick={toggle}>
      Account
    </button>
  )}
>
  <Link className="or-menu__item" href="/profile">Profile</Link>
  <div className="or-menu__sep" role="separator" />
  <button type="button" className="or-menu__item" onClick={signOut}>Sign out</button>
</Menu>

Chip de filtro

Abre os valores de uma coluna. O número diz quantos estão escolhidos.

Ver numa tela

Estados

Fechado
Com contagem
Aberto
Foco
Uso em Next.js
{/* A filter is a URL: each option is a link to the list with it toggled. */}
<FilterMenu path={path} query={query} keep={keep} field="status" label={t('table.status')} values={filterValues('orderStatus')} />

Status

Selo

Um status. O ponto é um segundo canal, então a cor nunca é o único sinal.

Tons

Em separação
Neutro
Pago
Sucesso
Pendente
Aviso
Reembolsado
Perigo
Enviado
Informação
Arquivado
Discreto
Uso em Next.js
<span className="or-badge or-badge--success">
  <span className="or-badge__dot" />
  Paid
</span>

Variação

Alta, queda ou nada para comparar. Nunca "+100%" a partir de zero.

Variantes

+12,4%
Alta
-3,1%
Queda
sem comparação
Sem comparação
Uso em Next.js
<span className="or-delta or-delta--up">
  <Icon name="trending-up" size={16} />
  +12.4%
</span>

Avatar

Iniciais sobre uma cor da paleta. A pessoa mantém o mesmo avatar em todos os temas.

Cores

MO
Creme
TR
Pôr do sol
ID
Mostarda
KM
Cacto
LV
Céu
SH
Rosa

Tamanhos

LV
Pequeno
LV
Normal
LV
Grande
Uso em Next.js
{/* Initials, never a photograph: a face is a licence problem and a request. */}
<span className="or-avatar or-avatar--sky or-avatar--lg">LV</span>

Etiqueta

Um valor escolhido que pode ser removido sozinho.

Estados

Presentes
Habilitado
Presentes
Foco
Uso em Next.js
<span className="or-tag">
  Gifts
  <button type="button" aria-label="Remove Gifts">
    <Icon name="x" size={16} />
  </button>
</span>

Retorno

Alerta

Uma mensagem que pertence à tela e fica até a situação mudar.

Tons

Os preços incluem IVA para clientes da UE.
Informação
Seu repasse de € 2.480,00 está a caminho.
Sucesso
Três produtos estão esgotados.
Aviso
Perigo
Uso em Next.js
<div className="or-alert or-alert--warning" role="status">
  <Icon name="triangle-alert" size={18} />
  <div>Three products are out of stock.</div>
</div>

Aviso flutuante

O resultado de algo que a pessoa acabou de fazer. Some sozinho.

Tons

Exportação iniciada. Fica pronta em um minuto.
Informação
Salvo
Sucesso
Nada foi salvo.
Perigo
Uso em Next.js
// Server actions answer in place: the island shows the result inline
// rather than in a toast, so it is still there after a redirect.
<p className="or-alert or-alert--success" role="status">{t('form.saved')}</p>

Esqueleto

A forma do que está carregando, para ler a página antes de os números chegarem.

Variantes

Texto
Valor
Bloco
Uso em Next.js
<Skeleton variant="value" />
<Skeleton width="40%" />

Estado vazio

Diz por que não há nada aqui e oferece a saída.

Ver numa tela

Variantes

Nada corresponde a esses filtros

Tente outra busca ou limpe os filtros para ver tudo de novo.

Com uma ação
Uso em Next.js
<EmptyState icon="search" title={t('table.noResults')} body={t('table.noResultsBody')}>
  <button type="button" className="or-btn" onClick={table.clearFilters}>{t('table.clearFilters')}</button>
</EmptyState>

Barra do formulário

O que não foi salvo e as duas coisas a fazer, fixa no rodapé do formulário.

Ver numa tela

Estados

Salvo

Salvo

Alterações não salvas

Não salvo

2 campos precisam de atenção

Erro

Alterações não salvas

Carregando
Uso em Next.js
<FormBar
  dirty={form.dirty}
  saving={save.isPending}
  errors={form.errorCount}
  onSave={() => form.submit(() => save.mutate())}
  onDiscard={form.discard}
/>

Diálogo de confirmação

Fica entre a pessoa e a perda do trabalho. Esc é a resposta segura.

Variantes

Alterações não salvas

Sair desta tela agora faz com que elas se percam.

Confirmação
Uso em Next.js
<ConfirmDialog
  open={guard.pending !== null}
  title={t('form.unsaved')}
  body={t('form.unsavedBody')}
  confirmLabel={t('form.leave')}
  onConfirm={guard.leave}
  onCancel={guard.stay}
/>

Campos

Campo de texto

Um rótulo, o controle e um erro ou dica para os quais o controle aponta.

Ver numa tela

Estados

Habilitado
Vazio

Aparece nas faturas e nos e-mails.

Com uma dica

Obrigatório

Erro
Desabilitado
Foco

Tamanhos

Normal
Pequeno
Busca
Uso em Next.js
<Field label={t('settings.general.organisation')} error={form.errors.organisation}>
  {({ id, describedBy, invalid }) => (
    <TextInput
      id={id}
      describedBy={describedBy}
      invalid={invalid}
      field="organisation"
      value={form.values.organisation}
      onChange={(value) => form.set('organisation', value)}
      onBlur={() => form.blur('organisation')}
    />
  )}
</Field>

Seleção

Um valor de uma lista curta e fixa.

Estados

Habilitado

Esse valor não é permitido

Erro
Desabilitado
Foco

Tamanhos

Normal
Pequeno
Uso em Next.js
<Field label={t('table.status')} error={form.errors.status}>
  {({ id, describedBy, invalid }) => (
    <SelectInput id={id} describedBy={describedBy} invalid={invalid} field="status" value={form.values.status} options={STATUS_OPTIONS} onChange={(value) => form.set('status', value)} />
  )}
</Field>

Área de texto

Várias linhas de texto simples.

Ver numa tela

Estados

Habilitado

Obrigatório

Erro
Desabilitado
Foco
Uso em Next.js
<textarea className="or-textarea" rows="4" id="bio" aria-describedby="bio-hint"></textarea>
<p className="or-hint" id="bio-hint">280 characters left</p>

Caixa de seleção

Três estados, porque a caixa do cabeçalho precisa dizer "parte desta página".

Ver numa tela

Estados

Desmarcado
Marcado
Parcial
Desabilitado
Foco
Uso em Next.js
{/* Selection is client state; the rows around it are server-rendered. */}
<HeaderCheck label={t('table.selectPage')} />
<RowCheck id={order.id} label={t('table.selectRow', { label: order.number })} />

Interruptor

Um sim ou não que vale quando o formulário é salvo.

Ver numa tela

Estados

Desligado
Ligado

Uma vez por dia, antes das 9h.

Com uma dica
Desabilitado
Foco
Uso em Next.js
<SwitchField
  field="productUpdates"
  label={t('settings.notifications.productUpdates')}
  checked={form.values.productUpdates}
  onChange={(value) => form.set('productUpdates', value)}
/>

Autocompletar

Vários valores de uma lista longa, encontrados digitando.

Ver numa tela

Estados

Vazio
PresentesCasa
Preenchido
Casa
Aberto
Erro
Casa
Foco
Uso em Next.js
<Combobox
  id={id}
  describedBy={describedBy}
  field="tags"
  invalid={invalid}
  values={form.values.tags}
  options={options('tag')}
  onChange={(values) => form.set('tags', values)}
/>

Seletor de data

Digitada como AAAA-MM-DD ou escolhida numa grade que as setas percorrem.

Ver numa tela

Estados

Fechado
fevereiro de 2026
seg.ter.qua.qui.sex.sáb.dom.
Aberto

Obrigatório

Erro
Foco
Uso em Next.js
<DateField
  id={id}
  describedBy={describedBy}
  field="publishAt"
  value={form.values.publishAt}
  today={TODAY}
  onChange={(value) => form.set('publishAt', value)}
/>

Envio de arquivos

Uma área de soltar com um campo de arquivo real dentro, então funciona pelo teclado.

Ver numa tela

Estados

Solte as imagens aqui

PNG ou JPG, até 2 MB cada, no máximo 6

Vazio

Solte as imagens aqui

PNG ou JPG, até 2 MB cada, no máximo 6

Arrastando por cima

Solte as imagens aqui

PNG ou JPG, até 2 MB cada, no máximo 6

  • lamp-front.jpg412 kB
  • lamp-detail.png1280 kB
Preenchido
Uso em Next.js
<FileField
  id={id}
  describedBy={describedBy}
  field="images"
  files={form.values.images}
  onChange={(files) => form.set('images', files)}
  onReject={(failure) => push(t(failure.key, failure.values), 'danger')}
/>

Texto formatado

Negrito, itálico, listas e links. O texto colado chega limpo.

Ver numa tela

Estados

Diretora de Operações. Comanda o armazém de Lisboa e responde aos e-mails difíceis.

Preenchido
Vazio

Diretora de Operações. Comanda o armazém de Lisboa e responde aos e-mails difíceis.

Foco
Uso em Next.js
<RichText
  id={id}
  describedBy={describedBy}
  label={t('product.descriptionIn', { language: t(`language.${locale}`) })}
  value={form.values.description[locale]}
  onChange={(html) => form.set(`description.${locale}`, html)}
/>

Código de uso único

Seis caixas que se comportam como um campo: digitar avança, colar preenche todas.

Ver numa tela

Estados

Código de verificação
Vazio
Código de verificação
Preenchido
Código de verificação
Erro
Uso em Next.js
<CodeInput code={code} legend={t('auth.verify.legend')} error={form.errors.code} onChange={setCode} />

Força da senha

Um conselho, nunca uma barreira. Só o comprimento pode recusar uma senha.

Ver numa tela

Variantes

Curta demais
Curta demais
Fraca
Fraca
Razoável
Razoável
Boa
Boa
Forte
Forte
Uso em Next.js
<StrengthMeter password={form.values.password} />

Navegação

Abas

Partes de uma tela. A aba fica na URL e as setas percorrem a fileira.

Ver numa tela

Estados

Selecionado
Foco
Uso em Next.js
<div className="or-tabs" role="tablist" aria-label={t('settings.title')} onKeyDown={onKeyDown}>
  {SETTINGS_TABS.map((name) => (
    <Link key={name} className="or-tabs__tab" role="tab" href={`/settings?tab=${name}`}
      aria-selected={name === tab} tabIndex={name === tab ? 0 : -1}>
      {t(`settings.tabs.${name}`)}
    </Link>
  ))}
</div>

Paginação

Onde a pessoa está numa lista longa, e as linhas por página.

Ver numa tela

Estados

Mostrando 1–25 de 287
Primeira página
Mostrando 126–150 de 287
Uma página do meio
Mostrando 276–287 de 287
Última página
Uso em Next.js
{/* Links rather than buttons: every page is a URL the server renders. */}
<Link className="or-pager__page" href={hrefFor(path, query, { page: page + 1 }, keep)} aria-label={t('table.nextPage')}>
  <Icon name="chevron-right" size={16} />
</Link>

Barra de ações em lote

Aparece com a primeira linha selecionada, no fluxo e não por cima da tabela.

Ver numa tela

Variantes

3 selecionados
Com uma seleção
Uso em Next.js
{/* The selection is client state; the action is a server action. */}
<BulkBar>
  <BulkActions />
</BulkBar>

Exibição de dados

Cartão

O contêiner de um assunto, com cabeçalho opcional.

Variantes

Pedidos recentes

Um cartão contém um único assunto: uma lista, um gráfico, uma seção de formulário.

Com margem interna

Pedidos recentes

PedidoClienteStatus
#10482Maya OkaforPago€ 184,50
#10481Tomás ReyesPendente€ 62,00
#10480Ines DuarteReembolsado€ 129,90
Sem margem interna
Uso em Next.js
<section className="or-card">
  <div className="or-card__head">
    <h3>Recent orders</h3>
    <a className="or-btn or-btn--ghost or-btn--sm" href="orders.html">View all</a>
  </div>
  <div className="or-card__body">…</div>
  {/* or-card__body--flush when the body is a table that runs to the edges */}
</section>

Indicador

Um número, o que ele mede e como mudou.

Ver numa tela

Estados

Receita€ 48.290,00+12,4%
Preenchido
Receita
Carregando
Uso em Next.js
<div className="or-card">
  <div className="or-stat">
    <span className="or-stat__label">Revenue</span>
    <span className="or-stat__value">€48,290.00</span>
    <span className="or-stat__foot"><span className="or-delta or-delta--up">+12.4%</span></span>
  </div>
</div>

Tabela

Cabeçalhos ordenáveis, linhas selecionáveis e números alinhados na casa decimal.

Ver numa tela

Estados

PedidoClienteStatus
#10482Maya OkaforPago€ 184,50
#10481Tomás ReyesPendente€ 62,00
#10480Ines DuarteReembolsado€ 129,90
Habilitado
PedidoClienteStatus
#10482Maya OkaforPago€ 184,50
#10481Tomás ReyesPendente€ 62,00
#10480Ines DuarteReembolsado€ 129,90
Selecionado
Uso em Next.js
{/* Sorting is a link to the same list, sorted: the server renders it. */}
<th scope="col" aria-sort={sort} className="or-num">
  <Link className="or-table__sort" href={hrefFor(path, nextSort(query, 'totalCents'), {}, keep)}>
    {t('table.total')}
    <Icon name={ARROW[sort]} size={16} />
  </Link>
</th>

Linha do tempo

O que uma conta fez, do mais recente ao mais antigo, como lista ordenada.

Ver numa tela

Variantes

  1. Fez o pedido #1048218 de fev. de 2026, 10:24
  2. Abriu a newsletter de primavera11 de fev. de 2026, 16:02
  3. Criou uma conta3 de nov. de 2025, 09:15
Histórico
Uso em Next.js
<ol className="or-timeline">
  <li className="or-timeline__item">
    <span className="or-timeline__mark" aria-hidden="true">
      <Icon name="shopping-cart" size={16} />
    </span>
    <div className="or-timeline__body">
      <span>Placed order #10482</span>
      <span className="or-timeline__when">18 Feb 2026, 10:24</span>
    </div>
  </li>
</ol>

Lista de descrição

Pares de rótulo e valor, ligados na marcação e não só no layout.

Ver numa tela

Variantes

País
Portugal
Gasto total
€ 2.489,00
Rótulo e valor
Uso em Next.js
<dl className="or-facts">
  <div className="or-facts__row">
    <dt>Email</dt>
    <dd><a href="mailto:maya@example.com">maya@example.com</a></dd>
  </div>
</dl>