Navigation.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <!--
  2. Menu Navigation
  3. -->
  4. <template>
  5. <div v-intersect="onIntersect">
  6. <div v-show="false">{{ agent }}</div>
  7. <!-- Navigation (écran large) -->
  8. <div v-if="lgAndUp || (!isMobileDevice() && !nuxtReady)">
  9. <LayoutNavigationLg :menu="menu" />
  10. </div>
  11. <!-- Navigation (petit écran) -->
  12. <div v-else>
  13. <LayoutNavigationMd :menu="menu" />
  14. </div>
  15. </div>
  16. </template>
  17. <script setup lang="ts">
  18. import { useDisplay } from 'vuetify'
  19. import { useRequestHeaders } from '#app'
  20. import type { MainMenuItem } from '~/types/interface'
  21. import { useLayoutStore } from '~/stores/layoutStore'
  22. import { useClientDevice } from '~/composables/useClientDevice'
  23. // On force la version écran large au build côté serveur si l'écran fait plus de 1280px de large
  24. const nuxtReady = ref(false)
  25. onNuxtReady(() => {
  26. nuxtReady.value = true
  27. })
  28. const headers = useRequestHeaders()
  29. const agent = headers['user-agent']
  30. const { lgAndUp } = useDisplay()
  31. const { isMobileDevice } = useClientDevice()
  32. const menu: Array<MainMenuItem> = [
  33. {
  34. label: 'Nos logiciels',
  35. children: [
  36. { label: 'Opentalent Artist', to: '/opentalent_artist' },
  37. { label: 'Opentalent School', to: '/opentalent_school' },
  38. { label: 'Opentalent Manager', to: '/opentalent_manager' },
  39. ],
  40. },
  41. {
  42. label: 'Nos services',
  43. children: [
  44. { label: 'Formations', to: '/formations' },
  45. { label: 'Webinaires', to: '/webinaires' },
  46. ],
  47. },
  48. {
  49. label: 'À propos',
  50. children: [
  51. { label: 'Qui sommes-nous', to: '/qui-sommes-nous' },
  52. { label: 'Nous rejoindre', to: '/nous-rejoindre' },
  53. ],
  54. },
  55. { label: 'Actualités', to: '/actualites' },
  56. { label: 'Contact', to: '/nous-contacter' },
  57. ]
  58. const layoutStore = useLayoutStore()
  59. const onIntersect = (isIntersecting: boolean) => {
  60. layoutStore.setIsHeaderVisible(isIntersecting)
  61. }
  62. </script>
  63. <style scoped></style>