Galeria de Exemplos 🎨¶
Bem-vindo à galeria do tempestweb! 🚀 Aqui você encontra apps completos e prontos para rodar, cada um focado em um conceito — estado, formulários, listas, navegação, tema, i18n, canvas, capacidades nativas e muito mais.
Os três modos, o mesmo código
Cada exemplo é um módulo view(app) -> Widget em Python tipado. O mesmo
app.py roda sem mudar uma linha:
- Modo A (WASM/Pyodide) — Python direto no browser.
- Modo B (servidor) — Python no servidor FastAPI + cliente fino por WebSocket.
- Modo C (transpile) — o app transcrito para JS nativo, bundle estático.
A árvore de view nunca nomeia um transporte. Você escreve a lógica uma vez e escolhe o modo na hora de servir.
Os selos de modo
Cada linha traz um selo: [A/B] roda nos modos interativos (WASM e servidor);
[A/B/C] roda também transpilado para JS nativo. A maioria dos exemplos
usa componentes prontos ou o formato Python de evento (event.value), por isso
vive em A/B. O Modo C roda o subconjunto de widgets puros — o
exemplo-vitrine é o Tour do Modo C.
Como ler cada página
Toda página segue o padrão do tutorial: o que você vai construir → o código completo → explicação peça por peça → um Recap no final. Comece pelo Contador e pela Lista de tarefas se for novo por aqui.
Fundamentos¶
Os blocos básicos — o ponto de partida para todo mundo.
- Contador — o "olá mundo" reativo: estado + handler + patch. [A/B/C]
- Lista de tarefas —
Inputcontrolado,LazyColumnvirtualizado eCheckboxpor item. [A/B] - Formulário —
Form+FormField+ validadores tipados que espelham erros no estado. [A/B] - Fetch assíncrono — transição
idle → loading → loaded/errorcom handlerasync. [A/B]
Estado e dados¶
Gerencie tempo, conversões, tabelas e gráficos de forma 100% determinística.
- Cronômetro — Start/Stop/Lap/Reset com tempo guardado como inteiro de décimos de segundo. [A/B]
- Conversor de temperatura — dois campos controlados (Celsius/Fahrenheit) sincronizados via two-way binding. [A/B]
- Tabela de dados — busca ao vivo + ordenação por coluna (ASC/DESC), dirigida pelo estado. [A/B]
- Grade de dados — grade densa com colunas tipadas e formatação por célula. [A/B]
- Dashboard de gráficos — cards de métricas + gráficos desenhados a partir do estado. [A/B]
Formulários e fluxos¶
Da validação simples ao wizard de múltiplos passos.
- Formulário de login —
EmailInput/PasswordInput, validação em três camadas eBannerde erro. [A/B] - Wizard de cadastro — três passos (Conta/Perfil/Revisão) com validadores que liberam o "Próximo". [A/B]
- Cadastro brasileiro — PF/PJ com máscaras de CPF/CNPJ/telefone/endereço e validadores BR em tempo real. [A/B]
- Quiz com pontuação — 5 perguntas com
RadioGroup,ProgressBare tela final de resultado. [A/B]
Componentes prontos (core)¶
Os componentes de alto nível do tempest_core — cascas, cards e feedback prontos.
- App shell do core —
Scaffold+AppBar+NavBarmontados em poucas linhas. [A/B] - Configurações com abas —
TabViewcom seções de preferências. [A/B] - Feedback e status —
Banner,Badge,EmptyStateeSpinnerem seus estados. [A/B] - Cards de perfil —
Card+Avatar+Chipcompondo um grid de perfis. [A/B]
Layout e navegação¶
Cascas de app, abas, drawers e rotas.
- Perfil com abas —
TabView+RouteChangeEventcom três seções e umSwitch. [A/B] - Console administrativo (presets) — o painel inteiro (shell, dashboard, listagem, ajustes) em 261 linhas de registros tipados, e responsivo. [A/B]
- Dashboard app shell — o mesmo painel montado à mão:
Scaffold+AppBar+Sidebar+NavBarcom seções alternáveis. [A/B] - Drawer de navegação e rotas —
RouteDrawerdeslizante, push/pop em 2 níveis eBreadcrumb. [A/B] - Onboarding carousel —
PageViewcomPageChangeEvent, indicador de pontos e tela de conclusão. [A/B]
Listas, mídia e entrada¶
Listas virtualizadas, galerias, chat, busca e drag-and-drop.
- Galeria de imagens —
LazyGridvirtualizado de 12 fotos +Dialoglightbox. [A/B] - Chat UI —
LazyColumnvirtualizado,Inputtwo-way eButtonde envio. [A/B] - Busca com autocomplete — filtragem ao vivo via
Autocomplete+ filtro de categoria porChip. [A/B] - Kanban board — três colunas com cards
DraggableeDragTargetpara mover/excluir. [A/B]
Seleção e feedback¶
Controles, disclosure e estados de feedback.
- Modo escuro — o tema chega ao widget:
theme=app.themeeapp.set_theme, com os mesmos valores nos três modos. [A/B/C] - Painel de configurações —
Switch,Checkbox,Slider,RadioGroupeSegmentedControlligados ao estado. [A/B] - Formulário de reserva —
DatePicker,TimePicker,RangeSlider,DropdowneFilePicker, os controles nativos do navegador. [A/B/C] - Avaliação e review — estrelas
Rating+Chiptags +TextAreanum formulário validado. [A/B] - FAQ accordion —
Accordioncom política de "um aberto por vez" e filtro de busca. [A/B] - Central de notificações —
Banner,Badgede não-lidas eEmptyStatena caixa vazia. [A/B]
Tema, i18n e canvas¶
Personalização visual, internacionalização e desenho.
- Alternador de tema —
Theme/ThemeModecomApp.set_theme,Theme.is_darke simulação de OS. [A/B] - Saudação internacionalizada —
Locale+translate()/t()com inglês, português e árabe (RTL). [A/B] - Sketch pad (canvas) — strokes como listas de comandos de desenho (
MoveTo/LineTo), presets, undo e clear. [A/B]
Capacidades nativas¶
A ponte nativa (tempestweb.native) dá acesso a geolocalização, HTTP, câmera,
área de transferência, compartilhamento e armazenamento — sempre via callables
injetáveis, então cada exemplo roda determinístico nos testes com um FakeBridge.
- Painel do dispositivo — quatro capacidades Tier 1 (
vibration,wakelock,fullscreen,network) ligadas a botões numa única tela. [A/B] - Clima (HTTP + geolocalização) — handler
asyncencadeado combinandogeolocation.get_positionehttp.request. [A/B] - Copiar e compartilhar —
clipboard.write+share.shareinjetados, dirigindo dois handlersasync. [A/B] - Captura de câmera — ciclo
IDLE → CAPTURING → CAPTURED/ERRORcomcamera.capturee preview por data URI. [A/B] - Notas no armazenamento do dispositivo — CRUD de notas sobre
storage.put/get/list_keys/remove. [A/B]
PWA e offline¶
Instalação como app, escritas duráveis e notificações push no browser.
- Instalação PWA + WebPush — fluxo de consentimento em 7 fases + script
build_pwa.pyque emite manifesto e ícones instaláveis. [A/B] - Fila offline — escritas duráveis via
native.offline(enqueue → size → replay) que sobrevivem a estar offline. [A/B] - WebPush ponta a ponta (servidor) — assinatura + entrega de push VAPID reais a partir de um servidor FastAPI. [B]
Observabilidade¶
Telemetria, feature flags, fronteiras de erro e autenticação — os blocos que deixam um app pronto para produção.
- Feature flags —
FeatureFlagsProvider+InMemoryFeatureFlagsAdapter: duas flags trocam variantes de widget ao vivo. [A/B] - Error boundary + telemetria —
ErrorBoundaryenvolvendo um filho explosivo, comon_errorligado aLogger+TelemetryProvider. [A/B] - Gate de autenticação JWT —
AuthStore+route_guard, JWTs decodificados offline e trilha de auditoria viaLogger. [A/B]
Modos de execução¶
O mesmo view rodando no servidor ou transpilado, sem mudar uma linha.
- Rodando o Modo B (servidor) — o exemplo do contador rodando unchanged em um servidor FastAPI por WebSocket via
TestClient. [B] - Tour do Modo C (transpile) — um app com estado+métodos, navegação, i18n, tema, formulário e animação transcrito para JS nativo. [A/B/C]
Demos mínimos¶
Cada um isola uma única capacidade no menor código possível — ótimos para ler de uma sentada. Não têm página dedicada; rode qualquer um com:
Todos rodam nos Modos A/B.
a11y_demo— a11y (Semantics→ ARIA) + i18n (translate) + cor de tema num único botão.anim_demo— transições CSS implícitas: umStylecomTransitionfaz o browser tweenar a mudança.async_demo— um handlerasyncqueawaita um timer e atualiza a UI sem travar a aba.geo_demo— a capacidade nativa de geolocalização (native.get_position) resolvida em-processo (Modo A) ou por proxy (Modo B).gesture_demo—GestureDetectorroteandoon_swipe/on_tap(gestos de ponteiro) para handlers Python.list_demo— umLazyColumndeclarando 1000 itens mas materializando só a janela visível ao rolar.login_demo— a tela de login pronta via o componenteLoginForm, sem layout manual.overlay_demo— a camada de overlay flutuante: umDialogacima da árvore, dispensável por id.router_demo— navegação dirigida por URL:viewrenderiza a tela do topo deapp.nav.camera_demo—CameraPreviewreportando frames amostrados eQrScannerdecodificando código peloBarcodeDetectorda plataforma (exige contexto seguro;localhostconta).reorder_demo—ReorderableList: arrastar uma linha reporta as duas posições, e mover é trabalho do estado.responsive_demo— a mesmaviewem dois layouts, decidida porapp.media(o cliente reporta o snapshot no mount e a cada resize).webaudio_demo— uma frase inteira agendada numa chamada (native.webaudio.sequence, notas com envelope,start_msigual = acorde) e o analisador medindo o próprio barramento de síntese (watch_levels, sem microfone e sem prompt de permissão).
Pronto para começar?
Escolha um exemplo que se pareça com o que você quer construir, copie o
app.py, e rode nos modos que fizerem sentido. Todos passam no gate verde
(build, ruff, mypy --strict). Bom código! 💡