HomeHero.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <template>
  2. <header v-if="showHero" class="home-hero">
  3. <figure v-if="$frontmatter.heroImage" class="figure">
  4. <img
  5. class="image"
  6. :src="$withBase($frontmatter.heroImage)"
  7. :alt="$frontmatter.heroAlt"
  8. />
  9. </figure>
  10. <h1 v-if="hasHeroText" id="main-title" class="title">{{ heroText }}</h1>
  11. <p v-if="hasTagline" class="description">{{ tagline }}</p>
  12. <NavLink
  13. v-if="hasAction"
  14. :item="{ link: data.actionLink, text: data.actionText }"
  15. class="action"
  16. />
  17. <NavLink
  18. v-if="hasAltAction"
  19. :item="{ link: data.altActionLink, text: data.altActionText }"
  20. class="action alt"
  21. />
  22. </header>
  23. </template>
  24. <script setup lang="ts">
  25. import { computed } from 'vue'
  26. import { useSiteDataByRoute, useFrontmatter } from 'vitepress'
  27. import NavLink from './NavLink.vue'
  28. const site = useSiteDataByRoute()
  29. const data = useFrontmatter()
  30. const showHero = computed(() => {
  31. return (
  32. data.value.heroImage ||
  33. hasHeroText.value ||
  34. hasTagline.value ||
  35. hasAction.value
  36. )
  37. })
  38. const hasHeroText = computed(() => data.value.heroText !== null)
  39. const heroText = computed(() => data.value.heroText || site.value.title)
  40. const hasTagline = computed(() => data.value.tagline !== null)
  41. const tagline = computed(() => data.value.tagline || site.value.description)
  42. const hasAction = computed(() => data.value.actionLink && data.value.actionText)
  43. const hasAltAction = computed(
  44. () => data.value.altActionLink && data.value.altActionText
  45. )
  46. </script>
  47. <style scoped>
  48. .home-hero {
  49. margin: 2.5rem 0 2.75rem;
  50. padding: 0 1.5rem;
  51. text-align: center;
  52. }
  53. @media (min-width: 420px) {
  54. .home-hero {
  55. margin: 3.5rem 0;
  56. }
  57. }
  58. @media (min-width: 720px) {
  59. .home-hero {
  60. margin: 4rem 0 4.25rem;
  61. }
  62. }
  63. .figure {
  64. padding: 0 1.5rem;
  65. }
  66. .image {
  67. display: block;
  68. margin: 0 auto;
  69. width: auto;
  70. max-width: 100%;
  71. max-height: 280px;
  72. }
  73. .title {
  74. margin-top: 1.5rem;
  75. font-size: 2rem;
  76. }
  77. @media (min-width: 420px) {
  78. .title {
  79. font-size: 3rem;
  80. }
  81. }
  82. @media (min-width: 720px) {
  83. .title {
  84. margin-top: 2rem;
  85. }
  86. }
  87. .description {
  88. margin: 0;
  89. margin-top: 0.25rem;
  90. line-height: 1.3;
  91. font-size: 1.2rem;
  92. color: var(--c-text-light);
  93. }
  94. @media (min-width: 420px) {
  95. .description {
  96. line-height: 1.2;
  97. font-size: 1.6rem;
  98. }
  99. }
  100. .action {
  101. margin-top: 1.5rem;
  102. display: inline-block;
  103. }
  104. .action.alt {
  105. margin-left: 1.5rem;
  106. }
  107. @media (min-width: 420px) {
  108. .action {
  109. margin-top: 2rem;
  110. display: inline-block;
  111. }
  112. }
  113. .action :deep(.item) {
  114. display: inline-block;
  115. border-radius: 6px;
  116. padding: 0 20px;
  117. line-height: 44px;
  118. font-size: 1rem;
  119. font-weight: 500;
  120. color: var(--c-bg);
  121. background-color: var(--c-brand);
  122. border: 2px solid var(--c-brand);
  123. transition: background-color 0.1s ease;
  124. }
  125. .action.alt :deep(.item) {
  126. background-color: var(--c-bg);
  127. color: var(--c-brand);
  128. }
  129. .action :deep(.item:hover) {
  130. text-decoration: none;
  131. color: var(--c-bg);
  132. background-color: var(--c-brand-light);
  133. }
  134. @media (min-width: 420px) {
  135. .action :deep(.item) {
  136. padding: 0 24px;
  137. line-height: 52px;
  138. font-size: 1.2rem;
  139. font-weight: 500;
  140. }
  141. }
  142. </style>