{"_id":"@designliquido/delegua-interface-grafica","_rev":"3-c477be989d2ab09446b9bab645e09010","name":"@designliquido/delegua-interface-grafica","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"name":"@designliquido/delegua-interface-grafica","version":"0.0.0","keywords":["delegua","interface","gui","janela"],"author":{"name":"Leonel Sanches da Silva"},"license":"MIT","_id":"@designliquido/delegua-interface-grafica@0.0.0","maintainers":[{"name":"leonelsanches","email":"leonel@designliquido.com.br"},{"name":"vitbrandao96","email":"vitorsbsilva@gmail.com"}],"homepage":"https://github.com/DesignLiquido/delegua-interface-grafica#readme","bugs":{"url":"https://github.com/DesignLiquido/delegua-interface-grafica/issues"},"dist":{"shasum":"2e42ec01b6c13dbac59a8ab9500872514bb9967e","tarball":"https://registry.npmjs.org/@designliquido/delegua-interface-grafica/-/delegua-interface-grafica-0.0.0.tgz","fileCount":19,"integrity":"sha512-yarFih+uk1wDU80k7eEoS2gFLPW9tg1D0NDD/zo3vHMjugCMhgSyUGJUnIks4h+FZJrkXuXQTMgO+dmvsOTrIQ==","signatures":[{"sig":"MEUCICVj0155/Q1/2SIV3UqZVzVjgdKXuUKSA1WYdjHTOH1WAiEAkKfAFbIQ4HXdXSLDanqkAJdDnzggb9gwjy+ZyMKTQ6g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52030},"main":"index.js","types":"index.d.ts","gitHead":"89b9aa5153f1f0342ead4179142b5224b5c6d72b","scripts":{"lint":"yarn eslint . --ext .ts --fix","empacotar":"yarn rimraf ./dist && tsc && yarn copyfiles -V ./README.md ./dist && yarn copyfiles -V ./LICENSE ./dist","publicar-npm":"npm publish --access public","testes-unitarios":"yarn jest --coverage"},"_npmUser":{"name":"leonelsanches","email":"leonel@designliquido.com.br"},"repository":{"url":"git+https://github.com/DesignLiquido/delegua-interface-grafica.git","type":"git"},"_npmVersion":"11.6.2","description":"Biblioteca de interface gráfica para Delégua","directories":{},"_nodeVersion":"22.20.0","dependencies":{"@designliquido/delegua":">=1.15.1"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","rimraf":"^6.0.1","ts-jest":"^29.3.0","ts-node":"^10.9.2","copyfiles":"^2.4.1","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.14.0"},"_npmOperationalInternal":{"tmp":"tmp/delegua-interface-grafica_0.0.0_1774137367063_0.1756800161951042","host":"s3://npm-registry-packages-npm-production"}},"0.0.1":{"name":"@designliquido/delegua-interface-grafica","version":"0.0.1","keywords":["delegua","interface","gui","janela"],"author":{"name":"Leonel Sanches da Silva"},"license":"MIT","_id":"@designliquido/delegua-interface-grafica@0.0.1","maintainers":[{"name":"leonelsanches","email":"leonel@designliquido.com.br"},{"name":"vitbrandao96","email":"vitorsbsilva@gmail.com"}],"homepage":"https://github.com/DesignLiquido/delegua-interface-grafica#readme","bugs":{"url":"https://github.com/DesignLiquido/delegua-interface-grafica/issues"},"dist":{"shasum":"ac52a6e540e6ff8aab878f04709970c91ab4a337","tarball":"https://registry.npmjs.org/@designliquido/delegua-interface-grafica/-/delegua-interface-grafica-0.0.1.tgz","fileCount":75,"integrity":"sha512-mxJIyyoPu+Uow9+YzUiztFRL7Lcn+FqGtQbyMBHt+Kk8lWLTvTmrl/AI1e1a76dr1l38HRa4vRYaKZMpxhWFsA==","signatures":[{"sig":"MEUCIQC3p7SKPozhXUPwVpLiMkfPldzVR6PQ0HPxQ1jmdcMnrQIgJWHMFtHBG18BUHGP1y11BfbNK5f5/Yyc1UcUZZeqsgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169699},"main":"index.js","types":"index.d.ts","gitHead":"c456593e63902bdb8dce7a6f91d953465abc08cc","scripts":{"lint":"yarn eslint . --ext .ts --fix","empacotar":"yarn rimraf ./dist && tsc && yarn copyfiles -V ./README.md ./dist && yarn copyfiles -V ./LICENSE ./dist && yarn copyfiles -V ./package.json ./dist","publicar-npm":"npm publish --access public","host-gtk:build":"cargo build --release --manifest-path host-gtk/Cargo.toml","testes-e2e-gtk":"node scripts/rodar-teste-e2e-gtk.js","testes-unitarios":"yarn jest --coverage","testes-e2e-windows":"node scripts/rodar-teste-e2e-windows.js","host-java-swing:jar":"gradle -p host-java-swing fatJar","host-windows:publish":"dotnet publish host-windows/DeleguaInterfaceGraficaWindowsHost.csproj -c Release -r win-x64 --self-contained false -o host-windows/publish","testes-e2e-java-swing":"node scripts/rodar-teste-e2e-java-swing.js"},"_npmUser":{"name":"leonelsanches","email":"leonel@designliquido.com.br"},"repository":{"url":"git+https://github.com/DesignLiquido/delegua-interface-grafica.git","type":"git"},"_npmVersion":"11.6.2","description":"Biblioteca de interface gráfica para Delégua","directories":{},"_nodeVersion":"22.20.0","publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","rimraf":"^6.0.1","ts-jest":"^29.3.0","ts-node":"^10.9.2","copyfiles":"^2.4.1","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.14.0"},"peerDependencies":{"@designliquido/delegua":">=1.15.1"},"_npmOperationalInternal":{"tmp":"tmp/delegua-interface-grafica_0.0.1_1774153763821_0.5001433530616346","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@designliquido/delegua-interface-grafica","version":"0.1.0","description":"Biblioteca de interface gráfica para Delégua","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/DesignLiquido/delegua-interface-grafica.git"},"scripts":{"empacotar":"yarn rimraf ./dist && tsc && yarn copyfiles -V ./README.md ./dist && yarn copyfiles -V ./LICENSE ./dist && yarn copyfiles -V ./package.json ./dist","publicar-npm":"npm publish --access public","testes-unitarios":"yarn jest --coverage","host-java-swing:jar":"gradle -p host-java-swing fatJar","testes-e2e-java-swing":"node scripts/rodar-teste-e2e-java-swing.js","host-gtk:build":"cargo build --release --manifest-path host-gtk/Cargo.toml","testes-e2e-gtk":"node scripts/rodar-teste-e2e-gtk.js","host-macos:build":"swift build --package-path host-macos -c release","host-windows:publish":"dotnet publish host-windows/DeleguaInterfaceGraficaWindowsHost.csproj -c Release -r win-x64 --self-contained false -o host-windows/publish","testes-e2e-windows":"node scripts/rodar-teste-e2e-windows.js","lint":"yarn eslint . --ext .ts --fix"},"keywords":["delegua","interface","gui","janela"],"author":{"name":"Leonel Sanches da Silva"},"license":"MIT","publishConfig":{"registry":"https://registry.npmjs.org/"},"peerDependencies":{"@designliquido/delegua":">=1.15.1"},"devDependencies":{"@designliquido/delegua":"^1.16.0","@types/jest":"^29.5.14","@types/node":"^25.5.2","copyfiles":"^2.4.1","jest":"^29.7.0","rimraf":"^6.0.1","ts-jest":"^29.3.0","ts-node":"^10.9.2","typescript":"^5.8.3"},"gitHead":"c22dbb5f7d5efdff2bdcc9e5e3c4ed22fa3a4d9f","_id":"@designliquido/delegua-interface-grafica@0.1.0","bugs":{"url":"https://github.com/DesignLiquido/delegua-interface-grafica/issues"},"homepage":"https://github.com/DesignLiquido/delegua-interface-grafica#readme","_nodeVersion":"22.20.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-AFtLTjLv/Ts4yT6YO5L/1pbgryw7Bnkg9psyJyU/cyd5qTpQK/paP4W3GIU/2wycY7Hn8EXJwux8vDssf1O8dg==","shasum":"c52b3b1f31b049fcb4fabc0a8a24c6b33c27ac74","tarball":"https://registry.npmjs.org/@designliquido/delegua-interface-grafica/-/delegua-interface-grafica-0.1.0.tgz","fileCount":83,"unpackedSize":207016,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGQm/kbHkxnYn+oL8Yb7db2Wg2RlBzbt5ZXr9QieO23IAiEAsoGZIPzeJnSYZLeYB7im7jrggr29d3ikh9rd4pOK/G8="}]},"_npmUser":{"name":"leonelsanches","email":"leonel@designliquido.com.br"},"directories":{},"maintainers":[{"name":"leonelsanches","email":"leonel@designliquido.com.br"},{"name":"vitbrandao96","email":"vitorsbsilva@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/delegua-interface-grafica_0.1.0_1775535940399_0.27653791681055084"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-21T23:56:06.939Z","modified":"2026-04-07T04:25:40.966Z","0.0.0":"2026-03-21T23:56:07.219Z","0.0.1":"2026-03-22T04:29:23.982Z","0.1.0":"2026-04-07T04:25:40.553Z"},"bugs":{"url":"https://github.com/DesignLiquido/delegua-interface-grafica/issues"},"author":{"name":"Leonel Sanches da Silva"},"license":"MIT","homepage":"https://github.com/DesignLiquido/delegua-interface-grafica#readme","keywords":["delegua","interface","gui","janela"],"repository":{"type":"git","url":"git+https://github.com/DesignLiquido/delegua-interface-grafica.git"},"description":"Biblioteca de interface gráfica para Delégua","maintainers":[{"name":"leonelsanches","email":"leonel@designliquido.com.br"},{"name":"vitbrandao96","email":"vitorsbsilva@gmail.com"}],"readme":"# delegua-interface-grafica\n\nBiblioteca de interface gráfica para a linguagem [Delégua](https://github.com/DesignLiquido/delegua).\n\nPermite criar janelas, botões, rótulos, caixas de texto e contêineres de layout diretamente em código Delégua, com suporte a eventos como cliques e alterações de texto. Também oferece layout livre com coordenadas absolutas e dimensionamento explícito de componentes.\n\n## Instalação\n\n```bash\nnpm install @designliquido/delegua-interface-grafica\n```\n\n## Uso em código Delégua\n\n```delegua\nvar ig = importar(\"interfaceGrafica\")\n\nvar janela = ig.janela(800, 600, \"Meu Programa\")\nvar rotulo = ig.rotulo(janela, \"Digite seu nome:\")\nvar caixa  = ig.caixaTexto(janela, \"\")\nvar botao  = ig.botao(janela, \"Confirmar\")\n\nfuncao aoClicar() {\n    var nome = ig.obterTexto(caixa)\n    ig.definirTexto(rotulo, \"Olá, \" + nome + \"!\")\n}\n\nig.aoClicar(botao, aoClicar)\nig.iniciar()\n```\n\n## Layouts disponíveis\n\n- `caixaVertical(pai)` e `caixaHorizontal(pai)` mantêm o modelo de fluxo/empilhamento.\n- `caixaLivre(pai)` cria uma área de layout absoluto para posicionar componentes com `x` e `y`.\n- `definirPosicao(componente, x, y)` e `definirTamanho(componente, largura, altura)` usam pixels.\n\nExemplo com geometria:\n\n```delegua\nvar ig = importar(\"interfaceGrafica\")\n\nvar janela = ig.janela(800, 600, \"Layout Livre\")\nvar areaLivre = ig.caixaLivre(janela)\n\nvar caixa = ig.caixaTexto(areaLivre, \"\")\nvar botao = ig.botao(areaLivre, \"Confirmar\")\n\nig.definirPosicao(caixa, 24, 32)\nig.definirTamanho(caixa, 220, 32)\nig.definirPosicao(botao, 24, 80)\nig.definirTamanho(botao, 120, 36)\n\nig.iniciar()\n```\n\n## Métodos disponíveis\n\n| Método | Descrição |\n|--------|-----------|\n| `janela(largura, altura, titulo)` | Cria a janela principal do programa. |\n| `botao(pai, rotulo)` | Cria um botão dentro do componente pai. |\n| `rotulo(pai, texto)` | Cria um rótulo de texto dentro do componente pai. |\n| `caixaTexto(pai, textoInicial?)` | Cria uma caixa de texto editável. |\n| `caixaVertical(pai)` | Cria um contêiner com layout vertical (de cima para baixo). |\n| `caixaHorizontal(pai)` | Cria um contêiner com layout horizontal (da esquerda para direita). |\n| `caixaLivre(pai)` | Cria um contêiner com layout livre para posicionamento por coordenadas. |\n| `definirTexto(componente, texto)` | Altera o texto de um rótulo ou caixa de texto. |\n| `obterTexto(componente)` | Lê o texto atual de um rótulo ou caixa de texto. |\n| `definirPosicao(componente, x, y)` | Define a posição do componente em pixels. |\n| `definirTamanho(componente, largura, altura)` | Define largura e altura do componente em pixels. |\n| `aoClicar(componente, funcao)` | Registra uma função a ser chamada ao clicar no componente. |\n| `aoAlterar(componente, funcao)` | Registra uma função a ser chamada quando o texto do componente mudar. A função recebe o novo texto como argumento. |\n| `iniciar()` | Inicia o laço de eventos. Bloqueia até a janela ser fechada. |\n| `encerrar()` | Encerra a interface gráfica e fecha todas as janelas. |\n\n## Regras de geometria\n\n- Posicionamento absoluto é garantido para componentes cujo pai imediato seja uma `caixaLivre`.\n- `x`, `y`, `largura` e `altura` são interpretados em pixels.\n- Em backends nativos, tentativas de posicionar um componente em um contêiner de fluxo podem resultar em erro explícito do host.\n\n## Arquitetura\n\nA biblioteca é dividida em duas camadas:\n\n- **`InterfaceGrafica`** — classe exposta ao código Delégua. Recebe o interpretador automaticamente como primeiro argumento de cada método (comportamento padrão de `FuncaoPadrao`) e repassa callbacks simples para a infraestrutura.\n- **`InfraestruturaGraficaInterface`** — contrato que toda infraestrutura deve implementar. A infraestrutura não conhece o interpretador nem tipos internos de Delégua; apenas recebe e invoca callbacks nativos.\n\n### Infraestruturas disponíveis\n\n| Classe | Ambiente | Descrição |\n|--------|----------|-----------|\n| `InfraestruturaElectron` | Processo renderer do Electron | Cria elementos DOM diretamente no `document.body` da janela Electron. Selecionada automaticamente quando `document` está disponível. |\n| `InfraestruturaGtk` *(experimental)* | Node.js + host GTK externo | Encaminha comandos de UI para um processo externo GTK via JSON em stdin/stdout. Recomendado para ambientes Linux-first. Suporta `caixaLivre` e `definir-geometria` no protocolo. |\n| `InfraestruturaJavaSwing` *(experimental)* | Node.js + host Java externo | Encaminha comandos de UI para um processo externo Java Swing via JSON em stdin/stdout. Requer um host Swing compatível com o protocolo da biblioteca. Suporta `caixaLivre` e `definir-geometria`. |\n| `InfraestruturaWindows` *(experimental)* | Node.js + host Windows externo | Encaminha comandos de UI para um processo externo Windows (WPF/WinUI/WinForms) via JSON em stdin/stdout. Recomendado para ambientes Windows-first. Suporta `caixaLivre` e `definir-geometria`. |\n| `InfraestruturaVazia` | Qualquer (fallback) | Sem operações visuais; mantém estado de texto em memória. Usada em testes unitários e quando nenhuma outra infraestrutura se aplica. |\n| `InfraestruturaWebView` | Extensão VS Code | Renderiza a janela em um `WebviewPanel` do VS Code, comunicando-se via `postMessage`. Requer chamada prévia a `definirFabricaPainelWebView()` em `@designliquido/delegua-node`. Suporta `caixaLivre` e geometria explícita. |\n| `InfraestruturaMacOS` *(experimental)* | Node.js + host macOS externo | Encaminha comandos de UI para um processo externo AppKit/Cocoa via JSON em stdin/stdout. Suporta `caixaLivre` e `definir-geometria`. |\n| `InfraestruturaElectronSpawn` *(em `delegua-node`)* | Linha de comando (Node.js) | Spawna um processo Electron filho e comunica-se via stdin/stdout com o mesmo protocolo JSON de `InfraestruturaWebView`. Selecionada automaticamente quando o pacote `electron` está instalado. |\n\n### Como a infraestrutura é escolhida em `delegua-node`\n\nAo importar `interfaceGrafica` em um programa Delégua, `delegua-node` escolhe a infraestrutura na seguinte ordem de prioridade:\n\n1. **`InfraestruturaWebView`** — se a extensão VS Code tiver registrado uma fábrica de painel via `definirFabricaPainelWebView()` (veja abaixo).\n2. **`InfraestruturaElectron`** — se `document` estiver disponível (processo renderer do Electron).\n3. **`InfraestruturaElectronSpawn`** *(em `delegua-node`)* — se o pacote `electron` estiver instalado (local ou globalmente). Spawna um processo Electron filho e comunica-se via stdin/stdout.\n4. **`InfraestruturaVazia`** — fallback final; emite um aviso no console e não exibe nenhuma janela.\n\n### Executando programas com interface gráfica\n\n#### Linha de comando (Node.js puro)\n\nRodar um programa Delégua diretamente pelo terminal (`delegua meu-programa.delegua`) cai no **fallback `InfraestruturaVazia`**: o programa executa sem erros, mas nenhuma janela é exibida. Isso é esperado — Node.js não tem DOM.\n\n#### Dentro do VS Code (extensão Delégua)\n\nA extensão Delégua para VS Code pode exibir a janela em um painel nativo chamando `definirFabricaPainelWebView()` antes de executar o programa:\n\n```typescript\nimport { definirFabricaPainelWebView } from '@designliquido/delegua-node';\n\n// no método activate() da extensão:\ndefinirFabricaPainelWebView(() =>\n    vscode.window.createWebviewPanel(\n        'delegua-interface-grafica',\n        'Interface Gráfica – Delégua',\n        vscode.ViewColumn.One,\n        { enableScripts: true }\n    )\n);\n```\n\nCom isso, `ig.iniciar()` abre um painel dentro do próprio VS Code e todos os eventos (cliques, alterações de texto) funcionam normalmente.\n\n#### Processo renderer do Electron\n\nSe o programa Delégua for executado diretamente dentro de um processo renderer Electron (onde `document` está disponível), `InfraestruturaElectron` é selecionada automaticamente e a janela é renderizada como um overlay DOM sobre a página existente.\n\nPara usar uma infraestrutura diferente (ou criar a sua própria), implemente `InfraestruturaGraficaInterface` e passe a instância ao construtor de `InterfaceGrafica`:\n\n```typescript\nimport { InterfaceGrafica, InfraestruturaGraficaInterface } from '@designliquido/delegua-interface-grafica';\n\nclass MinhaInfraestrutura implements InfraestruturaGraficaInterface {\n    // implementar os métodos da interface\n}\n\nconst ig = new InterfaceGrafica(new MinhaInfraestrutura());\n```\n\n### Selecionando backend Java Swing por variáveis de ambiente\n\nO módulo `DeleguaModuloInterfaceGrafica` pode inicializar o backend Swing automaticamente quando a variável abaixo estiver definida:\n\n```bash\nDELEGUA_INTERFACE_GRAFICA_BACKEND=java-swing\n```\n\nVariáveis opcionais para o host Swing:\n\n- `DELEGUA_INTERFACE_GRAFICA_SWING_COMANDO` (padrão: `java`)\n- `DELEGUA_INTERFACE_GRAFICA_SWING_ARGUMENTOS` (padrão: `-jar delegua-interface-grafica-swing-host.jar`)\n- `DELEGUA_INTERFACE_GRAFICA_SWING_JAR` (atalho para montar automaticamente `-jar <caminho>` quando `DELEGUA_INTERFACE_GRAFICA_SWING_ARGUMENTOS` não estiver definido)\n- `DELEGUA_INTERFACE_GRAFICA_SWING_CWD` (diretório de trabalho para o processo)\n\nSe o backend Swing falhar ao iniciar, a biblioteca faz fallback automático para `InfraestruturaVazia` com aviso em `console.warn`.\n\n### Selecionando backend GTK por variáveis de ambiente\n\nO módulo `DeleguaModuloInterfaceGrafica` pode inicializar o backend GTK automaticamente quando:\n\n```bash\nDELEGUA_INTERFACE_GRAFICA_BACKEND=gtk\n```\n\nVariáveis opcionais para o host GTK:\n\n- `DELEGUA_INTERFACE_GRAFICA_GTK_COMANDO` (padrão: `delegua-interface-grafica-gtk-host`)\n- `DELEGUA_INTERFACE_GRAFICA_GTK_ARGUMENTOS` (argumentos separados por espaço)\n- `DELEGUA_INTERFACE_GRAFICA_GTK_CWD` (diretório de trabalho para o processo)\n\nSe o backend GTK falhar ao iniciar, a biblioteca faz fallback automático para `InfraestruturaVazia` com aviso em `console.warn`.\n\n### Selecionando backend Windows por variáveis de ambiente\n\nO módulo `DeleguaModuloInterfaceGrafica` pode inicializar o backend Windows automaticamente quando:\n\n```bash\nDELEGUA_INTERFACE_GRAFICA_BACKEND=windows\n```\n\nVariáveis opcionais para o host Windows:\n\n- `DELEGUA_INTERFACE_GRAFICA_WINDOWS_COMANDO` (padrão: `delegua-interface-grafica-windows-host.exe`)\n- `DELEGUA_INTERFACE_GRAFICA_WINDOWS_ARGUMENTOS` (argumentos separados por espaço)\n- `DELEGUA_INTERFACE_GRAFICA_WINDOWS_CWD` (diretório de trabalho para o processo)\n\nSe o backend Windows falhar ao iniciar, a biblioteca faz fallback automático para `InfraestruturaVazia` com aviso em `console.warn`.\n\n### Protocolo do host externo\n\nA especificação do protocolo de mensagens entre TypeScript e hosts externos está em:\n\n- `docs/protocolo-processo-externo-v1.md`\n\nUm esqueleto inicial do host Java Swing foi adicionado em:\n\n- `host-java-swing/`\n\nUm esqueleto inicial do host GTK foi adicionado em:\n\n- `host-gtk/`\n\nUm esqueleto inicial do host Windows foi adicionado em:\n\n- `host-windows/`\n\nUm esqueleto inicial do host macOS foi adicionado em:\n\n- `host-macos/`\n\n### Teste E2E opcional com host Java real\n\nPor padrão, os testes E2E de Swing ficam desativados para não depender de Java/JAR em todos os ambientes.\n\nPara executar:\n\n1. Gere o JAR do host Java Swing.\n2. Defina as variáveis de ambiente:\n    - `DELEGUA_SWING_E2E=1`\n    - `DELEGUA_SWING_E2E_JAR=<caminho-absoluto-do-jar>`\n    - opcional: `DELEGUA_SWING_E2E_COMANDO=java`\n3. Rode `yarn testes-unitarios`.\n\nO teste E2E está em `testes/infraestrutura-java-swing-e2e.test.ts`.\n\nEsse teste agora também cobre `caixaLivre`, `definirPosicao()` e `definirTamanho()`.\n\nAlternativa automatizada (compila host + roda E2E):\n\n```bash\nyarn testes-e2e-java-swing\n```\n\nRequisitos para esse comando:\n\n- Gradle instalado no ambiente, ou\n- `gradlew`/`gradlew.bat` presente em `host-java-swing/`.\n\nOpcionalmente, personalize o comando Gradle com `DELEGUA_SWING_E2E_GRADLE_CMD`.\n\n### Teste E2E opcional com host GTK real\n\nPor padrão, os testes E2E de GTK ficam desativados para não depender de Rust + GTK nativo em todos os ambientes.\n\nPara executar manualmente:\n\n1. Compile o host GTK.\n2. Defina as variáveis de ambiente:\n    - `DELEGUA_GTK_E2E=1`\n    - `DELEGUA_GTK_E2E_CMD=<caminho-absoluto-do-executavel>`\n3. Rode `yarn testes-unitarios`.\n\nO teste E2E está em `testes/infraestrutura-gtk-e2e.test.ts`.\n\nEsse teste agora também cobre `caixaLivre`, `definirPosicao()` e `definirTamanho()`.\n\nAlternativa automatizada (compila host + roda E2E):\n\n```bash\nyarn testes-e2e-gtk\n```\n\nOpcionalmente, personalize o comando cargo com `DELEGUA_GTK_E2E_CARGO_CMD`.\n\n### Teste E2E opcional com host Windows real\n\nPor padrão, os testes E2E de Windows ficam desativados para não depender de .NET/host nativo em todos os ambientes.\n\nPara executar manualmente:\n\n1. Publique o host Windows.\n2. Defina as variáveis de ambiente:\n    - `DELEGUA_WINDOWS_E2E=1`\n    - `DELEGUA_WINDOWS_E2E_EXE=<caminho-absoluto-do-executavel>`\n3. Rode `yarn testes-unitarios`.\n\nO teste E2E está em `testes/infraestrutura-windows-e2e.test.ts`.\n\nEsse teste agora também cobre `caixaLivre`, `definirPosicao()` e `definirTamanho()`.\n\nAlternativa automatizada (publica host + roda E2E):\n\n```bash\nyarn testes-e2e-windows\n```\n\nOpcionalmente, personalize o comando .NET com `DELEGUA_WINDOWS_E2E_DOTNET_CMD`.\n\n## Desenvolvimento\n\n```bash\n# Instalar dependências\nyarn\n\n# Executar os testes\nyarn testes-unitarios\n\n# Compilar\nyarn empacotar\n```\n\n## Licença\n\nMIT\n","readmeFilename":"README.md"}