AppHeader.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <template>
  2. <header class="fixed top-0 left-0 right-0 z-50 bg-white shadow-sm h-16">
  3. <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-full flex items-center justify-between">
  4. <!-- Logo sempre à esquerda -->
  5. <button class="shrink-0 focus:outline-none" @click="scrollTo('quem-somos')" >
  6. <img
  7. class="hidden lg:block h-9"
  8. src="~/assets/images/logo_desktop.svg"
  9. alt="Serprati"
  10. >
  11. <img
  12. class="block lg:hidden h-8"
  13. src="~/assets/images/logo_mobile.svg"
  14. alt="Serprati"
  15. >
  16. </button>
  17. <!-- Todos os itens à direita -->
  18. <div class="flex items-center gap-6 lg:gap-8">
  19. <nav class="hidden lg:flex items-center gap-8">
  20. <template v-for="item in navItems" :key="item.id">
  21. <span v-if="item.disabled" class="nav-link opacity-50 cursor-default select-none">{{ item.label }}</span>
  22. <button v-else class="nav-link" @click="scrollTo(item.id)">{{ item.label }}</button>
  23. </template>
  24. </nav>
  25. <button
  26. class="border border-violet-normal text-violet-normal text-xs lg:text-sm font-semibold px-3 py-1.5 lg:px-5 lg:py-2 rounded-md hover:bg-violet-light transition-colors duration-200 cursor-pointer"
  27. @click="handleEntrar"
  28. >
  29. ENTRAR
  30. </button>
  31. <button
  32. class="flex lg:hidden items-center text-violet-normal cursor-pointer"
  33. :aria-expanded="isMenuOpen"
  34. aria-label="Abrir menu"
  35. @click="isMenuOpen = !isMenuOpen"
  36. >
  37. <span class="material-icons text-2xl">{{ isMenuOpen ? 'close' : 'menu' }}</span>
  38. </button>
  39. </div>
  40. </div>
  41. <Transition name="mobile-menu">
  42. <nav v-if="isMenuOpen" class="lg:hidden bg-white shadow-md border-t border-neutral-normal">
  43. <template v-for="item in navItems" :key="item.id">
  44. <span v-if="item.disabled" class="nav-link-mobile opacity-50 cursor-default select-none">{{ item.label }}</span>
  45. <button v-else class="nav-link-mobile" @click="onMobileNavClick(item.id)">{{ item.label }}</button>
  46. </template>
  47. </nav>
  48. </Transition>
  49. </header>
  50. </template>
  51. <script setup lang="ts">
  52. const { events } = useEvents()
  53. const navItems = computed(() => [
  54. { id: 'quem-somos', label: 'Início' },
  55. { id: 'beneficios', label: 'Benefícios' },
  56. { id: 'sobre-nos', label: 'Quem somos' },
  57. ...(events.value.length ? [{ id: 'eventos', label: 'Eventos' }] : []),
  58. { id: 'parceiros', label: 'Parceiros', disabled: true },
  59. { id: 'associe-se', label: 'Associe-se' },
  60. ])
  61. const isMenuOpen = ref(false)
  62. const scrollTo = (id: string) => {
  63. document.getElementById(id)?.scrollIntoView({ behavior: 'smooth' })
  64. }
  65. const onMobileNavClick = (id: string) => {
  66. isMenuOpen.value = false
  67. scrollTo(id)
  68. }
  69. const handleEntrar = () => {
  70. window.open('https://app.serprati.com.br/', '_blank')
  71. }
  72. </script>
  73. <style scoped>
  74. .nav-link {
  75. font-size: 0.875rem;
  76. font-weight: 500;
  77. color: #505050;
  78. transition: color 0.2s;
  79. cursor: pointer;
  80. }
  81. .nav-link:hover {
  82. color: #661d75;
  83. }
  84. .nav-link-mobile {
  85. display: block;
  86. width: 100%;
  87. text-align: left;
  88. font-size: 0.9375rem;
  89. font-weight: 500;
  90. color: #505050;
  91. padding: 0.875rem 1.5rem;
  92. border-bottom: 1px solid #f2f2f2;
  93. transition: color 0.2s, background-color 0.2s;
  94. cursor: pointer;
  95. }
  96. .nav-link-mobile:last-child {
  97. border-bottom: none;
  98. }
  99. .nav-link-mobile:hover {
  100. color: #661d75;
  101. background-color: #f0e8f1;
  102. }
  103. .mobile-menu-enter-active,
  104. .mobile-menu-leave-active {
  105. transition: opacity 0.25s ease, transform 0.25s ease;
  106. }
  107. .mobile-menu-enter-from,
  108. .mobile-menu-leave-to {
  109. opacity: 0;
  110. transform: translateY(-8px);
  111. }
  112. </style>