Skip to content

Roadmap P4: virtualização, acessibilidade, versionamento e higiene (+ bug de paginação) - #8

Merged
afernandes merged 4 commits into
feat/detail-panel-positionfrom
feat/roadmap-p4
Jul 28, 2026
Merged

Roadmap P4: virtualização, acessibilidade, versionamento e higiene (+ bug de paginação)#8
afernandes merged 4 commits into
feat/detail-panel-positionfrom
feat/roadmap-p4

Conversation

@afernandes

Copy link
Copy Markdown
Owner

Resumo

Avança o P4 do ROADMAP.md: virtualização, acessibilidade, versionamento e higiene — mais um bug de paginação que apareceu durante os testes.

Base: sai de feat/detail-panel-position (#7). Pilha: #6#7 → este.

🐞 Bug encontrado durante o teste

A paginação estava off-by-one. OmniPagination.CurrentPage é zero-based, mas o app conta a partir de 1 — que é o número mostrado no "X-Y de Z". Sem conversão:

  • a página 1 aparecia como "2 / 100";
  • a última página ficava inalcançável, porque o clamp do app ia até UltimaPagina enquanto o componente esperava UltimaPagina - 1.

Bug meu, introduzido na migração do P2 ao trocar os botões manuais pelo componente. A tradução ficou na fronteira, dentro da LogToolbar. Verificado: 1-50 de 5000 com 1 / 100, e o próximo leva a 51-100 / 2 / 100.

Itens do P4

18. Virtualização da lista ✅

O roadmap pedia para medir antes — e a medição mostrou que virtualizar sozinho renderia pouco com páginas de até 100. O ganho real veio junto: a lista usa OmniVirtualize e o seletor ganhou 250/500/1000 itens por página. Verificado com 5000 eventos: página de 1000 rola sem travar.

20. Acessibilidade ✅

Os componentes da Omni já vêm tratados; os elementos clef-* próprios não estavam.

  • Lista: era uma pilha de <div> com @onclick — sem foco, sem teclado, não anunciada como lista selecionável. Virou role=listbox / role=option com tabindex, aria-selected e ativação por Enter/Espaço. Cada item ganhou um aria-label montado, porque o nível é um badge colorido — sem isso ele se perderia para quem usa leitor de tela.
  • Itens de grupo: viraram <button> de verdade (foco, teclado e semântica de graça).
  • Indicador de foco: nenhum elemento clef-* tinha. Adicionado via :focus-visible.

21. Versionamento 🟨 parcial

A versão vivia solta no csproj e ficou em 1.0.0 enquanto a Store já estava em 1.0.2 — o título da janela mostrava um número diferente do publicado. Novo Directory.Build.props como fonte única, consumida pelo csproj, pelo publish-store-package.ps1 e pelo release.yml (que passa /p:Version da tag, então o exe dentro do pacote carrega a mesma versão do manifesto). Verificado: o assembly agora sai 1.1.0.0.

Pendente do item: o auto-update da versão standalone.

23. Higiene ✅

  • Tipo de arquivo registrado virou "Clef Log File" ("Reader Log File" era sobra de copy/paste e divergia do manifesto).
  • RuntimeIdentifiers só com win-x64 — é o que o CI publica, o que o pacote contém e o que o README anuncia. Declarar win-x86 sugeria um suporte inexistente.
  • Não suprimi o MSB3277 remanescente: vem da unificação de WindowsBase pelo próprio pacote WebView2, e mascarar conflitos de assembly com NoWarn é pior que o ruído. Os avisos CS* do nosso código seguem zerados.

Verificação

  • 173 testes verdes; 0 erros, 0 avisos CS*.
  • Validado no app: 5000 eventos com página de 1000 rolando fluido; paginação exibindo e navegando corretamente; versão 1.1.0.0 no título.
  • Não verificado na tela: o anel de foco do teclado — a máquina bloqueou durante o teste. As mudanças de a11y são estruturais e compilam.

O que resta do P4

  • 19 — Painel de estatísticas / timeline (🔴 esforço alto): não iniciado.
  • 22 — i18n (🔴): não iniciado. O próprio roadmap registra que "só vale a pena se houver intenção real de alcance internacional na Store" — é uma decisão de produto, não técnica.

🤖 Generated with Claude Code

afernandes and others added 4 commits July 28, 2026 12:36
A versao vivia solta no csproj e ficou em 1.0.0 enquanto a Store ja estava em
1.0.2 — o titulo da janela, que le a versao do assembly, mostrava um numero
diferente do publicado.

Directory.Build.props passa a ser a fonte unica:
- o csproj herda Version/FileVersion/AssemblyVersion (verificado: o assembly
  agora sai 1.1.0.0);
- publish-store-package.ps1 usa esse valor quando -Version nao e informado;
- release.yml passa /p:Version com a versao da tag, entao o exe dentro do
  pacote carrega a mesma versao carimbada no manifesto — antes o manifesto ia
  com a versao da tag e o assembly ficava em 1.0.0.

Higiene:
- o tipo de arquivo registrado virou 'Clef Log File'; 'Reader Log File' era
  sobra de copy/paste e divergia do rotulo do Package.appxmanifest;
- RuntimeIdentifiers fica so em win-x64: e o que o CI publica, o que o pacote da
  Store contem e o que o README anuncia. Declarar win-x86 sugeria um suporte
  que nao existe.

Nao suprimi o aviso MSB3277 remanescente: ele vem da unificacao de WindowsBase
pelo proprio pacote WebView2 e mascarar conflitos de assembly com NoWarn e pior
do que conviver com o ruido. Os avisos CS do nosso codigo seguem zerados.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A lista montava um no no DOM por evento da pagina. O roadmap pedia para medir
antes: com paginas de ate 100 a virtualizacao renderia pouco, entao o ganho de
verdade vinha junto com paginas maiores.

A lista passa a usar OmniVirtualize (Height=null: o pai ja limita a altura e faz
o scroll; sem altura limitada o Virtualize renderiza tudo) e o seletor ganha
250/500/1000 itens por pagina. Verificado com 5000 eventos: pagina de 1000 rola
sem travar.

Correcao encontrada durante esse teste: OmniPagination e zero-based e o app
conta a partir de 1 — que e o numero mostrado no "X-Y de Z". Sem conversao, a
pagina 1 aparecia como "2 / 100" e a ultima pagina ficava inalcancavel, porque o
clamp do app ia ate UltimaPagina enquanto o componente esperava
UltimaPagina - 1. A traducao ficou na fronteira, dentro da LogToolbar. Bug meu,
introduzido na migracao do P2 ao trocar os botoes manuais pelo componente.
Verificado: "1-50 de 5000" com "1 / 100", e o proximo leva a "51-100" / "2 / 100".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Nao houve passe de a11y depois da migracao. Os componentes da Omni ja vem
tratados, mas os elementos clef-* proprios nao.

Lista de eventos: era uma pilha de div com @OnClick - nao recebia foco, nao
respondia ao teclado e o leitor de tela nao a anunciava como lista selecionavel.
Agora e role=listbox com itens role=option, tabindex e aria-selected, ativaveis
por Enter/Espaco. Cada item ganhou um aria-label montado com nivel, hora,
mensagem e a marca de excecao: sem ele o item seria lido como textos soltos e o
nivel, que visualmente e um badge colorido, se perderia.

Itens de grupo viraram button de verdade em vez de div com @OnClick - foco,
teclado e semantica de graca. Nao ha nada interativo aninhado, entao a troca e
segura; o CSS ganhou o reset de aparencia correspondente.

Indicador de foco: nenhum elemento clef-* tinha. Adicionado via :focus-visible,
que mostra o anel so na navegacao por teclado, sem poluir o clique de mouse.

O contraste ja tinha sido tratado na migracao (WCAG AA medido no DOM nos dois
temas), entao ficou de fora deste passe.

Nao consegui confirmar o anel de foco na tela: a maquina bloqueou durante o
teste. As mudancas sao estruturais e compilam, mas a verificacao visual fica
pendente.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 28, 2026 15:48
@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Advances the P4 roadmap items by improving UI scalability (virtualization), accessibility for custom clef-* elements, and centralizing versioning across build/publish paths, plus fixes an off-by-one pagination mismatch between the app and OmniPagination.

Changes:

  • Virtualizes the log list and expands page-size options (up to 1000) to keep large pages responsive.
  • Improves accessibility semantics and keyboard navigation (ARIA roles/labels, focus styling, real <button> for group items).
  • Centralizes versioning in Directory.Build.props and wires it into the Store packaging script/workflow; also fixes pagination 0-based vs 1-based translation.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/wwwroot/css/app.css Resets button styling for group items and adds visible focus styling for custom interactive elements.
src/Services/FileAssociationService.cs Aligns the registered file-type display name with the Store manifest.
src/Components/LogToolbar.razor Fixes OmniPagination zero-based vs app one-based page translation.
src/Components/LogList.razor Adds ARIA listbox/option semantics and virtualizes rendering to improve performance on large pages.
src/Components/LogHeader.razor Adds larger “items per page” options enabled by virtualization.
src/Components/LogGroupManager.razor Switches group items to real <button> elements for keyboard + semantics.
src/ClefExplorer.csproj Removes local version declarations and limits RIDs to win-x64 to match published support.
ROADMAP.md Updates P4 status entries to reflect completed/partial items.
publish-store-package.ps1 Adds fallback to Directory.Build.props for version when -Version isn’t provided.
Directory.Build.props Introduces a single source of truth for product/version attributes.
.github/workflows/release.yml Passes a version into the Store build to align outputs with the release tag.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread publish-store-package.ps1
Comment on lines 41 to +42
[Parameter(Mandatory = $true)]
[string]$Version,
[string]$Version = '',
Comment on lines 94 to +96
/p:UapAppxPackageBuildMode=StoreUpload
/p:AppxPackageSigningEnabled=false
/p:Version=${{ steps.ver.outputs.version }}
Comment thread src/wwwroot/css/app.css
Comment on lines +674 to +681
.clef-list-item:focus-visible,
.clef-filter:focus-visible,
.clef-group-item:focus-visible,
.clef-regex-toggle:focus-visible,
.clef-col-item:focus-within {
outline: 2px solid var(--omni-accent);
outline-offset: -2px;
}
@afernandes
afernandes merged commit 344ec49 into feat/detail-panel-position Jul 28, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants