Resolve merge conflicts

This commit is contained in:
r2xrzh9q2z-lab
2026-02-02 11:03:31 +07:00
5 changed files with 454 additions and 506 deletions

View File

@@ -1,11 +1,26 @@
@charset "UTF-8";
@import "tailwindcss";
:root {
--body: #fff;
--font-primary: var(--font-inter);
--font-heading: var(--font-space-grotesk);
--background: #ffffff;
--foreground: #171717;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
}
@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
}
body {
font-family: var(--font-primary);
background: var(--background);
color: var(--foreground);
font-family: Arial, Helvetica, sans-serif;
}

View File

@@ -1,19 +1,17 @@
import type { Metadata } from "next";
import Script from "next/script";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import Header from "./components/Header";
import Footer from "./components/Footer";
import { Inter, Space_Grotesk } from "next/font/google";
const ASSET_URL = process.env.NEXT_PUBLIC_API_URL || "";
const inter = Inter({
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
variable: "--font-inter",
});
const spaceGrotesk = Space_Grotesk({
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
variable: "--font-space-grotesk",
});
export const metadata: Metadata = {
@@ -27,119 +25,15 @@ export default function RootLayout({
}: Readonly<{
children: React.ReactNode;
}>) {
//
return (
<html lang="en" className={`${inter.variable} ${spaceGrotesk.variable}`}>
<body>{children}</body>
<html lang="vi">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased bg-gray-50`}
>
<Header />
<main className="min-h-screen">{children}</main>
<Footer />
</body>
</html>
);
}
// <html lang="vi">
// <head>
// {/* Font Awesome 6.4.0 from CDN - for reliable icon support */}
// <link rel="stylesheet" href="../public/assets/css" />
// {/* Bootstrap min.css */}
// <link
// rel="stylesheet"
// href={`${ASSET_URL}/assets/css/bootstrap.min.css`}
// />
// {/* Animate.css */}
// <link rel="stylesheet" href={`${ASSET_URL}/assets/css/animate.css`} />
// {/* Magnific Popup.css */}
// <link
// rel="stylesheet"
// href={`${ASSET_URL}/assets/css/magnific-popup.css`}
// />
// {/* MeanMenu.css */}
// <link rel="stylesheet" href={`${ASSET_URL}/assets/css/meanmenu.css`} />
// {/* Odometer.css */}
// <link rel="stylesheet" href={`${ASSET_URL}/assets/css/odometer.css`} />
// {/* Swiper Bundle.css */}
// <link
// rel="stylesheet"
// href={`${ASSET_URL}/assets/css/swiper-bundle.min.css`}
// />
// {/* Nice Select.css */}
// <link
// rel="stylesheet"
// href={`${ASSET_URL}/assets/css/nice-select.css`}
// />
// {/* Main.css */}
// <link rel="stylesheet" href={`${ASSET_URL}/assets/css/main.css`} />
// </head>
// <body
// className={`${geistSans.variable} ${geistMono.variable} antialiased bg-gray-50`}
// >
// <Header />
// <main className="min-h-screen">{children}</main>
// <Footer />
// {/* Scripts */}
// <Script
// src={`${ASSET_URL}/assets/js/jquery-3.7.1.min.js`}
// strategy="beforeInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/viewport.jquery.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/bootstrap.bundle.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/jquery.nice-select.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/jquery.waypoints.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/odometer.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/swiper-bundle.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/jquery.meanmenu.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/jquery.magnific-popup.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/wow.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/circle-progress.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/gsap.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/lenis.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/ScrollTrigger.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/SplitText.min.js`}
// strategy="afterInteractive"
// />
// <Script
// src={`${ASSET_URL}/assets/js/main.js`}
// strategy="afterInteractive"
// />
// </body>
// </html>
// );

View File

@@ -1,98 +1,238 @@
"use client";
import { useState } from "react";
import visaData from "./visa.json";
import Breadcrumb from "./components/Breadcrumb";
const ASSET_URL = process.env.NEXT_PUBLIC_API_URL || "";
export default function VisaPage() {
const [selectedVisaType, setSelectedVisaType] = useState<string | null>(null);
const [openFaq, setOpenFaq] = useState<number | null>(null);
interface VisaCountry {
id: number;
name: string;
icon: string;
services: string[];
}
const handleVisaTypeClick = (visaId: string) => {
setSelectedVisaType(selectedVisaType === visaId ? null : visaId);
};
const visaCountries: VisaCountry[] = visaData.visaSystem.summaryList.map(
(country) => ({
...country,
icon: `${ASSET_URL}/${country.icon}`,
}),
);
export default function VisaListPage() {
const getSlug = (countryName: string): string => {
return countryName.toLowerCase().replace(/\s+/g, "-");
const toggleFaq = (index: number) => {
setOpenFaq(openFaq === index ? null : index);
};
return (
<>
{/* Breadcrumb-Wrapper Section Start */}
<Breadcrumb
title={visaData.visaSystem.breadcrumb.list.title}
breadcrumbItems={[
{ label: "Home", href: "/" },
{ label: visaData.visaSystem.breadcrumb.list.title },
]}
backgroundImage={`${ASSET_URL}/${visaData.visaSystem.breadcrumb.list.image}`}
/>
<div className="container mx-auto px-4 py-8">
<div className="max-w-6xl mx-auto">
{/* Hero Section */}
<div className="text-center mb-16">
<h1 className="text-5xl font-bold text-gray-900 mb-4">
{visaData.hero.title}
</h1>
<p className="text-xl text-gray-600 mb-8 max-w-3xl mx-auto">
{visaData.hero.description}
</p>
{/* Service Section Start */}
<section className="visa-provide-section section-padding section-bg-1 fix">
<div className="container">
<div className="row g-4">
{visaCountries.map((country) => (
<div key={country.id} className="col-lg-6">
<div className="visa-provide-box mt-0">
<div className="visa-top-item">
<div className="visa-left">
<div className="icon">
<img src={country.icon} alt="img" />
</div>
<div className="content">
<p>Visa Service</p>
<h3>
<a href={`/visa/${getSlug(country.name)}`}>
{country.name}
</a>
</h3>
</div>
</div>
<a
href={`/visa/${getSlug(country.name)}`}
className="theme-btn"
>
Read More
<i className="fa-solid fa-arrow-right"></i>
</a>
</div>
<div className="visa-list-item">
<ul className="list">
<li>
<i className="fa-regular fa-arrow-right"></i>
{country.services[0]}
</li>
<li>
<i className="fa-regular fa-arrow-right"></i>
{country.services[1]}
</li>
</ul>
<ul className="list">
<li>
<i className="fa-regular fa-arrow-right"></i>
{country.services[2]}
</li>
<li>
<i className="fa-regular fa-arrow-right"></i>
{country.services[3]}
</li>
</ul>
</div>
{/* Stats */}
<div className="grid md:grid-cols-3 gap-8 max-w-2xl mx-auto">
{visaData.hero.stats.map((stat, index) => (
<div key={index} className="text-center">
<div className="text-4xl font-bold text-blue-600 mb-2">
{stat.number}
</div>
<div className="text-gray-700">{stat.label}</div>
</div>
))}
</div>
</div>
</section>
</>
{/* Visa Types */}
<div className="mb-16">
<h2 className="text-3xl font-bold text-gray-900 mb-8 text-center">
Các Loại Visa
</h2>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
{visaData.visaTypes.map((visa) => (
<div
key={visa.id}
className="bg-white rounded-lg shadow-md overflow-hidden hover:shadow-lg transition-shadow"
>
{/* Visa Header */}
<div
className="p-6 cursor-pointer"
onClick={() => handleVisaTypeClick(visa.id)}
>
<div className="flex items-center mb-4">
<span className="text-3xl mr-4">{visa.icon}</span>
<h3 className="text-xl font-semibold text-gray-900">
{visa.name}
</h3>
</div>
<p className="text-gray-700 mb-4">{visa.description}</p>
{/* Quick Stats */}
<div className="grid grid-cols-2 gap-4 text-sm">
<div>
<span className="text-gray-500">Thời gian:</span>
<div className="font-medium">{visa.processingTime}</div>
</div>
<div>
<span className="text-gray-500">Tỷ lệ thành công:</span>
<div className="font-medium text-green-600">
{visa.successRate}
</div>
</div>
</div>
</div>
{/* Detailed Info */}
{selectedVisaType === visa.id && (
<div className="border-t bg-gray-50 p-6">
{/* Features */}
<div className="mb-6">
<h4 className="font-semibold text-gray-900 mb-3">
Tính năng:
</h4>
<ul className="space-y-2">
{visa.features.map((feature, index) => (
<li
key={index}
className="flex items-start text-gray-700"
>
<span className="text-green-500 mr-2 mt-1"></span>
{feature}
</li>
))}
</ul>
</div>
{/* Popular Countries */}
<div className="mb-6">
<h4 className="font-semibold text-gray-900 mb-3">
Quốc gia phổ biến:
</h4>
<div className="flex flex-wrap gap-2">
{visa.popularCountries.map((country, index) => (
<span
key={index}
className="bg-blue-100 text-blue-800 px-2 py-1 rounded text-sm"
>
{country}
</span>
))}
</div>
</div>
{/* CTA */}
<button className="w-full bg-blue-600 text-white py-2 px-4 rounded-lg hover:bg-blue-700 transition-colors">
vấn {visa.name}
</button>
</div>
)}
</div>
))}
</div>
</div>
{/* Process */}
<div className="mb-16">
<h2 className="text-3xl font-bold text-gray-900 mb-8 text-center">
Quy Trình Xin Visa
</h2>
<div className="relative">
{/* Process Line */}
<div className="hidden md:block absolute top-1/2 left-0 right-0 h-0.5 bg-blue-200 transform -translate-y-1/2"></div>
<div className="grid md:grid-cols-5 gap-8">
{visaData.process.map((step, index) => (
<div key={step.step} className="relative text-center">
{/* Step Circle */}
<div className="w-16 h-16 bg-blue-600 text-white rounded-full flex items-center justify-center text-2xl mx-auto mb-4 relative z-10">
{step.icon}
</div>
{/* Step Number */}
<div className="absolute -top-2 -right-2 w-8 h-8 bg-blue-800 text-white rounded-full flex items-center justify-center text-sm font-bold">
{step.step}
</div>
<h3 className="font-semibold text-gray-900 mb-2">
{step.title}
</h3>
<p className="text-gray-700 text-sm">{step.description}</p>
</div>
))}
</div>
</div>
</div>
{/* Why Choose Us */}
<div className="mb-16">
<h2 className="text-3xl font-bold text-gray-900 mb-8 text-center">
Tại Sao Chọn Chúng Tôi?
</h2>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
{visaData.whyChooseUs.map((reason, index) => (
<div
key={index}
className="bg-white rounded-lg shadow-md p-6 text-center"
>
<div className="text-4xl mb-4">{reason.icon}</div>
<h3 className="font-semibold text-gray-900 mb-2">
{reason.title}
</h3>
<p className="text-gray-700">{reason.description}</p>
</div>
))}
</div>
</div>
{/* FAQs */}
<div className="mb-16">
<h2 className="text-3xl font-bold text-gray-900 mb-8 text-center">
Câu Hỏi Thường Gặp
</h2>
<div className="max-w-3xl mx-auto space-y-4">
{visaData.faqs.map((faq, index) => (
<div
key={index}
className="bg-white rounded-lg shadow-md overflow-hidden"
>
<button
className="w-full p-6 text-left hover:bg-gray-50 transition-colors"
onClick={() => toggleFaq(index)}
>
<div className="flex items-center justify-between">
<h3 className="font-semibold text-gray-900">
{faq.question}
</h3>
<span className="text-gray-400">
{openFaq === index ? "" : "+"}
</span>
</div>
</button>
{openFaq === index && (
<div className="px-6 pb-6">
<p className="text-gray-700">{faq.answer}</p>
</div>
)}
</div>
))}
</div>
</div>
{/* CTA Section */}
<div className="text-center bg-gradient-to-r from-blue-600 to-purple-600 rounded-lg p-8 text-white">
<h2 className="text-3xl font-bold mb-4">
Sẵn Sàng Bắt Đu Hành Trình?
</h2>
<p className="text-xl mb-6 text-blue-100">
Liên hệ ngay đ đưc vấn miễn phí nhận báo giá tốt nhất
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<button className="bg-white text-blue-600 px-8 py-3 rounded-lg hover:bg-blue-50 transition-colors font-medium">
vấn miễn phí
</button>
<button className="bg-blue-800 text-white px-8 py-3 rounded-lg hover:bg-blue-900 transition-colors font-medium">
Gọi ngay: 1900 1234
</button>
</div>
</div>
</div>
</div>
);
}

View File

@@ -1,295 +1,206 @@
{
"visaSystem": {
"breadcrumb": {
"list": {
"title": "Country List",
"image": "assets/img/inner-page/breadcrumb.jpg"
"title": "Dịch Vụ Visa",
"subtitle": "Hỗ trợ toàn diện cho mọi loại visa",
"hero": {
"title": "Xin Visa Thành Công 99%",
"description": "Với hơn 10 năm kinh nghiệm, chúng tôi cam kết mang đến dịch vụ visa chất lượng cao với tỷ lệ thành công hàng đầu thị trường.",
"stats": [
{
"number": "50+",
"label": "Quốc gia"
},
{
"number": "99%",
"label": "Tỷ lệ thành công"
},
{
"number": "10000+",
"label": "Khách hàng"
}
},
"summaryList": [
{
"id": 1,
"name": "France",
"icon": "assets/img/home-2/visa/03.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 2,
"name": "UK",
"icon": "assets/img/home-2/visa/11.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 3,
"name": "Canada",
"icon": "assets/img/home-2/visa/02.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 4,
"name": "Germany",
"icon": "assets/img/home-2/visa/12.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 5,
"name": "Spain",
"icon": "assets/img/home-2/visa/13.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 6,
"name": "South Korea",
"icon": "assets/img/home-2/visa/14.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 7,
"name": "Japan",
"icon": "assets/img/home-2/visa/15.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 8,
"name": "Croatia",
"icon": "assets/img/home-2/visa/16.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 9,
"name": "England",
"icon": "assets/img/home-2/visa/17.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
},
{
"id": 10,
"name": "Indonesia",
"icon": "assets/img/home-2/visa/18.png",
"services": [
"Student Visa & Admission",
"Work Visa H1B",
"Work permit for Canada",
"Student Visa for Canada"
]
}
],
"detailedView": {
"activeCountry": {
"id": 1,
"name": "United States of America ",
"title": "COUNTRY USA",
"breadcrumb": {
"title": "COUNTRY USA",
"image": "assets/img/inner-page/breadcrumb.jpg"
},
"mainImage": "assets/img/inner-page/country-details/details-1.jpg",
"description": "The United States is one of the most popular destinations for international students and immigrants, offering world-class universities, diverse cultural experiences, and countless career opportunities...",
"additionalInfo": "Our consultancy provides complete guidance for study visas, work permits, and permanent residency pathways tailored to your goals.",
"tagline": "Over the last 35 Years we made an impact that is strong & we have long way to go.",
"visaTypes": [
{
"category": "Tourist & Work",
"items": [
{
"title": "Tourist Visa",
"description": "Broad term that can refer to various aspects of interconnectedness"
"id": "tourist",
"name": "Visa Du Lịch",
"icon": "🏖️",
"description": "Visa cho mục đích du lịch, nghỉ dưỡng và khám phá",
"features": [
"Thời hạn linh hoạt từ 30 ngày đến 10 năm",
"Hỗ trợ visa đơn và visa nhiều lần",
"Tư vấn lịch trình du lịch",
"Hỗ trợ đặt vé máy bay và khách sạn"
],
"popularCountries": ["Nhật Bản", "Hàn Quốc", "Schengen", "Mỹ", "Úc"],
"processingTime": "5-30 ngày",
"successRate": "99%"
},
{
"title": "Work Permit",
"description": "Broad term that can refer to various aspects of interconnectedness"
}
]
"id": "business",
"name": "Visa Công Tác",
"icon": "💼",
"description": "Visa cho mục đích công tác, hội nghị và kinh doanh",
"features": [
"Xử lý nhanh chóng cho công việc khẩn cấp",
"Hỗ trợ thư mời từ đối tác",
"Tư vấn về quy định làm việc",
"Visa nhiều lần cho doanh nhân"
],
"popularCountries": [
"Mỹ",
"Trung Quốc",
"Nhật Bản",
"Hàn Quốc",
"Singapore"
],
"processingTime": "3-20 ngày",
"successRate": "98%"
},
{
"category": "Student & Family",
"items": [
{
"title": "Student",
"description": "Broad term that can refer to various aspects of interconnectedness"
"id": "study",
"name": "Visa Du Học",
"icon": "🎓",
"description": "Visa cho mục đích học tập và nghiên cứu",
"features": [
"Tư vấn chọn trường và ngành học",
"Hỗ trợ chuẩn bị hồ sơ học bổng",
"Visa dài hạn cho toàn khóa học",
"Hỗ trợ gia hạn visa"
],
"popularCountries": ["Mỹ", "Canada", "Úc", "Anh", "Đức"],
"processingTime": "4-8 tuần",
"successRate": "96%"
},
{
"title": "Tourist Visa",
"description": "Broad term that can refer to various aspects of interconnectedness"
}
]
"id": "family",
"name": "Visa Thăm Thân",
"icon": "👨‍👩‍👧‍👦",
"description": "Visa để thăm người thân và gia đình",
"features": [
"Hỗ trợ chuẩn bị thư mời",
"Tư vấn chứng minh mối quan hệ",
"Visa ngắn hạn và dài hạn",
"Hỗ trợ visa cho cả gia đình"
],
"popularCountries": ["Mỹ", "Canada", "Úc", "Schengen", "Anh"],
"processingTime": "2-6 tuần",
"successRate": "97%"
},
{
"id": "transit",
"name": "Visa Transit",
"icon": "✈️",
"description": "Visa quá cảnh cho các chuyến bay kết nối",
"features": [
"Xử lý nhanh trong 24-48 giờ",
"Phí dịch vụ ưu đãi",
"Hỗ trợ 24/7",
"Không cần phỏng vấn"
],
"popularCountries": ["Trung Quốc", "Hàn Quốc", "Singapore", "UAE"],
"processingTime": "1-3 ngày",
"successRate": "99%"
},
{
"id": "work",
"name": "Visa Lao Động",
"icon": "🔨",
"description": "Visa cho mục đích làm việc dài hạn",
"features": [
"Tư vấn về thị trường lao động",
"Hỗ trợ tìm nhà tuyển dụng",
"Visa dài hạn có thể gia hạn",
"Hỗ trợ thủ tục định cư"
],
"popularCountries": ["Canada", "Úc", "Đức", "New Zealand", "Singapore"],
"processingTime": "6-12 tuần",
"successRate": "94%"
}
],
"visaProcess": {
"title": "USA Visa Process",
"steps": [
"process": [
{
"number": "01",
"title": "Consultation & Eligibility Check",
"description": "Our experts review your profile and visa requirements."
"step": 1,
"title": "Tư Vấn Miễn Phí",
"description": "Chuyên viên tư vấn chi tiết về loại visa phù hợp và yêu cầu hồ sơ",
"icon": "💬"
},
{
"number": "02",
"title": "Application Preparation",
"description": "We help with document collection, form filling, and statement drafting."
"step": 2,
"title": "Chuẩn Bị Hồ Sơ",
"description": "Hướng dẫn và hỗ trợ khách hàng chuẩn bị đầy đủ hồ sơ theo yêu cầu",
"icon": "📋"
},
{
"number": "03",
"title": "Submission",
"description": "Visa application is submitted online with required fees."
"step": 3,
"title": "Kiểm Tra & Nộp Hồ Sơ",
"description": "Kiểm tra kỹ lưỡng và nộp hồ sơ tại lãnh sự quán hoặc trung tâm visa",
"icon": "✅"
},
{
"number": "04",
"title": "Interview Guidance",
"description": "Get training and mock sessions for embassy interview."
"step": 4,
"title": "Theo Dõi Tiến Độ",
"description": "Cập nhật tiến độ xử lý và thông báo kết quả cho khách hàng",
"icon": "📊"
},
{
"number": "05",
"title": "Approval & Travel",
"description": "Once approved, we provide travel and pre-departure guidance."
"step": 5,
"title": "Nhận Visa",
"description": "Hỗ trợ nhận visa và tư vấn các lưu ý khi xuất nhập cảnh",
"icon": "🎉"
}
]
},
"gallery": [
"assets/img/inner-page/country-details/details-2.jpg",
"assets/img/inner-page/country-details/details-3.png"
],
"visaCategories": {
"title": "Types of USA Visas",
"steps": [
[
"Student Visa (F1, M1, J1)",
"Work Visa (H1B, L1)",
"Tourist Visa (B1/B2)"
"whyChooseUs": [
{
"title": "Kinh Nghiệm Lâu Năm",
"description": "Hơn 10 năm kinh nghiệm trong lĩnh vực dịch vụ visa",
"icon": "⭐"
},
{
"title": "Tỷ Lệ Thành Công Cao",
"description": "Tỷ lệ thành công 99% với hơn 10,000 khách hàng",
"icon": "📈"
},
{
"title": "Đội Ngũ Chuyên Nghiệp",
"description": "Chuyên viên được đào tạo bài bản, cập nhật thường xuyên",
"icon": "👥"
},
{
"title": "Hỗ Trợ 24/7",
"description": "Luôn sẵn sàng hỗ trợ khách hàng mọi lúc, mọi nơi",
"icon": "🕒"
},
{
"title": "Giá Cả Cạnh Tranh",
"description": "Mức phí hợp lý, minh bạch, không phí ẩn",
"icon": "💰"
},
{
"title": "Bảo Mật Thông Tin",
"description": "Cam kết bảo mật tuyệt đối thông tin khách hàng",
"icon": "🔒"
}
],
["Family/Spouse Visa (K1, IR1, F2A)", "Green Card / Immigrant Visa"]
]
},
"visaService": {
"title": "Our USA Visa Service Options",
"steps": [
"faqs": [
{
"number": "01",
"title": "Consultation & Eligibility Check",
"description": "Our experts review your profile and visa requirements."
"question": "Tôi có cần phải có kinh nghiệm du lịch trước đó không?",
"answer": "Không nhất thiết. Chúng tôi hỗ trợ cả khách hàng lần đầu xin visa. Tuy nhiên, có lịch sử du lịch sẽ giúp tăng tỷ lệ thành công."
},
{
"number": "02",
"title": "Application Preparation",
"description": "We help with document collection, form filling, and statement drafting."
"question": "Thời gian xử lý visa mất bao lâu?",
"answer": "Thời gian xử lý tùy thuộc vào từng quốc gia, từ 1-3 ngày (visa transit) đến 6-12 tuần (visa lao động). Chúng tôi sẽ tư vấn cụ thể cho từng trường hợp."
},
{
"number": "03",
"title": "Submission",
"description": "Visa application is submitted online with required fees."
"question": "Nếu visa bị từ chối thì sao?",
"answer": "Chúng tôi có gói VIP cam kết hoàn tiền nếu visa bị từ chối. Đối với các gói khác, chúng tôi sẽ hỗ trợ phân tích lý do và tư vấn nộp lại."
},
{
"number": "04",
"title": "Interview Guidance",
"description": "Get training and mock sessions for embassy interview."
"question": "Tôi có thể theo dõi tiến độ hồ sơ như thế nào?",
"answer": "Chúng tôi sẽ cập nhật tiến độ qua email, SMS và có thể tra cứu online. Khách hàng luôn được thông báo kịp thời về tình trạng hồ sơ."
},
{
"number": "05",
"title": "Approval & Travel",
"description": "Once approved, we provide travel and pre-departure guidance."
"question": "Chi phí dịch vụ có bao gồm phí lãnh sự không?",
"answer": "Phí dịch vụ của chúng tôi chưa bao gồm phí lãnh sự quán. Chúng tôi sẽ thông báo rõ ràng tổng chi phí bao gồm cả phí lãnh sự khi tư vấn."
}
]
}
},
"relatedCountries": [
{
"id": 1,
"name": "Canada",
"icon": "assets/img/inner-page/country-details/01.png"
},
{
"id": 2,
"name": "USA",
"icon": "assets/img/inner-page/country-details/02.png"
},
{
"id": 3,
"name": "USA",
"icon": "assets/img/inner-page/country-details/03.png"
},
{
"id": 4,
"name": "Saint Helena",
"icon": "assets/img/inner-page/country-details/05.png"
},
{
"id": 5,
"name": "Iran",
"icon": "assets/img/inner-page/country-details/06.png"
},
{
"id": 6,
"name": "Spain",
"icon": "assets/img/inner-page/country-details/07.png"
},
{
"id": 7,
"name": "Japan",
"icon": "assets/img/inner-page/country-details/08.png"
}
]
},
"contactInfo": {
"sectionTitle": "Visa & Immigration",
"helpText": "Need Help? Book Lab Visit",
"phone": {
"label": "Call Us",
"value": "+009 438 222 9540",
"link": "tel:+0094382229540"
},
"email": {
"label": "Mail Us",
"value": "infor@xridergamil.com",
"link": "mailto:infor@xridergamil.com"
},
"location": {
"label": "Location",
"address": "Toronto, Montreal, City 2026"
}
}
}
}

12
package-lock.json generated
View File

@@ -67,7 +67,6 @@
"integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.28.6",
"@babel/generator": "^7.28.6",
@@ -1562,7 +1561,6 @@
"integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -1622,7 +1620,6 @@
"integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.54.0",
"@typescript-eslint/types": "8.54.0",
@@ -2122,7 +2119,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2463,7 +2459,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -3031,7 +3026,6 @@
"integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -3217,7 +3211,6 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@@ -5390,7 +5383,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
"integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -5400,7 +5392,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
"integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -6089,7 +6080,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -6252,7 +6242,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -6528,7 +6517,6 @@
"integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
"dev": true,
"license": "MIT",
"peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}