Skip to content

ranui

Uma biblioteca de UI construída sobre custom elements nativos. Cada componente é uma tag <r-*>, então funciona igual no React, no Vue, no Svelte, no Solid, no Astro ou num arquivo HTML puro. Não há adaptador nem versão de framework para casar. Tipos TypeScript, tema claro e escuro por design tokens, encapsulamento com Shadow DOM e renderização no servidor já vêm incluídos.

Build Statusnpm-vnpm-dbrotlimodule formats: umd, esm

Instalação

bash
npm install ranui
html
<!-- ou de uma CDN, sem etapa de build -->
<script src="https://unpkg.com/ranui/dist/umd/index.umd.cjs"></script>

Como usar

Importar registra os elementos; depois disso você escreve tags.

js
import 'ranui'; // todos os componentes
import 'ranui/button'; // ou apenas um
html
<r-button type="primary">Publicar projeto</r-button>

É a mesma tag em todos os frameworks: o que muda é como cada um passa valores e liga eventos, algo que as diretrizes de código cobrem por inteiro:

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>;
// Valores complexos e listeners passam por um ref — veja as diretrizes de código.
vue
<template>
  <r-button type="primary" @click="deploy">Deploy</r-button>
</template>

<script setup>
import 'ranui';
</script>
<!-- Acrescente `r-` a compilerOptions.isCustomElement na configuração de build. -->
js
import 'ranui';

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

Pontos de entrada

Cada entrada registra exatamente o que o nome diz, então uma página que só quer temas nunca paga pela biblioteca de componentes.

ImportContém
ranuiTodos os componentes
ranui/<component>Um componente: ranui/button, ranui/select, …
ranui/themeTema claro/escuro e sobrescrita de tokens; sem elementos
ranui/i18nO motor de tradução; sem elementos
ranui/fontsGeist Sans + Geist Mono auto-hospedadas
ranui/styleA folha de estilos, se a sua configuração não a pegar sozinha
ranui/builderO construtor de DOM fluente com reatividade de granulação fina
ranui/ssr, ranui/ssr-streamRenderização no servidor
ranui/testingAuxiliares para alcançar um shadow root fechado a partir de um teste
ranui/typingsTipos ambientais de elementos para JSX / TS

Componentes

40 elementos. Todos eles, com seus atributos, propriedades, eventos, slots e nomes de ::part(), estão na referência da API de elementos.

Comuns: Button · Icon · Loading

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

Apresentação de dados: Card · Section · Tabs · Image · Progress · Radar · Player · Preview · Glass · Scratch · StateDot · DisclosureRow

Renderização de conteúdo: Markdown · Math · Mermaid

IA e chat: Conversation · Reasoning · ToolCard · TokenMeter

Camadas e avisos: Modal · Popover · Dropdown · Message · Skeleton

Navegação: Router · Route · Link

Fundamentos: Temas · ThemeSwitch · i18n

Cinco elementos não têm página própria porque só existem dentro de outro: <r-option> (Select), <r-tabs> (Tabs), <r-img> (Image), <r-dropdown-item> (Dropdown) e <r-content> (Popover). Eles estão na referência da API como todo o resto.

Ao vivo

PrimaryWarningTextDefault

Estilos

Os componentes são desenhados num shadow root fechado: o CSS da página não entra e os seletores não alcançam para dentro. Há quatro caminhos, em ordem de preferência.

1. Design tokens (propriedades personalizadas de CSS): eles são herdados através da fronteira, então defini-los no :root, num contêiner ou no próprio 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 ajustes estruturais que os tokens não cobrem · 3. o atributo sheet para injetar CSS no shadow root · 4. conteúdo em slots, que fica no seu documento e recebe o CSS da sua página.

Os nomes dos tokens são o design system; as regras para escolher entre eles são as diretrizes de design; a mecânica está nas diretrizes de código.

Eventos

Os componentes despacham CustomEvent com a carga em detail. Ligue o listener no elemento: se um evento borbulha é uma decisão por componente, e a referência da API informa isso para cada um:

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

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

A forma de atributo onchange="…" e a de propriedade el.onchange = … também funcionam, já que estes são elementos do DOM comuns, mas aceitam apenas um manipulador e não têm fase de captura, então addEventListener é o caminho a seguir.

Para onde ir em seguida

Se você quiser…Leia
Consultar a API exata de um elementoAPI de elementos
Saber qual token usar, e por quêDesign system
Montar uma tela que pareça um sistema sóDiretrizes de design
Integrar o ranui a um aplicativo corretamenteDiretrizes de código
Acrescentar claro/escuro, ou reestilizar tudoTemas
Traduzir a interfacei18n
Renderizar num servidorRenderização no servidor
Montar views reativas sem frameworkBuilder
Ver o que mudou antes de atualizarRegistro de alterações

Suporte a navegadores

A biblioteca funciona em todos os navegadores modernos: ela é construída sobre Custom Elements v1, Shadow DOM v1 e propriedades personalizadas de CSS. O Internet Explorer não é suportado.

Contribuidores

Leitura adicional

Padrões sobre os quais esta biblioteca se apoia: W3C · ECMA · RFCs · Can I use

Referências de design que vale manter à mão: Checklist Design · Laws of UX · Geist · Ant Design · Element UI · Animista · WebGradients

Publicado sob a licença MIT.