Português
GitHub
Tema

UI desktop para Java

Aplicações desktop em Java, desenhadas do zero.

O Limn desenha os próprios pixels. Widgets, layout, texto, gráficos, mídia e um viewport 3D, em uma dependência, sem Swing, sem JavaFX e sem toolkit nativo por baixo.

JDK 17 · Windows, macOS, Linux · Apache-2.0

Feito às claras com o Claude Code: o Claude escreveu, pessoas dirigiram e verificaram. O que custou para construir já está pago, então você não precisa pagar de novo. Como o Limn é feito

A aplicação de demonstração, renderizada pelo Limn durante este build.
A aplicação de demonstração, renderizada pelo Limn durante este build.
A aplicação de demonstração, renderizada pelo Limn durante este build.

Teste agora

A vitrine e o editor de temas, direto do Maven Central. Nada para clonar; o jbang baixa uma JDK se você não tiver nenhuma. O JBang resolve a versão mais nova uma vez e a guarda: acrescente --fresh para pegar uma mais nova.

# a vitrine
jbang demo@limn-toolkit/limn-toolkit
# o editor de temas
jbang theme-editor@limn-toolkit/limn-toolkit
# a vitrine
jbang --java-options=-XstartOnFirstThread demo@limn-toolkit/limn-toolkit
# o editor de temas
jbang --java-options=-XstartOnFirstThread theme-editor@limn-toolkit/limn-toolkit

Cinco minutos

Uma dependência e um método main

Sem linguagem de marcação, sem processador de anotações, sem plugin de build. Adicione o backend, que traz o toolkit junto, escreva Java puro e você tem uma janela.

Ler o guia de instalação
build.gradle.kts
dependencies {
    implementation("io.github.limn-toolkit:limn-backend-lwjgl:1.0.0")
}
pom.xml
<dependency>
  <groupId>io.github.limn-toolkit</groupId>
  <artifactId>limn-backend-lwjgl</artifactId>
  <version>1.0.0</version>
</dependency>
Main.java
import limn.backend.Backend;
import limn.backend.NativeWindow;
import limn.backend.WindowConfig;
import limn.backend.lwjgl.LwjglBackend;
import limn.components.Button;
import limn.components.Label;
import limn.scene.Insets;
import limn.scene.Scene;
import limn.scene.layout.Column;
import limn.scene.layout.Padding;

/** A window with a label and a button that closes it. */
public final class HelloWindow {

    public static void main(String[] args) {
        // macOS needs -XstartOnFirstThread on the JVM command line; it is macOS-only and a
        // JVM elsewhere given it will not start.
        try (Backend backend = new LwjglBackend()) {
            NativeWindow window = backend.createWindow(
                    WindowConfig.of("Hello, Limn", 480, 320));

            Column column = new Column();
            column.gap(12);
            column.add(new Label("A window, drawn by Limn."));
            column.add(new Button("Close").onAction(window::requestClose));

            Scene scene = new Scene(new Padding(Insets.all(24), column));
            scene.bind(window);

            backend.runEventLoop();
        }
    }
}

O que você ganha

Um conjunto de componentes que você não precisa construir

Botões, campos, listas, tabelas, árvores, seletores de data, abas, menus, diálogos, cartões, painéis divididos, um seletor de cor, gráficos de barra, linha e rosca, e uma lista virtualizada em que um milhão de linhas custa o mesmo que vinte. Cada um deles lê a cor, a forma e a densidade do tema, então nada fica fixo no código e um modo compacto é uma linha. Fora das suas janelas, a aplicação imprime em papel ou em PDF, mantém um ícone na bandeja, põe seus menus na barra de menus do macOS e troca conteúdo com outros programas arrastando e soltando.

Ver todos
Button
Button
ComboBox
ComboBox
Slider
Slider
SegmentedControl
SegmentedControl
Checkbox and switch
Checkbox and switch
Spinner
Spinner

Um layout que cabe na cabeça

Seis widgets e um marcador: uma coluna empilha, uma linha distribui, um wrap continua embaixo quando a largura acaba, uma grade alinha as células nos dois sentidos, uma pilha sobrepõe, o padding recua e o Expanded diz quem fica com o espaço que sobrou. Opacity e Transform esmaecem, deslocam, ampliam e giram uma parte da janela sem mexer no layout em volta. Não há solver de restrições para configurar nem layout manager para instalar.

Ler o guia de layout
Uma janela diagramada com o Limn
Uma janela diagramada com o Limn
Uma janela feita de uma coluna, uma linha, um split e um Expanded.

Formulários sem framework

Um campo é um widget, uma regra de validação é um listener e submeter é uma chamada de método. Nada para vincular, nada para registrar, e estados de validação que recolorem o campo no instante em que o usuário corrige.

Ler o guia de formulários
Um formulário feito com o Limn
Um formulário feito com o Limn
Rótulos, validação, uma escolha e a linha de ações.

Tabelas, árvores e datas, já prontas

Uma tabela é colunas tipadas sobre a lista que a sua aplicação possui, ordenada pelo toolkit ou pelo seu servidor, com um rodapé que soma. Uma árvore é uma estrutura em tópicos sobre os filhos que você fornece, e uma linha pode prometer filhos antes de conseguir nomeá-los. Um campo de data digita uma data ISO no calendário do próprio leitor, e um seletor de data abre uma grade de mês atrás dele.

Ler o guia de listas
Uma tabela, uma árvore e dois widgets de data numa janela do Limn
Uma tabela, uma árvore e dois widgets de data numa janela do Limn
Uma tabela, uma árvore, um campo de data e um seletor de data em uma janela.

Vídeo e 3D também são widgets

Um viewport 3D com materiais fisicamente corretos e um player de vídeo, compostos como widgets comuns: uma scroll view os recorta, uma pilha desenha por cima e ambos participam do layout como um rótulo participa.

Ler o guia de mídia
O viewport 3D do Limn
O viewport 3D do Limn
O viewport 3D, composto em uma janela comum.

Para todo mundo

Todas as línguas, e todos os leitores de tela

Nos idiomas dos seus usuários

Latino, grego, cirílico e CJK se misturam numa mesma string, e uma fonte é escolhida para cada trecho de uma mesma escrita. Árabe, hebraico, devanágari e tailandês são renderizados com a forma correta — letras ligadas, ligaturas, diacríticos — e um idioma da direita para a esquerda espelha a janela inteira: linhas, margens, barras de rolagem, setas. Os métodos de entrada compõem dentro do campo, e a edição avança por grafema.

Leia o guia de texto
A mesma tela capturada em japonês, chinês simplificado, coreano e russo, costurada em uma única janela.
A mesma tela capturada em japonês, chinês simplificado, coreano e russo, costurada em uma única janela.
A mesma tela, capturada em quatro idiomas durante este build.

Lido em voz alta, nessas mesmas línguas

Um leitor de tela no Windows, o VoiceOver no macOS e o Orca no Linux leem uma janela Limn pela API de acessibilidade de cada plataforma, sem código de plataforma na sua aplicação. Cada controle se descreve com seu papel, seu nome e seu estado, no idioma em que a interface está. Nomear um controle é uma chamada.

Leia o guia de acessibilidade
  1. heading“Create your account”
  2. label“Full name”
  3. text field“Full name”label · focusable, editable, required
  4. label“12 / 40”
  5. label“Email”
  6. text field“Email”label · focusable, editable, invalid, required
  7. label“Enter an address like ada@example.com”
  8. label“Password”
  9. password field“Password”label · focusable, editable, password
  10. label“At least 12 characters”
  11. label“Plan”
  12. combo box“Plan”label · focusable, expandable, has-popup
  13. switch“Email me release notes”focusable, checked
  14. separatorhorizontal
O formulário acima, como um leitor de tela o ouve, capturado durante este build.

Sua identidade, não a do toolkit

Sua aplicação deve parecer com o seu produto, não com a biblioteca em que foi feita. Um tema é dado puro (cada cor, o raio dos cantos, o passo de tamanho que todo controle herda), e uma chamada troca tudo em tempo de execução. Carregue a tipografia da sua marca de um arquivo seu, e nada da aparência do toolkit sobrevive.

Como funciona a temização
A mesma tela densa de controles renderizada sete vezes lado a lado, cada faixa em uma paleta, um passo de tamanho e uma tipografia diferentes.

Os mesmos componentes, sete temas

Passe o mouse sobre uma coluna para ver aquele tema na tela inteira.Toque numa coluna para ver aquele tema; deslize para o lado para trocar.

Uma tela, sete temas. O código por trás de cada faixa é idêntico.

Às claras

Como o Limn é feito

O código do Limn é escrito pelo Claude, o modelo da Anthropic, no Claude Code, e dirigido e verificado por pessoas. Dizemos isso logo de cara porque você ia querer saber.

Dirigido quer dizer que cada decisão de design é um registro escrito em docs/adr, discutido e aceito antes do código. Verificado quer dizer que toda mudança roda contra uma suíte de testes maior que o próprio código; que a acessibilidade foi ouvida, não presumida, com um leitor de tela no Windows, o VoiceOver no macOS e o Orca no Linux lendo janelas reais; e que o código passou por auditorias repetidas de correção, desempenho e design de API.

Chegar até aqui levou milhares de chamadas ao modelo e milhões de tokens gerados. Pelo modelo de estimativa COCOMO II, as mais de cem mil linhas de código, sem contar os testes, equivalem ao trabalho de uma equipe de cerca de vinte pessoas por mais de dois anos. Esse trabalho está feito. Você pode construir em cima dele em vez de refazê-lo.

Leia os registros de design

Uma janela na tela em cinco minutos

O guia de instalação termina com um programa rodando. Tudo depois disso é o guia, a galeria de componentes e a referência da API.