Banner.svelte 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <script lang="ts">
  2. import type { Banner } from '$lib/types';
  3. import { onMount, createEventDispatcher } from 'svelte';
  4. import { fade } from 'svelte/transition';
  5. const dispatch = createEventDispatcher();
  6. export let banner: Banner = {
  7. id: '',
  8. type: 'info',
  9. title: '',
  10. content: '',
  11. url: '',
  12. dismissable: true,
  13. timestamp: Math.floor(Date.now() / 1000)
  14. };
  15. export let dismissed = false;
  16. let mounted = false;
  17. const classNames: Record<string, string> = {
  18. info: 'bg-blue-500/20 text-blue-700 dark:text-blue-200 ',
  19. success: 'bg-green-500/20 text-green-700 dark:text-green-200',
  20. warning: 'bg-yellow-500/20 text-yellow-700 dark:text-yellow-200',
  21. error: 'bg-red-500/20 text-red-700 dark:text-red-200'
  22. };
  23. const dismiss = (id) => {
  24. dismissed = true;
  25. dispatch('dismiss', id);
  26. };
  27. onMount(() => {
  28. mounted = true;
  29. });
  30. </script>
  31. {#if !dismissed}
  32. {#if mounted}
  33. <div
  34. class=" top-0 left-0 right-0 p-2 mx-4 px-3 flex justify-center items-center relative rounded-xl border border-gray-100 dark:border-gray-850 text-gray-800 dark:text-gary-100 bg-white dark:bg-gray-900 backdrop-blur-xl z-40"
  35. transition:fade={{ delay: 100, duration: 300 }}
  36. >
  37. <div class=" flex flex-col md:flex-row md:items-center flex-1 text-sm w-fit gap-1.5">
  38. <div class="flex justify-between self-start">
  39. <div
  40. class=" text-xs font-black {classNames[banner.type] ??
  41. classNames['info']} w-fit px-2 rounded uppercase line-clamp-1 mr-0.5"
  42. >
  43. {banner.type}
  44. </div>
  45. {#if banner.url}
  46. <div class="flex md:hidden group w-fit md:items-center">
  47. <a
  48. class="text-gray-700 dark:text-white text-xs font-bold underline"
  49. href="/assets/files/whitepaper.pdf"
  50. target="_blank">Learn More</a
  51. >
  52. <div
  53. class=" ml-1 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-white"
  54. >
  55. <!-- -->
  56. <svg
  57. xmlns="http://www.w3.org/2000/svg"
  58. viewBox="0 0 16 16"
  59. fill="currentColor"
  60. class="w-4 h-4"
  61. >
  62. <path
  63. fill-rule="evenodd"
  64. d="M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z"
  65. clip-rule="evenodd"
  66. />
  67. </svg>
  68. </div>
  69. </div>
  70. {/if}
  71. </div>
  72. <div class="flex-1 text-xs text-gray-700 dark:text-white">
  73. {banner.content}
  74. </div>
  75. </div>
  76. {#if banner.url}
  77. <div class="hidden md:flex group w-fit md:items-center">
  78. <a
  79. class="text-gray-700 dark:text-white text-xs font-bold underline"
  80. href="/"
  81. target="_blank">Learn More</a
  82. >
  83. <div class=" ml-1 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-white">
  84. <!-- -->
  85. <svg
  86. xmlns="http://www.w3.org/2000/svg"
  87. viewBox="0 0 16 16"
  88. fill="currentColor"
  89. class="size-4"
  90. >
  91. <path
  92. fill-rule="evenodd"
  93. d="M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z"
  94. clip-rule="evenodd"
  95. />
  96. </svg>
  97. </div>
  98. </div>
  99. {/if}
  100. <div class="flex self-start">
  101. {#if banner.dismissible}
  102. <button
  103. on:click={() => {
  104. dismiss(banner.id);
  105. }}
  106. class=" -mt-[3px] ml-1.5 mr-1 text-gray-400 dark:hover:text-white h-1">&times;</button
  107. >
  108. {/if}
  109. </div>
  110. </div>
  111. {/if}
  112. {/if}