Roadmap P4: virtualização, acessibilidade, versionamento e higiene (+ bug de paginação) - #8
Merged
Merged
Conversation
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>
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
There was a problem hiding this comment.
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.propsand 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 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 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; | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
🐞 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:UltimaPaginaenquanto o componente esperavaUltimaPagina - 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 5000com1 / 100, e o próximo leva a51-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
OmniVirtualizee 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.<div>com@onclick— sem foco, sem teclado, não anunciada como lista selecionável. Virourole=listbox/role=optioncomtabindex,aria-selectede ativação por Enter/Espaço. Cada item ganhou umaria-labelmontado, porque o nível é um badge colorido — sem isso ele se perderia para quem usa leitor de tela.<button>de verdade (foco, teclado e semântica de graça).clef-*tinha. Adicionado via:focus-visible.21. Versionamento 🟨 parcial
A versão vivia solta no
csproje 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. NovoDirectory.Build.propscomo fonte única, consumida pelo csproj, pelopublish-store-package.ps1e pelorelease.yml(que passa/p:Versionda 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 ✅
RuntimeIdentifierssó comwin-x64— é o que o CI publica, o que o pacote contém e o que o README anuncia. Declararwin-x86sugeria um suporte inexistente.MSB3277remanescente: vem da unificação deWindowsBasepelo próprio pacote WebView2, e mascarar conflitos de assembly comNoWarné pior que o ruído. Os avisosCS*do nosso código seguem zerados.Verificação
CS*.O que resta do P4
🤖 Generated with Claude Code