Files
Montech_Landing/apps/landing/components/home/HeroSection.vue
T
MahdiandCursor b0088c35d1 Replace the landing with the artifact design and rebuild the admin in Ant Design.
Adds consultation leads, section editors, and the one-time content reset for this release.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-01 20:36:06 +03:30

114 lines
6.0 KiB
Vue

<template>
<section ref="sectionEl" class="relative pt-8 pb-16 lg:pt-14 lg:pb-24 overflow-hidden hero-parallax-section">
<div class="absolute top-1/4 right-0 w-[550px] h-[550px] bg-brand-100/50 dark:bg-brand-600/15 rounded-full blur-[140px] pointer-events-none -z-10" />
<div class="absolute bottom-10 left-10 w-[500px] h-[500px] bg-sky-100/50 dark:bg-sky-600/10 rounded-full blur-[140px] pointer-events-none -z-10" />
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-12 gap-12 lg:gap-8 items-center">
<div class="lg:col-span-5 space-y-6 text-right">
<div class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-slate-100/80 dark:bg-slate-800/80 border border-slate-200/70 dark:border-slate-700/70 text-xs font-semibold text-slate-500 dark:text-slate-300">
<span class="w-2 h-2 rounded-full bg-brand-500 animate-pulse" />
<span>{{ hero.eyebrow }}</span>
</div>
<h1 class="text-4xl sm:text-5xl lg:text-[54px] font-black text-slate-900 dark:text-white leading-[1.28] tracking-tight">
{{ hero.titleLine1 }}
<br>
<span class="text-transparent bg-clip-text bg-gradient-to-r from-brand-600 via-brand-500 to-sky-400">
{{ hero.titleHighlight }}
</span>
</h1>
<p class="text-base sm:text-lg text-slate-600 dark:text-slate-300 font-normal leading-relaxed max-w-xl">
{{ hero.subtitle }}
</p>
<div class="pt-2 max-w-xl">
<form class="relative group" role="search" @submit.prevent="search">
<div class="relative flex items-center bg-white dark:bg-slate-900/95 rounded-full p-2 pl-2 shadow-soft-card hover:shadow-hover-card border border-slate-200/90 dark:border-slate-700/80 focus-within:border-brand-500 focus-within:ring-4 focus-within:ring-brand-100/70 dark:focus-within:ring-brand-900/40 transition-all duration-300">
<button
type="submit"
aria-label="جستجوی هوشمند"
class="flex-shrink-0 w-12 h-12 rounded-full bg-brand-600 text-white flex items-center justify-center hover:bg-brand-700 active:scale-95 transition-all shadow-md shadow-brand-600/30"
>
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M10 19l-7-7m0 0l7-7m-7 7h18" />
</svg>
</button>
<input
v-model="ai.query.value"
type="text"
aria-label="نیاز کسب‌وکار خود را بنویسید"
:placeholder="hero.searchPlaceholder"
class="w-full bg-transparent text-sm sm:text-base text-slate-800 dark:text-slate-100 placeholder-slate-400 dark:placeholder-slate-500 focus:outline-none pr-3 pl-3 font-normal text-right"
>
<div class="pr-3 pl-2 text-brand-500 flex items-center justify-center" aria-hidden="true">
<svg class="w-5 h-5 text-brand-500" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 2L14.2 8.3L20.5 10.5L14.2 12.7L12 19L9.8 12.7L3.5 10.5L9.8 8.3L12 2Z" />
</svg>
</div>
</div>
<div class="mt-3.5 flex flex-wrap items-center gap-2 text-xs text-slate-500 dark:text-slate-400">
<span class="font-medium text-slate-400 dark:text-slate-500">{{ hero.suggestionsLabel }}</span>
<button
v-for="item in hero.suggestions"
:key="item.label"
type="button"
class="px-3 py-1 rounded-full bg-slate-100 dark:bg-slate-800 text-slate-600 dark:text-slate-300 hover:bg-brand-50 dark:hover:bg-brand-950 hover:text-brand-600 dark:hover:text-brand-300 border border-transparent hover:border-brand-200 dark:hover:border-brand-800 transition-all"
@click="suggest(item.query)"
>
{{ item.label }}
</button>
</div>
</form>
</div>
</div>
<div
class="lg:col-span-7 relative perspective-stage flex justify-center items-center py-6 min-h-[520px] sm:min-h-[580px]"
@mousemove="parallax.onMouseMove"
@mouseleave="parallax.onMouseLeave"
>
<div class="studio-botanical-leaf hidden sm:block" aria-hidden="true">
<svg viewBox="0 0 280 280" fill="none" class="w-full h-full text-emerald-950/25 dark:text-emerald-500/15">
<path d="M50,220 C35,120 100,40 220,25 C250,90 200,190 95,235 C75,240 60,235 50,220 Z" fill="currentColor" />
<path d="M75,195 C110,160 145,120 195,75" stroke="#047857" stroke-width="5" stroke-linecap="round" />
<path d="M105,170 C130,175 160,190 180,210" stroke="#047857" stroke-width="4" stroke-linecap="round" />
<path d="M130,135 C160,135 185,150 205,165" stroke="#047857" stroke-width="4" stroke-linecap="round" />
<path d="M155,100 C185,95 215,105 235,120" stroke="#047857" stroke-width="3" stroke-linecap="round" />
</svg>
</div>
<div class="device-ground-shadow" />
<HeroLaptopMockup :mockup="hero.mockup" :transform-style="parallax.laptop.value" />
<HeroPhoneMockup :base-count="hero.mockup.goldBarCount" :transform-style="parallax.mobile.value" />
</div>
</div>
</div>
</section>
</template>
<script setup lang="ts">
const { section } = useSiteContent();
const hero = section("hero");
const ai = useAiModal();
const parallax = useHeroParallax();
const sectionEl = ref<HTMLElement | null>(null);
function search() {
if (!ai.query.value.trim()) ai.query.value = hero.value.searchDefaultQuery;
ai.open();
}
function suggest(query: string) {
ai.query.value = query;
search();
}
useHeroScrollParallax(sectionEl);
</script>