Topbar.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <template>
  2. <div class="topbar">
  3. <v-btn
  4. icon="fas fa-bars"
  5. variant="plain"
  6. class="smAndDown mr-2"
  7. aria-label="Show or hide the website menu"
  8. @click="isMenuOpen = !isMenuOpen"
  9. />
  10. <nuxt-link to="/" class="logo">
  11. <v-img src="/logo.png" alt="logo path-php" />
  12. </nuxt-link>
  13. <div class="menu mdAndUp">
  14. <nuxt-link
  15. v-for="item in menu" :key="item.label"
  16. :to="item.to"
  17. active-class="active"
  18. >
  19. {{ item.label }}
  20. </nuxt-link>
  21. </div>
  22. <v-spacer class="smAndDown" />
  23. <div class="icon-links">
  24. <ThemeSwitcher />
  25. <nuxt-link
  26. href="https://github.com/olinox14/path-php"
  27. target="_blank"
  28. aria-label="Open the Github page of Path-php"
  29. >
  30. <v-icon>fab fa-github</v-icon>
  31. </nuxt-link>
  32. </div>
  33. <v-navigation-drawer v-model="isMenuOpen" app temporary>
  34. <v-list nav dense aria-label="Menu">
  35. <v-list-item
  36. v-for="(item, index) in menu"
  37. :key="item.label"
  38. :to="item.to"
  39. class="menuItem"
  40. >
  41. <v-list-item-title class="d-flex flex-row w-100">
  42. <span class="flex-grow-1">
  43. {{ item.label }}
  44. </span>
  45. </v-list-item-title>
  46. </v-list-item>
  47. </v-list>
  48. </v-navigation-drawer>
  49. </div>
  50. </template>
  51. <script setup lang="ts">
  52. import ThemeSwitcher from "~/components/ThemeSwitcher.vue";
  53. import type {Ref} from "@vue/reactivity";
  54. const isMenuOpen: Ref<boolean> = ref(false)
  55. const menu = [
  56. {
  57. label: "Home",
  58. to: "/"
  59. },
  60. {
  61. label: "Get started",
  62. to: "/get-started"
  63. },
  64. {
  65. label: "API",
  66. to: "api"
  67. }
  68. ]
  69. </script>
  70. <style scoped lang="scss">
  71. @media (min-width: 960px) {
  72. .smAndDown {
  73. display: none;
  74. }
  75. }
  76. @media (max-width: 960px) {
  77. .mdAndUp {
  78. display: none;
  79. }
  80. }
  81. .topbar {
  82. height: 72px;
  83. display: flex;
  84. flex-direction: row;
  85. padding: 18px;
  86. align-items: center;
  87. .logo {
  88. width: 140px;
  89. @media (max-width: 960px) {
  90. width: 25%;
  91. min-width: 30px;
  92. }
  93. }
  94. .v-btn {
  95. color: rgb(var(--v-theme-on-neutral));
  96. }
  97. .menu {
  98. margin: 0 auto;
  99. a {
  100. text-decoration: none;
  101. color: rgb(var(--v-theme-on-neutral));
  102. padding: 8px;
  103. font-weight: bold;
  104. margin: 0 18px;
  105. font-size: 18px;
  106. padding: 8px;
  107. }
  108. a:hover {
  109. color: rgb(var(--v-theme-on-neutral--clickable));
  110. }
  111. a.active {
  112. color: rgb(var(--v-theme-on-neutral--clickable));
  113. border-bottom: solid 2px rgb(var(--v-theme-on-neutral--clickable));
  114. }
  115. }
  116. .icon-links {
  117. color: black;
  118. font-size: 20px;
  119. display: flex;
  120. flex-direction: row;
  121. > * {
  122. margin-left: 16px;
  123. }
  124. a {
  125. color: rgb(var(--v-theme-on-neutral--clickable));
  126. }
  127. }
  128. }
  129. </style>