Skip to content

ranui

Una biblioteca de UI construida sobre custom elements nativos. Cada componente es una etiqueta <r-*>, así que funciona igual en React, Vue, Svelte, Solid, Astro o en un archivo HTML a secas. No hay adaptador ni versión de framework que hacer coincidir. Incluye tipos TypeScript, tema claro y oscuro mediante design tokens, encapsulación con Shadow DOM y renderizado en servidor.

Build Statusnpm-vnpm-dbrotlimodule formats: umd, esm

Instalación

bash
npm install ranui
html
<!-- o desde una CDN, sin paso de compilación -->
<script src="https://unpkg.com/ranui/dist/umd/index.umd.cjs"></script>

Cómo se usa

Importar registra los elementos; a partir de ahí escribes etiquetas.

js
import 'ranui'; // todos los componentes
import 'ranui/button'; // o solo uno
html
<r-button type="primary">Desplegar proyecto</r-button>

Es la misma etiqueta en todos los frameworks: lo que cambia es cómo cada uno pasa valores y enlaza eventos, algo que la guía de código cubre por completo:

html
<script src="https://unpkg.com/ranui/dist/umd/index.umd.cjs"></script>

<body>
  <r-button>Button</r-button>
</body>
jsx
import 'ranui';

export const App = () => <r-button type="primary">Deploy</r-button>;
// Los valores complejos y los listeners van por un ref — consulta la guía de código.
vue
<template>
  <r-button type="primary" @click="deploy">Deploy</r-button>
</template>

<script setup>
import 'ranui';
</script>
<!-- Añade `r-` a compilerOptions.isCustomElement en la configuración de build. -->
js
import 'ranui';

const button = document.createElement('r-button');
button.textContent = 'Deploy';
document.body.appendChild(button);

Puntos de entrada

Cada entrada registra exactamente lo que dice su nombre, así que una página que solo quiere temas nunca paga por la biblioteca de componentes.

ImportContiene
ranuiTodos los componentes
ranui/<component>Un componente: ranui/button, ranui/select, …
ranui/themeTema claro/oscuro y sobrescritura de tokens; sin elementos
ranui/i18nEl motor de traducción; sin elementos
ranui/fontsGeist Sans + Geist Mono autoalojadas
ranui/styleLa hoja de estilos, si tu configuración no la recoge sola
ranui/builderEl constructor de DOM fluido con reactividad de grano fino
ranui/ssr, ranui/ssr-streamRenderizado en servidor
ranui/testingAyudas para entrar en un shadow root cerrado desde una prueba
ranui/typingsTipos ambientales de elementos para JSX / TS

Componentes

40 elementos. Todos ellos, con sus atributos, propiedades, eventos, slots y nombres de ::part(), están en la referencia de la API de elementos.

Comunes: Button · Icon · Loading

Entrada de datos: Input · CheckBox · Select · ColorPicker · Attachments · VoiceButton · Forms

Presentación de datos: Card · Section · Tabs · Image · Progress · Radar · Player · Preview · Glass · Scratch · StateDot · DisclosureRow

Renderizado de contenido: Markdown · Math · Mermaid

IA y chat: Conversation · Reasoning · ToolCard · TokenMeter

Capas y avisos: Modal · Popover · Dropdown · Message · Skeleton

Navegación: Router · Route · Link

Fundamentos: Temas · ThemeSwitch · i18n

Cinco elementos no tienen página propia porque solo existen dentro de otro: <r-option> (Select), <r-tabs> (Tabs), <r-img> (Image), <r-dropdown-item> (Dropdown) y <r-content> (Popover). Están en la referencia de la API como todo lo demás.

En vivo

PrimaryWarningTextDefault

Estilos

Los componentes se dibujan en un shadow root cerrado: el CSS de la página no se cuela dentro y los selectores no alcanzan hacia adentro. Hay cuatro vías, por orden de preferencia.

1. Design tokens (propiedades personalizadas de CSS): se heredan a través del límite, así que definirlos en :root, en un contenedor o en el propio elemento funciona igual:

html
<r-progress
  percent="0.7"
  type="drag"
  style="--ran-progress-track-background: linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f)"
></r-progress>

2. ::part() para retoques estructurales que los tokens no cubren · 3. el atributo sheet para inyectar CSS en el shadow root · 4. contenido en slots, que se queda en tu documento y toma el CSS de tu página.

Los nombres de los tokens son el sistema de diseño; las reglas para elegir entre ellos son la guía de diseño; la mecánica está en la guía de código.

Eventos

Los componentes despachan CustomEvent con la carga en detail. Enlaza en el elemento: que un evento burbujee es una decisión por componente, y la referencia de la API lo indica para cada uno:

html
<r-select id="env"></r-select>

<script>
  document.getElementById('env').addEventListener('change', (event) => {
    console.log(event.detail.value);
  });
</script>

La forma de atributo onchange="…" y la de propiedad el.onchange = … también funcionan, ya que son elementos del DOM normales, pero solo admiten un manejador y no tienen fase de captura, así que addEventListener es la vía a la que recurrir.

Adónde ir después

Si quieres…Lee
Consultar la API exacta de un elementoAPI de elementos
Saber qué token usar, y por quéSistema de diseño
Construir una pantalla que parezca un solo sistemaGuía de diseño
Integrar ranui en una aplicación correctamenteGuía de código
Añadir claro/oscuro, o rehacer todo el estiloTemas
Traducir la interfazi18n
Renderizar en un servidorRenderizado en servidor
Construir vistas reactivas sin frameworkBuilder
Ver qué cambió antes de actualizarRegistro de cambios

Compatibilidad con navegadores

La biblioteca funciona en todos los navegadores modernos: está construida sobre Custom Elements v1, Shadow DOM v1 y propiedades personalizadas de CSS. Internet Explorer no está soportado.

Colaboradores

Para seguir leyendo

Estándares sobre los que se apoya esta biblioteca: W3C · ECMA · RFC · Can I use

Referencias de diseño que conviene tener a mano: Checklist Design · Laws of UX · Geist · Ant Design · Element UI · Animista · WebGradients

Publicado bajo la licencia MIT.