CommunityImagemgithub.com

Traço a tinta

Desenha qualquer motivo como linha de tinta medida: primeiro o contorno, depois hachura, pontilhado e cor.

O que é Traço a tinta?

Este skill transforma um objeto, um lugar ou uma sequência em ilustração a traço, renderizada em HTML e JavaScript sem build. Cada desenho começa com um contorno pronto e depois recebe classe de pena, hachura, contra-hachura ou pontilhado, em perspectiva ou axonometria. Cobre produtos, pessoas, animais, plantas, edifícios, interiores, paisagens e storyboards curtos.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/vishlbhardwaj/doodle/tree/HEAD

Installed? Explore more Imagem skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Doodle

Um sistema de ilustração desenhado a código. Os temas são criados como geometria, projetados através de uma câmara e renderizados por uma 'mão' com semente que faz o traço parecer desenhado. HTML + JS puro, sem compilação, sem dependências: abra uma página no navegador.

Configuração: onde trabalhas

O motor vem incluído nesta skill em engine/ (ao lado deste ficheiro). Nunca o edites lá; uma atualização da skill substitui-o.

  1. Se LOCAL.md existir ao lado deste ficheiro, lê-o primeiro: ele nomeia o espaço de trabalho e as ferramentas desta máquina, e substitui o padrão abaixo.
  2. Caso contrário, o espaço de trabalho é ./.doodle (oculto) no projeto atual. Se não existir, cria-o: cp -R "<pasta desta skill>/engine" ./.doodle.
  3. Cada caminho abaixo (src/…, bin/…) é relativo ao espaço de trabalho. A renderização precisa de Chrome ou Chromium (CHROME=/caminho para substituir) e python3; nada mais.

Um desenho = bin/new.sh <nome>, que cria drawings/<nome>.js (desenha dentro de draw(S), toolkit completo, com moldura automática) e a página que o renderiza. Várias coisas numa só imagem são um desenho; várias imagens separadas são vários nomes.

Os exemplos são código, não páginas. Os módulos em src/ (things.js, people.js, trials.js, scapes.js …) contêm temas trabalhados: lê-os e copia a sua construção para o teu desenho; nunca lhes adiciones ou edites. A tabela de roteamento abaixo indica qual módulo deves usar como ponto de partida.

Entrega IMAGENS, não páginas. Quando um desenho estiver pronto, executa bin/render.sh <nome>: ele escreve doodles/<nome>/<nome>.png (a cores) e <nome>-line.png (apenas linhas) no projeto e abre essa pasta para o utilizador. Diz-lhe o caminho da pasta. Não construas, abras ou direciones o utilizador para uma página HTML, canvas ou painel de controlos a menos que ele peça.

Este ficheiro é todo o contrato, e é curto de propósito para carregar completamente. O detalhe está em references/ (movido para lá na íntegra, nada omitido). A tabela de ROTEAMENTO abaixo indica qual referência deves ler para o trabalho. Lê-la faz parte do trabalho, não é opcional: cada regra nesses ficheiros foi paga com um desenho rejeitado.

O procedimento, sempre

  1. Nomeia a FORMA e a CLASSE (tabelas abaixo). A forma decide a página, a moldura e o orçamento de detalhe; a classe decide a caneta, o bico, o preenchimento e o tom.
  2. Roteia. Lê os ficheiros de referência que a tabela de roteamento indica para o teu tema, e abre o módulo que ela nomeia como ponto de partida. Nunca comeces um tema a partir de um ficheiro vazio quando já existe um kit para ele.
  3. Mede antes de desenhar. A partir de uma imagem de referência: proporções e paleta, sondadas, nunca recordadas. Sem uma: escreve as proporções do tema como números no cabeçalho do módulo (o sapato precisou de oito números; três renderizações sem eles falharam). references/hand-and-craft.md § Medição.
  4. Constrói a LINHA PRIMEIRO. Avalia ?outline=1 antes da cor. Cada valor é transportado duas vezes, como preenchimento e em linha. O detalhe diminui do foco para o plano médio para o papel. references/line-first.md.
  5. Renderiza e OBSERVA, em linha E cor, ao tamanho da moldura. Folha de contactos para a composição, o grande plano único para a qualidade da linha. Ambos, todas as rondas.
  6. Corrige no KIT, não no tema, quando a rutura é de um auxiliar. Repete até cada tema se ler.
  7. bin/check.sh drawings/<nome>.html (sem argumento = todos os desenhos): renderiza, sem NaN, sem erros de consola, sem desvio de classe.
  8. Entrega: bin/render.sh <nome> — PNGs em doodles/<nome>/, pasta aberta.
  9. Integra o que aprendeste nesta skill NA MESMA RONDA (§ Evolução).

Roteamento: o que ler, por onde começar

TemaPonto de partidaLer
qualquer doodle, primeira vez numa sessãon/areferences/line-first.md, references/forms-and-classes.md
um objeto do quotidiano (telemóvel, chaves, garrafa, pano, óculos …)src/things.js (o mais próximo de 20; cam, S.prism, S.on, S.dash)things.md
um produto, dispositivo, gadget, eletrodomésticosrc/retro.js (Retro._kit)products.md, geometry.md
um objeto redondo (chávena, vaso, fruta, garrafa)palco src/stilllife.js (lathe, ball) ou src/still.jsstill-life.md, geometry.md (construção de caminhos)
uma natureza-morta / arranjo / a partir de uma fotosrc/stilllife.jsstill-life.md
mobiliáriosrc/furniture3.js, src/kitchen.jsproducts.md
um objeto do quotidiano (portátil, tesoura, óculos, escova de dentes, secador de cabelo, t-shirt, sabonete, caderno, cadeado, urso de peluche, cabide, mochila, garrafa…)src/things.js def(...)products.md, geometry.md
uma PESSOA, pessoas, alguém numa cenasrc/people.js People.figure; nunca Trials._figure (morto)people.md
um animalsrc/trials.js (cat)figures-and-trials.md
vidro, líquido, transparênciasrc/trials.js (glass)figures-and-trials.md
uma bicicleta, uma estrutura, qualquer coisa de tubos finossrc/trials.js (bicycle), S.limbfigures-and-trials.md
um sapato, uma peça de roupa, panosrc/trials.js (sneaker, fruit cloth)figures-and-trials.md
plantas, flores, folhassrc/plants3.js, src/flowers.js; folhas com buracos: trials.js monsteraplants.md, figures-and-trials.md
um edifício, casa, fachadasrc/houses.js, src/arch.js, src/arch2.jsarchitecture.md, geometry.md
uma paisagem, vista exteriorsrc/scapes.js (o kit de cena)landscapes.md
noite, escuro, tempo, chuvasrc/trials.js (night, rain) no kit de cenafigures-and-trials.md, landscapes.md
uma rua, um diorama, um cafésrc/cafe.js, src/scenes.jslandscapes.md, geometry.md
um quarto / interiorsrc/kitchen.js, src/deskscene.jsgeometry.md, landscapes.md (fidelidade)
pena e tinta, sem corsrc/pen.jsline-first.md (tom), forms-and-classes.md (ink)
um storyboard / sequênciasrc/board.jsstoryboards.md
lettering, um letreirosrc/letter.jspages-and-files.md
um ecrã, UI, terminal (texto claro em fundo escuro)src/letter.js + linhas com cor de tompages-and-files.md (entrada letter.js)
fazê-lo mexer (Rive)o exportador Rive (não incluído; vê o ficheiro)animation.md
vê-lo desenhar, subdesenho?draw=<key>, ?sketch=1hand-and-craft.md
limpo / vetorial / não rabiscadon/aa skill clean-illustration se estiver instalada
um CONJUNTO, um teste de stressuma página de conjunto existente como modelochecking.md
um doodle que deve ALINHAR com uma renderização (esboço → limpeza final)traça a silhueta, cria o interiorregistration.md
que página / ficheiro faz o quên/areferences/pages-and-files.md

Todos os caminhos references/ são relativos à pasta desta skill.

Formas

DisseramFormaExemplo para começarOrçamento de detalhe
"desenha-me uma caneca / uma cadeira"temasrc/things.js, src/retro.jstudo, uma coisa com total fidelidade
"faz-me N deles"conjuntoum desenho bin/new.sh por item, ajudantes partilhados em cadaum toolkit, o detalhe vive no toolkit
"uma casa / uma montra"elevaçãosrc/houses.js, src/arch.jstrês vãos, 55% preenchimento preto sólido
"uma rua / uma vista / uma paisagem"cenasrc/scapes.js, moldura + recorte declaradosa escada de profundidade de três degraus
"o quarteirão inteiro / um pequeno mundo"dioramasrc/cafe.jsas bordas do quarteirão ficam DENTRO da imagem
"um quarto"interiorsrc/kitchen.js, src/deskscene.jsprimeiro plano completo, parede de fundo característica
"storyboard disto"painelsrc/board.jsdefinido pelo TAMANHO DO PLANO, não pelo tema
"pena e tinta / sem cor"registo inksrc/pen.jstom transportado na linha, sem preenchimento algum

Um conjunto não é uma cena (coisas numa página partilham apenas uma folha), e um painel não é um conjunto (fidelidade igual perde a sequência). O indicador: as coisas devem partilhar o MESMO ESPAÇO? Então é uma cena.

Classes (src/spec.js; texto completo em references/forms-and-classes.md)

classecanetabicoajustepreenchimentotom
object0.30firme.84/.84liso, sombreado pela normal da facesombra é um PREENCHIMENTO mais escuro, mais o seu gémeo em linha
ink0.26caneta.90/.88NENHUM, o papel é o objetoapenas linha; uma trama de pontos é proibida
product0.30firme.84/.84um material = uma corapenas vincos > ~35°
elevation0.30firme.86/.8455% painéis pretos sólidoshachura nos telhados, no lado da sombra
plant0.30firme.84/.88liso; tom claro .96, outros .84apenas rabisco para massa de folhagem
flower0.26firme.92/.90lisonenhum
scene0.30firme.96/.94liso; sombra é um preenchimento mais escuroapenas hachura onde nada está à frente
diorama0.22firme.94/.92lisonenhum
panel0.26firme.94/.94liso, menos que o tema sozinhoum valor chão, um céu
furniture, interior0.16 / 0.15caneta—pesos LEGACY; novo trabalho usa object—

Declara a classe, nunca redigita os números: Spec.wrap(cls, label, build). bin/check.sh audita o desvio em cada página. Uma classe possui a mão; uma página possui o papel. Adiciona uma classe apenas quando a política de preenchimento ou tom for genuinamente diferente.

Regras rígidas (cada uma é um desenho rejeitado)

Linha primeiro e fidelidade

  • Apenas linha (?outline=1) deve ser um desenho ACABADO. Cada página honra ?outline=1; verifica páginas que copiaste (uma outline: false codificada).
  • Cada valor é transportado duas vezes: material escuro = hachura; uma curva = nervuras que se curvam com a superfície; uma sombra projetada = hachura sem contorno; uma marca que NOMEIA a coisa = uma marca com contorno, nunca um preenchimento w: 0. Audita cada w: 0.
  • O foco recebe detalhe completo, o plano médio contorno mais 2–3 linhas, o fundo é PAPEL (o seu único tom é a sombra que o tema projeta). Semi-fecha os olhos: se a parede for tão ocupada como o tema, corta a parede.
  • A hachura é ENFILERADA como linhas (S.hatch), nunca um tom k.T; preenchimentos posteriores cortam-na. gap é o valor: 2.4 claro, 1.5 médio, 1.1 escuro. Hachura cruzada apenas na ÚNICA coisa mais escura do foco.
  • Um lado de sombra é uma CRESCENTE limitada por curvas que se curvam com a forma, nunca um corte de semiplano reto (lê-se como um objeto partido em dois).

Geometria e construção de caminhos

  • Uma linha reta que não criaste é um bug de caminho: uma corda de concatenar duas metades na direção errada, ou uma forma aberta traçada closed. Imprime os pontos.
  • Uma faixa à volta de um corpo opaco é apenas a sua metade MAIS PRÓXIMA; apenas uma boca aberta é uma elipse completa.
  • Buracos são CORTADOS (keyhole), nunca pintados na cor de fundo. Buraco aparece em linha mas não em cor = o seu enrolamento.
  • Coisas finas (membros, tubos, caules) são UMA tira através das suas juntas; contorna os lados, deixa as pontas encaixarem no que é desenhado depois.
  • Recipientes: interior → borda distante → conteúdo → parede frontal. O conteúdo afunda abaixo do lábio.
  • Mede as proporções como números antes de desenhar um objeto conhecido. Esticar uma forma errada mantém-na errada (o sapato).
  • Dimensiona o mobiliário a partir do corpo que o usa, nunca o contrário.
  • Um doodle que deve registar-se com uma imagem: TRAÇA a sua silhueta a partir do alfa da imagem, cria o interior, fixa a moldura à imagem e corta o ajuste de classe na exportação (registration.md).
  • Pessoas: People.figure apenas. Gesto antes do detalhe (peso numa perna, ancas e ombros inclinam opostos); poses são ÂNGULOS, pelo que a proporção está bloqueada; mobiliário e coisas seguradas derivam das juntas devolvidas. Cabelo de trás pinta antes do corpo.
  • Uma longa linha tracejada reta através de uma forma suave = o bug da crescente (corrigido em S.soft); um torno ondulado = poucos nós + easing por segmento: usa um perfil denso com steps: 1.
  • { dash: true } não faz nada: usa S.dash. Enquadra objetos à sua caixa de conteúdo, não a olho.
  • "Desajeitado" = construção, não detalhe: avalia UM tema ao tamanho real; os contornos devem UNIR-SE (sem pontas abertas nas juntas), o tom é apertado e regular ou ausente, o peso da caneta encaixa a largura da forma.

Enquadramento

  • A moldura é DERIVADA, nunca digitada: nos kits de plano de imagem são os limites da PRIMEIRA região, pelo que a primeira chamada é S.panel(<a moldura>); com uma câmara, a partir da projeção. Algo não visível? Verifica se está dentro da moldura antes de o redesenhar maior. clip = true recorta para a moldura declarada.
  • Cada camada de chão vai até ao fundo da moldura (FOOT), ou o céu mostra onde uma camada mais próxima desce. Uma regra de chão atinge ambas as bordas de uma folha, não além delas.

Cenas, noite, tempo

  • Profundidade é um número d (0 perto, 1 longe) e a caneta, o intervalo de hachura, a cor e o detalhe leem-na todos. Uma montanha com o peso do banco é O falhanço da paisagem plana.
  • Noite inverte o valor: o céu é a hachura mais densa, cada luz um buraco recortado; um brilho é MAIS CLARO que o céu. Uma figura contra luz é uma silhueta hachurada.
  • A chuva é desenhada por último, ausente debaixo de um guarda-chuva; um reflexo é o tema invertido, esmagado, em faixas partidas, sem contorno.

Páginas e paletas

  • Uma página deve declarar cada chave de paleta que os seus temas usam; uma chave desconhecida já renderizou preto silenciosamente.
  • Execuções paralelas de Chrome headless precisam de um --user-data-dir separado cada uma, ou os screenshots saem em branco.

Verificar

cd <espaço de trabalho>                                     # vê Configuração
bin/check.sh drawings/<nome>.html                  # renderiza, sem NaN, sem erros de consola, sem desvio de classe
bin/shot.sh "drawings/<nome>.html?outline=1" out.png [1120x700]   # um aspeto funcional; remove ?outline=1 para cor
bin/render.sh <nome>                               # a entrega: doodles/<nome>/*.png, pasta aberta

O Chrome/Chromium é encontrado por bin/chrome.sh (substitui CHROME=/caminho); cada screenshot recebe o seu próprio --user-data-dir, pelo que execuções paralelas são seguras. Olha para cada PNG (abre-o, ou lê-o se conseguires ver imagens). Um check.sh que passa prova que renderizou, não que se lê.

Evoluir esta skill

Quando corrigires uma lacuna, escreve-a onde uma sessão NOVA a encontrará (se esta skill estiver instalada apenas para leitura, guarda estas notas no espaço de trabalho e diz isso):

  1. O ficheiro de referência do tópico (references/<topic>.md): a regra, com o seu sintoma, declarada como instrução.

...

[truncado para tradução]

Habilidades Relacionadas