diff --git a/src/app/gioi-thieu/page.tsx b/src/app/gioi-thieu/page.tsx
index 322b659..3310374 100644
--- a/src/app/gioi-thieu/page.tsx
+++ b/src/app/gioi-thieu/page.tsx
@@ -14,6 +14,7 @@ import {
Users,
} from "lucide-react";
import { BackToTopButton } from "@/app/components/landing/BackToTopButton";
+import { CountUp } from "@/app/components/landing/CountUp";
import { SiteFooter } from "@/app/components/landing/SiteFooter";
import { SiteHeader } from "@/app/components/landing/SiteHeader";
import { activeTour, antiquities, heritageSites, img } from "@/app/content";
@@ -60,7 +61,7 @@ export default function AboutPage() {
-
+
Giới thiệu
@@ -98,7 +99,7 @@ export default function AboutPage() {
{stats.map((s) => (
@@ -142,21 +143,24 @@ export default function AboutPage() {
Từ tư liệu đến trải nghiệm số
-
- {steps.map((step, index) => {
- const Icon = step.icon;
- return (
-
-
- {String(index + 1).padStart(2, "0")}
-
-
- {step.title}
- {step.detail}
-
- );
- })}
-
+
+
+
+ {steps.map((step, index) => {
+ const Icon = step.icon;
+ return (
+
+
+ {String(index + 1).padStart(2, "0")}
+
+
+ {step.title}
+ {step.detail}
+
+ );
+ })}
+
+
diff --git a/src/app/globals.css b/src/app/globals.css
index 8f46d67..1511a35 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1344,3 +1344,226 @@ a {
transform: translate3d(-50%, 0, 0);
}
}
+
+/* ───────────────────────────────────────────────────────────────────────────
+ HIỆU ỨNG CHUYỂN ĐỘNG NÂNG CAO (bản "mạnh tay" — vẫn giữ gu di sản)
+ Tất cả gắn vào animation-timeline: view()/scroll() (gốc trình duyệt, không
+ tốn JS theo cuộn) nên cực mượt; trình duyệt không hỗ trợ sẽ nhảy thẳng tới
+ trạng thái cuối (hiển thị đầy đủ) — an toàn, không kẹt nội dung.
+ ─────────────────────────────────────────────────────────────────────────── */
+
+/* 1) Nâng cấp grade ảnh — ấm & sâu hơn nhưng vẫn tự nhiên (giữ ảnh thật). */
+.public-image-stage img,
+.public-card img,
+.public-media img,
+.public-gallery-card img {
+ filter: saturate(1.12) contrast(1.06) brightness(1.015);
+}
+
+/* 2) SPLIT REVEAL — thanh màu quét ngang tiết lộ nội dung khi cuộn tới. */
+.public-split-reveal {
+ position: relative;
+ isolation: isolate;
+}
+
+.public-split-reveal::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ z-index: 5;
+ background: linear-gradient(90deg, var(--primary), var(--tour-jade) 88%);
+ transform: scaleX(0);
+ transform-origin: left center;
+ pointer-events: none;
+ border-radius: inherit;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .public-split-reveal::after {
+ animation: public-split-bar both;
+ animation-timeline: view();
+ animation-range: entry 4% cover 34%;
+ }
+
+ .public-split-reveal > * {
+ animation: public-split-content both;
+ animation-timeline: view();
+ animation-range: entry 6% cover 34%;
+ }
+}
+
+@keyframes public-split-bar {
+ 0% {
+ transform: scaleX(0);
+ transform-origin: left center;
+ }
+ 46% {
+ transform: scaleX(1);
+ transform-origin: left center;
+ }
+ 54% {
+ transform: scaleX(1);
+ transform-origin: right center;
+ }
+ 100% {
+ transform: scaleX(0);
+ transform-origin: right center;
+ }
+}
+
+@keyframes public-split-content {
+ 0%,
+ 42% {
+ opacity: 0;
+ transform: translate3d(0, 14px, 0);
+ }
+ 64%,
+ 100% {
+ opacity: 1;
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+/* 3) TIMELINE — đường nối vẽ dần theo cuộn (hàng mốc "Hành trình số hóa"). */
+.public-timeline {
+ position: relative;
+}
+
+.public-timeline-line {
+ position: absolute;
+ left: 1.5rem;
+ right: 1.5rem;
+ top: var(--timeline-top, 2.6rem);
+ height: 2px;
+ background: linear-gradient(90deg, var(--primary), var(--tour-jade) 64%, transparent);
+ transform: scaleX(0);
+ transform-origin: left center;
+ pointer-events: none;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .public-timeline-line {
+ animation: public-line-grow both;
+ animation-timeline: view();
+ animation-range: entry 16% cover 70%;
+ }
+}
+
+@keyframes public-line-grow {
+ from {
+ transform: scaleX(0);
+ }
+ to {
+ transform: scaleX(1);
+ }
+}
+
+/* 4) PARALLAX HERO — lớp ảnh nền trôi chậm hơn nội dung khi cuộn.
+ Bọc trong @supports để trình duyệt thiếu scroll-timeline giữ bố cục tĩnh. */
+@supports (animation-timeline: scroll()) {
+ @media (prefers-reduced-motion: no-preference) {
+ .public-parallax-bg {
+ animation: public-parallax-drift linear both;
+ animation-timeline: scroll(root);
+ animation-range: 0 80vh;
+ will-change: transform;
+ }
+ }
+}
+
+@keyframes public-parallax-drift {
+ from {
+ transform: translate3d(0, 0, 0) scale(1.12);
+ }
+ to {
+ transform: translate3d(0, 9%, 0) scale(1.12);
+ }
+}
+
+/* 5) HORIZONTAL SCROLL — dải cuộn ngang có scroll-snap (thuần CSS, không jank). */
+.public-hscroll {
+ display: flex;
+ gap: 1rem;
+ overflow-x: auto;
+ overflow-y: hidden;
+ scroll-snap-type: x mandatory;
+ scroll-padding-inline: 1rem;
+ -webkit-overflow-scrolling: touch;
+ scrollbar-width: thin;
+ scrollbar-color: var(--primary) transparent;
+ padding-bottom: 0.9rem;
+ scroll-behavior: smooth;
+}
+
+.public-hscroll > * {
+ scroll-snap-align: start;
+ flex: 0 0 auto;
+}
+
+.public-hscroll::-webkit-scrollbar {
+ height: 8px;
+}
+
+.public-hscroll::-webkit-scrollbar-track {
+ background: rgb(25 76 55 / 0.08);
+ border-radius: 999px;
+}
+
+.public-hscroll::-webkit-scrollbar-thumb {
+ background: linear-gradient(90deg, var(--primary), var(--tour-jade));
+ border-radius: 999px;
+}
+
+.public-gallery-card {
+ position: relative;
+ overflow: hidden;
+ width: clamp(15rem, 72vw, 21rem);
+ border-radius: 14px;
+ border: 1px solid var(--surface-border);
+ background: rgb(14 52 39 / 0.1);
+ box-shadow:
+ 0 24px 66px rgb(37 75 54 / 0.16),
+ inset 0 1px 0 rgb(255 255 255 / 0.4);
+ transition:
+ transform 360ms cubic-bezier(0.16, 1, 0.3, 1),
+ box-shadow 360ms cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.public-gallery-card:hover {
+ transform: translateY(-5px);
+ box-shadow:
+ 0 34px 92px rgb(37 75 54 / 0.24),
+ 0 0 0 1px rgb(169 111 18 / 0.24),
+ inset 0 1px 0 rgb(255 255 255 / 0.5);
+}
+
+.public-gallery-card img {
+ transition: transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.public-gallery-card:hover img {
+ transform: scale(1.06);
+}
+
+/* 6) TYPEWRITER — con trỏ nhấp nháy cho dòng chữ tự gõ ở hero. */
+.public-typewriter-caret {
+ display: inline-block;
+ width: 0.5ch;
+ height: 1.02em;
+ margin-left: 0.1em;
+ vertical-align: -0.14em;
+ background: linear-gradient(180deg, var(--primary), var(--tour-jade));
+ border-radius: 1px;
+ animation: public-caret-blink 1.05s steps(1) infinite;
+}
+
+@keyframes public-caret-blink {
+ 0%,
+ 48% {
+ opacity: 1;
+ }
+ 49%,
+ 100% {
+ opacity: 0;
+ }
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 7181917..befbf2c 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -6,8 +6,9 @@ import { BackToTopButton } from "@/app/components/landing/BackToTopButton";
import { HeritageMarquee } from "@/app/components/landing/HeritageMarquee";
import { SiteFooter } from "@/app/components/landing/SiteFooter";
import { SiteHeader } from "@/app/components/landing/SiteHeader";
+import { Typewriter } from "@/app/components/landing/Typewriter";
import { HeroShaderBackground } from "@/app/components/ui/hero-shader-background";
-import { activeTour, heritageSites, img } from "@/app/content";
+import { activeTour, featuredSpaces, heritageSites, img } from "@/app/content";
export const metadata: Metadata = {
title: "Trang chủ | VR360 Như Quỳnh",
@@ -56,6 +57,19 @@ export default function Home() {
Hành trình số hóa hệ thống di tích, không gian văn hóa và giá trị truyền thống của Xã Như Quỳnh, tỉnh Hưng Yên bằng công nghệ tham quan thực tế ảo 360 độ.
+
+ Khám phá
+
+
@@ -82,6 +96,43 @@ export default function Home() {
+ {/* Không gian tiêu biểu — gallery cuộn ngang, khoe ảnh thật của di tích */}
+
+
+
Không gian tiêu biểu
+
+ Dạo qua từng không gian của Chùa Thái Lạc
+
+
+ Kéo ngang để lướt qua cổng tam quan, sân chùa, hành lang tượng và thượng điện — tất cả là hình ảnh thật được số hóa.
+
+
+
+
+ {featuredSpaces.map((space) => (
+
+
+
+
+
+
{space.title}
+
{space.note}
+
+
+
+ ))}
+
+
+
Giới thiệu nhanh
@@ -190,7 +241,7 @@ export default function Home() {
-
+
Điểm nổi bật
Giá trị của nền tảng VR360.