CodeBlock.svelte 960 B

123456789101112131415161718192021222324252627282930313233343536
  1. <script lang="ts">
  2. import { copyToClipboard } from '$lib/utils';
  3. import hljs from 'highlight.js';
  4. import 'highlight.js/styles/github-dark.min.css';
  5. export let lang = '';
  6. export let code = '';
  7. let copied = false;
  8. const copyCode = async () => {
  9. copied = true;
  10. await copyToClipboard(code);
  11. setTimeout(() => {
  12. copied = false;
  13. }, 1000);
  14. };
  15. $: highlightedCode = code ? hljs.highlightAuto(code, hljs.getLanguage(lang)?.aliases).value : '';
  16. </script>
  17. <div class="mb-4">
  18. <div
  19. class="flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 rounded-t-lg overflow-x-auto"
  20. >
  21. <div class="p-1">{lang}</div>
  22. <button class="copy-code-button bg-none border-none p-1" on:click={copyCode}
  23. >{copied ? 'Copied' : 'Copy Code'}</button
  24. >
  25. </div>
  26. <pre class=" rounded-b-lg hljs p-4 px-5 overflow-x-auto rounded-t-none"><code
  27. class="language-{lang} rounded-t-none whitespace-pre">{@html highlightedCode || code}</code
  28. ></pre>
  29. </div>