<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sailboat Comparison Infographic</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Inter', sans-serif;
background-color: #f0f4f8;
}
.chart-container {
position: relative;
width: 100%;
max-width: 600px;
margin-left: auto;
margin-right: auto;
height: 300px;
max-height: 400px;
}
@media (min-width: 768px) {
.chart-container {
height: 350px;
}
}
.stat-card {
background-color: white;
border-radius: 0.75rem;
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
padding: 1.5rem;
transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
}
.stat-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
}
.rig-card {
background-color: white;
border-radius: 0.75rem;
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
padding: 1.5rem;
text-align: center;
}
</style>
</head>
<body class="text-gray-800">
<div class="container mx-auto p-4 md:p-8">
<header class="text-center mb-12">
<h1 class="text-4xl md:text-5xl font-bold text-[#00A5E3] mb-2">A Sailor's Choice</h1>
<p class="text-lg text-gray-600">Comparing Four Distinct Cruising Yachts Across Price, Age, and Capability</p>
</header>
<section class="mb-16">
<h2 class="text-3xl font-bold text-center mb-8">The Contenders at a Glance</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<div class="stat-card text-center">
<div class="text-6xl mb-2">⛵</div>
<h3 class="text-xl font-semibold">Bavaria 38 Holiday</h3>
<p class="text-gray-500">1998</p>
<p class="text-3xl font-bold text-[#FF5768] my-2">€72,000</p>
<p class="text-sm bg-[#FFBF65] text-white rounded-full px-3 py-1 inline-block">The Renewed Weekender</p>
</div>
<div class="stat-card text-center">
<div class="text-6xl mb-2">🚤</div>
<h3 class="text-xl font-semibold">Beneteau Oceanis 37</h3>
<p class="text-gray-500">1997</p>
<p class="text-3xl font-bold text-[#FF5768] my-2">€68,000</p>
<p class="text-sm bg-[#00A5E3] text-white rounded-full px-3 py-1 inline-block">The Upgraded Cruiser</p>
</div>
<div class="stat-card text-center">
<div class="text-6xl mb-2">⚓</div>
<h3 class="text-xl font-semibold">Grampian 37</h3>
<p class="text-gray-500">1983</p>
<p class="text-3xl font-bold text-[#FF5768] my-2">€18,000</p>
<p class="text-sm bg-[#8DD7BF] text-white rounded-full px-3 py-1 inline-block">The Classic Project</p>
</div>
<div class="stat-card text-center">
<div class="text-6xl mb-2">✨</div>
<h3 class="text-xl font-semibold">'Jade' Van de Stadt</h3>
<p class="text-gray-500">1967</p>
<p class="text-3xl font-bold text-[#FF5768] my-2">€10,000</p>
<p class="text-sm bg-[#FF96C5] text-white rounded-full px-3 py-1 inline-block">The Restored Vintage</p>
</div>
</div>
</section>
<section class="mb-16 stat-card">
<div class="text-center mb-6">
<h2 class="text-3xl font-bold">Tale of the Tape</h2>
<p class="text-gray-600">A direct comparison of core physical specifications.</p>
</div>
<div class="chart-container h-96 md:h-[450px] max-h-[500px]">
<canvas id="specsChart"></canvas>
</div>
</section>
<section class="mb-16">
<h2 class="text-3xl font-bold text-center mb-8">Onboard Systems & Safety Gear</h2>
<p class="text-center text-gray-600 mb-8">A detailed breakdown of the electronics, communications, and safety equipment for each yacht.</p>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
<div class="stat-card">
<h3 class="text-xl font-semibold mb-2 text-[#FFBF65]">Bavaria 38 Holiday</h3>
<ul class="list-disc list-inside space-y-1 text-gray-700">
<li>**Navigation:** GPS Garmin 128, Autopilot, Windmeter, Tridata Autohelm.</li>
<li>**Communications:** VHF Ray 63, Handheld VHF Cobra, Navtex Nasa, AIS Transponder.</li>
<li>**Safety:** 8 automatic life jackets (inspected 2025), 4 fire extinguishers (inspected 2025).</li>
</ul>
</div>
<div class="stat-card">
<h3 class="text-xl font-semibold mb-2 text-[#00A5E3]">Beneteau Oceanis 37</h3>
<ul class="list-disc list-inside space-y-1 text-gray-700">
<li>**Navigation:** Renewed Raymarine instrumentation (speed, wind, chart plotter).</li>
<li>**Communications:** Strong transmit power VHF marine radio.</li>
<li>**Safety:** Owner states "ready for sea," implying standard safety gear.</li>
</ul>
</div>
<div class="stat-card">
<h3 class="text-xl font-semibold mb-2 text-[#8DD7BF]">Grampian 37</h3>
<ul class="list-disc list-inside space-y-1 text-gray-700">
<li>**Navigation:** No specific systems mentioned.</li>
<li>**Communications:** No specific systems mentioned.</li>
<li>**Safety:** Owner states "not seaworthy," implying systems need a full review and upgrade.</li>
</ul>
</div>
<div class="stat-card">
<h3 class="text-xl font-semibold mb-2 text-[#FF96C5]">`Jade` Van de Stadt</h3>
<ul class="list-disc list-inside space-y-1 text-gray-700">
<li>**Navigation:** New navigation lights.</li>
<li>**Communications:** New VHF and antenna installed.</li>
<li>**Safety:** Basic systems; owner selling to buy a larger boat for ocean cruising.</li>
</ul>
</div>
</div>
</section>
<section class="mb-16 stat-card">
<h2 class="text-3xl font-bold text-center mb-8">Electronics & Safety Scorecard</h2>
<p class="text-center text-gray-600 mb-8">A visual rating of the onboard systems and safety gear (1 = Basic, 5 = Excellent).</p>
<div class="chart-container h-80 md:h-[400px] max-h-[450px]">
<canvas id="scorecardBarChart"></canvas>
</div>
<p class="mt-8 text-center text-sm text-gray-600">The scorecard reflects the quality and modernity of the onboard systems, with higher scores indicating more comprehensive and up-to-date electronics.</p>
</section>
<section class="mb-16">
<h2 class="text-3xl font-bold text-center mb-8">Design Philosophy Explained</h2>
<p class="text-center text-gray-600 mb-8">A look at each boat's design ratios. Here's what each axis means:</p>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-8">
<div class="stat-card">
<h3 class="text-center text-xl font-semibold mb-4">Comfort Ratio</h3>
<div class="chart-container h-64"><canvas id="comfortChart"></canvas></div>
<p class="mt-4 text-sm text-gray-700">A higher number indicates a more comfortable, stable ride in rough seas, often associated with heavier boats.</p>
</div>
<div class="stat-card">
<h3 class="text-center text-xl font-semibold mb-4">Displacement to Length Ratio (D/L)</h3>
<div class="chart-container h-64"><canvas id="dispLenChart"></canvas></div>
<p class="mt-4 text-sm text-gray-700">A lower number (under ~200) suggests a lighter, faster cruiser. A higher number (over ~300) indicates a heavier, more powerful, and more stable boat. This chart now also shows the estimated top sailing speed.</p>
</div>
<div class="stat-card">
<h3 class="text-center text-xl font-semibold mb-4">Ballast to Displacement Ratio (B/D)</h3>
<div class="chart-container h-64"><canvas id="balDispChart"></canvas></div>
<p class="mt-4 text-sm text-gray-700">This is a measure of a boat's stiffness. A higher percentage indicates the boat is more resistant to heeling (leaning) under sail, which can lead to a more powerful, but less forgiving, ride.</p>
</div>
<div class="stat-card">
<h3 class="text-center text-xl font-semibold mb-4">Capsize Screening Formula</h3>
<div class="chart-container h-64"><canvas id="capsizeChart"></canvas></div>
<p class="mt-4 text-sm text-gray-700">A lower number indicates greater resistance to capsizing. A value under 2.0 is often considered suitable for offshore sailing.</p>
</div>
</div>
<div class="stat-card mt-8">
<h3 class="text-center text-2xl font-bold mb-6">Rig Types Explained</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="rig-card">
<span class="text-4xl mb-2 block text-[#FF96C5] font-bold">Cutter Rig</span>
<p class="text-sm text-gray-700 mb-2">Uses two headsails (jib and staysail) for flexibility in heavy winds.</p>
<div class="flex items-center justify-center space-x-2">
<div class="w-4 h-4 rounded-full" style="background-color: #FF96C5;"></div>
<p class="text-xs text-gray-500 font-bold">'Jade' Van de Stadt</p>
</div>
</div>
<div class="rig-card">
<span class="text-4xl mb-2 block text-[#FFBF65] font-bold">Masthead Rig</span>
<p class="text-sm text-gray-700 mb-2">The forestay goes to the masthead, allowing for a large, powerful headsail.</p>
<div class="flex flex-col items-center justify-center space-y-1">
<div class="flex items-center space-x-2">
<div class="w-4 h-4 rounded-full" style="background-color: #FFBF65;"></div>
<p class="text-xs text-gray-500 font-bold">Bavaria 38 Holiday</p>
</div>
<div class="flex items-center space-x-2">
<div class="w-4 h-4 rounded-full" style="background-color: #8DD7BF;"></div>
<p class="text-xs text-gray-500 font-bold">Grampian 37</p>
</div>
</div>
</div>
<div class="rig-card">
<span class="text-4xl mb-2 block text-[#00A5E3] font-bold">Fractional Rig</span>
<p class="text-sm text-gray-700 mb-2">The forestay connects below the masthead for better control of mast bend and sail shape.</p>
<div class="flex items-center justify-center space-x-2">
<div class="w-4 h-4 rounded-full" style="background-color: #00A5E3;"></div>
<p class="text-xs text-gray-500 font-bold">Beneteau Oceanis 37</p>
</div>
</div>
</div>
</div>
</section>
<section class="mb-16">
<h2 class="text-3xl font-bold text-center mb-8">Each Boat's Sailing Profile</h2>
<p class="text-center text-gray-600 mb-8">A summarized look at the design philosophy for each vessel, highlighting their key characteristics and intended purpose.</p>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<div class="stat-card">
<h3 class="text-xl font-semibold mb-2 text-[#FFBF65]">Bavaria 38 Holiday</h3>
<p class="text-sm text-gray-500 font-bold mb-2">Ratios: Comfort: 24.21, D/L: 186.23, B/D: 34.25%, Capsize: 1.99</p>
<p class="text-gray-700">A well-balanced, contemporary cruiser. It sits between the Beneteau and the Grampian, offering a good compromise between stability, comfort, and speed. It's a versatile choice for coastal cruising and can handle more challenging waters while still being manageable and responsive.</p>
</div>
<div class="stat-card">
<h3 class="text-xl font-semibold mb-2 text-[#00A5E3]">Beneteau Oceanis 37</h3>
<p class="text-sm text-gray-500 font-bold mb-2">Ratios: Comfort: 20.58, D/L: 157.99, B/D: 30.36%, Capsize: 2.13</p>
<p class="text-gray-700">A modern, performance-oriented cruiser. Its low Displacement to Length ratio suggests it's a lighter, faster boat, while a lower comfort ratio indicates a more active ride in rough seas. Its design prioritizes speed and efficiency, making it ideal for coastal cruising and club racing.</p>
</div>
<div class="stat-card">
<h3 class="text-xl font-semibold mb-2 text-[#8DD7BF]">Grampian 37</h3>
<p class="text-sm text-gray-500 font-bold mb-2">Ratios: Comfort: 28.30, D/L: 235.98, B/D: 46.67%, Capsize: 1.78</p>
<p class="text-gray-700">A heavy, traditional cruiser built for stability and offshore endurance. Its high ballast-to-displacement ratio makes it very stiff and resistant to heeling, and its low capsize ratio is excellent for safety in challenging conditions. The high D/L and comfort ratios point to a solid, comfortable, and powerful ride, though not a fast one.</p>
</div>
<div class="stat-card">
<h3 class="text-xl font-semibold mb-2 text-[#FF96C5]">`Jade` Van de Stadt</h3>
<p class="text-sm text-gray-500 font-bold mb-2">Ratios: Comfort: 22.89, D/L: 241.19, B/D: 40.0%, Capsize: 1.97</p>
<p class="text-gray-700">A classic design with a focus on stability and a comfortable ride. It has a moderate D/L ratio for its length, suggesting it's a solid, heavy boat that can handle rough conditions well. The high ballast-to-displacement ratio makes it stiff, and the good capsize ratio reinforces its offshore capabilities despite its vintage design.</p>
</div>
</div>
</section>
<section class="mb-16">
<h2 class="text-3xl font-bold text-center mb-8">Offshore Readiness Scorecard</h2>
<p class="text-center text-gray-600 mb-8">An estimated readiness score based on owner descriptions of current condition and required work. This is a subjective measure for comparison purposes.</p>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
<div class="stat-card flex flex-col items-center">
<h3 class="text-xl font-semibold mb-4">Bavaria 38 Holiday</h3>
<div class="w-48 h-48"><canvas id="readinessBavaria"></canvas></div>
<p class="mt-4 text-center text-sm text-gray-600">Extensively renewed with new engine, rigging, and deck. Ready for immediate use.</p>
</div>
<div class="stat-card flex flex-col items-center">
<h3 class="text-xl font-semibold mb-4">Beneteau Oceanis 37</h3>
<div class="w-48 h-48"><canvas id="readinessBeneteau"></canvas></div>
<p class="mt-4 text-center text-sm text-gray-600">Described as "fully upgraded" and "ready for sea (or ocean if desired)."</p>
</div>
<div class="stat-card flex flex-col items-center">
<h3 class="text-xl font-semibold mb-4">Grampian 37</h3>
<div class="w-48 h-48"><canvas id="readinessGrampian"></canvas></div>
<p class="mt-4 text-center text-sm text-gray-600">Explicitly "Not seaworthy" for ocean crossing. Requires significant work.</p>
</div>
<div class="stat-card flex flex-col items-center">
<h3 class="text-xl font-semibold mb-4">'Jade' Van de Stadt</h3>
<div class="w-48 h-48"><canvas id="readinessJade"></canvas></div>
<p class="mt-4 text-center text-sm text-gray-600">Comprehensively restored but is a vintage vessel needing a final clean and check.</p>
</div>
</div>
</section>
<footer class="text-center text-gray-500 text-sm mt-12">
<p>Data sourced from owner-provided descriptions. Performance ratios for some models are based on general specifications for the class and marked with an asterisk (*) in tooltips. This infographic is for illustrative purposes and is not a substitute for a professional marine survey.</p>
</footer>
</div>
<script>
const brilliantBlues = {
blue: '#00A5E3',
teal: '#8DD7BF',
pink: '#FF96C5',
red: '#FF5768',
yellow: '#FFBF65',
gray: '#6B7280',
lightGray: '#E5E7EB'
};
const tooltipCallback = {
plugins: {
tooltip: {
callbacks: {
title: function(tooltipItems) {
const item = tooltipItems[0];
let label = item.chart.data.labels[item.dataIndex];
if (Array.isArray(label)) {
return label.join(' ');
} else {
return label;
}
}
}
}
}
};
const boatData = [
{ name: 'Bavaria 38 Holiday', year: 1998, price: 72000, loa: 11.62, beam: 3.90, draft: 1.86, displacement: 7300, bal_disp: 34.25, disp_len: 186.23, comfort: 24.21, capsize: 1.99, color: brilliantBlues.yellow, readiness: 85, rig: 'Fractional Sloop', rigValue: 3, speed_sailing: '8 kn', scorecard: { communication: 5, navigation: 5, safety: 4 } },
{ name: 'Beneteau Oceanis 37', year: 1997, price: 68000, loa: 11.30, beam: 3.80, draft: 1.55, displacement: 6354, bal_disp: 30.36, disp_len: 157.99, comfort: 20.58, capsize: 2.13, color: brilliantBlues.blue, readiness: 90, rig: 'Fractional Sloop', rigValue: 3, speed_sailing: '7-8 kn', scorecard: { communication: 4, navigation: 4, safety: 3 } },
{ name: 'Grampian 37', year: 1983, price: 18000, loa: 11.23, beam: 3.20, draft: 1.60, displacement: 6000, bal_disp: 46.67, disp_len: 235.98, comfort: 28.30, capsize: 1.78, color: brilliantBlues.teal, readiness: 30, rig: 'Masthead Sloop', rigValue: 2, speed_sailing: '6 kn', scorecard: { communication: 1, navigation: 1, safety: 1 } },
{ name: "'Jade' Van de Stadt", year: 1967, price: 10000, loa: 9.75, beam: 2.75, draft: 1.55, displacement: 5500, bal_disp: 40.0, disp_len: 241.19, comfort: 22.89, capsize: 1.97, color: brilliantBlues.pink, readiness: 75, rig: 'Cutter Rig', rigValue: 1, speed_sailing: '5-6 kn', scorecard: { communication: 3, navigation: 2, safety: 2 } }
];
new Chart(document.getElementById('specsChart'), {
type: 'bar',
data: {
labels: boatData.map(b => b.name),
datasets: [
{
label: 'Length Overall (m)',
data: boatData.map(b => b.loa),
backgroundColor: brilliantBlues.blue,
yAxisID: 'y'
},
{
label: 'Beam (m)',
data: boatData.map(b => b.beam),
backgroundColor: brilliantBlues.teal,
yAxisID: 'y'
},
{
label: 'Draft (m)',
data: boatData.map(b => b.draft),
backgroundColor: brilliantBlues.yellow,
yAxisID: 'y'
},
{
label: 'Displacement (kg)',
data: boatData.map(b => b.displacement),
backgroundColor: brilliantBlues.pink,
yAxisID: 'y1'
}
]
},
options: {
...tooltipCallback,
maintainAspectRatio: false,
responsive: true,
scales: {
x: { grid: { display: false } },
y: {
type: 'linear',
display: true,
position: 'left',
title: { display: true, text: 'Meters (m)' }
},
y1: {
type: 'linear',
display: true,
position: 'right',
title: { display: true, text: 'Kilograms (kg)' },
grid: { drawOnChartArea: false }
}
},
plugins: { ...tooltipCallback.plugins, legend: { position: 'bottom' } }
}
});
function createBarChart(canvasId, title, labels, data, colors, tooltipLabel, labelsWithText = null) {
new Chart(document.getElementById(canvasId), {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: title,
data: data,
backgroundColor: colors,
borderColor: colors.map(c => c.replace('BF', '')),
borderWidth: 1
}]
},
options: {
maintainAspectRatio: false,
responsive: true,
indexAxis: 'y',
scales: {
x: {
beginAtZero: true,
title: { display: true, text: tooltipLabel }
},
y: {
grid: { display: false },
ticks: {
callback: function(value, index, ticks) {
return labelsWithText ? labelsWithText[index] : labels[index];
}
}
}
},
plugins: {
legend: { display: false },
tooltip: {
callbacks: {
label: function(context) {
return `${context.dataset.label}: ${context.raw.toFixed(2)} ${tooltipLabel.includes('%') ? '%' : ''}`;
}
}
}
}
}
});
}
const names = boatData.map(b => b.name);
const colors = boatData.map(b => b.color);
// Comfort Ratio Chart
createBarChart(
'comfortChart',
'Comfort Ratio',
names,
boatData.map(b => b.comfort),
colors,
''
);
// Displacement to Length Ratio Chart
createBarChart(
'dispLenChart',
'Displacement / Length Ratio',
boatData.map(b => b.name),
boatData.map(b => b.disp_len),
colors,
'',
boatData.map(b => `${b.name} (${b.speed_sailing})`)
);
// Ballast to Displacement Ratio Chart
createBarChart(
'balDispChart',
'Ballast / Displacement',
names,
boatData.map(b => b.bal_disp),
colors,
'%'
);
// Capsize Screening Formula Chart
createBarChart(
'capsizeChart',
'Capsize Screening Formula',
names,
boatData.map(b => b.capsize),
colors,
''
);
function createReadinessChart(canvasId, boat) {
new Chart(document.getElementById(canvasId), {
type: 'doughnut',
data: {
labels: ['Ready', 'Needs Attention'],
datasets: [{
data: [boat.readiness, 100 - boat.readiness],
backgroundColor: [boat.color, brilliantBlues.lightGray],
borderColor: '#ffffff',
borderWidth: 4,
}]
},
options: {
maintainAspectRatio: false,
responsive: true,
cutout: '70%',
plugins: {
legend: { display: false },
tooltip: { enabled: false },
title: {
display: true,
text: `${boat.readiness}%`,
position: 'bottom',
font: { size: 24, weight: 'bold' },
color: boat.color,
padding: { top: -60 }
}
}
}
});
}
createReadinessChart('readinessBavaria', boatData[0]);
createReadinessChart('readinessBeneteau', boatData[1]);
createReadinessChart('readinessGrampian', boatData[2]);
createReadinessChart('readinessJade', boatData[3]);
// New comparative bar chart for the scorecard
new Chart(document.getElementById('scorecardBarChart'), {
type: 'bar',
data: {
labels: ['Communication', 'Navigation', 'Safety'],
datasets: [
{
label: 'Bavaria 38 Holiday',
data: [boatData[0].scorecard.communication, boatData[0].scorecard.navigation, boatData[0].scorecard.safety],
backgroundColor: brilliantBlues.yellow
},
{
label: 'Beneteau Oceanis 37',
data: [boatData[1].scorecard.communication, boatData[1].scorecard.navigation, boatData[1].scorecard.safety],
backgroundColor: brilliantBlues.blue
},
{
label: 'Grampian 37',
data: [boatData[2].scorecard.communication, boatData[2].scorecard.navigation, boatData[2].scorecard.safety],
backgroundColor: brilliantBlues.teal
},
{
label: "'Jade' Van de Stadt",
data: [boatData[3].scorecard.communication, boatData[3].scorecard.navigation, boatData[3].scorecard.safety],
backgroundColor: brilliantBlues.pink
}
]
},
options: {
maintainAspectRatio: false,
responsive: true,
scales: {
x: {
grid: { display: false }
},
y: {
beginAtZero: true,
max: 5,
title: { display: true, text: 'Score (1-5)' }
}
},
plugins: {
legend: { position: 'bottom' }
}
}
});
</script>
</body>
</html>