# CrossFly > Framework open source para criar apps nativos Android, iOS, web (Chrome, Firefox, Safari e outros navegadores) e desktop (Windows, macOS e Linux) a partir de uma única base de código Java. Se você sabe Java, já sabe CrossFly. Renderização GPU via LibGDX, sem ponte JavaScript. Documentação completa num só arquivo Markdown: https://crossfly.dev/llms-full.txt. Cada página de docs também existe em Markdown — acrescente .md à URL. Guia para assistentes de IA que vão escrever código CrossFly: https://crossfly.dev/ai.md ## Principais - [Apps multiplataforma em Java, sincronizados offline](https://crossfly.dev/): Crie apps em Java nativos no Windows, macOS, Linux, Android, iOS e web e mantenha os dados sincronizados offline-first — tudo no ecossistema CrossFly. - [CrossFly Core — Android, iOS, Windows, macOS, Linux e web em Java](https://crossfly.dev/core): Uma linguagem, todas as plataformas: Android, iOS, web e desktop no Windows, macOS e Linux, com uma única base de código Java. Open source. - [Exemplos CrossFly — 38 telas em Java rodando no navegador](https://crossfly.dev/examples): Quatro aplicativos completos e trinta e quatro receitas rodando no navegador, cada um com o código Java inteiro — o mesmo de todas as plataformas. - [Novo projeto CrossFly — gere um app Java multiplataforma](https://crossfly.dev/new): Escolha plataformas, a primeira tela, a skin e as bibliotecas e baixe um projeto Gradle para Windows, macOS, Linux, Android, iOS e web com um só código Java. - [CrossFly Sync — Sincronização offline-first para qualquer stack](https://crossfly.dev/sync): Framework comercial de sincronização offline-first bidirecional e multi-tenant, com core em Rust e SDKs para várias linguagens. Sobre o banco que você já usa. - [Recursos do ecossistema CrossFly](https://crossfly.dev/recursos): Os recursos da plataforma: Core para apps nativos em Java e Sync para dados offline-first bidirecionais sobre o banco que você já usa. - [Benchmark](https://crossfly.dev/desempenho): Quatorze fases reimplementadas em cinco frameworks e rodadas num mesmo celular: quadros, CPU, pico de memória, tamanho do APK e SQLite — com todas as ressalvas. - [Desempenho do CrossFly Sync](https://crossfly.dev/desempenho/sync): Offline-first que move só o delta: gravação local em < 1ms, catch-up em ~1,2s e −92% de bytes na rede. Benchmarks ilustrativos. - [Preços do CrossFly](https://crossfly.dev/precos): Open source e grátis para sempre. Pro a $19/dev/mês. Plano Custom para empresas. - [Roadmap do CrossFly](https://crossfly.dev/roadmap): O que estamos construindo agora e o que vem a seguir — priorizado junto com a comunidade. - [Notas de versão](https://crossfly.dev/novidades): Cada melhoria, correção e novo recurso, documentado abertamente. Acompanhe a evolução do CrossFly. - [Roadmap do CrossFly Sync](https://crossfly.dev/roadmap/sync): O que vem no CrossFly Sync — de PostgreSQL e Flutter aos próximos adapters de banco e SDKs. Priorizado abertamente. - [Novidades do CrossFly Sync](https://crossfly.dev/novidades/sync): Notas de versão do CrossFly Sync: acompanhe as prévias (preview) e a evolução do framework de sincronização offline-first. - [Documentação do CrossFly](https://crossfly.dev/docs): Instalação, primeiro app, componentes, migração de Flutter/React Native e mais. - [Contato](https://crossfly.dev/contato): Fale com vendas ou com o suporte técnico do CrossFly. - [Framework multiplataforma para apps nativos em Java](https://crossfly.dev/framework-multiplataforma): Crie apps nativos para Windows, macOS, Linux, Android, iOS e web com uma base Java — renderização na GPU, sem ponte JavaScript. Como o CrossFly funciona. - [CrossFly vs Flutter, React Native e .NET MAUI](https://crossfly.dev/comparativos): Comparações técnicas honestas, lado a lado, entre o CrossFly e os principais frameworks multiplataforma — forças, limites e quando usar cada um. - [CrossFly vs Flutter — comparação técnica](https://crossfly.dev/comparativos/crossfly-vs-flutter): CrossFly (Java, GPU/OpenGL) vs Flutter (Dart): linguagens, renderização, plataformas, desempenho e quando escolher cada um. Comparação honesta. - [CrossFly vs React Native — comparação técnica](https://crossfly.dev/comparativos/crossfly-vs-react-native): CrossFly (Java, renderização nativa na GPU) vs React Native (ponte JavaScript): arquitetura, plataformas, desempenho e quando escolher cada um. - [CrossFly vs .NET MAUI — comparação técnica](https://crossfly.dev/comparativos/crossfly-vs-dotnet-maui): CrossFly (Java, GPU/OpenGL) vs .NET MAUI (C#, controles nativos): linguagens, renderização, plataformas e quando escolher cada um. - [Casos de uso do CrossFly](https://crossfly.dev/casos-de-uso): Onde o CrossFly encaixa: apps corporativos e B2B, trabalho offline-first em campo, e desktop + mobile multiplataforma a partir de uma base de código Java. - [SOVIS — caso de uso CrossFly](https://crossfly.dev/casos-de-uso/sovis): Como a SOVIS roda mais de 10.000 aparelhos em campo no Brasil e no Paraguai com o mesmo app Java no Android, iOS e Desktop, feito com CrossFly. ## Documentação (CrossFly Core) ### Primeiros passos - [Instalação e requisitos](https://crossfly.dev/pt/docs/get-started/installation.md): Prepare JDK e Gradle e adicione o CrossFly ao projeto — comece pelo desktop. - [Quickstart: Hello World em ~10 min](https://crossfly.dev/pt/docs/get-started/quickstart.md): Uma MainWindow com Label e Button rodando no desktop — e os 4 fatos que sustentam tudo. - [Seu primeiro app (guiado, ponta a ponta)](https://crossfly.dev/pt/docs/get-started/your-first-app.md): Uma lista de tarefas real — layout, entrada, estado, navegação e persistência em SQLite. - [Anatomia de um projeto](https://crossfly.dev/pt/docs/get-started/project-structure.md): Módulos Gradle, como o MainWindow é resolvido por classname e onde ficam assets. - [Tour panorâmico do CrossFly](https://crossfly.dev/pt/docs/get-started/tour.md): Um mapa do que o framework oferece, com links para cada seção temática. ### Aprender — Fundamentos do CrossFly - [O panorama do CrossFly](https://crossfly.dev/pt/docs/learn/big-picture.md): O modelo mental antes do código — Java+OpenGL, paint thread, tudo é Component, sem arquitetura imposta. - [Janelas e navegação](https://crossfly.dev/pt/docs/learn/windows-and-navigation.md): Window, onShow(), a pilha LIFO (show/hide), passar dados pelo construtor e retornar valores. - [Pensando em componentes](https://crossfly.dev/pt/docs/learn/thinking-in-components.md): Component como base, ciclo de vida (onAdd/onRemove), composição e um componente custom com bind. - [Layouts](https://crossfly.dev/pt/docs/learn/layouts.md): Os seis layouts, add(LAY_AUTO/LAY_FILL/fração) e a técnica de aninhar layouts para telas reais. - [Estilos e temas](https://crossfly.dev/pt/docs/learn/styling-and-themes.md): ComponentStyle por estado, cores ARGB, Skin e alternar claro/escuro em runtime sem recriar a UI. - [Lidando com entrada](https://crossfly.dev/pt/docs/learn/handling-input.md): onAction vs onActionThread, foco, TextField/TextArea e os handlers de toque/gesto. - [Gerenciando estado](https://crossfly.dev/pt/docs/learn/managing-state.md): Sem binding reativo — estado em campos/ViewModel, a View traduz estado→componentes na mão. - [Carregando dados](https://crossfly.dev/pt/docs/learn/loading-data.md): I/O fora da paint thread (Thread + onUI) e listas grandes eficientes com VirtualListView. - [Persistindo dados](https://crossfly.dev/pt/docs/learn/persisting-data.md): SQLite (SqliteDb/SqliteCursor) atrás de um repositório — bind 1-based, getters 0-based. - [Deixando responsivo](https://crossfly.dev/pt/docs/learn/making-it-responsive.md): Relative, Gap, LAY_FILL, Screen.minSize como breakpoint e onReposition() para trocar o arranjo. - [Testando seu app](https://crossfly.dev/pt/docs/learn/testing-your-app.md): O framework de testes (TestCase), simulação de toques e comparação visual por screenshot. - [Publicando](https://crossfly.dev/pt/docs/learn/shipping.md): Empacotar e rodar em cada plataforma a partir dos módulos Gradle — o fim do ciclo. ### Conceitos — Entendendo o CrossFly - [A arquitetura em camadas](https://crossfly.dev/pt/docs/concepts/architecture.md): O mapa mental do CrossFly — app → ui → core → gl → libGDX — e por que essa separação existe. - [Tudo é um Component](https://crossfly.dev/pt/docs/concepts/everything-is-a-component.md): A ideia unificadora do CrossFly — só existe Component, e container = Component + Layout. - [O pipeline de renderização](https://crossfly.dev/pt/docs/concepts/rendering-pipeline.md): Como um pixel chega à tela — Paint → renderizadores por primitiva → OpenGL — e o que é batching. - [A paint thread](https://crossfly.dev/pt/docs/concepts/the-paint-thread.md): O modelo de threading do CrossFly — single-thread na paint thread, onUI e render sob demanda. - [Layout e o modelo Relative](https://crossfly.dev/pt/docs/concepts/the-layout-and-relative-model.md): Como o CrossFly mede e posiciona — relativo por padrão — e por que isso é a base da responsividade. - [Estilos e temas](https://crossfly.dev/pt/docs/concepts/styling-and-theming-model.md): O modelo de aparência — Skin é estrutura, Theme são papéis semânticos por modo — e troca de tema em runtime. - [O ciclo de vida](https://crossfly.dev/pt/docs/concepts/lifecycle.md): Do bootstrap ao componente — Main, Window.onShow e os ganchos onAdd(firstTime)/onRemove. - [Estado e fluxo de dados](https://crossfly.dev/pt/docs/concepts/state-and-data-flow.md): A filosofia de estado do CrossFly — sem binding reativo, sem DI, imperativo + invalidação explícita. ### UI — Construir a interface - [Layouts · EvenlySpacedLayout](https://crossfly.dev/pt/docs/ui/layouts/evenly-spaced-layout.md): Distribui os filhos com espaçamento igual num eixo, preservando o tamanho de cada um. - [Layouts · GridLayout](https://crossfly.dev/pt/docs/ui/layouts/grid-layout.md): Grade de colunas por fração, uma altura de linha por conteúdo mais alto. - [Layouts · HorizontalLayout](https://crossfly.dev/pt/docs/ui/layouts/horizontal-layout.md): Dispõe os filhos lado a lado, cada um na altura do contêiner. - [Layouts · RandomLayout](https://crossfly.dev/pt/docs/ui/layouts/random-layout.md): Sem arranjo automático — posicionamento manual (setBounds) ou relativo (setRelativeBounds). - [Layouts · RelativeLayout](https://crossfly.dev/pt/docs/ui/layouts/relative-layout.md): Posiciona e dimensiona por âncoras — relativo ao contêiner ou a outro componente. - [Layouts · Responsividade](https://crossfly.dev/pt/docs/ui/layouts/responsiveness.md): Como garantir que qualquer layout se adapte a tamanho de tela, densidade e fonte. - [Layouts · VerticalLayout](https://crossfly.dev/pt/docs/ui/layouts/vertical-layout.md): Empilha os filhos de cima para baixo, cada um na largura do contêiner. - [Navegação · A pilha de janelas](https://crossfly.dev/pt/docs/ui/navigation/the-window-stack.md): O modelo por trás da navegação — a pilha do EventsProcessor, popup vs fullscreen, botão Voltar e transições. - [Navegação · Diálogos e modais](https://crossfly.dev/pt/docs/ui/navigation/dialogs-and-modals.md): Alert, ActionSheet e Hint — como abrir, obter a resposta e configurar aparência. - [Navegação · Navegar entre telas](https://crossfly.dev/pt/docs/ui/navigation/navigate-between-screens.md): Avançar e voltar entre telas (push/pop) e passar dados para a tela de destino. - [Navegação · Retornar valores de uma tela](https://crossfly.dev/pt/docs/ui/navigation/returning-results.md): Como receber um resultado de volta — o padrão de callback e o padrão Picker/onAnswer. - [Formulários e entrada · Áreas de texto](https://crossfly.dev/pt/docs/ui/forms-and-input/text-areas.md): TextArea — entrada de várias linhas, rolagem e ícones por linha. - [Formulários e entrada · Campos de texto](https://crossfly.dev/pt/docs/ui/forms-and-input/text-fields.md): TextField — legenda flutuante, ícones, senha com toggle e leitura do valor. - [Formulários e entrada · Foco e validação](https://crossfly.dev/pt/docs/ui/forms-and-input/focus-and-validation.md): Controle de foco (focusOnTouch/focusOnKey), editável, limites e validação ao enviar. - [Formulários e entrada · Máscaras e teclados](https://crossfly.dev/pt/docs/ui/forms-and-input/masks-and-keyboards.md): EditMode (data/hora/moeda), máscara com '9', teclados nativos e o Keypad embutido. - [Temas e estilos · Esquemas de cores](https://crossfly.dev/pt/docs/ui/theming/color-schemes.md): ColorScheme — gere a paleta inteira do app a partir de uma cor-semente (Material 3). - [Temas e estilos · Estilizar componentes](https://crossfly.dev/pt/docs/ui/theming/styling-components.md): ComponentStyle — API fluente para cor, borda, cantos, gaps, fonte e sombra de um componente. - [Temas e estilos · Modo claro/escuro](https://crossfly.dev/pt/docs/ui/theming/dark-mode.md): Alternar tema em tempo real sem reconstruir a UI — setDarkMode + onRestyle/styled/restyle. - [Temas e estilos · Skins (Material / iOS / Flutter)](https://crossfly.dev/pt/docs/ui/theming/skins.md): Trocar a identidade visual — estrutura, forma e espaçamento — global ou por componente. - [Animações e transições · Animações de valor](https://crossfly.dev/pt/docs/ui/animations/value-animations.md): AlphaAnimation, PositionAnimation e LoopAnimation — interpolar um número e aplicá-lo. - [Animações e transições · Toque e feedback](https://crossfly.dev/pt/docs/ui/animations/press-and-feedback.md): Animação de pressão automática via pressable() e controle manual de alpha do componente. - [Animações e transições · Transições de tela](https://crossfly.dev/pt/docs/ui/animations/screen-transitions.md): Animar a troca de janela (fade/slide/scale) declarando WindowStyle.transition. - [Imagens e gráficos · Desenho customizado](https://crossfly.dev/pt/docs/ui/images-and-graphics/custom-drawing.md): Sobrescrever onPaint(Paint) e usar as primitivas — rect (GRect), text, line, image. - [Imagens e gráficos · Imagens](https://crossfly.dev/pt/docs/ui/images-and-graphics/images.md): Carregar e exibir imagens com ImageView, os modos de escala (ImageSize) e imagens de fundo. - [Imagens e gráficos · Whiteboard](https://crossfly.dev/pt/docs/ui/images-and-graphics/whiteboard.md): Captura de desenho livre — assinatura, rabisco — com cor e espessura de caneta. - [Catálogo de Componentes · ActionSheet](https://crossfly.dev/pt/docs/ui/widgets/actionsheet.md): Folha de ações estilo iOS ancorada na base da tela. - [Catálogo de Componentes · Alert](https://crossfly.dev/pt/docs/ui/widgets/alert.md): Caixa de diálogo modal com título, mensagem e botões de ação. - [Catálogo de Componentes · BarcodePicker](https://crossfly.dev/pt/docs/ui/widgets/barcodepicker.md): Leitura de códigos de barras/QR pela câmera (classe abstrata). - [Catálogo de Componentes · Button](https://crossfly.dev/pt/docs/ui/widgets/button.md): Botão clicável que exibe texto e/ou ícone, com estado de pressionado e onAction. - [Catálogo de Componentes · Charts (ChartView)](https://crossfly.dev/pt/docs/ui/widgets/chartview.md): Gráficos — linha, área, barra, barra/área empilhada, pizza, rosca e combo — com um núcleo de render compartilhado. - [Catálogo de Componentes · ColorPicker](https://crossfly.dev/pt/docs/ui/widgets/colorpicker.md): Escolha de cor por matriz matiz×saturação + slider de brilho. - [Catálogo de Componentes · DatePicker](https://crossfly.dev/pt/docs/ui/widgets/datepicker.md): Seleção de data num calendário mensal, com intervalo permitido opcional e retorno do dia escolhido. - [Catálogo de Componentes · Dropdown](https://crossfly.dev/pt/docs/ui/widgets/dropdown.md): ComboBox — botão com seta que abre uma lista para escolha única. - [Catálogo de Componentes · Espaçamento (Gap)](https://crossfly.dev/pt/docs/ui/widgets/spacing.md): Como espaçar componentes sem Spacer — usando Gap, ingap/outgap e frações de layout. - [Catálogo de Componentes · FilePicker](https://crossfly.dev/pt/docs/ui/widgets/filepicker.md): Reservado — esqueleto vazio na API 2026 (não produz resultado). - [Catálogo de Componentes · Group](https://crossfly.dev/pt/docs/ui/widgets/group.md): Registro lógico que torna Options/Switches mutuamente exclusivos (radio). - [Catálogo de Componentes · Hint](https://crossfly.dev/pt/docs/ui/widgets/hint.md): Notificação efêmera não-modal (substitui Toast/ToolTip). - [Catálogo de Componentes · ImageView](https://crossfly.dev/pt/docs/ui/widgets/imageview.md): Exibe uma Image com modo de escala (ImageSize) e alinhamento configuráveis. - [Catálogo de Componentes · Keypad](https://crossfly.dev/pt/docs/ui/widgets/keypad.md): Janela de teclado numérico/calculadora que se ancora a um TextField em foco. - [Catálogo de Componentes · Label](https://crossfly.dev/pt/docs/ui/widgets/label.md): Componente não interativo para exibir texto (com word-wrap) e/ou ícones read-only. - [Catálogo de Componentes · LabelItem e CheckLabelItem](https://crossfly.dev/pt/docs/ui/widgets/list-items.md): Cards prontos de item de lista — só rótulo (SINGLE) ou checkbox + rótulo (MULTIPLE). - [Catálogo de Componentes · ListView](https://crossfly.dev/pt/docs/ui/widgets/listview.md): Lista rolável e embutível de itens de texto, com seleção única ou múltipla. - [Catálogo de Componentes · ListViewWindow](https://crossfly.dev/pt/docs/ui/widgets/listviewwindow.md): Popup modal que envolve um ListView numa Window para seleção em janela flutuante. - [Catálogo de Componentes · LocationPicker](https://crossfly.dev/pt/docs/ui/widgets/locationpicker.md): Escolha de coordenada geográfica num mapa com GPS, devolvendo latitude e longitude ao chamador. - [Catálogo de Componentes · LocationView](https://crossfly.dev/pt/docs/ui/widgets/locationview.md): Exibe as coordenadas de GPS (lat, lon, hora do fix, velocidade, direção) como texto, atualizadas periodicamente. - [Catálogo de Componentes · Option](https://crossfly.dev/pt/docs/ui/widgets/option.md): Checkbox/radio com crossfade animado — checkbox sozinho, radio em Group. - [Catálogo de Componentes · PagedDataAdapter](https://crossfly.dev/pt/docs/ui/widgets/paged-data-adapter.md): DataAdapter paginado para VirtualListView, com cache LRU de páginas e carregamento assíncrono. - [Catálogo de Componentes · PhotoPicker](https://crossfly.dev/pt/docs/ui/widgets/photopicker.md): Captura de foto ou vídeo pela câmera do dispositivo, devolvendo o caminho do arquivo gerado. - [Catálogo de Componentes · Picker (classe base)](https://crossfly.dev/pt/docs/ui/widgets/picker.md): Base de todos os pickers — o padrão getAnswer() + show(onAnswer). - [Catálogo de Componentes · Progress](https://crossfly.dev/pt/docs/ui/widgets/progress.md): Indicador de progresso — barra determinada, animação infinita ou ícone girando. - [Catálogo de Componentes · Slider](https://crossfly.dev/pt/docs/ui/widgets/slider.md): Seleção de um valor float num intervalo, contínuo ou em passos. - [Catálogo de Componentes · Switch](https://crossfly.dev/pt/docs/ui/widgets/switch.md): Interruptor on/off com trilho deslizante animado e rótulo opcional. - [Catálogo de Componentes · TabBar](https://crossfly.dev/pt/docs/ui/widgets/tabbar.md): Barra de abas com indicador animado e conteúdo rolável horizontalmente com snap por página. - [Catálogo de Componentes · TextArea](https://crossfly.dev/pt/docs/ui/widgets/textarea.md): Campo de texto multilinha com word-wrap, rolagem vertical, ícones por linha e modo read-only rolável. - [Catálogo de Componentes · TextField](https://crossfly.dev/pt/docs/ui/widgets/textfield.md): Campo de texto de uma linha com máscara, EditMode, modo senha, ícones clicáveis e caption flutuante. - [Catálogo de Componentes · TextInput](https://crossfly.dev/pt/docs/ui/widgets/textinput.md): Base abstrata de entrada de texto — cursor, seleção, clipboard, foco e teclado, comuns a TextField e TextArea. - [Catálogo de Componentes · TimePicker](https://crossfly.dev/pt/docs/ui/widgets/timepicker.md): Seleção de hora e minuto por relógio analógico ou grade. - [Catálogo de Componentes · VirtualListView](https://crossfly.dev/pt/docs/ui/widgets/virtuallistview.md): Lista virtualizada de alto desempenho que recicla componentes, à moda do RecyclerView. - [Catálogo de Componentes · WebContainer](https://crossfly.dev/pt/docs/ui/widgets/webcontainer.md): Embute uma webview nativa (HTML/JS) dentro da UI — via a interface IWebView, dependente de plataforma. - [Catálogo de Componentes · Whiteboard](https://crossfly.dev/pt/docs/ui/widgets/whiteboard.md): Superfície de desenho livre à mão, com traço suavizado, cor e espessura configuráveis. ### Dados e serviços - [Gerência de estado](https://crossfly.dev/pt/docs/data-and-services/state-management.md): O padrão de estado do CrossFly — sem binding reativo, ViewModel manual + onUI + repaint. - [Persistência com SQLite](https://crossfly.dev/pt/docs/data-and-services/storage-sqlite.md): SqliteDb / SqliteStmt / SqliteCursor — CRUD, transações, escrita em massa e criptografia. - [Arquivos e "preferências"](https://crossfly.dev/pt/docs/data-and-services/files-and-preferences.md): A persistência leve foi removida — o que usar no lugar (SQLite kv ou arquivo em homeFolder). - [Rede e HTTP](https://crossfly.dev/pt/docs/data-and-services/networking-http.md): Sem cliente HTTP de alto nível — use java.net/OkHttp fora da paint thread, JSON com Jackson. - [Câmera e código de barras](https://crossfly.dev/pt/docs/data-and-services/device-camera.md): Capturar foto/vídeo com Camera.shot() e ler códigos com CameraBarcode.readBarcode. - [Localização e GPS](https://crossfly.dev/pt/docs/data-and-services/device-location-gps.md): Location (ao vivo), LocationService (background) e GPSThread (contínuo) — com as unidades certas. - [Bluetooth BLE / GATT](https://crossfly.dev/pt/docs/data-and-services/device-bluetooth-ble.md): A pilha BLE/GATT assíncrona (BluetoothManager) que substituiu o JSR-82/SPP. - [Biometria](https://crossfly.dev/pt/docs/data-and-services/device-biometry.md): Autenticação biométrica portável com Biometry.isAvailable() e authenticate(...). - [Som e utilidades de dispositivo](https://crossfly.dev/pt/docs/data-and-services/device-sound-and-misc.md): O resto da fachada Device — beep, vibrate, clipboard, rádios sem fio, TTS/STT, plataforma. - [Mapas](https://crossfly.dev/pt/docs/data-and-services/maps.md): MapContainer, pins, formas, rotas e utilitários — com as armadilhas de chave, null e thread. - [Trabalho em background](https://crossfly.dev/pt/docs/data-and-services/background-work.md): O padrão de threading do CrossFly — Thread/executor fora da paint thread, reentrando com onUI. ### Receitas - [Receitas · UI · Como abrir um menu de ações (ActionSheet)](https://crossfly.dev/pt/docs/cookbook/ui/menu-de-acoes.md): Exibir uma folha de ações estilo iOS na base da tela, com botões e um Cancelar. - [Receitas · UI · Como colocar um badge no canto de um avatar](https://crossfly.dev/pt/docs/cookbook/ui/badge-no-avatar.md): Posicionar um selo/contador sobreposto ao canto de outro componente com RelativeLayout. - [Receitas · UI · Como criar abas (TabBar)](https://crossfly.dev/pt/docs/cookbook/ui/abas.md): Montar uma barra de abas com conteúdo por aba e reagir à troca de aba. - [Receitas · UI · Como criar um card clicável](https://crossfly.dev/pt/docs/cookbook/ui/card-clicavel.md): Montar um Component com fundo arredondado, conteúdo em layout e resposta ao toque. - [Receitas · UI · Como mostrar spinner e barra de progresso (Progress)](https://crossfly.dev/pt/docs/cookbook/ui/spinner-e-progresso.md): Usar Progress nos três modos — ícone girando, barra determinada e indeterminada. - [Receitas · UI · Como mostrar um Hint (toast)](https://crossfly.dev/pt/docs/cookbook/ui/mostrar-um-hint.md): Exibir feedback efêmero não-modal que aparece e some sozinho. - [Receitas · UI · Como pedir confirmação com Alert](https://crossfly.dev/pt/docs/cookbook/ui/confirmar-com-alert.md): Abrir um diálogo modal de confirmação com botões Cancelar/OK e reagir à escolha. - [Receitas · UI · Como usar checkbox e radio (Option e Group)](https://crossfly.dev/pt/docs/cookbook/ui/checkbox-e-radio.md): Um Option sozinho vira checkbox; vários em um Group viram radio (seleção exclusiva). - [Receitas · UI · Como usar um Dropdown de seleção](https://crossfly.dev/pt/docs/cookbook/ui/dropdown-selecao.md): Abrir uma lista suspensa, reagir à escolha e obter o item selecionado. - [Receitas · Formulários · Como abrir um teclado numérico](https://crossfly.dev/pt/docs/cookbook/forms/teclado-numerico.md): Escolher entre teclado numérico nativo, Keypad embutido ou calculadora. - [Receitas · Formulários · Como aplicar máscara de CPF, CEP ou data](https://crossfly.dev/pt/docs/cookbook/forms/mascara-cpf.md): Formatar automaticamente CPF, CEP e datas com máscara e ler os dígitos limpos. - [Receitas · Formulários · Como criar um campo de data ou hora com picker](https://crossfly.dev/pt/docs/cookbook/forms/data-e-hora.md): Campo que abre o DatePicker ou TimePicker ao ser tocado e formata pelo locale. - [Receitas · Formulários · Como criar um campo de moeda](https://crossfly.dev/pt/docs/cookbook/forms/mascara-moeda.md): Campo com formatação monetária automática, casas decimais e leitura do valor numérico. - [Receitas · Formulários · Como criar um campo de senha com mostrar/ocultar](https://crossfly.dev/pt/docs/cookbook/forms/campo-de-senha.md): Campo de senha mascarado com botão de alternância de visibilidade. - [Receitas · Formulários · Como montar um formulário responsivo rótulo:campo](https://crossfly.dev/pt/docs/cookbook/forms/formulario-responsivo.md): Alinhar rótulos e campos em colunas proporcionais com GridLayout. - [Receitas · Formulários · Como validar um campo de texto](https://crossfly.dev/pt/docs/cookbook/forms/validar-campo.md): Restringir caracteres, limitar tamanho e ler o valor limpo antes de submeter. - [Receitas · Listas · Como exibir um popup de seleção modal](https://crossfly.dev/pt/docs/cookbook/lists/popup-de-selecao.md): Abrir uma lista como janela modal centralizada com linhas customizadas via ItemFactory. - [Receitas · Listas · Como exibir uma lista virtual com milhares de itens](https://crossfly.dev/pt/docs/cookbook/lists/lista-virtual-grande.md): Renderizar listas enormes com VirtualListView + DataAdapter reciclando views (estilo RecyclerView). - [Receitas · Listas · Como fazer uma lista simples selecionável](https://crossfly.dev/pt/docs/cookbook/lists/lista-simples.md): Exibir uma lista de textos e capturar a seleção com ListView (SINGLE ou MULTIPLE). - [Receitas · Listas · Como implementar carregar-mais (scroll infinito)](https://crossfly.dev/pt/docs/cookbook/lists/carregar-mais.md): Anexar mais itens automaticamente quando o usuário chega perto do fim da lista virtual. - [Receitas · Listas · Como paginar dados de servidor em uma lista virtual](https://crossfly.dev/pt/docs/cookbook/lists/paginacao.md): Carregar páginas sob demanda com PagedDataAdapter (cache LRU) sobre VirtualListView. - [Receitas · Listas · Como tornar um Component rolável e ajustar o overscroll](https://crossfly.dev/pt/docs/cookbook/lists/rolagem-e-overscroll.md): Habilitar scroll em qualquer Component com setScrollable e configurar o efeito elástico de borda. - [Receitas · Navegação · Como abrir e fechar uma tela](https://crossfly.dev/pt/docs/cookbook/nav/abrir-tela.md): Empilhar (push) e desempilhar (pop) telas com show() e hide(), montando a UI em onShow(). - [Receitas · Navegação · Como centralizar a navegação num controller](https://crossfly.dev/pt/docs/cookbook/nav/controller-de-navegacao.md): Encapsular push/pop da pilha do EventsProcessor num controller próprio, para navegação testável e desacoplada. - [Receitas · Navegação · Como pedir confirmação antes de uma ação destrutiva](https://crossfly.dev/pt/docs/cookbook/nav/dialogo-confirmacao.md): Exibir um Alert de confirmação com buttonAction, escurecer o fundo e dar feedback com Hint. - [Receitas · Navegação · Como receber um resultado de uma tela](https://crossfly.dev/pt/docs/cookbook/nav/receber-resultado.md): Abrir uma tela e receber um valor de volta — pickers via show(onAnswer), telas comuns via callback no construtor. - [Receitas · Dispositivo · Como autenticar com biometria (digital / Face ID)](https://crossfly.dev/pt/docs/cookbook/device/biometria.md): Verificar disponibilidade e autenticar o usuário com impressão digital, Face ID ou Windows Hello. - [Receitas · Dispositivo · Como deixar o usuário escolher um local no mapa](https://crossfly.dev/pt/docs/cookbook/device/escolher-local-no-mapa.md): Abrir um mapa com pino arrastável e GPS para o usuário confirmar uma coordenada (LatLon) via LocationPicker. - [Receitas · Dispositivo · Como escanear e conectar a um dispositivo Bluetooth (BLE)](https://crossfly.dev/pt/docs/cookbook/device/bluetooth-ble.md): Descobrir dispositivos Bluetooth, conectar e ler/receber notificações de características GATT. - [Receitas · Dispositivo · Como gravar um vídeo com áudio e limite de tempo](https://crossfly.dev/pt/docs/cookbook/device/gravar-video.md): Gravar vídeo (com ou sem áudio), definir qualidade e limite de duração, e obter o caminho do MP4. - [Receitas · Dispositivo · Como ler um QR Code ou código de barras](https://crossfly.dev/pt/docs/cookbook/device/ler-codigo-de-barras.md): Escanear QR/código de barras com a câmera usando BarcodePicker, ou decodificar uma Image com CameraBarcode. - [Receitas · Dispositivo · Como obter a posição GPS (latitude/longitude)](https://crossfly.dev/pt/docs/cookbook/device/obter-gps.md): Ler coordenadas do GPS do dispositivo com Location + retrieveGPSData(), ou rastrear continuamente com GPSThread. - [Receitas · Dispositivo · Como tirar uma foto e obter o caminho do arquivo](https://crossfly.dev/pt/docs/cookbook/device/tirar-foto.md): Capturar uma foto com a câmera do dispositivo e receber o caminho do JPEG salvo. - [Receitas · Dispositivo · Como usar Text-to-Speech (TTS) e Speech-to-Text (STT)](https://crossfly.dev/pt/docs/cookbook/device/tts-stt.md): Falar um texto em voz alta e transcrever a fala do usuário para texto, com configuração de locale/velocidade. - [Receitas · Dispositivo · Como vibrar, emitir beep e usar a área de transferência](https://crossfly.dev/pt/docs/cookbook/device/vibrar-beep-clipboard.md): Feedback rápido do dispositivo — vibração, som de beep e copiar/colar do clipboard. - [Receitas · Imagens · Como capturar um screenshot da tela](https://crossfly.dev/pt/docs/cookbook/images/screenshot.md): Capturar o backbuffer atual como uma Image com Main.getScreenShot e salvá-la. - [Receitas · Imagens · Como carregar uma imagem de arquivo ou da rede](https://crossfly.dev/pt/docs/cookbook/images/carregar-arquivo-rede.md): Carregar um PNG/JPEG/GIF de um arquivo local ou baixado da rede e exibi-lo com ImageView. - [Receitas · Imagens · Como definir uma imagem de fundo em um Component](https://crossfly.dev/pt/docs/cookbook/images/imagem-de-fundo.md): Adicionar uma imagem de fundo a qualquer Component com addBackgroundImage e ImageSize. - [Receitas · Imagens · Como gerar um thumbnail (miniatura)](https://crossfly.dev/pt/docs/cookbook/images/thumbnail.md): Redimensionar uma imagem para uma miniatura com resize(), escolhendo modo e qualidade. - [Receitas · Imagens · Como salvar uma imagem em PNG ou JPEG](https://crossfly.dev/pt/docs/cookbook/images/salvar-imagem.md): Gravar uma Image em disco (arquivo com timestamp) ou em um OutputStream, em PNG ou JPEG. - [Receitas · Animações · Como aplicar uma transição ao abrir/fechar uma tela](https://crossfly.dev/pt/docs/cookbook/anim/transicao-de-tela.md): Configurar uma transição (slide, fade, scale) na WindowStyle antes de show()/hide() — o CrossFly anima a troca de telas automaticamente. - [Receitas · Animações · Como criar um pulso contínuo (loop)](https://crossfly.dev/pt/docs/cookbook/anim/pulso-loop.md): Animar um valor em ciclo infinito com LoopAnimation, útil para indicadores de carregamento e efeitos de brilho. - [Receitas · Animações · Como fazer fade (aparecer/desaparecer) de um componente](https://crossfly.dev/pt/docs/cookbook/anim/fade.md): Animar a opacidade de um componente com AlphaAnimation, aplicando o valor via alpha() e repintando sob demanda. - [Receitas · Animações · Como mover um componente animando sua posição](https://crossfly.dev/pt/docs/cookbook/anim/mover-componente.md): Deslizar um componente de um ponto a outro com PositionAnimation (interpolação linear em pixels). - [Receitas · Dados · Como abrir ou criar um banco SQLite](https://crossfly.dev/pt/docs/cookbook/data/abrir-banco.md): Abrir/criar um arquivo .db com try-with-resources, usar banco em memória e criar tabelas. - [Receitas · Dados · Como acessar o banco fora da paint thread](https://crossfly.dev/pt/docs/cookbook/data/banco-fora-da-paint-thread.md): Rodar consultas SQLite em uma thread de trabalho e voltar à UI com Component.onUI. - [Receitas · Dados · Como escrever em massa com transação e bulkInsert](https://crossfly.dev/pt/docs/cookbook/data/transacao-e-bulk.md): Inserir milhares de linhas rápido — transação, statement reusado com reset() ou bulkInsert nativo. - [Receitas · Dados · Como fazer CRUD parametrizado no SQLite](https://crossfly.dev/pt/docs/cookbook/data/crud.md): Inserir, ler, atualizar e apagar com parâmetros posicionais e cursor, sem concatenar SQL. - [Receitas · Dados · Como usar um banco SQLite criptografado](https://crossfly.dev/pt/docs/cookbook/data/banco-criptografado.md): Abrir com chave, escolher a cifra, trocar/remover a chave e detectar chave errada. ### Boas Práticas - [Acessibilidade (a11y)](https://crossfly.dev/pt/docs/best-practices/acessibilidade.md): Alvos de toque generosos, contraste, texto que escala e feedback multissensorial no CrossFly. - [Arquitetura de app (MVVM, repositório, service locator)](https://crossfly.dev/pt/docs/best-practices/arquitetura-de-app.md): Como estruturar um app quando o CrossFly não impõe arquitetura, DI nem binding reativo. - [Internacionalização (i18n)](https://crossfly.dev/pt/docs/best-practices/internacionalizacao.md): LocaleFormats cuida da formatação; a tradução de texto é manual — onde o framework ajuda e onde não. - [Performance e listas grandes](https://crossfly.dev/pt/docs/best-practices/performance-e-listas-grandes.md): Manter 60 fps com muitos dados — virtualização (VirtualListView), paginação e onPaint barato. - [Responsividade: uma UI para todas as telas](https://crossfly.dev/pt/docs/best-practices/responsividade.md): Telas que se adaptam sozinhas a tamanho, densidade, escala de fonte e orientação — sem media queries. - [Segurança](https://crossfly.dev/pt/docs/best-practices/seguranca.md): Banco criptografado (SQLite3MC), biometria como porta de acesso e cuidados com dados locais. - [Testes automatizados de UI](https://crossfly.dev/pt/docs/best-practices/testes.md): TestCase/TestSuite rodando no runtime gráfico, com comparação visual de screenshots (golden images). - [Tratamento de erros e logging](https://crossfly.dev/pt/docs/best-practices/tratamento-de-erros-e-logging.md): Debug.handle como funil de exceções, reagir a erros específicos e mostrar falhas ao usuário. ### Plataformas — construir, rodar e publicar - [Matriz de plataformas e recursos](https://crossfly.dev/pt/docs/platforms/overview.md): O modelo multi-módulo (core + launchers) e o que cada plataforma suporta. - [Desktop (Windows/macOS/Linux) com LWJGL3](https://crossfly.dev/pt/docs/platforms/desktop-lwjgl3.md): O loop de iteração rápida — rodar, título/rotação, crossfly-lib e a pegadinha do macOS. - [Android](https://crossfly.dev/pt/docs/platforms/android.md): Do installDebug ao AAB — launcher, início atrasado por permissões, manifesto, status bar e Voltar. - [iOS / iPadOS com RoboVM](https://crossfly.dev/pt/docs/platforms/ios.md): A toolchain RoboVM (AOT), o IOSLauncher, Info.plist e os pontos sensíveis do WKWebView. - [Web (TeaVM/WebGL) e suas limitações reais](https://crossfly.dev/pt/docs/platforms/web-teavm.md): O app compilado para JS via TeaVM rodando em canvas WebGL2 — e o que NÃO funciona. - [Integração nativa (PlatformUtils, JNI, crossfly-lib)](https://crossfly.dev/pt/docs/platforms/native-integration.md): Como o código Java neutro alcança o SO — o ponto único PlatformUtils e o padrão de fallback. - [Build, assinatura e distribuição](https://crossfly.dev/pt/docs/platforms/building-and-releasing.md): O fim do pipeline por alvo — build.gradle, assinatura e publicação em cada plataforma. ### Migrar para o CrossFly — vindo de outro framework - [Filosofia: CrossFly vs. declarativo-reativo](https://crossfly.dev/pt/docs/migrate/overview.md): A mudança de mentalidade compartilhada por quem vem de Flutter, Compose, SwiftUI ou React Native. - [Vindo do Flutter](https://crossfly.dev/pt/docs/migrate/from-flutter.md): Tabela Widget→Component completa e exemplos "como era / como fica" para quem vem do Flutter. - [Vindo do Jetpack Compose](https://crossfly.dev/pt/docs/migrate/from-jetpack-compose.md): Mapeamento @Composable→Component e o contador reativo reescrito como campo + repaint(). - [Vindo do SwiftUI](https://crossfly.dev/pt/docs/migrate/from-swiftui.md): Mapeamento View/@State→Component e um formulário reescrito, com a diferença de destino. - [Vindo do React Native](https://crossfly.dev/pt/docs/migrate/from-react-native.md): Mapeamento JSX/useState→Component em código Java, sem bridge e sem hot-reload. - [Vindo do TotalCross / SuperWaba](https://crossfly.dev/pt/docs/migrate/from-totalcross.md): A linhagem — o que permanece familiar e o que a modernização 2026 mudou/removeu. ### Referência - [Como a referência é organizada](https://crossfly.dev/pt/docs/reference/overview.md): As três camadas da referência do CrossFly e a regra de fonte única. - [Índice de API](https://crossfly.dev/pt/docs/reference/api-reference.md): Mapa navegável dos 36 capítulos técnicos por parte e pacote Java, mais o Javadoc gerado. - [Catálogo de widgets](https://crossfly.dev/pt/docs/reference/widget-catalog.md): Todos os widgets por família, com link para a página e o capítulo dono — e os widgets removidos. - [Enums e constantes de UIConstants](https://crossfly.dev/pt/docs/reference/enums-uiconstants.md): Referência dos enums, constantes e tipos aninhados de dev.crossfly.ui.UIConstants. - [Folhas de cola](https://crossfly.dev/pt/docs/reference/cheat-sheets.md): Referência de bolso — assinaturas de add() por layout, Relative, cores ARGB e threading. - [Glossário](https://crossfly.dev/pt/docs/reference/glossary.md): Termos próprios do CrossFly e o dicionário de renomeações da modernização 2026. ### Recursos - [Apps de amostra executáveis](https://crossfly.dev/pt/docs/resources/examples.md): Projetos-exemplo completos que você clona e roda no desktop — o substituto nativo do "sandbox". - [Amostras e tutoriais](https://crossfly.dev/pt/docs/resources/samples-and-tutorials.md): Índice curado de tutoriais passo a passo e amostras temáticas, internos e da comunidade. - [Vídeos](https://crossfly.dev/pt/docs/resources/videos.md): Galeria de vídeos — introduções, walkthroughs, talks e screencasts, por nível e tema. - [Comunidade e suporte](https://crossfly.dev/pt/docs/resources/community-and-support.md): Onde pedir ajuda, como fazer uma boa pergunta e a distinção comunidade vs. canais comerciais. - [Changelog / What's new](https://crossfly.dev/pt/docs/resources/changelog-whats-new.md): O histórico de mudanças, com destaque para a modernização 2026 — a maior virada da API. - [Roadmap](https://crossfly.dev/pt/docs/resources/roadmap.md): O rumo do projeto — o que amadurece, o que é esqueleto no core e o que o framework não fornece de propósito. - [Contribuindo](https://crossfly.dev/pt/docs/resources/contributing.md): Como contribuir com código e com a doc — docs-as-code, Definition of Done e screenshots automáticas. ### FAQ - [FAQ — Perguntas Frequentes](https://crossfly.dev/pt/docs/faq/perguntas-frequentes.md): Respostas curtas às dúvidas mais comuns do CrossFly, cada uma com link para a página canônica. ### Solução de problemas - [Erros de compilação (APIs removidas/renomeadas 2026)](https://crossfly.dev/pt/docs/troubleshooting/compilation.md): cannot find symbol / package does not exist — a tabela de conserto legado → atual. - [Erros de runtime](https://crossfly.dev/pt/docs/troubleshooting/runtime.md): Exceções e falhas em execução — MainWindow, FrameBuffer, thread de fundo, UI no construtor. - [Problemas de renderização](https://crossfly.dev/pt/docs/troubleshooting/render.md): A tela não reflete o código — render sob demanda, alpha, invalidação de layout, GPU fraca. - [Build e Gradle](https://crossfly.dev/pt/docs/troubleshooting/build-gradle.md): Falhas antes de a app subir — dependência, biblioteca nativa, classname, assets, Web/TeaVM. - [Específicos por plataforma](https://crossfly.dev/pt/docs/troubleshooting/platform-specific.md): "Funciona no desktop, quebra no celular" — status bar, teclado, permissões, BLE stub, densidade. ## Novo projeto - [Gerador de projetos](https://crossfly.dev/new): escolha plataformas, primeira tela, skin e bibliotecas e baixe um projeto Gradle pronto. A configuração vai na URL (name, pkg, p=desktop,android,ios,web, t, skin, theme, brand, a=) - [Starter em JSON](https://crossfly.dev/starter/bundle.json): os templates e o registro de bibliotecas que o gerador usa ## Exemplos (rodam no navegador, com o código inteiro) - [Índice de todos os exemplos, em JSON](https://crossfly.dev/examples.json): 38 exemplos — id, título, assunto e onde buscar cada um - [Brief para assistentes de IA](https://crossfly.dev/ai.md): as regras que são caras de descobrir, mais o índice do catálogo de API - [Catálogo de API](https://crossfly.dev/ai/api-catalog.md): todo tipo e membro público de dev.crossfly, uma linha cada - [Guia de posicionamento](https://crossfly.dev/ai/layout-guide.md): qual layout escolher e quando usar setRelativeBounds - [Construindo sobre o CrossFly](https://crossfly.dev/ai/agents.md): regras firmes, como tornar uma tela testável e as armadilhas já pagas ### Aplicativos completos (uma forma arquitetural cada) - [Depot — offline-first CRUD](https://crossfly.dev/examples/app-crud.md): One shell, three listings over a local database, a detail and a long form. A thing you navigate away from is a Window; a thing you switch between is not. - [Pulse — a dashboard](https://crossfly.dev/examples/app-dashboard.md): One screen, read rather than operated: a headline number, a KPI grid and charts, all re-fed by the single control that changes the period. - [Fieldwork — capturing from the device](https://crossfly.dev/examples/app-capture.md): Every capture has three states, not two: empty, captured, and unavailable on this device — and the third is the one a phone-only developer never sees. - [Order entry — a wizard](https://crossfly.dev/examples/app-wizard.md): A linear flow that validates per step, lets the reader walk back freely, and ends on a review built from the same data the steps collected. ### Receitas (uma tela, uma pergunta) - [Layouts](https://crossfly.dev/examples/layouts.md): Any Component becomes a container with setLayout. The same three labels, three ways. - [Theme tokens](https://crossfly.dev/examples/theme-tokens.md): Flip the switch. The token line follows the theme; the hardcoded one does not, and turns unreadable — no rebuild involved. - [Switching skins](https://crossfly.dev/examples/skins.md): Shape, radius, padding and typeface all come from the skin. Nothing below knows which one is in force. - [Bottom sheet with a fixed footer](https://crossfly.dev/examples/bottom-sheet.md): BottomSheet already gives you the header, the grabber, the close button and a footer that floats over the scroll. You only fill body(). - [Listing: cards or table](https://crossfly.dev/examples/listing.md): A card answers "what is this one?"; a row answers "how do these compare?". Which one the reader needs changes during the day, so Listing lets them switch. - [Choosing from a list](https://crossfly.dev/examples/select.md): ListViewWindow does single and multi selection, with the title, the confirm and the tap-to-choose already wired. - [Picking a date range](https://crossfly.dev/examples/date-range.md): DatePicker answers "which day". This answers "between which two", which has its own rules — and its own ways of being wrong. - [Reordering a list](https://crossfly.dev/examples/reorder.md): The first row has no up arrow and the last has no down arrow — hidden, not removed, so the column does not jitter as rows move. - [Making a screen testable](https://crossfly.dev/examples/testable.md): Tag anything a test must reach. Text breaks on rewording, class breaks on a second instance, index breaks on insertion — a tag breaks only when someone removes it. - [A form that fights back](https://crossfly.dev/examples/form.md): setMode does most of the work: it picks the keyboard, the mask and the validation together. A regex on the way out only tells the user they already got it wrong. - [Telling the user something](https://crossfly.dev/examples/telling.md): Interrupt in proportion to what you need back. A confirmation on something reversible teaches people to dismiss confirmations — including the one that mattered. - [Bottom nav that becomes a rail](https://crossfly.dev/examples/nav.md): One flag — tabsAtBottom — and the strip is a bottom bar on a phone and a rail on a tablet. Resize the window to see it happen. - [Waiting](https://crossfly.dev/examples/waiting.md): Known length gets a bar. Unknown gets a spinner. A finished measurement — a share, a score — gets a ring, and that one is not waiting at all. - [Cards that reflow](https://crossfly.dev/examples/reflow.md): Tell CardGrid the width a card wants, not how many columns to use. Resize the window — the reflow is the framework's, not yours. - [A header that collapses](https://crossfly.dev/examples/header.md): header() scrolls away, pinned() never does. Put the identity in the first and the control the reader needs at row 200 in the second. - [Charts](https://crossfly.dev/examples/charts.md): autoThemeColors themes the axes, grid and background — but NOT the series. A series left at colour 0 falls back to a library grey, and becomes the one thing on screen ignoring your brand. - [A list too big to build](https://crossfly.dev/examples/big-list.md): createView is rare, bindView is constant. Anything slow in bindView — a query, a request, an allocation — is felt directly as stutter while scrolling. - [Storing something](https://crossfly.dev/examples/storage.md): Add a few notes and reopen the recipe — they are still there. The same code runs on desktop, Android, iOS and the web. - [Capturing a signature](https://crossfly.dev/examples/signature.md): White pad, not the theme surface: the image is captured to be printed. Under dark mode a themed pad captures white ink on navy, which is unusable downstream. - [Pickers](https://crossfly.dev/examples/pickers.md): show(answer -> …) on all of them, and answer is null when the user backed out. The ones needing hardware live in R21, and the system file picker in R31 — those can be refused. - [Camera, barcode and GPS](https://crossfly.dev/examples/device.md): Ask whether the device HAS it before offering it. PlatformUtils.isSupported answers per capability, at runtime — never a check on which platform this is. - [Animation](https://crossfly.dev/examples/animation.md): Styles.animationDuration is the house value — match it, so the app moves at one speed. Anything the user waits through twice was too long the first time. - [Painting your own](https://crossfly.dev/examples/painting.md): A component is a rectangle that can draw. width/height are yours, getAutoHeight says how much room you want, and onPaint puts something in it. - [Floating action button](https://crossfly.dev/examples/fab.md): It floats over the content, so leave room at the bottom of the list — bottomInset is what stops it covering the last row nobody can then scroll past. - [A map with pins](https://crossfly.dev/examples/map.md): OSM needs no API key, so a map works the moment you write it. Opens in a window of its own — a native view inside a scrolling page floats over everything around it. - [Images](https://crossfly.dev/examples/images.md): Decode once, keep the Image, reuse it. Loading inside onPaint or inside a list's bind step is what makes scrolling stutter where the pictures are. - [Keyboard and focus](https://crossfly.dev/examples/focus.md): Tab follows the order you ADDED the fields, not where they ended up on screen. Build in reading order and the tab order is correct without being designed. - [Writing your own component](https://crossfly.dev/examples/own-component.md): Search dev/crossfly/ui first — most of what you are about to write is already there. When it genuinely is not, this is the shape. - [Brand and dark mode](https://crossfly.dev/examples/brand.md): One seed generates the whole palette, for both themes. Nothing below names a colour, which is why the switch needs no rebuild. - [Empty, loading and broken](https://crossfly.dev/examples/empty-states.md): Three of these are usually left to render as blank space. Blank space reads as a bug, never as an answer. - [Files, sharing and printing](https://crossfly.dev/examples/files.md): Ask the capability, not the platform. Phones, Windows 10+ and the Mac have the picker and the share sheet; Linux has no share sheet; a browser has the picker always and the sheet only sometimes. Printing takes a PDF, and every platform's own dialog does the rest. - [Video playback](https://crossfly.dev/examples/video.md): A native surface over the canvas, like the map. Ask the capability first: all five platforms have it now, and one that does not says so instead of showing black. - [Embedded web page](https://crossfly.dev/examples/webview.md): A native browser over the canvas, at this component's rect. On the web it is an