Repository navigation
Release 1.0.0 - #1
Merged
Merged
Conversation
Plano da Fase 1 apos investigacao: arquitetura de display list (Scene) entre composicao e renderizacao, Next 16 com export estatico, verificacao de leitura com jsQR em Web Worker. Limite de logo ajustado de 25% para 16% de area com base em testes de decodificacao - jsQR e ZXing falham em 25% mesmo com correcao H. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Substitui Vite por Next 16 (App Router, output: export), TypeScript strict com noUncheckedIndexedAccess, Tailwind 4 com os tokens do brand board e a suite de testes completa. Zera os namespaces --radius-*, --shadow-* e --blur-* do Tailwind: as utilidades correspondentes deixam de existir, tornando a regra de raio zero do board impossivel de violar por engano. Modo escuro via light-dark(), com as cores do QR deliberadamente fora do mecanismo de tema - o codigo continua escuro sobre claro para nao falhar em scanners. E2E ja cobre dois criterios de aceite: border-radius zero e nenhuma requisicao de rede fora da origem. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Cria QrArtifact normalizando as armadilhas da biblioteca qrcode:
nivel de correcao vem como { bit } com numeracao propria, e o
get() da matriz recebe (linha, coluna) - escrever get(x, y)
produziria um QR espelhado que jsQR e ZXing leem sem reclamar
mas parte dos leitores de celular recusa. A matriz e indexada
explicitamente por y * size + x, com teste ancorado no modulo
escuro do ISO/IEC 18004.
Tabela de capacidade propria em vez de API privada do qrcode,
com dois guardas: cross-check das 160 celulas e verificacao
comportamental de fronteira.
Adiciona deteccao de polaridade invertida ao contraste: inverter
as duas cores mantem a razao identica, entao o numero sozinho
nunca detectaria o problema.
Corrige afirmacao da investigacao: o par medido que decodificou
da 4,79:1 e passa no limiar, nao 3,5:1 como eu havia estimado.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Interpoe uma Scene entre composicao e desenho: cada moldura sera escrita uma vez como funcao pura e os renderers viram um switch sobre kind, sem regra de negocio. Elimina por construcao o risco de SVG e PDF divergirem nas 14 molduras. O no do codigo guarda o QrArtifact em vez de um path ja resolvido - com o caminho pronto, o rasterizador precisaria de um interpretador de SVG path para poder verificar a leitura. Merge de modulos em runs horizontais: SVG de 69,6 KB cai para 8,6 KB num v8, e o designer abre 1 objeto em vez de 1.256. Equivalencia provada por comparacao exata de conjuntos e por rasterizacao pixel a pixel contra uma segunda implementacao. Padroniza align em ingles nos renderers: os testes passavam com valores em portugues porque nenhum conferia o text-anchor de saida. Testes de comportamento adicionados. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Decodifica de volta o resultado renderizado e compara com o conteudo original, nos quatro niveis de correcao, com e sem logo. Quando falha, o diagnostico nao e heuristica: remove o logo, devolve as cores ao padrao e aumenta a escala, em experimentos controlados. O primeiro que faz o codigo voltar a ler e a causa isolada por eliminacao. Polaridade invertida e checada antes, porque inverter as duas cores mantem a razao de contraste identica e nenhum experimento a distinguiria. Area do logo passa a ser relativa a matriz, nao ao artefato com quiet zone - 8 modulos sem dado liberariam um logo maior que o testado. Comparacao por lado em vez de area, para o tamanho maximo nao ser recusado por erro de ponto flutuante. Tira rotacao do relatorio de dano padrao: satura em 45 graus nos quatro niveis, porque o QR e invariante a rotacao por construcao. jsQR fica atras de uma interface e fixado sem caret. Verificacao roda em Web Worker com debounce e politica de ultimo-pedido-vence. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Logo com a geometria 7:5:3 do padrao de localizacao e o canto inferior direito vazio, que o board trata como elemento de marca. A regra de escala e implementada, nao documentada: abaixo de 16 px o vao interno colapsa e o componente troca sozinho para o icone de aplicativo cheio. Oito icones proprios em grade 24 com traco 2 e construcao ortogonal - teste garante que nenhum path tem comando de curva. SeloPermanencia nao expoe prop de texto: o board determina que o literal nunca seja reescrito, e uma prop convidaria a isso. Componentes de UI com acessibilidade resolvida na origem: segmentado e radiogroup com setas e roving tabindex, Caixa usa checkbox nativo escondido, Campo liga a ajuda por aria-describedby e so vira alert no erro. Nenhum declara foco proprio, porque o :focus-visible global ja aplica o anel do board. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Campo com validacao, seletor de correcao, tamanho com unidade e DPI, personalizacao de cor com contraste, logo central e ficha tecnica com numeros calculados - nao os do board, que exibe uma capacidade impossivel para v6 em nivel H. O E2E fecha o circuito que ficou aberto no incremento 3: prova que o Web Worker sobe no export estatico e que a verificacao de leitura roda no navegador, nao so no Node dos unitarios. Exportacao bloqueada quando a verificacao falha. Entregar um arquivo que nao le e pior do que nao entregar, porque o usuario so descobre depois de mandar imprimir. Baixar o nivel de correcao descarta o logo em vez de manter um logo que quebraria o codigo. Trocar unidade preserva o tamanho fisico; trocar DPI em px reconverte o lado. Dispensa o Context previsto no plano: nao ha consumidor fora da subarvore do Gerador, entao useReducer local basta. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
As 8 do board mais tag de roupa com furo de cordao, grade recortavel, cartao de visita, display de mesa dobravel, cartaz e faixa horizontal. Cada uma e uma funcao pura que devolve Scene, entao SVG, PNG e PDF as renderizam sem duplicacao. Toda cena passa por uma moldura, inclusive "sem moldura" - que e a primeira das catorze, nao um caso especial. Um caminho so para compor, em vez de dois que poderiam divergir. Corrige a verificacao para recortar a regiao do codigo antes de decodificar. Molduras que repetem o QR apresentam varios conjuntos de padroes de localizacao na mesma imagem e o decodificador nao sabe qual seguir - a grade e o display de mesa eram reprovados sendo perfeitamente legiveis. Corrige nosSobrepondoOCodigo para respeitar a ordem de pintura: a placa de fundo de qualquer moldura era acusada de invadir o codigo mesmo estando por baixo dele. Corrige o cartao de visita, que descartava o logo em silencio. Cada moldura e verificada por decodificacao, em duas cores de moldura. O criterio de aceite virou assercao. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
pdf-lib e fontkit entram por import() no clique de exportar: first-load fica em 206 KB gzip e o chunk de PDF, com 532 KB, so e baixado por quem usa. Fontes embutidas em vez de servidas de /public. Um fetch, mesmo da propria origem, abriria um caminho de rede num produto cuja tese e que nada sai do navegador - e o E2E confirma que exportar PDF nao dispara requisicao alguma. As 441 KB de TTF viram 66 KB apos instanciar o Archivo variavel em wght=800/wdth=125 e subsetar para Latin-1 e Latin Extended-A. O codigo sai como retangulos e nao como path unico: assim o fluxo de conteudo pode ser lido de volta e a matriz reconstruida, o que prova a geometria do PDF sem rasterizador de PDF. Corrige um erro de tamanho fisico: o renderizador encolhia a peca para abrir espaco ao selo, e um pedido de 40 mm virava 34 mm em silencio. Agora a pagina cresce e a escala e 1; em papel fixo a peca reduz para caber, mas nunca amplia. Acrescenta papel A4/Carta/Etiqueta, marcas de corte, sangria de 3 mm e preto 100% K - uma chapa em vez de quatro, que e o que grafica e serigrafia pedem. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Quatro rotas com titulo e descricao proprios, sitemap, robots, manifesto e icones gerados da mesma geometria 7:5:3 do componente Logo - assim eles nao podem divergir do simbolo da interface. Service worker escrito a mao, sem next-pwa: o gerador funciona offline depois da primeira visita, o que faz "nao depende deste site" valer tambem para a ferramenta, nao so para o arquivo. Lighthouse 98/100/100/100. Chegar a 100 em acessibilidade exigiu corrigir tres problemas reais, dois deles contra o brand board: - Steel #6E7280 nao passa em AA como texto secundario. Da 4,36:1 sobre Quiet e 3,99:1 sobre Carbon, contra o minimo de 4,5:1. Ajustado por tema, mantendo o matiz. - Ultramarine como texto sobre Carbon da 2,64:1. O board acerta que ele serve em texto pequeno, mas so sobre fundo claro. - aria-label que substituia o rotulo visivel violava a WCAG 2.5.3. Abre excecao explicita de lint para o fetch do service worker, onde interceptar requisicao e justamente o proposito. README, ROADMAP e ARQUITETURA escritos como peca de portfolio, com as dividas conhecidas registradas e justificadas. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Nucleo /core/content: payload EMV-MPM em TLV com CRC-16/CCITT-FALSE para o Pix estatico, mais Wi-Fi, e-mail, SMS, telefone, geo e vCard. O Pix estatico e estatico por natureza — chave, nome e cidade viajam dentro do proprio desenho, sem redirecionamento nem consulta a servidor. Encaixe exato na tese do produto. Decisoes ancoradas em teste: - CRC-16/CCITT-FALSE confirmado pelo vetor canonico 0x29B1, que separa a variante certa das outras quatro que atendem pelo mesmo nome. - Digitos verificadores de CPF e CNPJ conferidos: chave errada gera QR perfeito para destino inexistente. - CNPJ pela regra alfanumerica de julho de 2026, identica a antiga no caso numerico. - Onze digitos sao CPF e celular ao mesmo tempo; o sinal de + desempata. - SSID hexadecimal sai entre aspas, senao a especificacao manda interpretar o nome da rede como bytes. - SMSTO em vez do sms: da RFC 5724, que os dois sistemas moveis implementam de formas incompativeis. - vCard 3.0 sem dobra de linha em 75 octetos. Ida e volta por decodificacao para todos os formatos, nao so montagem. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Estado passa a guardar `tipoConteudo` + os nove formularios vivos ao mesmo tempo: espiar outro tipo nao apaga o vCard de doze campos ja preenchido. A acao de escrita e distribuida sobre o tipo, entao um patch de Wi-Fi num formulario de Pix nao compila. O resto da cadeia continua vendo so uma string — matriz, cena, renderers e verificacao nao sabem que existem nove tipos. Segundo nivel de verificacao para o Pix: alem de decodificar de volta, o BR Code e remontado do TLV e o CRC conferido. Sao dois defeitos diferentes e nenhum cobre o outro. Correcao de acessibilidade encontrada no caminho: o `aria-labelledby` do controle segmentado usava um id derivado da legenda, e legenda com espaco vira multiplas referencias inexistentes. Trocado por `useId`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A tese arquitetural cobra a fatura: como a composicao e funcao pura, gerar mil pecas e um laco. O lote reaproveita `derivar`, a mesma cadeia da previa, entao a peca do lote e identica a que o usuario viu na tela. Tres formatos escritos a mao, sem dependencia nova: - CSV do RFC 4180, com deteccao de ponto e virgula (Excel pt-BR) e remocao de BOM. Cabecalho so e reconhecido por nome conhecido: chutar descartaria em silencio a primeira linha de um arquivo sem cabecalho. - ZIP com deflate da propria plataforma (CompressionStream) e data fixa, para que a mesma entrada produza o mesmo arquivo. - PNG sem DOM, para o Worker: 8 bits, RGB, filtro zero. As alternativas eram OffscreenCanvas, que sai do alcance dos testes em Node, ou uma biblioteca com deflate proprio. Verificacao por linha: o codigo que nao decodifica de volta fica fora do ZIP e aparece no relatorio com o numero da linha na planilha. E o defeito que ninguem descobre antes da impressao. Tres rotas novas: /qr-code-pix/, /qr-code-wifi/ e /qr-code-em-lote/. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
IndexedDB e nao localStorage pelo motivo que o roadmap ja registrava: uma configuracao com logo embutido e um data URI de centenas de KB, e o teto de 5 MB estoura em poucas entradas. O modulo e dividido por testabilidade: identidade, rotulo e poda sao funcoes puras em `registro.ts`, cobertas no Node; `db.ts` fica so com o que existe apenas no navegador, coberto por E2E que recarrega a pagina. Decisoes: - So grava depois que a verificacao confirma a leitura. Guardar configuracao quebrada encheria a lista do que ninguem quer de volta. - O identificador sai da configuracao inteira, entao voltar a uma antiga move a entrada para o topo em vez de duplicar. - Restaurar substitui o estado inteiro, sem merge: misturar duas configuracoes produziria uma terceira que ninguem verificou. - Pix, contato e Wi-Fi mostram o campo que o usuario reconhece, nao o payload cru — uma lista de `00020126...` seria ilegivel. - Sem IndexedDB (navegacao privada), o painel avisa e o gerador segue inteiro. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…mentacao Navegacao entre as sete rotas no rodape: sem ela cada landing seria uma ilha, alcancavel so por quem ja sabia que existe. Correcao de acessibilidade encontrada pelo Lighthouse: o seletor de arquivo do lote e `sr-only`, e escondido nao e o mesmo que ausente — o leitor de tela ainda o encontra e anunciava so "arquivo". Ganhou rotulo visualmente oculto, e a acessibilidade voltou a 100. O servidor de previa passou a comprimir os tipos textuais. Nao e otimizacao dele: e fidelidade. Sem compressao o mesmo build media 78 em desempenho — e o commit anterior a esta fase tambem, verificado por checkout. O numero era do servidor, nao do codigo. Com compressao: 99 / 100 / 100 / 100. Cache do service worker versionado para qrcs-v2. README, ARQUITETURA, ROADMAP e HANDOFF atualizados, com o procedimento de medicao do Lighthouse registrado para nao se repetir a confusao. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e medida O CSS ja resolvia claro e escuro por light-dark(), e [data-theme] ja estava previsto em globals.css — faltava quem trocasse. O site seguia o sistema operacional e quem quisesse o contrario nao tinha como pedir. Agora ha seletor de tres estados no cabecalho, com script inline aplicando antes da primeira pintura para nao piscar. `useSyncExternalStore` e nao `useState` + efeito: o tema ja esta no DOM antes da hidratacao, entao o componente le de fora do React em vez de montar um segundo estado. Cabecalho e rodape viraram componentes compartilhados. A pagina-tese copiava a marca a mao e estava sem rodape nenhum. O rodape credita a autoria com link para o LinkedIn, com teste E2E percorrendo as sete rotas. README no formato do Compressify: telas do proprio projeto, tabela de numeros medidos, arquitetura e documentacao. As capturas sao geradas por scripts/capturar-telas.mjs, que so fotografa depois da verificacao concluir. Duas correcoes que as capturas revelaram: 1. A ficha tecnica exibia "132 / 98 bytes" para um Pix. O codificador nao usa um modo so — quebra o conteudo em segmentos e escolhe o mais denso para cada um — entao comparar tamanho do texto com capacidade em modo Byte media coisas diferentes. Hoje compara bits ocupados contra bits disponiveis, com tabela nova de codewords de dados (cross-check das 160 celulas) e duas guardas: nunca passa da capacidade da versao, e nunca caberia na versao anterior. 2. A margem de dano rasterizava a peca inteira, entao com moldura o quadrado de oclusao ficava centrado no papel em vez do codigo: a mesma matriz reportava 5% em vez de 10%. Agora usa o mesmo recorte da verificacao. Lighthouse com compressao: 91-94 / 100 / 100 / 100. A faixa e de cinco execucoes; registrar o melhor numero seria escolher a execucao mais simpatica. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
No description provided.