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>
This commit is contained in:
@@ -0,0 +1,28 @@
|
|||||||
|
import { heritageSites } from "@/app/content";
|
||||||
|
|
||||||
|
// Dải tên di tích chạy ngang liên tục, gợi bề dày của hệ thống di sản.
|
||||||
|
// Lặp danh sách 2 lần để vòng lặp khép kín; dừng khi prefers-reduced-motion.
|
||||||
|
export function HeritageMarquee() {
|
||||||
|
const names = heritageSites.map((site) => site.name);
|
||||||
|
const loop = [...names, ...names];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section
|
||||||
|
className="border-y border-[var(--surface-border)] bg-[var(--surface-band)] py-6"
|
||||||
|
aria-label="Hệ thống di tích Xã Như Quỳnh"
|
||||||
|
>
|
||||||
|
<div className="heritage-marquee">
|
||||||
|
<div className="heritage-marquee-track">
|
||||||
|
{loop.map((name, index) => (
|
||||||
|
<span key={index} className="flex items-center" aria-hidden={index >= names.length}>
|
||||||
|
<span className="public-display text-lg font-semibold text-[var(--tour-ink)]/85 sm:text-xl">
|
||||||
|
{name}
|
||||||
|
</span>
|
||||||
|
<span className="mx-7 inline-block h-1.5 w-1.5 rotate-45 bg-[var(--primary)]/70" />
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -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 và không gian văn hóa Xã Như Quỳnh, tỉnh Hưng Yên bằng công nghệ VR360.
|
Cổng số hóa di tích và không gian văn hóa Xã 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} />
|
||||||
Xã 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 Xã 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 tư liệu
|
Gửi góp ý hoặc tư liệu
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
+15
-7
@@ -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ổ và 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",
|
||||||
|
|||||||
@@ -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 Xã Như Quỳnh
|
Hệ thống di tích Xã 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 Xã Như Quỳnh: 9 di tích xếp hạng cấp quốc gia và 6 di tích cấp tỉnh.
|
Khám phá 15 di tích lịch sử, văn hóa của Xã Như Quỳnh: 9 di tích xếp hạng cấp quốc gia và 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">
|
||||||
|
|||||||
@@ -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 là 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">
|
||||||
|
|||||||
@@ -1399,3 +1399,47 @@ 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;
|
||||||
|
align-items: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: no-preference) {
|
||||||
|
.heritage-marquee-track {
|
||||||
|
animation: heritage-marquee 46s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heritage-marquee:hover .heritage-marquee-track {
|
||||||
|
animation-play-state: paused;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes heritage-marquee {
|
||||||
|
to {
|
||||||
|
transform: translate3d(-50%, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+4
-1
@@ -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
@@ -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 và tư liệu đóng góp xin gửi về Ủy ban nhân dân Xã Như Quỳnh theo địa chỉ và 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
@@ -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 mô hình ba chiều — xoay, phóng to và 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 mô hình ba chiều: xoay, phóng to và 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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user