loreal-sla-calculator/market.html
Phil Dore 1f7153d105 Bump script version strings to bust browser cache
Forces browsers to fetch updated market-script.js and script.js
with the Gantt red line position fix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 11:48:54 +01:00

379 lines
27 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" class="scroll-smooth">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SLA Brief Advisor — eCom Content Factory</title>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
colors: {
brand: { 50: '#fef3f2', 100: '#fee4e2', 200: '#fecdd3', 300: '#fda4af', 400: '#fb7185', 500: '#f43f5e', 600: '#e11d48', 700: '#be123c', 800: '#9f1239', 900: '#881337' }
}
}
}
}
</script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/airbnb.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js"></script>
<style>
.fade-in { animation: fadeIn 0.3s ease-in-out; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
@media print { .no-print { display: none !important; } }
</style>
</head>
<body class="bg-gray-50 dark:bg-gray-900 text-gray-800 dark:text-gray-100 min-h-screen transition-colors">
<!-- Header -->
<header class="bg-white dark:bg-gray-800 shadow-sm border-b border-gray-200 dark:border-gray-700 no-print">
<div class="max-w-3xl mx-auto px-4 py-4 flex items-center justify-between">
<div>
<h1 class="text-xl font-bold text-brand-700 dark:text-brand-400">SLA Brief Advisor</h1>
<p class="text-xs text-gray-500 dark:text-gray-400 mt-0.5">eCom Content Factory</p>
</div>
<button id="darkToggle" class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors" title="Toggle dark mode">
<svg id="sunIcon" class="w-5 h-5 hidden" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"/></svg>
<svg id="moonIcon" class="w-5 h-5" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/></svg>
</button>
</div>
</header>
<!-- Disclaimer -->
<div class="max-w-3xl mx-auto px-4 mt-4 no-print">
<div class="rounded-xl border-2 border-amber-400 dark:border-amber-500 bg-amber-50 dark:bg-amber-900/30 p-4">
<div class="flex items-start gap-3">
<svg class="w-6 h-6 text-amber-500 dark:text-amber-400 shrink-0 mt-0.5" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"/>
</svg>
<div>
<p class="text-sm font-bold text-amber-800 dark:text-amber-200">These timings are for reference only and assume suitable working files have been provided.</p>
<p class="text-sm font-semibold text-amber-700 dark:text-amber-300 mt-1">Please confirm final deadlines with your BCM after studio evaluation. Creative requests follow ad-hoc production timelines.</p>
</div>
</div>
</div>
</div>
<!-- Main Content -->
<main class="max-w-3xl mx-auto px-4 py-6">
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 p-6">
<p class="text-sm text-gray-600 dark:text-gray-400 mb-6">Tell us what you need and when — we'll tell you the right brief type and when to submit it.</p>
<!-- Form -->
<form id="clientForm" class="space-y-5" autocomplete="off">
<!-- Content Type -->
<div>
<label for="contentType" class="block text-sm font-semibold text-gray-700 dark:text-gray-300 mb-1.5">What is this for?</label>
<select id="contentType" class="w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-3 py-2.5 text-sm focus:ring-2 focus:ring-brand-500 focus:border-brand-500 outline-none transition-colors">
<option value="">— Select —</option>
<option value="pdp">Product (PDP)</option>
<option value="eventing">Eventing</option>
</select>
</div>
<!-- Asset Volume -->
<div>
<label for="assetVolume" class="block text-sm font-semibold text-gray-700 dark:text-gray-300 mb-1.5">How many assets do you need?</label>
<select id="assetVolume" class="w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-3 py-2.5 text-sm focus:ring-2 focus:ring-brand-500 focus:border-brand-500 outline-none transition-colors">
<option value="0_50">0 50</option>
<option value="50_100">50 100</option>
<option value="100_200">100 200</option>
<option value="200_300">200 300</option>
<option value="300_400">300 400</option>
</select>
</div>
<!-- Yes/No Toggles -->
<div class="space-y-3">
<p class="text-sm font-semibold text-gray-700 dark:text-gray-300">What do you need?</p>
<!-- Static -->
<div class="rounded-lg border border-gray-200 dark:border-gray-600 overflow-hidden">
<label class="flex items-center justify-between p-3 hover:bg-gray-50 dark:hover:bg-gray-700/40 cursor-pointer transition-colors">
<div class="flex items-center gap-3">
<span class="text-lg">🖼️</span>
<span class="text-sm font-medium text-gray-700 dark:text-gray-300">Static imagery</span>
</div>
<div class="relative">
<input type="checkbox" id="needsStatic" class="sr-only peer toggle-with-feedback" data-feedback="feedbackStatic">
<div class="w-10 h-5 bg-gray-300 dark:bg-gray-600 rounded-full peer-checked:bg-brand-500 transition-colors"></div>
<div class="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow peer-checked:translate-x-5 transition-transform"></div>
</div>
</label>
<div id="feedbackStatic" class="hidden border-t border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-700/30 px-3 py-2.5 space-y-3">
<!-- Static work type sub-selector -->
<div>
<p class="text-xs font-semibold text-gray-600 dark:text-gray-400 mb-1.5">What type of static work?</p>
<div class="flex flex-col gap-1.5">
<label class="flex items-center gap-2 cursor-pointer">
<input type="radio" name="staticWorkType" value="creation" checked class="w-3.5 h-3.5 text-brand-500 focus:ring-brand-500 border-gray-300 dark:border-gray-600">
<span class="text-xs text-gray-700 dark:text-gray-300">New Asset <span class="text-gray-400 dark:text-gray-500">(new KV & Visual ID)</span></span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="radio" name="staticWorkType" value="adaptation" class="w-3.5 h-3.5 text-brand-500 focus:ring-brand-500 border-gray-300 dark:border-gray-600">
<span class="text-xs text-gray-700 dark:text-gray-300">Adapting existing <span class="text-gray-400 dark:text-gray-500">(local customisation)</span></span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="radio" name="staticWorkType" value="simple" class="w-3.5 h-3.5 text-brand-500 focus:ring-brand-500 border-gray-300 dark:border-gray-600">
<span class="text-xs text-gray-700 dark:text-gray-300">Resizing / Cropping only</span>
</label>
</div>
</div>
<!-- Feedback days -->
<label class="flex items-center justify-between">
<span class="text-xs font-medium text-gray-600 dark:text-gray-400">Days needed for feedback <span class="font-normal text-gray-400 dark:text-gray-500">(30 min* 0.3 response time for urgent brief)</span></span>
<input type="number" id="feedbackDaysStatic" min="0" max="30" step="0.1" value="3" class="w-16 text-center rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-2 py-1 text-sm focus:ring-2 focus:ring-brand-500 outline-none">
</label>
<!-- Rounds of amends -->
<label class="flex items-center justify-between">
<span class="text-xs font-medium text-gray-600 dark:text-gray-400">Rounds of amends</span>
<input type="number" id="amendRoundsStatic" min="1" max="10" step="1" value="1" class="w-16 text-center rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-2 py-1 text-sm focus:ring-2 focus:ring-brand-500 outline-none">
</label>
</div>
</div>
<!-- Video -->
<div class="rounded-lg border border-gray-200 dark:border-gray-600 overflow-hidden">
<label class="flex items-center justify-between p-3 hover:bg-gray-50 dark:hover:bg-gray-700/40 cursor-pointer transition-colors">
<div class="flex items-center gap-3">
<span class="text-lg">🎬</span>
<span class="text-sm font-medium text-gray-700 dark:text-gray-300">Video / Motion content</span>
</div>
<div class="relative">
<input type="checkbox" id="needsVideo" class="sr-only peer toggle-with-feedback" data-feedback="feedbackVideo">
<div class="w-10 h-5 bg-gray-300 dark:bg-gray-600 rounded-full peer-checked:bg-brand-500 transition-colors"></div>
<div class="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow peer-checked:translate-x-5 transition-transform"></div>
</div>
</label>
<div id="feedbackVideo" class="hidden border-t border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-700/30 px-3 py-2.5 space-y-3">
<!-- Video work type sub-selector -->
<div>
<p class="text-xs font-semibold text-gray-600 dark:text-gray-400 mb-1.5">What type of video work?</p>
<div class="flex flex-col gap-1.5">
<label class="flex items-center gap-2 cursor-pointer">
<input type="radio" name="videoWorkType" value="new_asset" checked class="w-3.5 h-3.5 text-brand-500 focus:ring-brand-500 border-gray-300 dark:border-gray-600">
<span class="text-xs text-gray-700 dark:text-gray-300">New asset</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="radio" name="videoWorkType" value="adapting" class="w-3.5 h-3.5 text-brand-500 focus:ring-brand-500 border-gray-300 dark:border-gray-600">
<span class="text-xs text-gray-700 dark:text-gray-300">Adapting existing <span class="text-gray-400 dark:text-gray-500">(local customisation)</span></span>
</label>
</div>
</div>
<!-- Feedback days -->
<label class="flex items-center justify-between">
<span class="text-xs font-medium text-gray-600 dark:text-gray-400">Days needed for feedback</span>
<input type="number" id="feedbackDaysVideo" min="0" max="30" step="0.1" value="3" class="w-16 text-center rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-2 py-1 text-sm focus:ring-2 focus:ring-brand-500 outline-none">
</label>
<!-- Rounds of amends -->
<label class="flex items-center justify-between">
<span class="text-xs font-medium text-gray-600 dark:text-gray-400">Rounds of amends</span>
<input type="number" id="amendRoundsVideo" min="1" max="10" step="1" value="1" class="w-16 text-center rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-2 py-1 text-sm focus:ring-2 focus:ring-brand-500 outline-none">
</label>
</div>
</div>
<!-- HTML -->
<div class="rounded-lg border border-gray-200 dark:border-gray-600 overflow-hidden">
<label class="flex items-center justify-between p-3 hover:bg-gray-50 dark:hover:bg-gray-700/40 cursor-pointer transition-colors">
<div class="flex items-center gap-3">
<span class="text-lg">🖥️</span>
<span class="text-sm font-medium text-gray-700 dark:text-gray-300">HTML / Rich media</span>
</div>
<div class="relative">
<input type="checkbox" id="needsHTML" class="sr-only peer toggle-with-feedback" data-feedback="feedbackHTML">
<div class="w-10 h-5 bg-gray-300 dark:bg-gray-600 rounded-full peer-checked:bg-brand-500 transition-colors"></div>
<div class="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow peer-checked:translate-x-5 transition-transform"></div>
</div>
</label>
<div id="feedbackHTML" class="hidden border-t border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-700/30 px-3 py-2.5 space-y-3">
<label class="flex items-center justify-between">
<span class="text-xs font-medium text-gray-600 dark:text-gray-400">Days needed for feedback</span>
<input type="number" id="feedbackDaysHTML" min="0" max="30" step="0.1" value="3" class="w-16 text-center rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-2 py-1 text-sm focus:ring-2 focus:ring-brand-500 outline-none">
</label>
<label class="flex items-center justify-between">
<span class="text-xs font-medium text-gray-600 dark:text-gray-400">Rounds of amends</span>
<input type="number" id="amendRoundsHTML" min="1" max="10" step="1" value="1" class="w-16 text-center rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-2 py-1 text-sm focus:ring-2 focus:ring-brand-500 outline-none">
</label>
</div>
</div>
<!-- Translation -->
<div class="rounded-lg border border-gray-200 dark:border-gray-600 overflow-hidden">
<label class="flex items-center justify-between p-3 hover:bg-gray-50 dark:hover:bg-gray-700/40 cursor-pointer transition-colors">
<div class="flex items-center gap-3">
<span class="text-lg">🌐</span>
<span class="text-sm font-medium text-gray-700 dark:text-gray-300">Translation</span>
</div>
<div class="relative">
<input type="checkbox" id="needsTranslation" class="sr-only peer toggle-with-feedback" data-feedback="feedbackTranslation">
<div class="w-10 h-5 bg-gray-300 dark:bg-gray-600 rounded-full peer-checked:bg-brand-500 transition-colors"></div>
<div class="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow peer-checked:translate-x-5 transition-transform"></div>
</div>
</label>
<div id="feedbackTranslation" class="hidden border-t border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-700/30 px-3 py-2.5 space-y-3">
<label class="flex items-center justify-between">
<span class="text-xs font-medium text-gray-600 dark:text-gray-400">Days needed for feedback</span>
<input type="number" id="feedbackDaysTranslation" min="0" max="30" step="0.1" value="5" class="w-16 text-center rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-2 py-1 text-sm focus:ring-2 focus:ring-brand-500 outline-none">
</label>
<label class="flex items-center justify-between">
<span class="text-xs font-medium text-gray-600 dark:text-gray-400">Rounds of amends</span>
<input type="number" id="amendRoundsTranslation" min="1" max="10" step="1" value="1" class="w-16 text-center rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-2 py-1 text-sm focus:ring-2 focus:ring-brand-500 outline-none">
</label>
</div>
</div>
<!-- Syndication -->
<div class="rounded-lg border border-gray-200 dark:border-gray-600 overflow-hidden">
<label class="flex items-center justify-between p-3 hover:bg-gray-50 dark:hover:bg-gray-700/40 cursor-pointer transition-colors">
<div class="flex items-center gap-3">
<span class="text-lg">📤</span>
<span class="text-sm font-medium text-gray-700 dark:text-gray-300">Delivery to Retailer (Syndication)</span>
</div>
<div class="relative">
<input type="checkbox" id="needsSyndication" class="sr-only peer" checked>
<div class="w-10 h-5 bg-gray-300 dark:bg-gray-600 rounded-full peer-checked:bg-brand-500 transition-colors"></div>
<div class="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow peer-checked:translate-x-5 transition-transform"></div>
</div>
</label>
</div>
</div>
<!-- Go-Live Date -->
<div>
<label for="golive" class="block text-sm font-semibold text-gray-700 dark:text-gray-300 mb-1.5">When do you need Oliver tasks completed by?</label>
<input id="golive" type="text" placeholder="Select your go-live date…" class="w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-3 py-2.5 text-sm focus:ring-2 focus:ring-brand-500 focus:border-brand-500 outline-none transition-colors" readonly>
</div>
<!-- Calculate Button -->
<button type="submit" id="calcBtn" disabled class="w-full bg-brand-600 hover:bg-brand-700 disabled:bg-gray-300 dark:disabled:bg-gray-600 disabled:cursor-not-allowed text-white font-semibold py-3 px-4 rounded-lg transition-colors text-sm">
Show me the result
</button>
</form>
<!-- Results -->
<div id="results" class="hidden mt-8 fade-in">
<hr class="border-gray-200 dark:border-gray-700 mb-6">
<!-- Brief Type Result -->
<div class="rounded-xl p-5 mb-4 bg-brand-50 dark:bg-brand-900/20 border border-brand-200 dark:border-brand-800">
<div class="flex items-start gap-3">
<div class="w-10 h-10 rounded-full bg-brand-500 flex items-center justify-center flex-shrink-0 shadow">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg>
</div>
<div class="flex-1">
<p class="text-xs font-medium text-brand-600 dark:text-brand-400 uppercase tracking-wide mb-1.5">Brief type to submit</p>
<select id="briefTypeOverride" class="w-full rounded-lg border border-brand-300 dark:border-brand-700 bg-white dark:bg-gray-700 px-3 py-2 text-sm font-bold text-brand-800 dark:text-brand-200 focus:ring-2 focus:ring-brand-500 outline-none">
</select>
<div id="resultBriefDesc" class="mt-2 p-2.5 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg text-xs text-blue-800 dark:text-blue-300 hidden"></div>
</div>
</div>
</div>
<!-- Submission Deadline -->
<div id="deadlineBanner" class="rounded-xl p-5 mb-4"></div>
<!-- Urgent Brief Note (shown conditionally by JS) -->
<div id="urgentNote" class="hidden"></div>
<!-- Disclaimer Banner -->
<div class="rounded-xl border-2 border-amber-400 dark:border-amber-500 bg-amber-50 dark:bg-amber-900/30 p-4 mb-4">
<div class="flex items-start gap-3">
<svg class="w-6 h-6 text-amber-500 dark:text-amber-400 shrink-0 mt-0.5" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"/>
</svg>
<div>
<p class="text-sm font-bold text-amber-800 dark:text-amber-200">These timings are for reference only and assume suitable working files have been provided.</p>
<p class="text-sm font-semibold text-amber-700 dark:text-amber-300 mt-1">Please confirm final deadlines with your BCM after studio evaluation. Creative requests follow ad-hoc production timelines.</p>
</div>
</div>
</div>
<!-- Timeline Summary -->
<div id="timelineSummary" class="space-y-3"></div>
<!-- Summary Row -->
<div id="summaryCards" class="mt-6 grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3">
<div class="bg-gray-50 dark:bg-gray-700/50 rounded-lg p-3 text-center">
<p class="text-xs text-gray-500 dark:text-gray-400 mb-1">Submit Brief By</p>
<p id="summarySubmitBy" class="text-sm font-bold text-gray-700 dark:text-gray-200"></p>
<p class="text-[10px] text-gray-400 dark:text-gray-500 mt-0.5">2 days before acceptance</p>
</div>
<div class="bg-brand-50 dark:bg-brand-900/20 border border-brand-200 dark:border-brand-800 rounded-lg p-3 text-center">
<p class="text-xs text-brand-600 dark:text-brand-400 mb-1">Brief Accepted By</p>
<p id="summaryBriefAcceptedBy" class="text-sm font-bold text-brand-700 dark:text-brand-300"></p>
</div>
<div class="bg-gray-50 dark:bg-gray-700/50 rounded-lg p-3 text-center">
<p class="text-xs text-gray-500 dark:text-gray-400 mb-1">Estimated Completion</p>
<p id="summaryCompletion" class="text-sm font-bold"></p>
</div>
<div class="bg-gray-50 dark:bg-gray-700/50 rounded-lg p-3 text-center">
<p class="text-xs text-gray-500 dark:text-gray-400 mb-1">Total Business Days</p>
<p id="summaryDays" class="text-sm font-bold"></p>
</div>
<div class="bg-gray-50 dark:bg-gray-700/50 rounded-lg p-3 text-center">
<p class="text-xs text-gray-500 dark:text-gray-400 mb-1">Earliest Completion</p>
<p id="summaryEarliest" class="text-sm font-bold"></p>
</div>
</div>
<!-- Gantt Toggle -->
<div class="mt-4 no-print">
<button type="button" id="toggleGanttBtn" onclick="toggleGantt()" class="inline-flex items-center gap-2 px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2"/></svg>
Show Gantt
</button>
</div>
<!-- Gantt Panel -->
<div id="ganttView" class="hidden mt-4 bg-gray-50 dark:bg-gray-700/30 rounded-xl border border-gray-200 dark:border-gray-700 p-4">
<div class="flex justify-between items-center mb-3 no-print">
<h3 class="text-sm font-bold text-gray-700 dark:text-gray-300 uppercase tracking-wide">Timeline Gantt</h3>
<button onclick="downloadGanttPNG()" class="px-3 py-1.5 bg-gray-900 dark:bg-white dark:text-gray-900 hover:bg-gray-700 dark:hover:bg-gray-100 text-white rounded-lg font-medium text-xs transition-colors flex items-center gap-1.5">
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg>
Download PNG
</button>
</div>
<div id="ganttChart"></div>
</div>
<!-- SLA one-pager link (hidden until URL is available) -->
<div id="slaPagerLink" class="hidden mt-4 text-center">
<a href="#" class="inline-flex items-center gap-1.5 text-sm text-brand-600 dark:text-brand-400 hover:underline font-medium">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg>
Download our SLA guide →
</a>
</div>
<!-- Toggle for urgent brief detail view -->
<div id="toggleDetails" class="hidden mt-4 text-center"></div>
<!-- Actions -->
<div class="mt-6 flex flex-wrap justify-center gap-3 no-print">
<button type="button" id="btnCopyEmail" onclick="copyForEmail()" class="inline-flex items-center gap-2 px-5 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white rounded-lg font-medium text-sm transition-colors">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3m2 4H10m0 0l3-3m-3 3l3 3"/></svg>
Copy for Email
</button>
<button id="resetBtn" type="button" class="inline-flex items-center gap-2 px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">
<svg class="w-4 h-4" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/></svg>
Start Over
</button>
</div>
</div>
</div>
<!-- Footer -->
<p class="text-center text-xs text-gray-400 dark:text-gray-500 mt-6 no-print">
For detailed stage-by-stage configuration, use the <a href="index.html" class="underline hover:text-brand-500">full SLA Calculator</a>.
</p>
</main>
<script src="market-script.js?v=2026042401"></script>
</body>
</html>