-
Notifications
You must be signed in to change notification settings - Fork 401
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add copy to clipboard feature for code blocks in md viewer #1433
feat: add copy to clipboard feature for code blocks in md viewer #1433
Conversation
Someone is attempting to deploy a commit to the TabNews Team on Vercel. A member of the Team first needs to authorize it. |
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
Fala @vilarjp, obrigado pelo PR! 💪 Muito legal a implementação 👍 Chegou a ver se não era simples fazer como plugin para o ByteMD? E o que acha de usar os ícones do Primer para ficar igual ao GitHub? https://primer.style/design/foundations/icons/copy-24 Tem algum bug duplicando o ícone. Veja na imagem ou no link abaixo: |
boa, @aprendendofelipe, realmente usar os ícones do Primer faz mais sentido, fica com uma aparência mais familiar ao que já estamos acostumados a ver. Também dei uma atualizada no código, movi para um arquivo separado no formato de um plugin do bytemd. Fico no aguardo de saber o que você achou 😄 Screen.Recording.2023-06-03.at.00.36.56.mov |
@vilarjp, pensando em manter o site mais clean, além de seguir uma UX que deve ter sido muito bem testada, que tal mostrar o ícone apenas nas mesmas situações em que ele é mostrado no GitHub? Por exemplo ao passar o mouse ou, no celular, ao tocar no trecho de código. |
Screen.Recording.2023-06-05.at.22.18.01.mov@aprendendofelipe feito 👨🏻💻 |
91bcc41
to
03204b8
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Massa @vilarjp!
Eu só vi um comportamento que imagino que não seja o que você queria, que é no celular o ícone sumir muito rápido após copiar o código.
Acho que só está levando o tempo da transição, e não aguardando o setTimeout
. Talvez seja porque o foco que faz o botão aparecer é perdido ao clicar, mas não sei se é isso.
Fora esse probleminha, fiz alguns questionamentos no código, apenas para você pensar se vale a pena mudar 👍
const copyIconSvg = | ||
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path d="M7.024 3.75c0-.966.784-1.75 1.75-1.75H20.25c.966 0 1.75.784 1.75 1.75v11.498a1.75 1.75 0 0 1-1.75 1.75H8.774a1.75 1.75 0 0 1-1.75-1.75Zm1.75-.25a.25.25 0 0 0-.25.25v11.498c0 .139.112.25.25.25H20.25a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path><path d="M1.995 10.749a1.75 1.75 0 0 1 1.75-1.751H5.25a.75.75 0 1 1 0 1.5H3.745a.25.25 0 0 0-.25.25L3.5 20.25c0 .138.111.25.25.25h9.5a.25.25 0 0 0 .25-.25v-1.51a.75.75 0 1 1 1.5 0v1.51A1.75 1.75 0 0 1 13.25 22h-9.5A1.75 1.75 0 0 1 2 20.25l-.005-9.501Z"></path></svg>'; | ||
|
||
const checkIconSvg = | ||
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path d="M21.03 5.72a.75.75 0 0 1 0 1.06l-11.5 11.5a.747.747 0 0 1-1.072-.012l-5.5-5.75a.75.75 0 1 1 1.084-1.036l4.97 5.195L19.97 5.72a.75.75 0 0 1 1.06 0Z"></path></svg>'; | ||
|
||
function copyToClipboard(text, buttonElement) { | ||
navigator.clipboard.writeText(text).then(() => { | ||
buttonElement.innerHTML = checkIconSvg; | ||
buttonElement.title = 'Copiado!'; | ||
buttonElement.classList.add('copied'); | ||
|
||
setTimeout(() => { | ||
buttonElement.innerHTML = copyIconSvg; | ||
buttonElement.title = 'Copiar'; | ||
buttonElement.classList.remove('copied'); | ||
}, 2500); | ||
}); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const copyIconSvg = | |
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path d="M7.024 3.75c0-.966.784-1.75 1.75-1.75H20.25c.966 0 1.75.784 1.75 1.75v11.498a1.75 1.75 0 0 1-1.75 1.75H8.774a1.75 1.75 0 0 1-1.75-1.75Zm1.75-.25a.25.25 0 0 0-.25.25v11.498c0 .139.112.25.25.25H20.25a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path><path d="M1.995 10.749a1.75 1.75 0 0 1 1.75-1.751H5.25a.75.75 0 1 1 0 1.5H3.745a.25.25 0 0 0-.25.25L3.5 20.25c0 .138.111.25.25.25h9.5a.25.25 0 0 0 .25-.25v-1.51a.75.75 0 1 1 1.5 0v1.51A1.75 1.75 0 0 1 13.25 22h-9.5A1.75 1.75 0 0 1 2 20.25l-.005-9.501Z"></path></svg>'; | |
const checkIconSvg = | |
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20"><path d="M21.03 5.72a.75.75 0 0 1 0 1.06l-11.5 11.5a.747.747 0 0 1-1.072-.012l-5.5-5.75a.75.75 0 1 1 1.084-1.036l4.97 5.195L19.97 5.72a.75.75 0 0 1 1.06 0Z"></path></svg>'; | |
function copyToClipboard(text, buttonElement) { | |
navigator.clipboard.writeText(text).then(() => { | |
buttonElement.innerHTML = checkIconSvg; | |
buttonElement.title = 'Copiado!'; | |
buttonElement.classList.add('copied'); | |
setTimeout(() => { | |
buttonElement.innerHTML = copyIconSvg; | |
buttonElement.title = 'Copiar'; | |
buttonElement.classList.remove('copied'); | |
}, 2500); | |
}); | |
} | |
import octicons from '@primer/octicons'; | |
function copyToClipboard(text, buttonElement) { | |
navigator.clipboard.writeText(text).then(() => { | |
buttonElement.innerHTML = octicons.check.toSVG(); | |
buttonElement.title = 'Copiado!'; | |
buttonElement.classList.add('copied'); | |
setTimeout(() => { | |
buttonElement.innerHTML = octicons.copy.toSVG(); | |
buttonElement.title = 'Copiar'; | |
buttonElement.classList.remove('copied'); | |
}, 2500); | |
}); | |
} |
Não são sugestões, mas sim questionamentos mesmo...
Será que não deveríamos utilizar a biblioteca ao invés de apenas copiar os ícones e deixar fixos no código? Obs. Eu não testei se o código está correto, apenas me baseei na documentação.
Caso seja melhor deixar fixo no código, não seria interessante informar de onde vieram?
Será que ficaria melhor deixar esse arquivo dentro de uma pasta como markdown>plugins
?
fala, @aprendendofelipe, eu não consegui simular esse comportamento aqui, no meu celular achei que ficou tudo ok (é um iphone e testei no chrome e no safari), você consegue fazer uma gravação da sua tela mostrando o que tá rolando? em relação a parte do SVG, eu copiei o valor deles e deixei como string em uma variável por que a lib que já temos no projeto ficaria algo assim então?
|
Isso mesmo, veja que a alteração que fiz no código importa essa biblioteca. A outra opção é deixar comentado de onde copiou 👍
Não não 😅... Sobre a pasta eu não falava dos ícones, mas sim do plugin que você criou. Talvez colocar ele dentro da pasta plugins ao invés de deixar o arquivo solto na pasta markdown.
Testado no Chrome em Samsung Galaxy, está assim: Bug.botao.de.copiar.o.codigo.mp4 |
@vilarjp, conseguiu reproduzir o comportamento do Android? Imagino que seja algo simples de resolver na estilização do botão. Se precisar de algo, manda aqui pra Turma ajudar 🤝 |
Passando aqui só pois lembrei que já tive muito problema com copiar e colar no navegador, lembro que tinham algumas especificações para isto ocorrer, lembro que haviam alguns navegadores que não aceitavam tal ação... Talvez eu esteja chovendo no molhado, mas bom avisar né 🤣 Achei um link aqui, talvez ajude |
Fechando o PR por inatividade, mas mantendo a issue #1422 aberta para que a solução seja implementada com a correção do bug existente. 🤝 |
Boa tarde a todos!
Esse PR segue como uma sugestão de implementação de código para a [Sugestão] Implementar botão para copiar snippets de código #1422
Screen.Recording.2023-06-02.at.15.37.03.mov