Projeto de estudo para praticar Vue 3 e técnicas de glassmorphism.
A ideia do app é simples: você envia uma imagem, o app transforma em um grid com paleta reduzida e vira um puzzle de colorir por células, que nem aqueles livrinhos relaxantes de colorir
- Upload de imagem (JPG/PNG) por clique ou drag-and-drop
- Geração de puzzle com ajuste de:
- tamanho da célula
- quantidade de cores (6, 8, 12 ou 16)
- Pintura no canvas com progresso em tempo real
- Modo "apenas cores corretas"
- Zoom, pan, encaixar na tela e reset de visualização
- Botão "resolver tudo"
- Exportação PNG do resultadi
- Persistência por
localStorage
- Vue 3
- Vite
- Pinia (para o estado global)
- Web Worker (processamento pesado fora da thread principal)
image-q(quantização de cores)
- Node.js
^20.19.0 || >=22.12.0 - Yarn 1.x (recomendado neste repo)
yarnyarn devyarn buildyarn preview- O usuário envia uma imagem.
- A UI manda o arquivo para um Web Worker.
- O worker redimensiona para o grid, reduz as cores e monta o "gabarito" (
targetGrid). - A store (Pinia) controla pintura, progresso, paleta e estado da sessão.
- O canvas renderiza o resultado e responde à interação de pintura/zoom/pan.
- Recebe a imagem e define o tamanho do grid com base no
cellSize. - Redimensiona a imagem para esse grid (cada pixel vira uma célula do puzzle).
- Usa quantização (
image-q+WuQuant) para reduzir para N cores (paletteSize). - Para cada célula, escolhe a cor da paleta mais próxima e salva no
targetGrid. - O
targetGridvira o gabarito: o canvas desenha números/guias e valida a pintura. - Durante a pintura, só células alteradas são redesenhadas (para melhor performance).
src/
components/ # UI (upload, controles, paleta, canvas, exportar)
composables/ # lógica reutilizável (worker, canvas, mouse paint)
stores/ # regra de negócio e estado global (Pinia)
workers/ # processamento de imagem em background
assets/ # tokens visuais e estilos globais
O foco não foi só "deixar bonito", mas entender como "aplicar vidro" em CSS de forma consistente:
- Tokens de tema (claro/escuro) para cor, blur, borda, sombra e contraste.
- Fundo em camada separada (
#bg-layer) para obackdrop-filterfuncionar de forma estavel - Superfícies com níveis diferentes (
glass-surface,--simple,--deep) para criar hierarquia visual - Persistência de tema no
localStorage