refactor: separate landing hero section from fixed header
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="absolute left-0 top-0 w-full overflow-hidden bg-slate-900"
|
class="absolute inset-0 overflow-hidden bg-slate-900"
|
||||||
:style="{ height: `${height}px` }"
|
:style="containerStyle"
|
||||||
>
|
>
|
||||||
<ClientOnly>
|
<ClientOnly>
|
||||||
<DotLottieVue
|
<DotLottieVue
|
||||||
@@ -20,9 +20,16 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { DotLottieVue } from '@lottiefiles/dotlottie-vue'
|
import { DotLottieVue } from '@lottiefiles/dotlottie-vue'
|
||||||
|
|
||||||
withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
height?: number
|
height?: number
|
||||||
|
fill?: boolean
|
||||||
}>(), {
|
}>(), {
|
||||||
height: 860
|
height: 860,
|
||||||
|
fill: false
|
||||||
|
})
|
||||||
|
|
||||||
|
const containerStyle = computed(() => {
|
||||||
|
if (props.fill) return undefined
|
||||||
|
return { height: `${props.height ?? 860}px` }
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -103,11 +103,6 @@
|
|||||||
isHeroLayout ? 'w-full max-w-none justify-start' : 'max-w-2xl justify-center'
|
isHeroLayout ? 'w-full max-w-none justify-start' : 'max-w-2xl justify-center'
|
||||||
]"
|
]"
|
||||||
>
|
>
|
||||||
<!-- Hero slot for home page title -->
|
|
||||||
<div :style="heroTitleStyle">
|
|
||||||
<slot name="hero" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Client Area tabs -->
|
<!-- Client Area tabs -->
|
||||||
<template v-if="isClientArea">
|
<template v-if="isClientArea">
|
||||||
<div class="flex items-center gap-1 rounded-full pill-glass p-1">
|
<div class="flex items-center gap-1 rounded-full pill-glass p-1">
|
||||||
@@ -541,20 +536,6 @@ const rowStyle = computed(() => {
|
|||||||
return { height: `${props.height}px` }
|
return { height: `${props.height}px` }
|
||||||
})
|
})
|
||||||
|
|
||||||
const heroTitleTop = computed(() => {
|
|
||||||
if (!isHeroLayout.value) return 0
|
|
||||||
const heroHeight = props.heroBaseHeight || props.height || topRowHeight
|
|
||||||
const minTop = 0
|
|
||||||
const maxTop = Math.max(120, Math.round(heroHeight * 0.42))
|
|
||||||
const progress = Math.min(1, Math.max(0, props.collapseProgress || 0))
|
|
||||||
return Math.round(maxTop - (maxTop - minTop) * progress)
|
|
||||||
})
|
|
||||||
|
|
||||||
const heroTitleStyle = computed(() => {
|
|
||||||
if (!isHeroLayout.value) return {}
|
|
||||||
return { marginTop: `${heroTitleTop.value}px` }
|
|
||||||
})
|
|
||||||
|
|
||||||
const isFloatingHomeCapsule = computed(() => isHeroLayout.value)
|
const isFloatingHomeCapsule = computed(() => isHeroLayout.value)
|
||||||
|
|
||||||
const landingCapsuleTopStart = computed(() => {
|
const landingCapsuleTopStart = computed(() => {
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
<div class="flex-1 flex flex-col" :style="contentStyle">
|
<div class="flex-1 flex flex-col" :style="contentStyle">
|
||||||
<!-- Fixed Header Container -->
|
<!-- Fixed Header Container -->
|
||||||
<div class="header-glass fixed inset-x-0 top-0 z-50 border-0" :style="headerContainerStyle">
|
<div class="header-glass fixed inset-x-0 top-0 z-50 border-0" :style="headerContainerStyle">
|
||||||
<!-- Static hero background for home page -->
|
|
||||||
<HeroBackground v-if="isHomePage" :height="heroBaseHeight" />
|
|
||||||
<div class="header-glass-backdrop" aria-hidden="true" />
|
<div class="header-glass-backdrop" aria-hidden="true" />
|
||||||
|
|
||||||
<!-- MainNavigation -->
|
<!-- MainNavigation -->
|
||||||
@@ -59,16 +57,7 @@
|
|||||||
@update:search-query="searchQuery = $event"
|
@update:search-query="searchQuery = $event"
|
||||||
@update-quantity="setQuantity"
|
@update-quantity="setQuantity"
|
||||||
@search="onSearch"
|
@search="onSearch"
|
||||||
>
|
/>
|
||||||
<!-- Hero content for home page -->
|
|
||||||
<template v-if="isHomePage" #hero>
|
|
||||||
<h1
|
|
||||||
class="text-3xl lg:text-5xl font-black tracking-tight text-white mb-4"
|
|
||||||
>
|
|
||||||
{{ $t('hero.tagline', 'Make trade easy') }}
|
|
||||||
</h1>
|
|
||||||
</template>
|
|
||||||
</MainNavigation>
|
|
||||||
|
|
||||||
<!-- Sub Navigation (section-specific tabs) - only for non-catalog/non-home/non-clientarea sections -->
|
<!-- Sub Navigation (section-specific tabs) - only for non-catalog/non-home/non-clientarea sections -->
|
||||||
<SubNavigation
|
<SubNavigation
|
||||||
@@ -233,7 +222,7 @@ const headerContainerStyle = computed(() => {
|
|||||||
// Main content padding-top to compensate for fixed header
|
// Main content padding-top to compensate for fixed header
|
||||||
const mainStyle = computed(() => {
|
const mainStyle = computed(() => {
|
||||||
if (isCatalogSection.value) return { paddingTop: '0' }
|
if (isCatalogSection.value) return { paddingTop: '0' }
|
||||||
if (isHomePage.value) return { paddingTop: `${heroBaseHeight.value}px` }
|
if (isHomePage.value) return { paddingTop: '100px' }
|
||||||
if (isClientArea.value) return { paddingTop: '116px' } // Header only, no SubNav
|
if (isClientArea.value) return { paddingTop: '116px' } // Header only, no SubNav
|
||||||
return { paddingTop: '154px' }
|
return { paddingTop: '154px' }
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,7 +1,23 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="pb-0 -mx-3 lg:-mx-6">
|
<div class="pb-0 -mx-3 lg:-mx-6">
|
||||||
|
<!-- Hero -->
|
||||||
|
<section class="relative mb-16 min-h-[calc(100vh-100px)] overflow-hidden">
|
||||||
|
<HeroBackground fill />
|
||||||
|
|
||||||
|
<div class="relative z-10 flex min-h-[calc(100vh-100px)] items-center justify-center px-4 pt-16 pb-28">
|
||||||
|
<div class="mx-auto max-w-4xl text-center text-white">
|
||||||
|
<h1 class="text-4xl font-black leading-tight md:text-6xl">
|
||||||
|
{{ $t('hero.tagline', 'Торговля — это просто') }}
|
||||||
|
</h1>
|
||||||
|
<p class="mx-auto mt-4 max-w-3xl text-base text-white/80 md:text-lg">
|
||||||
|
{{ $t('hero.subtitle', 'Сравнивайте предложения, находите поставщиков и управляйте закупками в одном интерфейсе.') }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- Section: How it works -->
|
<!-- Section: How it works -->
|
||||||
<section class="container mx-auto px-4 mb-20 mt-12">
|
<section class="container mx-auto px-4 mb-20 mt-0">
|
||||||
<!-- Section header with line -->
|
<!-- Section header with line -->
|
||||||
<div class="flex items-center gap-6 mb-10">
|
<div class="flex items-center gap-6 mb-10">
|
||||||
<div class="h-px flex-1 bg-gradient-to-r from-transparent via-base-content/20 to-transparent" />
|
<div class="h-px flex-1 bg-gradient-to-r from-transparent via-base-content/20 to-transparent" />
|
||||||
|
|||||||
Reference in New Issue
Block a user