Interactive Guide: Arriving at Quang Ninh (Van Don) Airport
https://cdn.tailwindcss.com
Goal: Inform/Prepare. -> Viz/Method: Interactive HTML/CSS checklist. -> Interaction: Hover states on items. -> Justification: Breaks down a dense list into a scannable, user-friendly format. -> Library/Method: Tailwind CSS.
– Report Info: Two distinct arrival processes (E-visa vs. VOA). -> Goal: Organize/Compare/Guide. -> Viz/Method: Dynamic visual flowchart. -> Interaction: User clicks a button to select their visa type, which triggers JS to highlight and display only the relevant steps. -> Justification: Visually and interactively clarifies the user’s specific path, making it far easier to understand than reading two separate blocks of text. -> Library/Method: HTML/Tailwind CSS, Vanilla JS.
– Report Info: Benefits and details of the Expedited Entry Service. -> Goal: Persuade/Inform. -> Viz/Method: Card-based layout with icons. -> Interaction: Clickable call-to-action button. -> Justification: Presents key selling points in a visually appealing, easy-to-digest format. -> Library/Method: HTML/Tailwind CSS.
– Report Info: Reasons to trust vietnamimmigration.org. -> Goal: Build Credibility. -> Viz/Method: List with external links and icons. -> Interaction: Links open in a new tab. -> Justification: Clearly presents credentials and provides proof through external validation. -> Library/Method: HTML/Tailwind CSS.
–>
body {
font-family: ‘Inter’, sans-serif;
background-color: #FDFBF8;
color: #3f3f46;
}
@import url(‘
https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap’ ;);
.nav-link {
transition: color 0.3s;
}
.nav-link:hover {
color: #d97706;
}
.btn-primary {
background-color: #f59e0b;
color: white;
transition: background-color 0.3s;
}
.btn-primary:hover {
background-color: #d97706;
}
.btn-secondary {
background-color: #e5e7eb;
color: #374151;
transition: background-color 0.3s;
}
.btn-secondary.active {
background-color: #d97706;
color: white;
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
}
.step {
transition: all 0.5s ease-in-out;
opacity: 0.4;
transform: scale(0.95);
filter: grayscale(80%);
}
.step.active {
opacity: 1;
transform: scale(1);
filter: grayscale(0%);
border-color: #f59e0b;
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -2px rgb(0 0 0 / 0.1);
}
.step-connector {
transition: all 0.5s ease-in-out;
opacity: 0.4;
height: 2rem;
width: 2px;
background-color: #d1d5db;
}
.step-connector.active {
opacity: 1;
background-color: #f59e0b;
}
.smooth-scroll {
scroll-behavior: smooth;
}
Your interactive guide to navigating the airport with ease. Prepare for your trip, understand the process, and learn how to skip the queues.
Book with Confidence
✅
Over 15 years of experience (domain registered in 2008).
[Verify]
✅
100% Money-Back Guarantee Policy for your peace of mind.
[Details]
✅
Secure payments via PayPal with Buyer Protection.
[Learn More]
✅
Highly rated by our customers.
[See Reviews]
© 2024 Interactive Arrival Guide. Information provided by VietnamImmigration.org.
This is an informational tool. Please verify all travel requirements with official sources.
document.addEventListener(‘DOMContentLoaded’, () => {
const btnEvisa = document.getElementById(‘btn-evisa’);
const btnVoa = document.getElementById(‘btn-voa’);
const voaOnlyElements = document.querySelectorAll(‘.voa-only’);
const steps = {
plane: document.getElementById(‘step-plane’),
voaCounter: document.getElementById(‘step-voa-counter’),
immigration: document.getElementById(‘step-immigration’),
baggage: document.getElementById(‘step-baggage’),
customs: document.getElementById(‘step-customs’),
exit: document.getElementById(‘step-exit’),
};
const connectors = {
voaCounter: document.getElementById(‘connector-voa-counter’),
immigration: document.getElementById(‘connector-immigration’),
baggage: document.getElementById(‘connector-baggage’),
customs: document.getElementById(‘connector-customs’),
exit: document.getElementById(‘connector-exit’),
}
const titles = {
immigration: document.getElementById(‘immigration-step-title’),
baggage: document.getElementById(‘baggage-step-title’),
customs: document.getElementById(‘customs-step-title’),
exit: document.getElementById(‘exit-step-title’),
}
function updateFlow(type) {
// Reset all
Object.values(steps).forEach(step => step.classList.remove(‘active’));
Object.values(connectors).forEach(conn => conn.classList.remove(‘active’));
// Handle button active state
btnEvisa.classList.remove(‘active’);
btnVoa.classList.remove(‘active’);
// Activate common first step
steps.plane.classList.add(‘active’);
if (type === ‘evisa’) {
btnEvisa.classList.add(‘active’);
voaOnlyElements.forEach(el => el.classList.add(‘hidden’));
titles.immigration.textContent = ‘2. Immigration Checkpoint’;
titles.baggage.textContent = ‘3. Baggage Claim’;
titles.customs.textContent = ‘4. Customs Check’;
titles.exit.textContent = ‘5. Exit & Enjoy Vietnam!’;
// Activate e-visa path
setTimeout(() => connectors.immigration.classList.add(‘active’), 200);
setTimeout(() => steps.immigration.classList.add(‘active’), 400);
setTimeout(() => connectors.baggage.classList.add(‘active’), 600);
setTimeout(() => steps.baggage.classList.add(‘active’), 800);
setTimeout(() => connectors.customs.classList.add(‘active’), 1000);
setTimeout(() => steps.customs.classList.add(‘active’), 1200);
setTimeout(() => connectors.exit.classList.add(‘active’), 1400);
setTimeout(() => steps.exit.classList.add(‘active’), 1600);
} else if (type === ‘voa’) {
btnVoa.classList.add(‘active’);
voaOnlyElements.forEach(el => el.classList.remove(‘hidden’));
titles.immigration.textContent = ‘3. Immigration Checkpoint’;
titles.baggage.textContent = ‘4. Baggage Claim’;
titles.customs.textContent = ‘5. Customs Check’;
titles.exit.textContent = ‘6. Exit & Enjoy Vietnam!’;
// Activate VOA path
setTimeout(() => connectors.voaCounter.classList.add(‘active’), 200);
setTimeout(() => steps.voaCounter.classList.add(‘active’), 400);
setTimeout(() => connectors.immigration.classList.add(‘active’), 600);
setTimeout(() => steps.immigration.classList.add(‘active’), 800);
setTimeout(() => connectors.baggage.classList.add(‘active’), 1000);
setTimeout(() => steps.baggage.classList.add(‘active’), 1200);
setTimeout(() => connectors.customs.classList.add(‘active’), 1400);
setTimeout(() => steps.customs.classList.add(‘active’), 1600);
setTimeout(() => connectors.exit.classList.add(‘active’), 1800);
setTimeout(() => steps.exit.classList.add(‘active’), 2000);
}
}
btnEvisa.addEventListener(‘click’, () => updateFlow(‘evisa’));
btnVoa.addEventListener(‘click’, () => updateFlow(‘voa’));
// Set initial state
updateFlow(‘evisa’);
// Smooth scrolling for nav links
document.querySelectorAll(‘a[href^=”#”]’).forEach(anchor => {
anchor.addEventListener(‘click’, function (e) {
e.preventDefault();
document.querySelector(this.getAttribute(‘href’)).scrollIntoView({
behavior: ‘smooth’
});
});
});
});