Saltar al contenido

Componentes

Espacio de trabajo

Paleta de comandos

Acciones

↑↓ para mover · ↵ para elegir · Esc para cerrar

Cada componente, con sus variantes, tamaños y estados. Cambia la apariencia aquí y todas las muestras la siguen.

Tema

Densidad

Diseño

Dirección

Refleja el diseño, la sombra dura y los iconos direccionales. El idioma lo establece; cámbialo aquí para ver cualquier dirección en cualquier idioma.

Acciones

Botón

Una acción principal por pantalla. Al cargar queda deshabilitado y ocupado, y dice qué está haciendo.

Variantes

Predeterminado
Principal
Peligro
Fantasma

Tamaños

Normal
Pequeño
Icono
Icono pequeño

Estados

Habilitado
Deshabilitado
Cargando
Foco
Uso en 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>

Control segmentado

Tres o cuatro opciones que se aplican al instante, una junto a otra.

Estados

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

Menú

Una lista de acciones detrás de un botón. Escape o un clic fuera lo cierran.

Estados

Cerrado
PerfilPreferencias
Abierto
Uso en 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 los valores de una columna. El número indica cuántos están elegidos.

Verlo en una pantalla

Estados

Cerrado
Con un recuento
Abierto
Foco
Uso en 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')} />

Estado

Insignia

Un estado. El punto es un segundo canal, así que el color nunca es la única señal.

Tonos

Preparando
Neutro
Pagado
Éxito
Pendiente
Advertencia
Reembolsado
Peligro
Enviado
Información
Archivado
Atenuado
Uso en Next.js
<span className="or-badge or-badge--success">
  <span className="or-badge__dot" />
  Paid
</span>

Variación

Sube, baja o no hay con qué comparar. Nunca "+100 %" desde cero.

Variantes

+12,4 %
Sube
-3,1 %
Baja
sin comparación
Sin comparación
Uso en Next.js
<span className="or-delta or-delta--up">
  <Icon name="trending-up" size={16} />
  +12.4%
</span>

Avatar

Iniciales sobre un color de la paleta. Una persona conserva su avatar en todos los temas.

Colores

MO
Crema
TR
Atardecer
ID
Mostaza
KM
Cactus
LV
Cielo
SH
Rosa

Tamaños

LV
Pequeño
LV
Normal
LV
Grande
Uso en 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

Un valor elegido que se puede quitar por separado.

Estados

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

Respuesta

Alerta

Un mensaje que pertenece a la pantalla y se queda hasta que la situación cambia.

Tonos

Los precios incluyen IVA para clientes de la UE.
Información
Tu pago de 2480,00 € está en camino.
Éxito
Tres productos están agotados.
Advertencia
Peligro
Uso en 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 emergente

El resultado de algo que el lector acaba de hacer. Se va solo.

Tonos

Exportación iniciada. Estará lista en un minuto.
Información
Guardado
Éxito
No se guardó nada.
Peligro
Uso en 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

La forma de lo que se está cargando, para leer la página antes de que lleguen los números.

Variantes

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

Estado vacío

Explica por qué no hay nada y ofrece la salida.

Verlo en una pantalla

Variantes

Nada coincide con esos filtros

Prueba otra búsqueda o quita los filtros para verlo todo de nuevo.

Con una acción
Uso en 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 del formulario

Lo que está sin guardar y las dos cosas que puedes hacer, fija al pie del formulario.

Verlo en una pantalla

Estados

Guardado

Guardado

Cambios sin guardar

Sin guardar

2 campos necesitan atención

Error

Cambios sin guardar

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

Diálogo de confirmación

Se interpone entre el lector y la pérdida de su trabajo. Escape es la respuesta segura.

Variantes

Cambios sin guardar

Si sales ahora de esta pantalla, se pierden.

Confirmación
Uso en 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

Una etiqueta, el control y un error o una pista a los que apunta el control.

Verlo en una pantalla

Estados

Habilitado
Vacío

Aparece en las facturas y en los correos.

Con una pista

Obligatorio

Error
Deshabilitado
Foco

Tamaños

Normal
Pequeño
Búsqueda
Uso en 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>

Selector

Un valor de una lista corta y fija.

Estados

Habilitado

Ese valor no está permitido

Error
Deshabilitado
Foco

Tamaños

Normal
Pequeño
Uso en 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

Varias líneas de texto sin formato.

Verlo en una pantalla

Estados

Habilitado

Obligatorio

Error
Deshabilitado
Foco
Uso en 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>

Casilla

Tres estados, porque la casilla de cabecera tiene que decir "parte de esta página".

Verlo en una pantalla

Estados

Sin marcar
Marcado
Parcial
Deshabilitado
Foco
Uso en 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

Un sí o no que se aplica al guardar el formulario.

Verlo en una pantalla

Estados

Desactivado
Activado

Una vez al día, antes de las 9.

Con una pista
Deshabilitado
Foco
Uso en Next.js
<SwitchField
  field="productUpdates"
  label={t('settings.notifications.productUpdates')}
  checked={form.values.productUpdates}
  onChange={(value) => form.set('productUpdates', value)}
/>

Autocompletar

Varios valores de una lista larga, encontrados escribiendo.

Verlo en una pantalla

Estados

Vacío
RegalosHogar
Completo
Hogar
Abierto
Error
Hogar
Foco
Uso en Next.js
<Combobox
  id={id}
  describedBy={describedBy}
  field="tags"
  invalid={invalid}
  values={form.values.tags}
  options={options('tag')}
  onChange={(values) => form.set('tags', values)}
/>

Selector de fecha

Se escribe como AAAA-MM-DD o se elige en una cuadrícula que recorren las flechas.

Verlo en una pantalla

Estados

Cerrado
febrero de 2026
lunmarmiéjueviesábdom
Abierto

Obligatorio

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

Subida de archivos

Una zona para soltar con un campo de archivo real dentro, así funciona con teclado.

Verlo en una pantalla

Estados

Suelta las imágenes aquí

PNG o JPG, hasta 2 MB cada uno, 6 como máximo

Vacío

Suelta las imágenes aquí

PNG o JPG, hasta 2 MB cada uno, 6 como máximo

Arrastrando encima

Suelta las imágenes aquí

PNG o JPG, hasta 2 MB cada uno, 6 como máximo

  • lamp-front.jpg412 kB
  • lamp-detail.png1280 kB
Completo
Uso en 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 enriquecido

Negrita, cursiva, listas y enlaces. El texto pegado llega limpio.

Verlo en una pantalla

Estados

Directora de Operaciones. Dirige el almacén de Lisboa y responde los correos difíciles.

Completo
Vacío

Directora de Operaciones. Dirige el almacén de Lisboa y responde los correos difíciles.

Foco
Uso en 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 un solo uso

Seis casillas que se comportan como un campo: escribir avanza, pegar las llena todas.

Verlo en una pantalla

Estados

Código de verificación
Vacío
Código de verificación
Completo
Código de verificación
Error
Uso en Next.js
<CodeInput code={code} legend={t('auth.verify.legend')} error={form.errors.code} onChange={setCode} />

Seguridad de la contraseña

Un consejo, nunca una barrera. Solo la longitud puede rechazar una contraseña.

Verlo en una pantalla

Variantes

Demasiado corta
Demasiado corta
Débil
Débil
Aceptable
Aceptable
Buena
Buena
Fuerte
Fuerte
Uso en Next.js
<StrengthMeter password={form.values.password} />

Navegación

Pestañas

Partes de una pantalla. La pestaña está en la URL y las flechas recorren la fila.

Verlo en una pantalla

Estados

Seleccionado
Foco
Uso en 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>

Paginación

Dónde está el lector en una lista larga, y las filas por página.

Verlo en una pantalla

Estados

Mostrando 1–25 de 287
Primera página
Mostrando 126–150 de 287
Una página intermedia
Mostrando 276–287 de 287
Última página
Uso en 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 acciones en lote

Aparece con la primera fila seleccionada, dentro del flujo y no encima de la tabla.

Verlo en una pantalla

Variantes

3 seleccionados
Con una selección
Uso en Next.js
{/* The selection is client state; the action is a server action. */}
<BulkBar>
  <BulkActions />
</BulkBar>

Visualización de datos

Tarjeta

El contenedor de un tema, con cabecera opcional.

Variantes

Pedidos recientes

Una tarjeta contiene un solo tema: una lista, un gráfico, una sección de formulario.

Con relleno

Pedidos recientes

PedidoClienteEstado
#10482Maya OkaforPagado184,50 €
#10481Tomás ReyesPendiente62,00 €
#10480Ines DuarteReembolsado129,90 €
Sin relleno
Uso en 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

Una cifra, lo que mide y cómo ha cambiado.

Verlo en una pantalla

Estados

Ingresos48.290,00 €+12,4 %
Completo
Ingresos
Cargando
Uso en 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>

Tabla

Cabeceras ordenables, filas seleccionables y números alineados en el decimal.

Verlo en una pantalla

Estados

PedidoClienteEstado
#10482Maya OkaforPagado184,50 €
#10481Tomás ReyesPendiente62,00 €
#10480Ines DuarteReembolsado129,90 €
Habilitado
PedidoClienteEstado
#10482Maya OkaforPagado184,50 €
#10481Tomás ReyesPendiente62,00 €
#10480Ines DuarteReembolsado129,90 €
Seleccionado
Uso en 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>

Cronología

Lo que hizo una cuenta, lo más reciente primero, como lista ordenada.

Verlo en una pantalla

Variantes

  1. Hizo el pedido #1048218 feb 2026, 10:24
  2. Abrió el boletín de primavera11 feb 2026, 16:02
  3. Creó una cuenta3 nov 2025, 9:15
Historial
Uso en 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 descripción

Pares de etiqueta y valor, unidos en el marcado y no solo en el diseño.

Verlo en una pantalla

Variantes

País
Portugal
Gasto total
2489,00 €
Etiqueta y valor
Uso en 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>