Skip to content

Release 1.0.0 - #1

Merged
Igorpcferreira merged 16 commits into
mainfrom
refactor/fase-1
Jul 26, 2026
Merged

Igorpcferreira merged 16 commits into
mainfrom
refactor/fase-1

Conversation

@Igorpcferreira

Copy link
Copy Markdown
Owner

No description provided.

Igorpcferreira and others added 16 commits July 25, 2026 22:17
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>
@Igorpcferreira
Igorpcferreira merged commit b5be097 into main Jul 26, 2026
3 checks passed
Igorpcferreira added a commit that referenced this pull request Jul 26, 2026
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.

1 participant