AZ Restrictions
📍 EBS volumes are bound to the AZ where they are created.
❌ A volume created in one AZ cannot attach to an instance in another AZ.
🔄 To move data across different AZs is not allowed thats where EBS snapshots comes in.
EBS Snapshots
📸 Snapshots are backups of EBS volumes.
⏰ Can be taken at any time and restore a volume even after the original is terminated.
🌍 Can copy snapshots across AZs and AWS regions.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EBS Snapshot → Restore → Attach</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,wght@0,600;1,500&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
.infographic-ebssnap {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-2: #1e40af;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--muted: #9a968c;
--ok: #15803d;
--ok-soft: #e6f4ea;
--display-font: 'Newsreader', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
background: var(--paper);
color: var(--ink);
font-family: var(--body-font);
max-width: 880px;
margin: 0 auto;
padding: clamp(1.25rem, 5vw, 3rem);
box-sizing: border-box;
line-height: 1.5;
}
.infographic-ebssnap[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-2: #7ea3f5;
--accent-soft:#202942;
--line: #2c313d;
--muted: #6b6f7a;
--ok: #4ade80;
--ok-soft: #123322;
}
.infographic-ebssnap * { box-sizing: border-box; }
.eb-header { margin-bottom: 1.25rem; }
.eb-header h1 {
font-family: var(--display-font);
font-weight: 600;
font-size: clamp(1.4rem, 4vw, 1.9rem);
margin: 0 0 0.3rem 0;
line-height: 1.25;
}
.eb-header p { color: var(--ink-soft); margin: 0; font-size: 0.9rem; }
.steps {
display: flex;
gap: 0.6rem;
margin-bottom: 1.25rem;
flex-wrap: wrap;
}
.step-btn {
font: inherit;
font-size: 0.85rem;
font-weight: 600;
display: flex;
align-items: center;
gap: 0.5rem;
background: var(--paper-alt);
color: var(--ink-soft);
border: 1px solid var(--line);
border-radius: 999px;
padding: 0.5rem 1rem 0.5rem 0.6rem;
cursor: pointer;
transition: border-color 0.15s, background 0.15s, color 0.15s;
}
.step-btn .step-num {
width: 22px; height: 22px; border-radius: 50%;
background: var(--paper); border: 1px solid var(--line);
display: flex; align-items: center; justify-content: center;
font-size: 0.75rem; flex-shrink: 0;
}
.step-btn.is-active {
background: var(--accent-soft); color: var(--accent); border-color: var(--accent);
}
.step-btn.is-active .step-num { background: var(--accent); color: var(--paper); border-color: var(--accent); }
.step-btn.is-playing { animation: eb-pulse 1s ease-in-out infinite; }
@keyframes eb-pulse {
0%, 100% { box-shadow: 0 0 0 0 var(--accent-soft); }
50% { box-shadow: 0 0 0 5px var(--accent-soft); }
}
.play-btn {
font: inherit;
font-size: 0.85rem;
font-weight: 600;
display: flex;
align-items: center;
gap: 0.4rem;
background: var(--accent);
color: var(--paper);
border: 1px solid var(--accent);
border-radius: 999px;
padding: 0.5rem 1rem 0.5rem 0.8rem;
cursor: pointer;
margin-left: auto;
transition: opacity 0.15s;
}
.play-btn:hover { opacity: 0.88; }
.play-btn svg { flex-shrink: 0; }
.az-diagram { width: 100%; height: auto; display: block; }
.az-diagram text { font-family: var(--body-font); fill: var(--ink); }
.az-diagram .az-label { font-weight: 700; font-size: 20px; }
.az-diagram .vol-label { font-weight: 500; font-size: 15px; fill: var(--ink-soft); }
.az-diagram .step-label { font-weight: 600; font-size: 14px; fill: var(--ink-soft); }
.az-diagram .az-box { fill: none; stroke: var(--line); stroke-width: 1.5; }
.az-diagram .chip { fill: none; stroke: var(--accent); stroke-width: 2; }
.az-diagram .chip-pin { stroke: var(--accent); stroke-width: 2; }
.az-diagram .drum { fill: var(--paper-alt); stroke: var(--accent-2); stroke-width: 2; }
.az-diagram .snap-icon { fill: var(--paper-alt); stroke: var(--accent-2); stroke-width: 2; }
.az-diagram .conn { stroke: var(--ink-soft); stroke-width: 1.5; fill: none; marker-end: url(#arrowhead); }
.az-diagram .conn.restore { stroke: var(--ok); }
.az-diagram .ring { fill: none; stroke: var(--ok); stroke-width: 2.5; }
.az-diagram .phase-highlight { fill: var(--accent-soft); opacity: 0; transition: opacity 0.25s ease; }
.az-diagram .phase-highlight.is-active-phase { opacity: 1; }
.az-diagram [data-min-step] { transition: opacity 0.2s ease; }
.az-diagram .is-hidden { opacity: 0; pointer-events: none; }
.eb-footer {
margin-top: 1.25rem;
padding: 0.8rem 1rem;
border-left: 3px solid var(--accent);
background: var(--paper-alt);
border-radius: 0 8px 8px 0;
font-size: 0.86rem;
min-height: 1.4em;
}
.eb-footer strong { font-weight: 600; }
@media (prefers-reduced-motion: reduce) {
.infographic-ebssnap *, .infographic-ebssnap *::before, .infographic-ebssnap *::after {
transition-duration: 0.001ms !important;
}
}
</style>
</head>
<body>
<div class="infographic-ebssnap">
<div class="eb-header">
<h1>Moving an EBS Volume Across Availability Zones</h1>
<p>Click through the three steps.</p>
</div>
<div class="steps">
<button class="step-btn is-active" data-step="1"><span class="step-num">1</span>Snapshot</button>
<button class="step-btn" data-step="2"><span class="step-num">2</span>Restore</button>
<button class="step-btn" data-step="3"><span class="step-num">3</span>Attach</button>
<button class="play-btn" id="ebPlayBtn">
<svg id="ebPlayIcon" width="14" height="14" viewBox="0 0 14 14" fill="currentColor"><path d="M3 2 L12 7 L3 12 Z"/></svg>
<span id="ebPlayLabel">Play</span>
</button>
</div>
<svg class="az-diagram" viewBox="0 0 1180 380" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="arrowhead" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto">
<path d="M0,0 L8,4 L0,8 Z" fill="var(--ink-soft)"/>
</marker>
<marker id="arrowhead-ok" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto">
<path d="M0,0 L8,4 L0,8 Z" fill="var(--ok)"/>
</marker>
</defs>
<!-- phase highlights (behind everything) -->
<rect class="phase-highlight is-active-phase" data-phase="1" x="440" y="190" width="180" height="130" rx="16"/>
<rect class="phase-highlight" data-phase="2" x="655" y="190" width="170" height="130" rx="16"/>
<rect class="phase-highlight" data-phase="3" x="900" y="55" width="160" height="230" rx="16"/>
<!-- AZ 1A -->
<rect class="az-box" x="20" y="20" width="330" height="340" rx="16"/>
<text class="az-label" x="45" y="55">US-EAST-1A</text>
<g transform="translate(140,80)">
<rect class="chip" x="0" y="0" width="60" height="60" rx="6"/>
<line class="chip-pin" x1="15" y1="-9" x2="15" y2="0"/><line class="chip-pin" x1="30" y1="-9" x2="30" y2="0"/><line class="chip-pin" x1="45" y1="-9" x2="45" y2="0"/>
<line class="chip-pin" x1="15" y1="60" x2="15" y2="69"/><line class="chip-pin" x1="30" y1="60" x2="30" y2="69"/><line class="chip-pin" x1="45" y1="60" x2="45" y2="69"/>
<line class="chip-pin" x1="-9" y1="15" x2="0" y2="15"/><line class="chip-pin" x1="-9" y1="30" x2="0" y2="30"/><line class="chip-pin" x1="-9" y1="45" x2="0" y2="45"/>
<line class="chip-pin" x1="60" y1="15" x2="69" y2="15"/><line class="chip-pin" x1="60" y1="30" x2="69" y2="30"/><line class="chip-pin" x1="60" y1="45" x2="69" y2="45"/>
</g>
<g transform="translate(130,230)">
<rect class="drum" x="0" y="10" width="56" height="46" rx="4"/>
<path class="drum" d="M0,20 Q28,32 56,20"/>
<text class="vol-label" x="28" y="82" text-anchor="middle">EBS 50 GB</text>
</g>
<path class="conn" d="M158,230 C158,195 165,170 168,148"/>
<path class="conn" d="M186,255 C240,255 280,250 330,250"/>
<!-- Snapshot -->
<g data-min-step="1" transform="translate(490,225)">
<text class="step-label" x="35" y="-15" text-anchor="middle">EBS Snapshot</text>
<path class="snap-icon" d="M0,10 Q35,-6 70,10 L70,40 Q35,56 0,40 Z"/>
<path class="snap-icon" d="M0,10 Q35,26 70,10" fill="none"/>
<path class="snap-icon" d="M14,44 v14 a21,10 0 0 0 42,0 v-14" fill="none"/>
</g>
<!-- Restore arrow + new volume in 1B -->
<path class="conn restore is-hidden" data-min-step="2" marker-end="url(#arrowhead-ok)" d="M580,250 C640,250 660,250 700,250"/>
<g data-min-step="2" class="is-hidden" transform="translate(700,230)">
<rect class="drum" x="0" y="10" width="56" height="46" rx="4"/>
<path class="drum" d="M0,20 Q28,32 56,20"/>
<text class="vol-label" x="28" y="82" text-anchor="middle">EBS 50 GB</text>
</g>
<!-- AZ 1B -->
<rect class="az-box" x="830" y="20" width="330" height="340" rx="16"/>
<text class="az-label" x="855" y="55">US-EAST-1B</text>
<g transform="translate(960,80)">
<rect class="chip" x="0" y="0" width="60" height="60" rx="6"/>
<line class="chip-pin" x1="15" y1="-9" x2="15" y2="0"/><line class="chip-pin" x1="30" y1="-9" x2="30" y2="0"/><line class="chip-pin" x1="45" y1="-9" x2="45" y2="0"/>
<line class="chip-pin" x1="15" y1="60" x2="15" y2="69"/><line class="chip-pin" x1="30" y1="60" x2="30" y2="69"/><line class="chip-pin" x1="45" y1="60" x2="45" y2="69"/>
<line class="chip-pin" x1="-9" y1="15" x2="0" y2="15"/><line class="chip-pin" x1="-9" y1="30" x2="0" y2="30"/><line class="chip-pin" x1="-9" y1="45" x2="0" y2="45"/>
<line class="chip-pin" x1="60" y1="15" x2="69" y2="15"/><line class="chip-pin" x1="60" y1="30" x2="69" y2="30"/><line class="chip-pin" x1="60" y1="45" x2="69" y2="45"/>
</g>
<!-- Attach connector + ring -->
<path class="conn restore is-hidden" data-min-step="3" marker-end="url(#arrowhead-ok)" d="M756,255 C820,255 900,255 960,255 C975,220 980,180 985,150"/>
<circle class="ring is-hidden" data-min-step="3" cx="990" cy="107" r="34"/>
</svg>
<div class="eb-footer" id="ebSnapFooter">
<strong>Snapshot</strong> — a point-in-time backup of the volume, stored in S3 (not tied to one AZ).
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-ebssnap')
|| document.querySelector('.infographic-ebssnap');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function () {
const footerText = {
1: '<strong>Snapshot</strong> — a point-in-time backup of the volume, stored in S3 (not tied to one AZ).',
2: '<strong>Restore</strong> — create a new volume from the snapshot in any AZ, here US-EAST-1B.',
3: '<strong>Attach</strong> — the new volume connects to an instance in 1B. Same data, new AZ.'
};
const buttons = document.querySelectorAll('.step-btn');
const footer = document.getElementById('ebSnapFooter');
const revealEls = document.querySelectorAll('[data-min-step]');
const phaseEls = document.querySelectorAll('.phase-highlight');
const playBtn = document.getElementById('ebPlayBtn');
const playIcon = document.getElementById('ebPlayIcon');
const playLabel = document.getElementById('ebPlayLabel');
let playTimer = null;
const STEP_MS = 1800;
function goToStep(step) {
buttons.forEach(b => b.classList.toggle('is-active', Number(b.dataset.step) === step));
revealEls.forEach(el => {
const min = Number(el.dataset.minStep);
el.classList.toggle('is-hidden', min > step);
});
phaseEls.forEach(el => {
el.classList.toggle('is-active-phase', Number(el.dataset.phase) === step);
});
footer.innerHTML = footerText[step];
}
function currentStep() {
const active = document.querySelector('.step-btn.is-active');
return active ? Number(active.dataset.step) : 1;
}
function stopPlay() {
if (playTimer) { clearInterval(playTimer); playTimer = null; }
buttons.forEach(b => b.classList.remove('is-playing'));
playIcon.innerHTML = '<path d="M3 2 L12 7 L3 12 Z"/>';
playLabel.textContent = 'Play';
}
function startPlay() {
goToStep(1);
buttons[0].classList.add('is-playing');
playIcon.innerHTML = '<rect x="3" y="2" width="3" height="10"/><rect x="8" y="2" width="3" height="10"/>';
playLabel.textContent = 'Pause';
playTimer = setInterval(() => {
const next = currentStep() + 1;
buttons.forEach(b => b.classList.remove('is-playing'));
if (next > 3) {
stopPlay();
return;
}
goToStep(next);
buttons[next - 1].classList.add('is-playing');
if (next === 3) {
setTimeout(stopPlay, STEP_MS);
clearInterval(playTimer);
playTimer = null;
}
}, STEP_MS);
}
buttons.forEach(btn => {
btn.addEventListener('click', () => { stopPlay(); goToStep(Number(btn.dataset.step)); });
});
playBtn.addEventListener('click', () => {
if (playTimer) { stopPlay(); } else { startPlay(); }
});
goToStep(1);
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});📸 Snapshot Management
🗄️ Snapshot Archive Tier
💸 Move infrequently used snapshots to a lower-cost archive tier (up to 75% cheaper).
📦 Best for long-term backup and compliance.
⏳ Restoring an archived snapshot typically takes 24–72 hours.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EBS Snapshot Archive</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Newsreader:wght@500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<style>
.infographic-ebsarchive {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f4f1ea;
--accent: #2563eb;
--accent-2: #1e40af;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--display-font: 'Newsreader', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
background: var(--paper);
color: var(--ink);
font-family: var(--body-font);
max-width: 760px;
margin: 0 auto;
padding: clamp(1.25rem, 5vw, 3rem);
box-sizing: border-box;
}
.infographic-ebsarchive[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1c1c24;
--accent: #5b8def;
--accent-2: #85a9f5;
--accent-soft:#20293f;
--line: #2c313d;
}
.infographic-ebsarchive * { box-sizing: border-box; }
.eb-card {
background: var(--paper-alt);
border: 1px solid var(--line);
border-radius: 18px;
padding: clamp(1.5rem, 4vw, 2.5rem) clamp(1rem, 4vw, 2rem);
}
.az-diagram { width: 100%; height: auto; display: block; overflow: visible; }
.az-diagram text {
font-family: var(--display-font);
fill: var(--ink);
font-weight: 600;
}
.bucket-fill { fill: var(--accent-soft); stroke: var(--accent-2); stroke-width: 4.5; stroke-linecap: round; stroke-linejoin: round; }
.bucket-line { fill: none; stroke: var(--accent-2); stroke-width: 4.5; stroke-linecap: round; stroke-linejoin: round; }
.bucket-shine { fill: var(--paper); opacity: 0.35; }
.bucket-icon { filter: drop-shadow(0 4px 8px rgba(30, 64, 175, 0.18)); }
.infographic-ebsarchive[data-theme="dark"] .bucket-icon { filter: drop-shadow(0 4px 10px rgba(0, 0, 0, 0.45)); }
.cold-badge circle { fill: var(--accent); }
.cold-badge path, .cold-badge line { stroke: var(--paper-alt); stroke-width: 2; stroke-linecap: round; }
.arrow-line { stroke: var(--ink-soft); stroke-width: 2; fill: none; stroke-linecap: round; }
.arrow-head { fill: var(--ink-soft); }
.arrow-pill { fill: var(--paper); stroke: var(--line); stroke-width: 1; }
.arrow-label { font-family: var(--body-font); font-weight: 500; font-size: 14px; fill: var(--ink-soft); letter-spacing: 0.02em; }
</style>
</head>
<body>
<div class="infographic-ebsarchive">
<div class="eb-card">
<svg class="az-diagram" viewBox="0 0 620 220" xmlns="http://www.w3.org/2000/svg">
<text x="105" y="34" font-size="23" text-anchor="middle">EBS Snapshot</text>
<g class="bucket-icon" transform="translate(60,62)">
<path class="bucket-fill" d="M22,28 L38,14 L52,14 L68,28"/>
<line class="bucket-line" x1="24" y1="32" x2="66" y2="32"/>
<ellipse class="bucket-fill" cx="45" cy="38" rx="24" ry="9"/>
<path class="bucket-fill" d="M21,38 L27,74 Q45,84 63,74 L69,38 Q45,47 21,38 Z"/>
<ellipse class="bucket-shine" cx="33" cy="45" rx="5" ry="10"/>
<path class="bucket-line" d="M32,50 Q45,58 58,48"/>
<circle cx="32" cy="50" r="3" fill="var(--accent-2)" stroke="none"/>
</g>
<path class="arrow-line" d="M150,124 L280,124"/>
<path class="arrow-line" d="M350,124 L470,124"/>
<path class="arrow-head" d="M470,118 L482,124 L470,130 Z"/>
<rect class="arrow-pill" x="282" y="110" width="66" height="28" rx="14"/>
<text class="arrow-label" x="315" y="128" text-anchor="middle">archive</text>
<text x="525" y="22" font-size="23" text-anchor="middle">EBS Snapshot</text>
<text x="525" y="47" font-size="23" text-anchor="middle">Archive</text>
<g class="bucket-icon" transform="translate(480,62)">
<path class="bucket-fill" d="M22,28 L38,14 L52,14 L68,28"/>
<line class="bucket-line" x1="24" y1="32" x2="66" y2="32"/>
<ellipse class="bucket-fill" cx="45" cy="38" rx="24" ry="9"/>
<path class="bucket-fill" d="M21,38 L27,74 Q45,84 63,74 L69,38 Q45,47 21,38 Z"/>
<ellipse class="bucket-shine" cx="33" cy="45" rx="5" ry="10"/>
<path class="bucket-line" d="M32,50 Q45,58 58,48"/>
<circle cx="32" cy="50" r="3" fill="var(--accent-2)" stroke="none"/>
<g class="cold-badge" transform="translate(64,72)">
<circle r="13"/>
<g transform="scale(0.65)">
<line x1="-9" y1="0" x2="9" y2="0"/><line x1="0" y1="-9" x2="0" y2="9"/>
<line x1="-6.5" y1="-6.5" x2="6.5" y2="6.5"/><line x1="-6.5" y1="6.5" x2="6.5" y2="-6.5"/>
</g>
</g>
</g>
</svg>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-ebsarchive')
|| document.querySelector('.infographic-ebsarchive');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});🗑️ Snapshot Recycle Bin
🛡️ Instead of being permanently deleted, snapshots are stored in a Recycle Bin for a configurable retention period.
🔄 You can restore accidentally deleted snapshots before the retention period expires.
✅ Provides an extra layer of protection against accidental deletion.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EBS Snapshot Delete</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Newsreader:wght@500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<style>
.infographic-ebsdelete {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f4f1ea;
--accent: #2563eb;
--accent-2: #1e40af;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--muted: #9a968c;
--muted-soft: #e4e0d6;
--display-font: 'Newsreader', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
background: var(--paper);
color: var(--ink);
font-family: var(--body-font);
max-width: 760px;
margin: 0 auto;
padding: clamp(1.25rem, 5vw, 3rem);
box-sizing: border-box;
}
.infographic-ebsdelete[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1c1c24;
--accent: #5b8def;
--accent-2: #85a9f5;
--accent-soft:#20293f;
--line: #2c313d;
--muted: #6b6f7a;
--muted-soft: #23262e;
}
.infographic-ebsdelete * { box-sizing: border-box; }
.eb-card {
background: var(--paper-alt);
border: 1px solid var(--line);
border-radius: 18px;
padding: clamp(1.5rem, 4vw, 2.5rem) clamp(1rem, 4vw, 2rem);
}
.az-diagram { width: 100%; height: auto; display: block; overflow: visible; }
.az-diagram text {
font-family: var(--display-font);
fill: var(--ink);
font-weight: 600;
}
.bucket-fill { fill: var(--accent-soft); stroke: var(--accent-2); stroke-width: 4.5; stroke-linecap: round; stroke-linejoin: round; }
.bucket-line { fill: none; stroke: var(--accent-2); stroke-width: 4.5; stroke-linecap: round; stroke-linejoin: round; }
.bucket-shine { fill: var(--paper); opacity: 0.35; }
.bucket-icon { filter: drop-shadow(0 4px 8px rgba(30, 64, 175, 0.18)); }
.infographic-ebsdelete[data-theme="dark"] .bucket-icon { filter: drop-shadow(0 4px 10px rgba(0, 0, 0, 0.45)); }
.bin-fill { fill: var(--muted-soft); stroke: var(--muted); stroke-width: 4; stroke-linecap: round; stroke-linejoin: round; }
.bin-line { fill: none; stroke: var(--muted); stroke-width: 4; stroke-linecap: round; stroke-linejoin: round; }
.bin-icon { filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.12)); }
.ghost-bucket { fill: var(--paper); stroke: var(--muted); stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; opacity: 0.75; }
.loop-icon { stroke: var(--muted); stroke-width: 3; fill: none; stroke-linecap: round; }
.loop-icon .arrow-tip { fill: var(--muted); stroke: none; }
.arrow-line { stroke: var(--ink-soft); stroke-width: 2; fill: none; stroke-linecap: round; }
.arrow-head { fill: var(--ink-soft); }
.arrow-pill { fill: var(--paper); stroke: var(--line); stroke-width: 1; }
.arrow-label { font-family: var(--body-font); font-weight: 500; font-size: 14px; fill: var(--ink-soft); letter-spacing: 0.02em; }
</style>
</head>
<body>
<div class="infographic-ebsdelete">
<div class="eb-card">
<svg class="az-diagram" viewBox="0 0 640 230" xmlns="http://www.w3.org/2000/svg">
<!-- EBS Snapshot -->
<text x="105" y="34" font-size="23" text-anchor="middle">EBS Snapshot</text>
<g class="bucket-icon" transform="translate(60,64)">
<path class="bucket-fill" d="M22,28 L38,14 L52,14 L68,28"/>
<line class="bucket-line" x1="24" y1="32" x2="66" y2="32"/>
<ellipse class="bucket-fill" cx="45" cy="38" rx="24" ry="9"/>
<path class="bucket-fill" d="M21,38 L27,74 Q45,84 63,74 L69,38 Q45,47 21,38 Z"/>
<ellipse class="bucket-shine" cx="33" cy="45" rx="5" ry="10"/>
<path class="bucket-line" d="M32,50 Q45,58 58,48"/>
<circle cx="32" cy="50" r="3" fill="var(--accent-2)" stroke="none"/>
</g>
<!-- delete arrow -->
<path class="arrow-line" d="M150,126 L272,126"/>
<path class="arrow-line" d="M344,126 L468,126"/>
<path class="arrow-head" d="M468,120 L480,126 L468,132 Z"/>
<rect class="arrow-pill" x="274" y="112" width="70" height="28" rx="14"/>
<text class="arrow-label" x="309" y="130" text-anchor="middle">delete</text>
<!-- Recycle Bin -->
<text x="540" y="34" font-size="23" text-anchor="middle">Recycle Bin</text>
<g class="bin-icon" transform="translate(478,64)">
<path class="bin-fill" d="M28,36 L48,18 L66,18 L86,36"/>
<line class="bin-line" x1="31" y1="41" x2="83" y2="41"/>
<ellipse class="bin-fill" cx="57" cy="49" rx="30" ry="11"/>
<path class="bin-fill" d="M26,49 L33,96 Q57,108 81,96 L88,49 Q57,60 26,49 Z"/>
<!-- ghost bucket resting inside -->
<g class="ghost-bucket" transform="translate(35,58) scale(0.55)">
<path d="M22,28 L38,14 L52,14 L68,28"/>
<line x1="24" y1="32" x2="66" y2="32"/>
<ellipse cx="45" cy="38" rx="24" ry="9"/>
<path d="M21,38 L27,74 Q45,84 63,74 L69,38 Q45,47 21,38 Z"/>
<path d="M32,50 Q45,58 58,48"/>
</g>
</g>
<!-- loop / recycle icon -->
<g class="loop-icon" transform="translate(590,52)">
<path d="M -13,-6 A14,14 0 1 1 -13,6"/>
<path class="arrow-tip" d="M -18,-5 L -12,-15 L -6,-7 Z"/>
<path d="M 13,6 A14,14 0 1 1 13,-6"/>
<path class="arrow-tip" d="M 18,5 L 12,15 L 6,7 Z"/>
</g>
</svg>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-ebsdelete')
|| document.querySelector('.infographic-ebsdelete');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});