Aplicativo de apresentação de PDFs para desktop, construído com Tauri 2 + React + TypeScript. Transforma um arquivo PDF em uma apresentação estilo PowerPoint, com uma janela de controle para o apresentador e janelas de projeção em tela cheia para o público.
- Abertura de PDF — selecione qualquer arquivo
.pdfdo computador, arraste e solte na tela inicial ou use o atalhoO. - Histórico de arquivos — sidebar na tela inicial exibe os últimos PDFs abertos; clique para reabrir (com verificação de existência e dialog de erro); menu com opções de abrir local do arquivo e remover do histórico.
- Renderização em alta resolução — cada página é desenhada em
<canvas>via PDF.js (react-pdf), redimensionando-se automaticamente ao tamanho da janela. - Modo apresentador multi-janela — a janela principal controla janelas
viewscreen-{idx}exibidas em tela cheia nos monitores selecionados. - Modo tela cheia com monitor único — quando há apenas um monitor, a janela principal entra em tela cheia com controles flutuantes.
- Seleção multi-monitor — marque múltiplos monitores para exibir a apresentação simultaneamente em várias telas (configuração persistida em disco).
- Pré-carregamento — as páginas anterior e posterior à atual são carregadas em segundo plano para transições instantâneas.
- Preview do próximo slide — miniatura da próxima página na sidebar direita, com tamanho redimensionável via arraste do mouse.
- Carrossel de slides — filmstrip na parte inferior com miniaturas de todas as páginas e anotações; clique para pular para qualquer slide; altura ajustável via arraste.
- Zoom — Ctrl+Scroll ou Ctrl+/Ctrl−/Ctrl0 para ampliar/reduzir; Space+arraste para pan quando ampliado.
- Cronômetro — modo progressivo (stopwatch) ou regressivo (countdown) para controle de tempo.
- Tela preta — oculta temporariamente o conteúdo do projetor (pausa visual).
- Exportar PDF — gere uma cópia do documento com todas as anotações incorporadas.
- Anotações ao vivo — desenhe sobre os slides durante a apresentação com ferramentas sincronizadas em tempo real com o projetor:
- Caneta — traço contínuo (cor e espessura ajustáveis; espessura via scroll do mouse).
- Marcador de texto — destaque semi-transparente (cor e espessura ajustáveis).
- Laser — ponteiro luminoso vermelho para chamar atenção.
- Borracha — apague apenas os traços selecionados arrastando sobre eles (raio ajustável via scroll; duplo-clique apaga tudo na página).
- Desfazer / Refazer — Ctrl+Z / Ctrl+Shift+Z para desfazer e refazer anotações (até 50 passos).
- Linhas retas — segure Shift durante o arraste para travar o traço em ângulos de 45° (caneta e marcador).
- Seleção de cores — paleta de 6 cores preset com HexColorPicker para cores personalizadas; cores reiniciam ao padrão a cada abertura do app.
- Botão de reset de tamanhos — restaura os tamanhos e cores padrão das ferramentas de anotação.
- Confirmação ao fechar — impede fechamento acidental quando há PDF ou apresentação ativa.
- Sidebar toggle — sidebars podem ser ocultadas/mostradas via atalhos (
ZeX). - Configurações — dialog de configurações com seleção de cor de fundo do projetor (presets + hex personalizado), auto-hide dos controles flutuantes e timeout configurável.
| Tecla | Ação |
|---|---|
F5 |
Iniciar / Encerrar apresentação |
O |
Abrir PDF (tela inicial) |
→ / Espaço / Page Down |
Próximo slide |
← / Page Up |
Slide anterior |
Home |
Primeiro slide |
End |
Último slide |
B |
Alternar tela preta (durante apresentação) |
Z |
Mostrar/ocultar sidebar esquerda |
X |
Mostrar/ocultar sidebar direita (preview) |
C |
Mostrar/Ocultar Carrousel |
Esc |
Encerrar apresentação ou voltar ao início (com confirmação) |
L |
Ativar/desativar laser |
P |
Ativar/desativar caneta |
H |
Ativar/desativar marcador de texto |
E |
Ativar/desativar borracha |
Ctrl+Z |
Desfazer última anotação |
Ctrl+Shift+Z / Ctrl+Y |
Refazer anotação |
Ctrl+= / Ctrl+- |
Zoom in / out |
Ctrl+0 |
Resetar zoom |
Space+arraste |
Pan (quando zoom > 1) |
Scroll do mouse (com ferramenta ativa) |
Aumentar/diminuir tamanho da caneta, marcador ou borracha |
Duplo-clique (com borracha) |
Apagar todas as anotações do slide atual |
- Tauri 2 — shell desktop (Rust)
- React 19 + TypeScript
- Vite — bundler
- Tailwind CSS 4 + shadcn/ui (Radix UI)
- react-pdf — renderização de PDF (PDF.js)
- Lucide — ícones
src/— frontend React/TypeScriptsrc/state/presentation.tsx— estado global (Context), navegação de slides, seleção multi-monitor, zoomsrc/state/annotations/— estado de anotações (provider + contexto compartilhado)presenter.tsx— hook principal do apresentador (strokes, undo/redo, emit de eventos)viewscreen.ts— hook read-only da janela de projeção (escuta eventos)index.ts— barrel re-export
src/components/— UISidebar.tsx— orquestrador da sidebar (decompõe nos sub-componentes abaixo)sidebar/FileControls.tsx— abertura de PDF, nome do documento, voltar ao iníciosidebar/MonitorSelector.tsx— seleção multi-monitor com checkboxessidebar/PresentationControls.tsx— iniciar/encerrar apresentação, tela pretasidebar/SlideNavigation.tsx— navegação prev/next e input de páginasidebar/AnnotationToolbar.tsx— botões de ferramentas com tamanhos + undo/redo/resetPdfStage.tsx— renderizador de página com zoom (CSS transform) e pan (Space+drag)AnnotationLayer.tsx— canvas de anotações (caneta, marcador, laser, borracha)AnnotationLayerContainer.tsx— wrapper que conecta AnnotationLayer ao contextoColorPicker.tsx— paleta de cores com 6 presets, HexColorPicker e input hexFloatingControls.tsx— controles flutuantes no modo tela cheia (navegação + ferramentas)PreviewPanel.tsx— sidebar direita com preview do próximo slide + exportação + configuraçõesSettingsDialog.tsx— dialog de configurações (cor de fundo, auto-hide, timeout)SlideCarousel.tsx— filmstrip de miniaturas com anotações e altura ajustávelNextPreview.tsx— preview do próximo slideTimer.tsx— cronômetro progressivo/regressivoWelcome.tsx— tela inicial com drag-and-drop e atalhosWelcomeSidebar.tsx— sidebar de histórico de arquivos recentes com menu de opções
src/viewscreen/— janela de projeção (instância secundária)src/hooks/— hooks customizadosuseKeyboardShortcuts.ts— atalhos de teclado globaisuseAutoHide.ts— auto-hide para controles flutuantesuseSettings.ts— configurações persistidas (backgroundColor, auto-hide, timeout)
src/lib/— helperspdf.ts— leitura de PDF e comandos Rust (read_pdf, set_document, get_document, file_exists)monitors.ts— detecção de monitores, config persistida e comandos de projeçãoannotations.ts— tipos, constantes e utilidades de anotações (distâncias, eraser logic)canvasDrawing.ts— funções de desenho compartilhadas (drawStrokes, drawLaser, drawEraserCursor, drawToolCursor)exportPdf.ts— exportação de PDF com anotações incorporadasfileHistory.ts— histórico de arquivos abertos (localStorage)utils.ts— utilitários gerais (cn para classnames)shared.ts— constantes de eventos e interfaces compartilhadas
src-tauri/— backend Rustsrc/lib.rs— comandos (read_pdf,file_exists,set_document,get_document,list_monitors,open_projections,close_projection,save_file, etc.) e ícone embutidocapabilities/default.json— permissões das janelastauri.conf.json— configuração do app e janelas
A sincronização entre janelas usa os eventos globais do Tauri: mudar-slide (troca de página), tela-preta (blackout), anotacao-sincronizar (undo/redo), anotacao-limpar-pagina (borracha duplo-clique) e eventos de anotações (anotacao-traco, anotacao-laser, anotacao-apagar, anotacao-limpar). As janelas de projeção são criadas/posicionadas/fechadas por comandos Rust (open_projections / close_projection), que as movem para os monitores escolhidos e ativam o modo tela cheia.
- Node.js (v18+ recomendado) e npm
- Rust (toolchain stable)
- Plataforma de build do Tauri — no Windows, o Visual Studio Build Tools com a carga de trabalho "Desenvolvimento para desktop com C++" e o WebView2 Runtime (normalmente já presente no Windows 10/11).
-
Clone e instale as dependências
npm install
-
Execute em modo desenvolvimento
npm run tauri dev
Isso inicia o Vite (frontend em
http://localhost:1420) e abre a janela do app com recarregamento automático. -
Gere o instalador de produção
npm run tauri build
Os artefatos são gerados em
src-tauri/target/release/bundle/(.exeNSIS no Windows). O installador NSIS usa um ícone personalizado configurado emtauri.conf.json.
- Clique em Abrir PDF e selecione o arquivo da apresentação.
- (Opcional) Na seção Tela de projeção, marque os monitores onde a apresentação será exibida.
- Clique em Iniciar (F5) — as janelas de projeção abrem em tela cheia nos monitores selecionados.
- Navegue com as setas,
Espaçoou pelos controles da sidebar. - Use as ferramentas de anotação (caneta, marcador, laser, borracha) na barra inferior da sidebar.
- Use
ZeXpara ocultar/mostrar as sidebars,Bpara tela preta eF5/Escpara encerrar.
O projeto possui workflows automatizados no GitHub Actions:
build-windows.yml— gera o instalador NSIS (.exe) nowindows-latestbuild-linux.yml— gera pacotes.debe.AppImagenoubuntu-24.04build-macos.yml— gera o instalador.dmgnomacos-latest(ARM64)release.yml— disparado por tagsv*, builda para todas as plataformas e cria um draft de release no GitHub com os artefatos
Todos os workflows rodam a cada push na branch main e podem ser disparados manualmente (workflow_dispatch).