Infographic: A Smoother Arrival at Nha Trang Airport (CXR)
https://cdn.tailwindcss.com
https://cdn.jsdelivr.net/npm/chart.js
Goal: Inform (Hook). -> Viz/Method: Single Big Number (HTML/CSS). -> Justification: Grabs attention immediately with the primary pain point. -> Library/Method: HTML & Tailwind CSS.
– Report Info: Different traveler types (E-Visa/VOA) and their distinct processes. -> Goal: Organize, Compare. -> Viz/Method: Interactive Flow Chart with buttons (HTML/CSS/JS). -> Interaction: User clicks a button to see their specific process flow rendered dynamically. Queue steps are highlighted in a warning color. -> Justification: Personalizes the information and makes a complex process easy to understand visually. -> Library/Method: Vanilla JS & Tailwind CSS. (CONFIRMING NO SVG/Mermaid)
– Report Info: Breakdown of arrival hassles. -> Goal: Inform. -> Viz/Method: Donut Chart (Chart.js). -> Data: “Potential Delay Sources at CXR”, e.g., ‘Immigration Queue’, ‘VOA Processing’. -> Justification: Provides a quick, quantitative visualization of where the delays occur, reinforcing the problem. -> Library/Method: Chart.js (Canvas).
– Report Info: Transport options to city. -> Goal: Compare. -> Viz/Method: Bar Chart (Chart.js). -> Data: Comparing estimated travel times for different transport modes. -> Justification: A bar chart is the best way to compare values (time) across different categories (transport types). -> Library/Method: Chart.js (Canvas).
– Report Info: Benefits of the service. -> Goal: Compare, Persuade. -> Viz/Method: Side-by-side card comparison. -> Justification: A direct, scannable comparison of “Standard vs. Expedited” is highly effective for showing value. -> Library/Method: HTML & Tailwind CSS Grid.
–>
body {
font-family: ‘Inter’, sans-serif;
background-color: #F0F4FF; /* Light Blue/Gray Background */
color: #1E293B; /* Slate 800 */
}
.material-card {
background-color: white;
border-radius: 1.0rem;
padding: 2rem;
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.07), 0 4px 6px -4px rgb(0 0 0 / 0.07);
transition: all 0.3s ease-in-out;
}
.material-card:hover {
box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
transform: translateY(-5px);
}
.flow-step {
border-left: 4px solid #93C5FD; /* Blue 300 */
padding-left: 1.5rem;
position: relative;
}
.flow-step::before {
content: ”;
position: absolute;
left: -11px;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
border-radius: 9999px;
background-color: white;
border: 4px solid #93C5FD;
}
.flow-step.is-queue {
border-left-color: #FBBF24; /* Amber 400 */
}
.flow-step.is-queue::before {
border-color: #FBBF24;
}
.profile-btn {
transition: all 0.2s ease-in-out;
}
.profile-btn-active {
background-color: #2563EB !important; /* Blue 700 */
color: white;
box-shadow: 0 4px 14px 0 rgb(59 130 246 / 39%);
}
.chart-container {
position: relative;
width: 100%;
max-width: 500px;
margin-left: auto;
margin-right: auto;
height: 350px;
max-height: 400px;
}
@media (min-width: 768px) {
.chart-container {
height: 400px;
}
}
Don’t let airport queues delay your entry into the beauty of Nha Trang. This guide visualizes your arrival and shows you a faster path.
Potential Wait Time
At peak hours, immigration queues can significantly delay your arrival.
Airport to City
Cam Ranh Airport is a scenic 45-60 minute drive from Nha Trang.
International Terminals
All international flights arrive at the modern Terminal 2 (T2).
Visualize Your Arrival Journey
Choose your profile to see the step-by-step process. We’ve highlighted the common delay points (in orange ) you’ll want to avoid.
E-Visa / Visa-Free
Visa on Arrival
Our VIP service turns a long, stressful process into a seamless, premium experience. Compare the difference below.
Standard Arrival
✗ Wait at the VOA counter.
✗ Wait again at Immigration.
✗ Navigate crowds and procedures alone.
✗ Risk issues with missing photos or cash for VOA.
Getting to Nha Trang: A Time Comparison
Once you exit the airport, you have several options to get to the city center. Here’s how their typical travel times compare.
Invest in a smoother, faster start to your vacation. Book the Expedited Entry Service and let us handle the hassle.
Book Now & Arrive in Style
© 2024 Infographic by VietnamImmigration.org. All data is for illustrative purposes.
document.addEventListener(‘DOMContentLoaded’, () => {
const processData = {
evisa: [
{ name: ‘Arrive & Deplane’, isQueue: false },
{ name: ‘Immigration Checkpoint’, isQueue: true },
{ name: ‘Baggage Claim’, isQueue: false },
{ name: ‘Customs Check’, isQueue: false },
{ name: ‘Exit & Enjoy Vietnam’, isQueue: false }
],
voa: [
{ name: ‘Arrive & Deplane’, isQueue: false },
{ name: ‘Landing Visa Counter’, isQueue: true },
{ name: ‘Immigration Checkpoint’, isQueue: true },
{ name: ‘Baggage Claim’, isQueue: false },
{ name: ‘Customs Check’, isQueue: false },
{ name: ‘Exit & Enjoy Vietnam’, isQueue: false }
]
};
const flowchartContainer = document.getElementById(‘flowchart’);
const btnEvisa = document.getElementById(‘btn-evisa’);
const btnVoa = document.getElementById(‘btn-voa’);
let activeProfile = ‘evisa’;
const renderFlowchart = () => {
const data = processData[activeProfile];
flowchartContainer.innerHTML = ”;
data.forEach(step => {
const stepEl = document.createElement(‘div’);
stepEl.className = ‘flow-step pb-6’;
if (step.isQueue) {
stepEl.classList.add(‘is-queue’);
}
stepEl.innerHTML = `
${step.name} `;
flowchartContainer.appendChild(stepEl);
});
};
const setActiveProfile = (profile) => {
activeProfile = profile;
if (profile === ‘evisa’) {
btnEvisa.classList.add(‘profile-btn-active’);
btnVoa.classList.remove(‘profile-btn-active’);
} else {
btnVoa.classList.add(‘profile-btn-active’);
btnEvisa.classList.remove(‘profile-btn-active’);
}
renderFlowchart();
};
btnEvisa.addEventListener(‘click’, () => setActiveProfile(‘evisa’));
btnVoa.addEventListener(‘click’, () => setActiveProfile(‘voa’));
const chartOptions = {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
position: ‘bottom’,
labels: {
padding: 20,
font: {
size: 14
}
}
},
tooltip: {
callbacks: {
title: function(tooltipItems) {
const item = tooltipItems[0];
let label = item.chart.data.labels[item.dataIndex];
if (Array.isArray(label)) {
return label.join(‘ ‘);
}
return label;
}
}
}
}
};
const wrapLabel = (label) => {
if (label.length {
if ((currentLine + ‘ ‘ + word).trim().length > 16) {
lines.push(currentLine);
currentLine = word;
} else {
currentLine = (currentLine + ‘ ‘ + word).trim();
}
});
lines.push(currentLine);
return lines;
};
const delayCtx = document.getElementById(‘delayChart’).getContext(‘2d’);
new Chart(delayCtx, {
type: ‘doughnut’,
data: {
labels: [‘Immigration Queue’, ‘VOA Processing Queue’, ‘Baggage Wait’],
datasets: [{
label: ‘Minutes’,
data: [60, 30, 15],
backgroundColor: [‘#FBBF24’, ‘#F87171’, ‘#93C5FD’],
borderColor: ‘#F0F4FF’,
borderWidth: 4,
hoverOffset: 8
}]
},
options: chartOptions
});
const transportCtx = document.getElementById(‘transportChart’).getContext(‘2d’);
new Chart(transportCtx, {
type: ‘bar’,
data: {
labels: [‘Airport Bus’, ‘Taxi / Ride-hailing’, ‘Pre-booked Private Car’],
datasets: [{
label: ‘Est. Travel Time (minutes)’,
data: [60, 45, 45],
backgroundColor: [‘#93C5FD’, ‘#60A5FA’, ‘#3B82F6’],
borderRadius: 8
}]
},
options: { …chartOptions, indexAxis: ‘y’, plugins: { …chartOptions.plugins, legend: { display: false } } }
});
renderFlowchart();
});