Compare commits

...

2 Commits

Author SHA1 Message Date
tuyenio 224166f1d4 fix: gỡ đường hairline đè nút CTA hero + marquee di tích cuộn liên tục
- Tắt đường trang trí .public-hero-inner (đè ngang nút "Khám phá ngay/Tìm hiểu dự án")
- Marquee tên di tích: vòng lặp khép kín phải→trái (track <ul> reset, dịch -50%),
  tên bấm được mở trang chi tiết, rê chuột để tạm dừng; tôn trọng prefers-reduced-motion

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:10:16 +07:00
tuyenio dd6dadaa55 feat: thông tin liên hệ chính thức + lớp nghệ thuật (grain, marquee), bỏ em-dash
- Thông tin liên hệ thật: Thôn Đình Dù, Xã Như Quỳnh, tỉnh Hưng Yên · ĐT 02213 985 074
  · cổng nhuquynh.hungyen.gov.vn (1 nguồn dữ liệu `contact`, dùng ở footer + liên hệ + bản đồ)
- Thêm lớp nhiễu hạt phim cố định (chiều sâu cao cấp) + dải tên di tích chạy ngang (1 dải/trang)
- Thay toàn bộ em-dash trong nội dung hiển thị bằng dấu câu chuẩn

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 15:56:15 +07:00
11 changed files with 167 additions and 43 deletions
@@ -0,0 +1,39 @@
import Link from "next/link";
import { heritageSites } from "@/app/content";
// Dải tên di tích cuộn liên tục từ phải sang trái (vòng lặp khép kín).
// Danh sách được lặp 2 lần và track dịch -50% -> điểm nối trùng khít, không giật.
// Rê chuột để tạm dừng và bấm vào tên để mở trang chi tiết.
export function HeritageMarquee() {
const loop = [...heritageSites, ...heritageSites];
return (
<section
className="relative border-y border-[var(--surface-border)] bg-[var(--surface-band)] py-7"
aria-label="Hệ thống di tích Xã Như Quỳnh"
>
<div className="heritage-marquee">
<ul className="heritage-marquee-track">
{loop.map((site, index) => {
const duplicate = index >= heritageSites.length;
return (
<li key={index} className="flex items-center" aria-hidden={duplicate}>
<Link
href={site.detailUrl}
tabIndex={duplicate ? -1 : 0}
className="public-display text-lg font-semibold text-[var(--tour-ink)]/80 transition-colors duration-500 hover:text-[var(--primary)] sm:text-xl"
>
{site.name}
</Link>
<span
aria-hidden="true"
className="mx-7 inline-block h-1.5 w-1.5 rotate-45 bg-[var(--primary)]/70"
/>
</li>
);
})}
</ul>
</div>
</section>
);
}
+16 -10
View File
@@ -1,13 +1,13 @@
import Link from "next/link"; import Link from "next/link";
import { Globe2, Mail, MapPin } from "lucide-react"; import { Globe2, Mail, MapPin, Phone } from "lucide-react";
import { navigation } from "@/app/content"; import { contact, navigation } from "@/app/content";
export function SiteFooter() { export function SiteFooter() {
return ( return (
<footer id="contact" className="px-4 pb-8 sm:px-6"> <footer id="contact" className="px-4 pb-8 sm:px-6">
<div className="mx-auto grid max-w-7xl gap-8 border-t border-[var(--surface-border)] pt-8 lg:grid-cols-[1.1fr_0.72fr_0.82fr]"> <div className="mx-auto grid max-w-7xl gap-8 border-t border-[var(--surface-border)] pt-8 lg:grid-cols-[1.1fr_0.72fr_0.82fr]">
<div className="min-w-0"> <div className="min-w-0">
<p className="text-lg font-bold text-[var(--tour-ink)]">VR360 Như Quỳnh</p> <p className="public-display text-xl font-bold text-[var(--tour-ink)]">VR360 Như Quỳnh</p>
<p className="mt-3 max-w-[62ch] text-sm leading-6 text-[var(--muted-foreground)]"> <p className="mt-3 max-w-[62ch] text-sm leading-6 text-[var(--muted-foreground)]">
Cổng số hóa di tích không gian văn hóa Như Quỳnh, tỉnh Hưng Yên bằng công nghệ VR360. Cổng số hóa di tích không gian văn hóa Như Quỳnh, tỉnh Hưng Yên bằng công nghệ VR360.
</p> </p>
@@ -24,18 +24,24 @@ export function SiteFooter() {
<div className="grid gap-3 text-sm leading-6 text-[var(--muted-foreground)] lg:text-right"> <div className="grid gap-3 text-sm leading-6 text-[var(--muted-foreground)] lg:text-right">
<p className="font-bold text-[var(--tour-ink)]">Thông tin liên hệ</p> <p className="font-bold text-[var(--tour-ink)]">Thông tin liên hệ</p>
<p className="inline-flex items-center gap-2 lg:justify-end"> <p className="inline-flex items-start gap-2 lg:justify-end">
<MapPin className="h-4 w-4 text-[var(--primary)]" strokeWidth={1.8} /> <MapPin className="mt-0.5 h-4 w-4 shrink-0 text-[var(--primary)]" strokeWidth={1.8} />
Như Quỳnh, tỉnh Hưng Yên {contact.address}
</p> </p>
<a href={contact.phoneHref} className="inline-flex items-center gap-2 font-semibold text-[var(--tour-ink)] transition-colors hover:text-[var(--primary)] lg:justify-end">
<Phone className="h-4 w-4 text-[var(--primary)]" strokeWidth={1.8} />
{contact.phone}
</a>
<a <a
href="#" href={contact.website}
className="inline-flex items-center gap-2 font-semibold text-[var(--tour-ink)] hover:text-[var(--primary)] lg:justify-end" target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 font-semibold text-[var(--tour-ink)] transition-colors hover:text-[var(--primary)] lg:justify-end"
> >
<Globe2 className="h-4 w-4 text-[var(--primary)]" strokeWidth={1.8} /> <Globe2 className="h-4 w-4 text-[var(--primary)]" strokeWidth={1.8} />
Cổng thông tin Như Quỳnh {contact.websiteLabel}
</a> </a>
<Link href="/lien-he" className="inline-flex items-center gap-2 font-semibold text-[var(--tour-ink)] hover:text-[var(--primary)] lg:justify-end"> <Link href="/lien-he" className="inline-flex items-center gap-2 font-semibold text-[var(--tour-ink)] transition-colors hover:text-[var(--primary)] lg:justify-end">
<Mail className="h-4 w-4 text-[var(--primary)]" strokeWidth={1.8} /> <Mail className="h-4 w-4 text-[var(--primary)]" strokeWidth={1.8} />
Gửi góp ý hoặc liệu Gửi góp ý hoặc liệu
</Link> </Link>
+15 -7
View File
@@ -9,9 +9,17 @@ export const commune = {
"Vùng đất cổ giàu truyền thống văn hiến và khoa bảng, nơi lưu giữ hệ thống di tích đình, chùa, đền, văn miếu trải dài nhiều thế kỷ.", "Vùng đất cổ giàu truyền thống văn hiến và khoa bảng, nơi lưu giữ hệ thống di tích đình, chùa, đền, văn miếu trải dài nhiều thế kỷ.",
}; };
export const contact = {
address: "Thôn Đình Dù, Xã Như Quỳnh, tỉnh Hưng Yên",
phone: "02213 985 074",
phoneHref: "tel:02213985074",
website: "https://nhuquynh.hungyen.gov.vn/",
websiteLabel: "nhuquynh.hungyen.gov.vn",
};
export const activeTour = { export const activeTour = {
title: "Chùa Thái Lạc (Pháp Vân tự)", title: "Chùa Thái Lạc (Pháp Vân tự)",
subtitle: "Di tích quốc gia chạm khắc gỗ thời Trần", subtitle: "Di tích quốc gia, chạm khắc gỗ thời Trần",
href: "/tour/chua-thai-lac", href: "/tour/chua-thai-lac",
heroImage: img("01.jpg"), // Chính diện cổng chùa heroImage: img("01.jpg"), // Chính diện cổng chùa
coverImage: img("08.jpg"), // Chính sảnh coverImage: img("08.jpg"), // Chính sảnh
@@ -45,7 +53,7 @@ export type Antiquity = {
export const antiquities: Antiquity[] = [ export const antiquities: Antiquity[] = [
{ {
id: "chuong-dong-1", id: "chuong-dong-1",
name: "Chuông đồng Hiện vật I", name: "Chuông đồng (Hiện vật I)",
site: "Cụm di tích Xã Như Quỳnh", site: "Cụm di tích Xã Như Quỳnh",
material: "Đồng", material: "Đồng",
period: "Đang cập nhật", period: "Đang cập nhật",
@@ -59,7 +67,7 @@ export const antiquities: Antiquity[] = [
}, },
{ {
id: "chuong-dong-2", id: "chuong-dong-2",
name: "Chuông đồng Hiện vật II", name: "Chuông đồng (Hiện vật II)",
site: "Cụm di tích Xã Như Quỳnh", site: "Cụm di tích Xã Như Quỳnh",
material: "Đồng", material: "Đồng",
period: "Đang cập nhật", period: "Đang cập nhật",
@@ -122,8 +130,8 @@ export const heritageSites: HeritageSite[] = [
shortDescription: shortDescription:
"Ngôi chùa cổ thờ Pháp Vân trong hệ Tứ Pháp, nổi tiếng với những mảng chạm khắc gỗ thời Trần (thế kỷ 14) thuộc hàng quý hiếm bậc nhất Việt Nam.", "Ngôi chùa cổ thờ Pháp Vân trong hệ Tứ Pháp, nổi tiếng với những mảng chạm khắc gỗ thời Trần (thế kỷ 14) thuộc hàng quý hiếm bậc nhất Việt Nam.",
longDescription: [ longDescription: [
"Chùa Thái Lạc, tên chữ là Pháp Vân tự, là một trong những ngôi chùa cổ tiêu biểu của vùng Như Quỳnh, thờ Pháp Vân vị thần Mây trong tín ngưỡng Tứ Pháp của cư dân nông nghiệp đồng bằng Bắc Bộ.", "Chùa Thái Lạc, tên chữ là Pháp Vân tự, là một trong những ngôi chùa cổ tiêu biểu của vùng Như Quỳnh, thờ Pháp Vân, vị thần Mây trong tín ngưỡng Tứ Pháp của cư dân nông nghiệp đồng bằng Bắc Bộ.",
"Giá trị đặc biệt của di tích nằm ở hệ thống ván chạm khắc gỗ có niên đại thời Trần (thế kỷ 14), khắc họa các nhạc công, vũ nữ, hình tượng Phật giáo với kỹ thuật điêu luyện nguồn tư liệu quý cho nghiên cứu mỹ thuật cổ Việt Nam.", "Giá trị đặc biệt của di tích nằm ở hệ thống ván chạm khắc gỗ có niên đại thời Trần (thế kỷ 14), khắc họa các nhạc công, vũ nữ, hình tượng Phật giáo với kỹ thuật điêu luyện, là nguồn tư liệu quý cho nghiên cứu mỹ thuật cổ Việt Nam.",
"Không gian chùa gồm cổng, sân, tiền đường, thượng điện cùng các ban thờ và cảnh quan vườn, ao, được số hóa đầy đủ trong tour VR360.", "Không gian chùa gồm cổng, sân, tiền đường, thượng điện cùng các ban thờ và cảnh quan vườn, ao, được số hóa đầy đủ trong tour VR360.",
], ],
image: img("01.jpg"), // Chính diện cổng chùa image: img("01.jpg"), // Chính diện cổng chùa
@@ -137,7 +145,7 @@ export const heritageSites: HeritageSite[] = [
nationalStub("tu-vu-ho-truong", "Từ Vũ họ Trương", "Di tích khác", nationalStub("tu-vu-ho-truong", "Từ Vũ họ Trương", "Di tích khác",
"Từ đường dòng họ Trương, di tích phản ánh truyền thống dòng tộc và tín ngưỡng thờ tổ tiên của địa phương."), "Từ đường dòng họ Trương, di tích phản ánh truyền thống dòng tộc và tín ngưỡng thờ tổ tiên của địa phương."),
nationalStub("bai-da-den-tu-vu", "Bãi đá đền Từ Vũ", "Di tích khác", nationalStub("bai-da-den-tu-vu", "Bãi đá đền Từ Vũ", "Di tích khác",
"Cụm di tích khảo cổ kiến trúc đá gắn với đền Từ Vũ, mang giá trị lịch sử và văn hóa lâu đời."), "Cụm di tích khảo cổ kiến trúc đá gắn với đền Từ Vũ, mang giá trị lịch sử và văn hóa lâu đời."),
nationalStub("dinh-at", "Đình Ất", "Đình", nationalStub("dinh-at", "Đình Ất", "Đình",
"Đình làng cổ, không gian sinh hoạt tín ngưỡng và cộng đồng tiêu biểu của làng quê Như Quỳnh."), "Đình làng cổ, không gian sinh hoạt tín ngưỡng và cộng đồng tiêu biểu của làng quê Như Quỳnh."),
nationalStub("chua-hanh-lac", "Chùa Hành Lạc", "Chùa", nationalStub("chua-hanh-lac", "Chùa Hành Lạc", "Chùa",
@@ -155,7 +163,7 @@ export const heritageSites: HeritageSite[] = [
provincialStub("chua-tu-kinh", "Chùa Từ Kính", "Chùa", provincialStub("chua-tu-kinh", "Chùa Từ Kính", "Chùa",
"Ngôi chùa cổ, điểm sinh hoạt Phật giáo và văn hóa tâm linh của cộng đồng."), "Ngôi chùa cổ, điểm sinh hoạt Phật giáo và văn hóa tâm linh của cộng đồng."),
provincialStub("cung-chi-nguyen", "Cung Chí Nguyên", "Di tích khác", provincialStub("cung-chi-nguyen", "Cung Chí Nguyên", "Di tích khác",
"Di tích gắn với nhà văn Thạch Lam nơi khơi nguồn cảm hứng cho truyện ngắn \"Dưới bóng hoàng lan\"."), "Di tích gắn với nhà văn Thạch Lam, nơi khơi nguồn cảm hứng cho truyện ngắn \"Dưới bóng hoàng lan\"."),
provincialStub("van-mieu-nhu-quynh", "Văn miếu Như Quỳnh", "Văn miếu", provincialStub("van-mieu-nhu-quynh", "Văn miếu Như Quỳnh", "Văn miếu",
"Văn miếu tôn vinh truyền thống hiếu học và khoa bảng của vùng đất Như Quỳnh."), "Văn miếu tôn vinh truyền thống hiếu học và khoa bảng của vùng đất Như Quỳnh."),
provincialStub("dau-tich-chua-la", "Dấu tích Chùa Lá", "Chùa", provincialStub("dau-tich-chua-la", "Dấu tích Chùa Lá", "Chùa",
+2 -2
View File
@@ -11,7 +11,7 @@ import { activeTour, heritageSites } from "@/app/content";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Di tích | VR360 Như Quỳnh", title: "Di tích | VR360 Như Quỳnh",
description: description:
"Danh sách toàn bộ di tích lịch sử văn hóa và tour VR360 của Xã Như Quỳnh, tỉnh Hưng Yên.", "Danh sách toàn bộ di tích lịch sử, văn hóa và tour VR360 của Xã Như Quỳnh, tỉnh Hưng Yên.",
}; };
export default function HeritageListPage() { export default function HeritageListPage() {
@@ -36,7 +36,7 @@ export default function HeritageListPage() {
Hệ thống di tích Như Quỳnh Hệ thống di tích Như Quỳnh
</h1> </h1>
<p className="public-subpage-copy mt-6 text-base leading-8 text-[var(--foreground)]/82 sm:text-lg"> <p className="public-subpage-copy mt-6 text-base leading-8 text-[var(--foreground)]/82 sm:text-lg">
Khám phá 15 di tích lịch sử văn hóa của Như Quỳnh: 9 di tích xếp hạng cấp quốc gia 6 di tích cấp tỉnh. Khám phá 15 di tích lịch sử, văn hóa của Như Quỳnh: 9 di tích xếp hạng cấp quốc gia 6 di tích cấp tỉnh.
</p> </p>
<div className="mt-7 flex flex-wrap gap-3"> <div className="mt-7 flex flex-wrap gap-3">
<span className="public-chip"> <span className="public-chip">
+3 -3
View File
@@ -21,7 +21,7 @@ import { activeTour, antiquities, heritageSites, img } from "@/app/content";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Giới thiệu | VR360 Như Quỳnh", title: "Giới thiệu | VR360 Như Quỳnh",
description: description:
"Giới thiệu về Xã Như Quỳnh, tỉnh Hưng Yên vùng đất văn hiến và hệ thống di tích lịch sử văn hóa được số hóa bằng công nghệ VR360.", "Giới thiệu về Xã Như Quỳnh, tỉnh Hưng Yên: vùng đất văn hiến và hệ thống di tích lịch sử, văn hóa được số hóa bằng công nghệ VR360.",
}; };
const nationalCount = heritageSites.filter((s) => s.level === "Cấp quốc gia").length; const nationalCount = heritageSites.filter((s) => s.level === "Cấp quốc gia").length;
@@ -41,7 +41,7 @@ const paragraphs = [
]; ];
const values = [ const values = [
{ icon: Landmark, title: "Không gian tín ngưỡng", detail: "Đình, chùa, đền, văn miếu nơi gìn giữ kiến trúc và đời sống tâm linh của cộng đồng làng quê." }, { icon: Landmark, title: "Không gian tín ngưỡng", detail: "Đình, chùa, đền, văn miếu, nơi gìn giữ kiến trúc và đời sống tâm linh của cộng đồng làng quê." },
{ icon: BookOpenText, title: "Vùng đất khoa bảng", detail: "Truyền thống hiếu học được tôn vinh qua hệ thống văn miếu và các bậc danh nhân của quê hương." }, { icon: BookOpenText, title: "Vùng đất khoa bảng", detail: "Truyền thống hiếu học được tôn vinh qua hệ thống văn miếu và các bậc danh nhân của quê hương." },
{ icon: Building2, title: "Kiến trúc nghệ thuật", detail: "Những mảng chạm khắc, đồ thờ tự và hiện vật mang giá trị mỹ thuật cổ tiêu biểu." }, { icon: Building2, title: "Kiến trúc nghệ thuật", detail: "Những mảng chạm khắc, đồ thờ tự và hiện vật mang giá trị mỹ thuật cổ tiêu biểu." },
{ icon: Users, title: "Ký ức cộng đồng", detail: "Lễ hội, phong tục và câu chuyện dân gian gắn liền với từng di tích qua nhiều thế hệ." }, { icon: Users, title: "Ký ức cộng đồng", detail: "Lễ hội, phong tục và câu chuyện dân gian gắn liền với từng di tích qua nhiều thế hệ." },
@@ -178,7 +178,7 @@ export default function AboutPage() {
{activeTour.title} {activeTour.title}
</h2> </h2>
<p className="mt-4 max-w-[52ch] text-sm leading-7 text-[var(--foreground)]/80 sm:text-base"> <p className="mt-4 max-w-[52ch] text-sm leading-7 text-[var(--foreground)]/80 sm:text-base">
Ngôi chùa cổ thờ Pháp Vân, nổi tiếng với mảng chạm khắc gỗ thời Trần di tích đu tiên Ngôi chùa cổ thờ Pháp Vân, nổi tiếng với mảng chạm khắc gỗ thời Trần. Đây di tích đu tiên
đưc số hóa thành tour VR360 hoàn chỉnh. đưc số hóa thành tour VR360 hoàn chỉnh.
</p> </p>
<div className="mt-7 flex flex-wrap gap-3"> <div className="mt-7 flex flex-wrap gap-3">
+49 -1
View File
@@ -292,7 +292,7 @@ a {
.public-hero-inner::before, .public-hero-inner::before,
.public-hero-inner::after { .public-hero-inner::after {
content: ""; content: none; /* gỡ đường hairline trang trí (đè lên nút CTA) */
position: absolute; position: absolute;
pointer-events: none; pointer-events: none;
} }
@@ -1399,3 +1399,51 @@ a {
filter: saturate(1.08) brightness(1.03); filter: saturate(1.08) brightness(1.03);
} }
} }
/* Lớp nhiễu hạt phim cố định — tạo chiều sâu, chất liệu cao cấp cho nền tối. */
.site-grain {
position: fixed;
inset: 0;
z-index: 60;
pointer-events: none;
opacity: 0.05;
mix-blend-mode: overlay;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
background-size: 160px 160px;
}
/* Dải tên di tích chạy ngang — gợi bề dày hệ thống di sản. Một dải/trang. */
.heritage-marquee {
position: relative;
overflow: hidden;
mask-image: linear-gradient(90deg, transparent, black 9%, black 91%, transparent);
-webkit-mask-image: linear-gradient(90deg, transparent, black 9%, black 91%, transparent);
}
.heritage-marquee-track {
display: inline-flex;
width: max-content;
margin: 0;
padding: 0;
list-style: none;
align-items: center;
white-space: nowrap;
will-change: transform;
transform: translate3d(0, 0, 0);
}
@media (prefers-reduced-motion: no-preference) {
.heritage-marquee-track {
animation: heritage-marquee 42s linear infinite;
}
.heritage-marquee:hover .heritage-marquee-track {
animation-play-state: paused;
}
}
@keyframes heritage-marquee {
to {
transform: translate3d(-50%, 0, 0);
}
}
+4 -1
View File
@@ -34,7 +34,10 @@ export default function RootLayout({
}>) { }>) {
return ( return (
<html lang="vi" className={`${notoSans.variable} ${notoSerifDisplay.variable} h-full antialiased`}> <html lang="vi" className={`${notoSans.variable} ${notoSerifDisplay.variable} h-full antialiased`}>
<body className="min-h-full flex flex-col">{children}</body> <body className="min-h-full flex flex-col">
{children}
<div className="site-grain" aria-hidden="true" />
</body>
</html> </html>
); );
} }
+31 -14
View File
@@ -1,8 +1,9 @@
import type { Metadata } from "next"; import type { Metadata } from "next";
import { Clock, ImagePlus, Landmark, Mail, MapPin, MessageSquareText, Phone, Send } from "lucide-react"; import { Clock, Globe2, ImagePlus, Landmark, MapPin, MessageSquareText, Phone, Send } from "lucide-react";
import { BackToTopButton } from "@/app/components/landing/BackToTopButton"; import { BackToTopButton } from "@/app/components/landing/BackToTopButton";
import { SiteFooter } from "@/app/components/landing/SiteFooter"; import { SiteFooter } from "@/app/components/landing/SiteFooter";
import { SiteHeader } from "@/app/components/landing/SiteHeader"; import { SiteHeader } from "@/app/components/landing/SiteHeader";
import { contact } from "@/app/content";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Liên hệ | VR360 Như Quỳnh", title: "Liên hệ | VR360 Như Quỳnh",
@@ -10,10 +11,10 @@ export const metadata: Metadata = {
}; };
const contacts = [ const contacts = [
{ icon: MapPin, label: "Địa chỉ", value: "Xã Như Quỳnh, tỉnh Hưng Yên" }, { icon: MapPin, label: "Địa chỉ", value: contact.address, href: undefined, external: false },
{ icon: Phone, label: "Điện thoại", value: "Đang cập nhật" }, { icon: Phone, label: "Điện thoại", value: contact.phone, href: contact.phoneHref, external: false },
{ icon: Mail, label: "Email", value: "Đang cập nhật" }, { icon: Globe2, label: "Cổng thông tin", value: contact.websiteLabel, href: contact.website, external: true },
{ icon: Clock, label: "Thời gian tiếp nhận", value: "Trong giờ hành chính các ngày làm việc" }, { icon: Clock, label: "Thời gian tiếp nhận", value: "Trong giờ hành chính các ngày làm việc", href: undefined, external: false },
]; ];
const steps = [ const steps = [
@@ -77,22 +78,38 @@ export default function ContactPage() {
<div className="mt-6 grid gap-3"> <div className="mt-6 grid gap-3">
{contacts.map((c) => { {contacts.map((c) => {
const Icon = c.icon; const Icon = c.icon;
return ( const inner = (
<div key={c.label} className="public-panel flex items-center gap-4 rounded-[14px] p-5"> <>
<span className="grid h-11 w-11 shrink-0 place-items-center rounded-full bg-[rgb(200_164_106_/_0.18)]"> <span className="grid h-11 w-11 shrink-0 place-items-center rounded-full bg-[rgb(200_164_106_/_0.18)]">
<Icon className="h-5 w-5 text-[var(--primary)]" strokeWidth={1.8} /> <Icon className="h-5 w-5 text-[var(--primary)]" strokeWidth={1.8} />
</span> </span>
<span> <span className="min-w-0">
<span className="block text-xs font-bold uppercase tracking-[0.1em] text-[var(--muted-foreground)]">{c.label}</span> <span className="block text-xs font-bold uppercase tracking-[0.1em] text-[var(--muted-foreground)]">{c.label}</span>
<span className="block text-base font-semibold text-[var(--tour-ink)]">{c.value}</span> <span className="block break-words text-base font-semibold text-[var(--tour-ink)]">{c.value}</span>
</span> </span>
</>
);
const base = "public-panel flex items-center gap-4 rounded-[14px] p-5";
return c.href ? (
<a
key={c.label}
href={c.href}
target={c.external ? "_blank" : undefined}
rel={c.external ? "noopener noreferrer" : undefined}
className={`${base} group transition hover:-translate-y-0.5`}
>
{inner}
</a>
) : (
<div key={c.label} className={base}>
{inner}
</div> </div>
); );
})} })}
</div> </div>
<p className="mt-4 inline-flex items-center gap-2 text-xs leading-5 text-[var(--muted-foreground)]"> <p className="mt-4 inline-flex items-start gap-2 text-xs leading-5 text-[var(--muted-foreground)]">
<Send className="h-3.5 w-3.5 text-[var(--primary)]" strokeWidth={1.8} /> <Send className="mt-0.5 h-3.5 w-3.5 shrink-0 text-[var(--primary)]" strokeWidth={1.8} />
Thông tin số điện thoại và email chính thức sẽ đưc cập nhật khi sẵn sàng. Mọi thông tin, hình nh liệu đóng góp xin gửi v y ban nhân dân Như Quỳnh theo đa chỉ số điện thoại trên.
</p> </p>
</div> </div>
</section> </section>
@@ -101,8 +118,8 @@ export default function ContactPage() {
<section className="mx-auto max-w-7xl px-4 pb-16 sm:px-6 lg:pb-24"> <section className="mx-auto max-w-7xl px-4 pb-16 sm:px-6 lg:pb-24">
<div className="public-map-frame overflow-hidden rounded-[16px] border border-[var(--surface-border)]"> <div className="public-map-frame overflow-hidden rounded-[16px] border border-[var(--surface-border)]">
<iframe <iframe
title="Bản đồ Xã Như Quỳnh, tỉnh Hưng Yên" title="Bản đồ Thôn Đình Dù, Xã Như Quỳnh, tỉnh Hưng Yên"
src="https://www.google.com/maps?q=Nh%C6%B0%20Qu%E1%BB%B3nh%2C%20H%C6%B0ng%20Y%C3%AAn&output=embed" src={`https://www.google.com/maps?q=${encodeURIComponent(contact.address)}&output=embed`}
loading="lazy" loading="lazy"
referrerPolicy="no-referrer-when-downgrade" referrerPolicy="no-referrer-when-downgrade"
className="h-[360px] w-full sm:h-[440px]" className="h-[360px] w-full sm:h-[440px]"
+4 -1
View File
@@ -3,6 +3,7 @@ import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { ArrowRight, Box, Globe2, Landmark, PlayCircle, Rotate3d, School, Sparkles } from "lucide-react"; import { ArrowRight, Box, Globe2, Landmark, PlayCircle, Rotate3d, School, Sparkles } from "lucide-react";
import { BackToTopButton } from "@/app/components/landing/BackToTopButton"; import { BackToTopButton } from "@/app/components/landing/BackToTopButton";
import { HeritageMarquee } from "@/app/components/landing/HeritageMarquee";
import { SiteFooter } from "@/app/components/landing/SiteFooter"; import { SiteFooter } from "@/app/components/landing/SiteFooter";
import { SiteHeader } from "@/app/components/landing/SiteHeader"; import { SiteHeader } from "@/app/components/landing/SiteHeader";
import { HeroShaderBackground } from "@/app/components/ui/hero-shader-background"; import { HeroShaderBackground } from "@/app/components/ui/hero-shader-background";
@@ -79,6 +80,8 @@ export default function Home() {
</section> </section>
</HeroShaderBackground> </HeroShaderBackground>
<HeritageMarquee />
<section className="mx-auto grid max-w-7xl gap-10 px-4 py-14 sm:px-6 lg:grid-cols-[0.8fr_1.2fr] lg:items-center lg:py-20"> <section className="mx-auto grid max-w-7xl gap-10 px-4 py-14 sm:px-6 lg:grid-cols-[0.8fr_1.2fr] lg:items-center lg:py-20">
<div className="min-w-0"> <div className="min-w-0">
<p className="public-kicker">Giới thiệu nhanh</p> <p className="public-kicker">Giới thiệu nhanh</p>
@@ -135,7 +138,7 @@ export default function Home() {
<p className="mt-1 text-sm font-bold text-[var(--primary)]">Phòng trưng bày số</p> <p className="mt-1 text-sm font-bold text-[var(--primary)]">Phòng trưng bày số</p>
<h3 className="mt-2 text-2xl font-extrabold leading-tight text-[var(--tour-ink)]">Cổ vật & hiện vật 3D</h3> <h3 className="mt-2 text-2xl font-extrabold leading-tight text-[var(--tour-ink)]">Cổ vật & hiện vật 3D</h3>
<p className="mt-3 text-sm leading-6 text-[var(--muted-foreground)]"> <p className="mt-3 text-sm leading-6 text-[var(--muted-foreground)]">
Chiêm ngưỡng các cổ vật tiêu biểu đưc dựng thành hình ba chiều xoay, phóng to quan sát từng chi tiết. Chiêm ngưỡng các cổ vật tiêu biểu đưc dựng thành hình ba chiều: xoay, phóng to quan sát từng chi tiết.
</p> </p>
<Link href="/co-vat" className="mt-auto inline-flex items-center gap-2 pt-5 text-sm font-extrabold text-[var(--tour-ink)] transition hover:text-[var(--primary)]"> <Link href="/co-vat" className="mt-auto inline-flex items-center gap-2 pt-5 text-sm font-extrabold text-[var(--tour-ink)] transition hover:text-[var(--primary)]">
Khám phá cổ vật 3D Khám phá cổ vật 3D
+1 -1
View File
@@ -4,7 +4,7 @@ import VirtualTour from "@/app/components/VirtualTour";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "VR360 Chùa Thái Lạc (Pháp Vân tự)", title: "VR360 Chùa Thái Lạc (Pháp Vân tự)",
description: description:
"Trải nghiệm tham quan thực tế ảo 360° Chùa Thái Lạc (Pháp Vân tự) di tích quốc gia tại Xã Như Quỳnh, tỉnh Hưng Yên.", "Trải nghiệm tham quan thực tế ảo 360° Chùa Thái Lạc (Pháp Vân tự), di tích quốc gia tại Xã Như Quỳnh, tỉnh Hưng Yên.",
}; };
export default function ChuaThaiLacTourPage() { export default function ChuaThaiLacTourPage() {
+3 -3
View File
@@ -33,7 +33,7 @@ const seeds: SceneSeed[] = [
pitch: -2, pitch: -2,
iconType: "info", iconType: "info",
content: [ content: [
"Chùa Thái Lạc, tên chữ là Pháp Vân tự, là ngôi chùa cổ thờ Pháp Vân vị thần Mây trong tín ngưỡng Tứ Pháp của cư dân nông nghiệp đồng bằng Bắc Bộ.", "Chùa Thái Lạc, tên chữ là Pháp Vân tự, là ngôi chùa cổ thờ Pháp Vân, vị thần Mây trong tín ngưỡng Tứ Pháp của cư dân nông nghiệp đồng bằng Bắc Bộ.",
"Di tích được xếp hạng cấp quốc gia, nổi tiếng với hệ thống ván chạm khắc gỗ thời Trần (thế kỷ 14) thuộc hàng quý hiếm bậc nhất Việt Nam.", "Di tích được xếp hạng cấp quốc gia, nổi tiếng với hệ thống ván chạm khắc gỗ thời Trần (thế kỷ 14) thuộc hàng quý hiếm bậc nhất Việt Nam.",
], ],
}, },
@@ -86,7 +86,7 @@ const seeds: SceneSeed[] = [
pitch: -2, pitch: -2,
iconType: "envelope", iconType: "envelope",
content: [ content: [
"Khu vực tôn trí tượng Quan Âm Bồ Tát cùng các pho tượng La Hán, Phật không gian chiêm bái trang nghiêm trong khuôn viên chùa.", "Khu vực tôn trí tượng Quan Âm Bồ Tát cùng các pho tượng La Hán, Phật, là không gian chiêm bái trang nghiêm trong khuôn viên chùa.",
], ],
}, },
], ],
@@ -147,7 +147,7 @@ const mapRoutes = scenes
export const chuaThaiLacTour: Omit<TourConfig, "sceneById" | "locationGroups"> = { export const chuaThaiLacTour: Omit<TourConfig, "sceneById" | "locationGroups"> = {
id: "chua-thai-lac", id: "chua-thai-lac",
title: "Chùa Thái Lạc (Pháp Vân tự)", title: "Chùa Thái Lạc (Pháp Vân tự)",
subtitle: "Di tích quốc gia chạm khắc gỗ thời Trần", subtitle: "Di tích quốc gia, chạm khắc gỗ thời Trần",
welcomeTitle: "Chùa Thái Lạc", welcomeTitle: "Chùa Thái Lạc",
welcomeAccent: "Pháp Vân tự", welcomeAccent: "Pháp Vân tự",
welcomeSubtitle: welcomeSubtitle: