From 0222d16a8ba5c5825362c03a5b3b410cd4fa40d1 Mon Sep 17 00:00:00 2001
From: sric <sirrcvip@126.com>
Date: 星期四, 20 十一月 2025 23:51:44 +0800
Subject: [PATCH] Merge branch 'master' of https://git.v-ji.com/git/r/yujiu_web
---
src/views/HomeView.vue | 518 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 518 insertions(+), 0 deletions(-)
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
new file mode 100644
index 0000000..045dd3a
--- /dev/null
+++ b/src/views/HomeView.vue
@@ -0,0 +1,518 @@
+<script setup>
+import banner from '@/assets/images/banner1@2x.png';
+import banner2 from '@/assets/images/banner2@2x.png';
+
+const getUrl = (name) => {
+ // return new URL(url, import.meta.url).href;
+ return new URL(`../assets/images/${name}.png`, import.meta.url).href;
+};
+
+const getIcon = (name) => {
+ // return new URL(url, import.meta.url).href;
+ return new URL(`../assets/images/icons/${name}.png`, import.meta.url).href;
+};
+
+const route = useRoute();
+const router = useRouter();
+
+const navs = [
+ {
+ path: '/',
+ name: 'About us',
+ },
+ {
+ path: '/Products',
+ name: 'Products',
+ },
+ {
+ path: '/Projects',
+ name: 'Projects',
+ },
+ {
+ path: '/Clients',
+ name: 'Clients',
+ },
+ {
+ path: '/Career',
+ name: 'Career',
+ },
+];
+
+const activeNav = ref(route.path == '' ? '/' : route.path);
+
+const banners = [
+ {
+ id: 1,
+ image: banner, // 闆北 (Home-3)
+ title: 'CLEAN AIR.',
+ subtitle: 'SMART TECHNOLOGY.',
+ },
+ {
+ id: 2,
+ image: banner2, // 宸ヤ笟椋� (Home-2)
+ title: 'CLEAN AIR.',
+ subtitle: 'SMART TECHNOLOGY.',
+ },
+ // {
+ // id: 3,
+ // image: banner2, // 宸ヤ笟椋� (Home-2)
+ // title: 'CLEAN AIR.',
+ // subtitle: 'SMART TECHNOLOGY.',
+ // },
+];
+
+const currentSlide = ref(0);
+let timer = null;
+
+const nextSlide = () => {
+ currentSlide.value = (currentSlide.value + 1) % banners.length;
+};
+
+const prevSlide = () => {
+ currentSlide.value = (currentSlide.value - 1 + banners.length) % banners.length;
+};
+
+const goToSlide = (index) => {
+ currentSlide.value = index;
+};
+
+const startAutoPlay = () => {
+ clearInterval(timer);
+ timer = setInterval(nextSlide, 6000);
+};
+
+const stopAutoPlay = () => {
+ clearInterval(timer);
+};
+
+onMounted(() => {
+ startAutoPlay();
+});
+
+onUnmounted(() => {
+ stopAutoPlay();
+});
+
+const solutions = [
+ {
+ title: 'Ventilation Damper',
+ // image: getUrl('../assets/images/鍥惧眰 79@2x.png'),
+ // icon: getUrl('../assets/images/icons/Ventilation Damper-icon@2x.png'),
+ image: getUrl('鍥惧眰 79@2x'),
+ icon: getIcon('Ventilation Damper-icon@2x'),
+ },
+ {
+ title: 'Air Ducts',
+ // image: getUrl('../assets/images/Air Ducts-pic@2x.png'),
+ // icon: getUrl('../assets/images/icons/Air Ducts-icon@2x.png'),
+ image: getUrl('Air Ducts-pic@2x'),
+ icon: getIcon('Air Ducts-icon@2x'),
+ },
+ {
+ title: 'Muffler',
+ // image: getUrl('../assets/images/Muffler-pic@2x.png'),
+ // icon: getUrl('../assets/images/icons/Muffler-icon@2x.png'),
+ image: getUrl('Muffler-pic@2x'),
+ icon: getIcon('Muffler-icon@2x'),
+ },
+ {
+ title: 'Air Outlet',
+ // image: getUrl('../assets/images/Air Outlet-pic@2x.png'),
+ // icon: getUrl('../assets/images/icons/Air Outlet-icon@2x.png'),
+ image: getUrl('Air Outlet-pic@2x'),
+ icon: getIcon('Air Outlet-icon@2x'),
+ },
+];
+
+const changeLange = (lang = 'en') => {
+ if (lang === 'en') {
+ router.push('/');
+ } else {
+ router.push('/cn');
+ }
+};
+</script>
+
+<template>
+ <div class="en-font min-h-screen font-sans text-slate-800 bg-[#F1F1F3]">
+ <div
+ class="absolute z-50 left-0 top-0 right-0 h-[180px] bg-linear-[to_bottom,#fff,rgba(255,255,255,.91)_21%,rgba(255,255,255,.88)_48%,rgba(255,255,255,.6)_65%,rgba(255,255,255,0.20),transparent]"
+ >
+ <header
+ class="px-10 lg:px-20 xl:px-30 2xl:px-55 3xl:px-80 py-[30px] flex items-center justify-between relative z-50"
+ >
+ <div class="flex flex-row flex-nowrap">
+ <img
+ class="h-[38px] w-[170px] aspect-188/42 lg:h-[42px] lg:w-[188px]"
+ src="@/assets/images/logo@2x.png"
+ />
+ <nav
+ class="hidden ml-8 md:flex gap-x-8 text-[22px] font-bold text-[#132251] tracking-wide"
+ >
+ <template v-for="item in navs" :key="item.path">
+ <a
+ href="#"
+ class="px-4 text-nowrap border-b-8 border-transparent transition-colors duration-300"
+ :class="[
+ activeNav === item.path ? ' border-b-8 border-[#132251]! scale-[1.15]' : '',
+ ]"
+ @click="activeNav = item.path"
+ >{{ item.name }}</a
+ >
+ </template>
+ </nav>
+ </div>
+
+ <div class="group relative h-8 cursor-pointer select-none transition">
+ <div
+ class="relative z-20 px-2.5 bg-white border-2 border-[#132251] rounded-full w-full flex items-center gap-2"
+ >
+ <img src="@/assets/images/en-icon@2x.png" class="w-8 h-auto" alt="UK Flag" />
+ <span class="text-xl font-bold text-[#132251]">EN</span>
+ <el-icon class=""><ArrowDown /></el-icon>
+ </div>
+
+ <ul
+ class="opacity-0 scale-y-0 absolute z-10 top-4 pt-5 pb-2 px-1 left-0 right-0 w-full rounded-br-lg rounded-bl-lg transition-transform origin-top duration-300 bg-[#132251] group-hover:opacity-100 group-hover:scale-y-100"
+ >
+ <li
+ class="text-#fff flex flex-row items-center gap-x-2 px-2 rounded-full hover:bg-[#2499D3] transition duration-300"
+ @click="changeLange('cn')"
+ >
+ <img src="@/assets/images/CN-icon@2x.png" class="w-8 h-auto" alt="UK Flag" />
+ <span class="text-xl font-bold text-white">CN</span>
+ </li>
+ </ul>
+ </div>
+ </header>
+ </div>
+
+ <div
+ class="relative w-full h-screen md:h-[707px] overflow-hidden bg-white group"
+ @mouseenter="stopAutoPlay"
+ @mouseleave="startAutoPlay"
+ >
+ <div class="relative w-full h-full">
+ <transition-group name="fade">
+ <div
+ v-for="(banner, index) in banners"
+ :key="banner.id"
+ v-show="currentSlide === index"
+ class="absolute inset-0 w-full h-full"
+ >
+ <img
+ :src="banner.image"
+ class="slide-up-imgage w-full h-full object-cover brightness-[0.65]"
+ />
+
+ <div class="absolute inset-0 flex items-center px-6 md:px-30 z-20">
+ <div class="text-white">
+ <div
+ class="slide-up-text bg-black/40 rounded-xs pt-[60px] pr-[98px] pb-10 pl-[82px] text-[50px]/[50px]"
+ style="animation-delay: 1.2s"
+ >
+ <h1
+ :key="`t1-${currentSlide}`"
+ class="slide-up-text font-bold tracking-tighter drop-shadow-2xl"
+ style="animation-delay: 1.8s"
+ >
+ {{ banner.title }}
+ </h1>
+ <h2
+ :key="`t2-${currentSlide}`"
+ class="slide-up-text font-bold tracking-tighter drop-shadow-2xl"
+ style="animation-delay: 1.8s"
+ >
+ {{ banner.subtitle }}
+ </h2>
+ </div>
+
+ <!-- <p
+ :key="`t3-${currentSlide}`"
+ class="slide-up-text text-base md:text-xl font-light text-gray-100 max-w-xl tracking-wide leading-loose"
+ style="animation-delay: 1.3s; font-family: sans-serif"
+ >
+ Leading service provider of smart technology and tailored solutions for industrial
+ waste gas treatment.
+ </p> -->
+ </div>
+ </div>
+ </div>
+ </transition-group>
+ </div>
+
+ <button
+ @click="prevSlide"
+ class="absolute w-[30px] h-[71px] left-[85px] top-1/2 -translate-y-1/2 z-30 cursor-pointer rounded-full transition-all duration-500 backdrop-blur-sm group-hover:opacity-100 opacity-0"
+ >
+ <img class="w-full h-full" src="@/assets/images/icons/宸�-btn@2x.png" />
+ </button>
+
+ <button
+ @click="nextSlide"
+ class="absolute w-[30px] h-[71px] right-[85px] top-1/2 -translate-y-1/2 z-30 cursor-pointer rounded-full transition-all duration-500 backdrop-blur-sm group-hover:opacity-100 opacity-0"
+ >
+ <img class="w-full h-full" src="@/assets/images/icons/鍙�-btn@2x.png" />
+ </button>
+
+ <div class="absolute bottom-14 left-1/2 -translate-x-1/2 z-30 flex gap-4">
+ <button
+ v-for="(banner, index) in banners"
+ :key="index"
+ @click="goToSlide(index)"
+ class="h-4 cursor-pointer rounded-full bg-white transition-all duration-[1500ms]"
+ :class="currentSlide === index ? 'w-20 opacity-100' : 'w-4 hover:opacity-80'"
+ ></button>
+ </div>
+ </div>
+
+ <section class="pt-25 bg-white text-center overflow-hidden">
+ <div class="container mx-auto">
+ <h3 class="text-[46px] font-bold text-[#132251]">About Us</h3>
+ <p
+ class="mt-8 max-w-3xl mx-auto text-2xl font-bold md:text-xl text-[#132251] mb-12 leading-relaxed px-4"
+ >
+ The Thundearth Group is committed to being a leading service provider of <br />
+ smart technology and tailored solutions for industrial waste gas treatment
+ </p>
+
+ <div class="relative mx-auto w-[78.4%] h-auto">
+ <img
+ src="@/assets/images/maps@2x.png"
+ class="w-full h-full object-contain"
+ alt="Map Pattern"
+ />
+
+ <!-- <div
+ v-for="loc in locations"
+ :key="loc.country"
+ class="absolute flex flex-col items-center group cursor-pointer hover:scale-110 transition-transform duration-300"
+ :style="{ top: loc.top, left: loc.left }"
+ >
+ <div
+ class="bg-white/90 backdrop-blur border border-gray-200 shadow-sm px-2 py-0.5 rounded-[2px] flex items-center gap-1.5 mb-1 whitespace-nowrap"
+ >
+ <img
+ :src="`https://flagcdn.com/w20/${loc.flag}.png`"
+ class="w-3.5 h-auto shadow-sm"
+ :alt="loc.country"
+ />
+ <span class="text-[10px] md:text-xs font-bold text-blue-900">{{ loc.country }}</span>
+ </div>
+ <MapPin class="w-4 h-4 text-blue-500 fill-blue-500" />
+ </div> -->
+ </div>
+ </div>
+ </section>
+
+ <section class="relative h-[228px] text-white">
+ <div class="absolute inset-0 z-0">
+ <img src="@/assets/images/鏁板瓧搴曞浘@2x.png" class="w-full h-full object-cover grayscale" />
+ </div>
+
+ <div
+ class="container mx-auto h-full px-[200px] flex flex-row justify-between items-center font-bold text-white relative z-10"
+ >
+ <div class="px-2 flex flex-col items-center">
+ <div class="text-[76px]/[76px]">2018</div>
+ <div class="text-[26px] tracking-wider">Foundation</div>
+ </div>
+ <div class="px-2 flex flex-col items-center">
+ <div class="text-[76px]/[76px]">7</div>
+ <div class="text-[26px] tracking-wider">Countries</div>
+ </div>
+ <div class="px-2 flex flex-col items-center">
+ <div class="text-[76px]/[76px]">70+</div>
+ <div class="text-[26px] tracking-wider">Employees</div>
+ </div>
+ <div class="px-2 flex flex-col items-center">
+ <div class="text-[76px]/[76px]">40+</div>
+ <div class="text-[26px] tracking-wider">Projects</div>
+ </div>
+ </div>
+ </section>
+
+ <section class="mt-25 bg-blue-50/30 text-center">
+ <div class="container mx-auto px-4">
+ <h3 class="text-[46px] font-bold text-[#132251]">Solution</h3>
+
+ <div class="mt-14 flex flex-row flex-wrap max-w-[1230px] gap-px mx-auto">
+ <div
+ v-for="sol in solutions"
+ :key="sol.title"
+ class="group relative h-[200px] flex-1 basis-[45%] shrink-0 text-[26px] overflow-hidden cursor-pointer"
+ >
+ <img :src="sol.image" class="w-full h-full transition duration-700" />
+
+ <div
+ class="absolute top-1/2 left-1/2 -translate-y-1/2 -translate-x-1/2 w-[55%] flex flex-col items-center justify-center text-white p-4 bg-black/70"
+ >
+ <img class="w-16 h-16" :src="sol.icon" />
+ <h4 class="text-2xl font-semibold tracking-wide">{{ sol.title }}</h4>
+ </div>
+
+ <div
+ class="absolute z-30 inset-0 bg-blue transition-colors duration-300 group-hover:bg-blue-500/50"
+ ></div>
+ </div>
+ </div>
+ </div>
+ </section>
+
+ <h3 class="text-[46px] pt-25 pb-15 text-center font-bold text-[#132251]">News</h3>
+
+ <div class="w-full relative">
+ <el-carousel height="auto" class="border" indicator-position="none" arrow="never">
+ <el-carousel-item style="height: 400px">
+ <div class="relative h-full w-full">
+ <img class="h-full w-full" src="@/assets/images/鏂伴椈-pic@2x.png" />
+ <div
+ class="absolute top-0 left-0 bottom-0 w-[51%] pt-[87px] pb-20 pl-[202px] pr-[244px] text-white text-[26px] bg-[url('@/assets/images/News-姝f枃@2x.png')] bg-no-repeat bg-size-[100%_100%]"
+ >
+ Thundearth continues its expansion <br />and is strengthening its presence in Germany.
+ We are excited to establish another subsidiary in Munich and to offer our products and
+ services even more effectively in the German and European markets.
+ </div>
+ </div>
+ </el-carousel-item>
+ </el-carousel>
+ <div class="absolute top-1/2 left-[54px] -translate-y-1/2 w-[42px] h-25 cursor-pointer">
+ <img class="w-full h-full" src="@/assets/images/icons/宸�-btn@2x.png" />
+ </div>
+ <div class="absolute top-1/2 right-[54px] -translate-y-1/2 w-[42px] h-25 cursor-pointer">
+ <img class="w-full h-full" src="@/assets/images/icons/鍙�-btn@2x.png" />
+ </div>
+ </div>
+
+ <section class="bg-[#f2f4f7] mt-[111px] pb-[124px]">
+ <div class="container mx-auto px-4">
+ <h3 class="text-[46px] font-bold text-center text-[#132251] mb-10">Contact Us</h3>
+
+ <div class="max-w-7xl mx-auto flex flex-col md:flex-row items-start gap-6 md:gap-0">
+ <div class="w-full md:w-[51%] pr-0 md:pr-[67px]">
+ <form class="space-y-[18px] text-[26px]">
+ <div class="grid grid-cols-2 gap-4">
+ <input
+ type="text"
+ placeholder="Name"
+ class="w-full h-[46px] px-5 bg-[#a3a3a3] placeholder-white text-white rounded-full focus:outline-none focus:ring-2 focus:ring-[#132251]"
+ />
+ <input
+ type="text"
+ placeholder="Phone"
+ class="w-full h-[46px] px-5 bg-[#a3a3a3] placeholder-white text-white rounded-full focus:outline-none focus:ring-2 focus:ring-[#132251]"
+ />
+ </div>
+ <input
+ type="email"
+ placeholder="Email"
+ class="w-full h-[46px] px-5 bg-[#a3a3a3] placeholder-white text-white rounded-full focus:outline-none focus:ring-2 focus:ring-[#132251]"
+ />
+ <textarea
+ rows="4"
+ placeholder="Message"
+ class="w-full h-[121px] p-5 bg-[#a3a3a3] placeholder-white text-white rounded-2xl focus:outline-none focus:ring-2 focus:ring-[#132251] resize-none"
+ ></textarea>
+
+ <button
+ class="bg-[#132251] w-32 cursor-pointer h-[70px] text-white py-2 rounded-3xl font-medium hover:bg-blue-900 transition shadow-md w-32"
+ >
+ Submit
+ </button>
+ </form>
+ </div>
+
+ <div
+ class="w-full aspect-571/311 2xl:w-[571px] text-white rounded-lg p-8 relative overflow-hidden flex flex-col justify-center bg-[url('@/assets/images/淇℃伅妗咢2x.png')] bg-no-repeat bg-size-[100%_100%]"
+ >
+ <div class="relative z-10 space-y-5 text-[26px]">
+ <div class="flex items-start gap-3">
+ <img class="h-[39px] w-[25px] mt-2" src="@/assets/images/icons/tel-icon@2x.png" />
+ <div>
+ <p>+86 177 4276 6126</p>
+ <p>+966 50 802 7425</p>
+ </div>
+ </div>
+ <div class="flex items-center gap-3">
+ <img class="h-[27px] w-9" src="@/assets/images/icons/mail-icon@2x.png" />
+ <p>liangr@thundearth.com</p>
+ </div>
+ <div class="flex items-start gap-3">
+ <img class="h-8 w-8" src="@/assets/images/icons/location-icon@2x.png" />
+ <p class="leading-tight">5 Tonggang Road, Dalian Free Trade Zone Liaoning, China</p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </section>
+ </div>
+</template>
+
+<style scoped>
+.fade-enter-active,
+.fade-leave-active {
+ /* transition: all 2.5s cubic-bezier(0.22, 1, 0.36, 1); */
+ /* position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ overflow: hidden; */
+ transition:
+ opacity 0.3s ease-in-out,
+ transform 1.2s;
+}
+
+.fade-leave-active {
+ opacity: 0;
+}
+
+.fade-enter-from {
+ opacity: 0;
+ transform: translateY(30%) scale(1.01);
+ z-index: 10;
+}
+
+.fade-enter-to {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ z-index: 10;
+}
+
+.fade-leave-to {
+ opacity: 0;
+ /* display: none; */
+ transform: scale(1);
+ z-index: 0;
+}
+
+.slide-up-text {
+ opacity: 0;
+ transform: translateY(40px);
+ animation: textSlideUp 1.4s cubic-bezier(0.16, 1, 0.3, 1) forwards;
+}
+
+.slide-up-imgage {
+ opacity: 0;
+ animation: imageSlideUp 1.2s forwards;
+}
+
+@keyframes textSlideUp {
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes imageSlideUp {
+ from {
+ opacity: 0;
+ transform: translateY(30%);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+</style>
--
Gitblit v1.8.0