Navigation.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <!--
  2. Menu Navigation
  3. -->
  4. <template>
  5. <div v-if="nuxtReady" v-intersect="onIntersect">
  6. <!-- Navigation (écran large) -->
  7. <div v-if="lgAndUp">
  8. <LayoutNavigationLg :menu="menu" />
  9. </div>
  10. <!-- Navigation (petit écran) -->
  11. <div v-else>
  12. <LayoutNavigationMd :menu="menu" />
  13. </div>
  14. </div>
  15. <div v-else class="loading-screen">
  16. <v-img
  17. src="/images/logos/opentalent/Logo_Opentalent-gris.png"
  18. alt="Logo Opentalent - Agenda et logiciels culturels"
  19. class="logo ml-4"
  20. width="200"
  21. />
  22. <v-progress-circular indeterminate />
  23. </div>
  24. </template>
  25. <script setup lang="ts">
  26. import { useDisplay } from 'vuetify'
  27. import type { MainMenuItem } from '~/types/interface'
  28. import { useLayoutStore } from '~/stores/layoutStore'
  29. // On force la version écran large au build côté serveur si l'écran fait plus de 1280px de large
  30. const nuxtReady = ref(false)
  31. onNuxtReady(() => {
  32. nuxtReady.value = true
  33. })
  34. const { lgAndUp } = useDisplay()
  35. const menu: Array<MainMenuItem> = [
  36. {
  37. label: 'Nos logiciels',
  38. children: [
  39. { label: 'Opentalent Artist', to: '/opentalent_artist' },
  40. { label: 'Opentalent School', to: '/opentalent_school' },
  41. { label: 'Opentalent Manager', to: '/opentalent_manager' },
  42. ],
  43. },
  44. {
  45. label: 'Nos services',
  46. children: [
  47. { label: 'Formations', to: '/formations' },
  48. { label: 'Webinaires', to: '/webinaires' },
  49. ],
  50. },
  51. {
  52. label: 'À propos',
  53. children: [
  54. { label: 'Qui sommes-nous', to: '/qui-sommes-nous' },
  55. { label: 'Nous rejoindre', to: '/nous-rejoindre' },
  56. ],
  57. },
  58. { label: 'Actualités', to: '/actualites' },
  59. { label: 'Contact', to: '/nous-contacter' },
  60. ]
  61. const layoutStore = useLayoutStore()
  62. const onIntersect = (isIntersecting: boolean) => {
  63. layoutStore.setIsHeaderVisible(isIntersecting)
  64. }
  65. </script>
  66. <style scoped lang="scss">
  67. .loading-screen {
  68. display: flex;
  69. flex-direction: row;
  70. align-items: center;
  71. justify-content: flex-start;
  72. height: 120px;
  73. padding: 16px;
  74. margin: 0 10%;
  75. .v-img {
  76. max-width: 300px;
  77. }
  78. .v-progress-circular {
  79. color: var(--primary-color);
  80. }
  81. }
  82. </style>