error.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <template>
  2. <TopBanner>
  3. <template #headline><slot name="headline">{{ error.statusCode }}</slot></template>
  4. <template #tagline><slot name="tagline">means I f*cked up…</slot></template>
  5. </TopBanner>
  6. <div id="content_box" :class="`flex flex-col bg-white pt-12 sm:pt-24`">
  7. <ClientOnly><CookieMonster /></ClientOnly>
  8. <MainMenu />
  9. <main class="container mx-auto max-w-screen-lg sm:px-12 px-2 prose">
  10. <article class="body grid grid-cols-1 gap-x-12 gap-y-0">
  11. <h3 class="text-5xl text-center -mt-6 sm:-mt-16">
  12. Sorry, I messed up.
  13. </h3>
  14. <p class="pt-12 py-6">Please copy the following error report and <a href="/contact" class="text-sky-500 underline">get in touch</a>.</p>
  15. <div>
  16. <button @click="copyToClipboard" class="btn btn-info btn-outline float-right">Copy to clipboard</button>
  17. <div id="errorReport">
  18. <p>Error code: {{ error.statusCode }}</p>
  19. <p>Message: {{ error.message }}</p>
  20. <p>URL: {{ error.url }}</p>
  21. <p v-if="error.data">Additional data: {{ error.data }}</p>
  22. <div v-html="error.description" />
  23. </div>
  24. </div>
  25. <p>&nbsp;</p><p>&nbsp;</p>
  26. </article>
  27. </main>
  28. </div>
  29. <Footer />
  30. </template>
  31. <style lang="pcss">
  32. @reference "./assets/css/main.css";
  33. article.body h2 {
  34. @apply mt-0;
  35. }
  36. </style>
  37. <script lang="ts" setup>
  38. // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
  39. const props = defineProps({
  40. error: Object
  41. })
  42. const copyToClipboard = () => {
  43. const element = document.getElementById('errorReport');
  44. if (navigator.clipboard && element) {
  45. navigator.clipboard.writeText(element.innerText).then(() => {
  46. alert("Error report copied. Head over to the contact section and get in touch!");
  47. });
  48. } else {
  49. alert("Clipboard API not available.");
  50. }
  51. }
  52. </script>