Ir para o conteúdo

Galeria de exemplos

Um conjunto de apps de exemplo executáveis vive em examples/. Cada um expõe o mesmo contrato make_state() + view(app), então roda no simulador Qt e no dispositivo via code-push, sem mudanças. Clique no nome de qualquer app abaixo para ver o código-fonte — todo app.py abre com um docstring explicando o que demonstra.

# Simulador Qt no desktop (precisa do extra `qt`; instalado por `uv sync`)
uv run python examples/<nome>/app.py
uv run tempest dev examples/<nome>/app.py     # + hot reload ao salvar

# Em um dispositivo Android, via code-push por LAN (fase B5)
adb reverse tcp:8765 tcp:8765                 # via USB; pule se na mesma Wi-Fi
uv run tempest serve examples/<nome>/app.py

Fundamentos

App O que mostra Exercita
counter O básico: handlers síncronos e async mutam estado e disparam um rebuild coalescido. Text, Button, Row/Column; update.
stopwatch Loop async-first: um handler corrotina conta via asyncio.sleep sem travar a UI (stop/reset seguem tocáveis). Rebuilds coalescidos a partir do loop; update.
todo Digite uma tarefa no Input e toque "add"; tocar alterna concluída; "clear done" remove as feitas. Input + chave estável; todos os child patches: insert / remove / update.
calculator A grade de botões é a entrada (sem widget de texto) — vitrine de layout denso. Row/Column aninhados, botões com chave; update no display.
colorpicker Style dinâmico: swatches recolorem um preview vivo; toggles re-estilizam o texto. background / font_size / font_weight pelo diff.

Componentes e shell

App O que mostra Exercita
shell Tela inteira montada dos componentes compostos: Scaffold + AppBar (com Burger/Drawer) no topo, NavBar embaixo. tempestroid.components reduzidos a primitivos via Component.render.
gallery Widgets utilitários + estilização de input + transição implícita de Style. Slider/Switch/ProgressBar/Spinner/Image/Icon/ScrollView/TextArea; Input seguro + regex; Style.transition.

Trilho E — paridade Flutter/RN

App O que mostra Exercita
navigation Os três hosts de navegação: pilha push/pop animada, abas e gaveta. Navigator / TabView / RouteDrawer (E0).
tabs Tab bar persistente troca o corpo entre 3 painéis; o estado compartilhado sobrevive à troca. Padrão canônico de navegação por abas.
lists LazyColumn de 10k itens + paginação + pull-to-refresh, e SectionList com cabeçalho fixo. Virtualização por janela (E1).
overlays Dialog, bottom sheet, menu e toast pela API imperativa de overlay do App. Camada de overlay z-ordenada (E2).
animation Caixa que faz ease de cor/opacidade, lista animada, Hero e Shimmer. AnimationController + Tween no clock de frames (E3).
gestures Swipe-to-delete (Dismissible), arrastar p/ reordenar e pinça-zoom. Gestos avançados (E4).
forms Form de FormFields com validators tipados (bloqueia submit inválido) + inputs de seleção/segmento. Validação em Python antes dos patches (E5).
form Os inputs com valor básicos, cada um dobrando seu evento tipado de volta no estado. Input / Checkbox / DatePicker / FilePicker + eventos tipados.
layout Chips com Wrap, PageView paginado e CollapsingAppBar que encolhe ao rolar. Layout refinado (E6).
media Desenho com Canvas, Svg, blur e clip. Mídia e gráficos (E7).
platform Haptics, preferências reais, stream de lifecycle e KeyboardAvoidingView. Plataforma/sistema (E8) — roda no Qt e no device.
theming Toggle dark/light (App.set_theme), locale PT↔árabe/RTL (App.set_locale) e Semantics. Transversais: tema/i18n/acessibilidade (E9).

Dispositivo e multi-arquivo

App O que mostra Exercita
device_counter Contador mínimo sem import de Qt — o alvo do code-push no aparelho. Mesmo contrato, livre de Qt (B5).
native_caps Capacidades nativas sem config extra, cada uma um round-trip request/response tipado. clipboard / storage / database (SQLite) / secure_storage / system (device-verificado).
sysverify Harness de verificação on-device das capacidades que exigem hardware real. Sensores / biometria / push (device-only).
multifile Projeto multi-arquivo (main.py + pacote widgets/) — o que tempest new --template multi gera. Bundle do projeto inteiro no sys.path (Trilho C).

Trilho G — inferência ONNX no device

Visão no aparelho com o ort-vision-sdk (backend plugável), inferência pela AAR nativa onnxruntime-androidsem OpenCV, sem wheel onnxruntime/Pillow. Exigem o extra [vision] + o build com --feature vision; device-verificados no emulador x86_64.

App O que mostra Exercita
onnxspike Prova mínima: import numpy + um cálculo rodam no interpretador embarcado (tela verde "numpy OK"). numpy android no device (G0/G1).
visionspike Pipeline completo: imagem real (banana.jpg) → decode nativo (BitmapFactory) → Classifier do SDK via AarBackend → top-1 + latência. Modelo embutido ou baixado (VISIONSPIKE_MODEL_URL), .onnx fp32 ou .int8.ort quantizado (VISIONSPIKE_MODEL). G1 (AAR) + G2 (imagem) + G3 (tempest optimize) + G4 (entrega).

Conjunto de widgets atual

Os dois renderizadores — simulador Qt (desktop) e Compose (dispositivo) — suportam o conjunto completo do Trilho E. Não há mais o gap antigo de "o Compose só renderiza cinco widgets": os inputs com valor (Input / TextArea / Checkbox / Switch / Slider / Dropdown / DatePicker / FilePicker / …) renderizam nativamente no aparelho via Jetpack Compose e dobram seus eventos tipados de volta no estado. A paridade é fixada pela suíte de conformância (golden snapshots dos dois tradutores Style → Qt e Style → Compose) e foi verificada em device ao longo de E0–E9.

Cobertura (ambos os renderizadores, salvo nota):

Categoria Widgets
Layout Column / Row / Container / Stack / Wrap / ScrollView / SafeArea / AspectRatio / PageView / KeyboardAvoidingView
Texto e ação Text / Button / Icon / Image (on_click)
Inputs com valor Input / TextArea / Checkbox / Switch / Slider / RangeSlider / Dropdown / DatePicker / TimePicker / FilePicker / PinInput / MaskedInput / Autocomplete / Form / FormField
Listas virtualizadas LazyColumn / LazyRow / LazyGrid / SectionList (+ pull-to-refresh, scroll infinito)
Navegação Navigator / TabView / TabBar / RouteDrawer
Overlays Dialog / BottomSheet / Menu / Popover / Toast / Tooltip / ActionSheet
Animação Animated / AnimatedList / Hero / Shimmer / Skeleton
Gestos GestureDetector / PanHandler / ScaleHandler / DoubleTapHandler / Draggable / DragTarget / Dismissible / ReorderableList / InteractiveViewer
Mídia e gráficos Canvas / Svg / VideoPlayer / WebView / Blur / BackdropFilter / ClipPath
Indicadores ProgressBar / Spinner

Divergência de mídia/câmera (device-only)

Alguns widgets de hardware — CameraPreview / QrScanner / MapView — renderizam só no aparelho (Compose) e aparecem como placeholder sinalizado no Qt, não o contrário. As divergências por campo entre os dois tradutores estão documentadas na suíte de conformância (tests/conformance/).

Os exemplos form e gallery exercitam os inputs com valor de verdade — no simulador e no aparelho. Exemplos como calculator continuam dirigidos por teclado numérico por design do app, não por limite do renderizador.

Handlers estáveis

Rebuilds comparam props de handler por identidade, então um lambda novo a cada build lê como mudança de prop (limitação conhecida). Os exemplos ainda emitem patches corretos — apenas mais que o mínimo estrito. Prefira referências de handler estáveis em apps de produção.

Capturas no dispositivo (emulador x86_64, sem hardware físico)

Geradas sem aparelho físico

A maioria foi renderizada pelo renderizador Compose num emulador x86_64 headless (make emulator-verify / toolchain/validate_gallery.sh) — zero hardware; as galerias do design system (h1buttonsh4gallery) são capturas do simulador Qt. stopwatch (animado) fica para uma recaptura como GIF (ver Animados).

animation
animation
brforms
brforms
calculator
calculator
colorpicker
colorpicker
counter
counter
device_counter
device_counter
form
form
forms
forms
gallery
gallery
gestures
gestures
icons
icons
layout
layout
lists
lists
media
media
multifile
multifile
native_caps
native_caps
navigation
navigation
overlays
overlays
platform
platform
shell
shell
sysverify
sysverify
tabs
tabs
theming
theming
todo
todo
h1buttons
h1buttons
h2gallery
h2gallery
h3gallery
h3gallery
h4gallery
h4gallery

Os exemplos h1buttons (variantes de Button), h2gallery (o kit de ação e entrada), h3gallery (superfície e layout) e h4gallery (data display e feedback) acompanham o design system.

Animados

Exemplos com movimento (animation, gestures, stopwatch) precisam de um GIF — um PNG estático não mostra a animação. O harness toolchain/capture_gif.sh captura uma rajada de frames no dispositivo e monta o GIF (via toolchain/frames_to_gif.py). Como esses exemplos são estáticos em repouso, dispare a animação com TAP_X/TAP_Y antes da rajada:

# ex.: stopwatch — toca "start" e captura o relógio correndo
TAP_X=540 TAP_Y=1400 ANDROID_SERIAL=emulator-5554 \
    bash toolchain/capture_gif.sh examples/stopwatch/app.py