Spinner.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <script setup>
  2. const props = defineProps({
  3. isVisible: Boolean,
  4. type: {
  5. type: String,
  6. default: 'inline'
  7. },
  8. message: {
  9. type: String,
  10. default: 'commons.generating_otp'
  11. }
  12. })
  13. </script>
  14. <template>
  15. <div v-if="isVisible">
  16. <div v-if="type == 'fullscreen'" class="spinner-container">
  17. <div class="spinner-wrapper">
  18. <span id="icnSpinnerFull" class="is-size-1 spinner">
  19. <FontAwesomeIcon :icon="['fas', 'spinner']" spin />
  20. </span>
  21. <span>{{ $t(message) }}</span>
  22. </div>
  23. </div>
  24. <div v-if="type == 'fullscreen-overlay'" class="spinner-overlay-container">
  25. <div class="spinner-wrapper">
  26. <span id="icnSpinnerFull" class="is-size-1 spinner">
  27. <FontAwesomeIcon :icon="['fas', 'spinner']" spin />
  28. </span>
  29. <span>{{ $t(message) }}</span>
  30. </div>
  31. </div>
  32. <FontAwesomeIcon v-else-if="type == 'raw'" :icon="['fas', 'spinner']" spin />
  33. <div v-else class="has-text-centered mt-6">
  34. <span id="icnSpinner" class="is-size-4">
  35. <FontAwesomeIcon :icon="['fas', 'spinner']" spin />
  36. </span>
  37. </div>
  38. </div>
  39. </template>
  40. <style scoped>
  41. .spinner-container,
  42. .spinner-overlay-container {
  43. text-align: center;
  44. z-index: 100000;
  45. position: absolute;
  46. top: 0;
  47. left: 0;
  48. right: 0;
  49. bottom: 0;
  50. display: flex;
  51. align-items: center;
  52. justify-content: center;
  53. }
  54. .spinner-container,
  55. .spinner-overlay-container {
  56. top: 25%;
  57. height: 50%;
  58. }
  59. .spinner {
  60. display: block;
  61. }
  62. </style>