<!doctype html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
		<meta http-equiv="Pragma" content="no-cache" />
		<meta http-equiv="Expires" content="0" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
		<title>Fantasy Hype</title>
		<meta name="description" content="Fantasy Hype — advanced analytics, mock drafts, trade tools, and data-driven insights for fantasy football. Join the community and win your league." />
		<meta name="theme-color" content="#0f172a" />
		<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#0f172a" />
		<meta name="theme-color" media="(prefers-color-scheme: light)" content="#ffffff" />

		<!-- Performance: Preconnect to critical domains -->
		<link rel="preconnect" href="https://solitary-mode-f465.marty22dyer.workers.dev" crossorigin />
		<link rel="dns-prefetch" href="https://solitary-mode-f465.marty22dyer.workers.dev" />
		<link rel="preconnect" href="https://www.fantasynerds.com" crossorigin />
		<link rel="dns-prefetch" href="https://www.fantasynerds.com" />
		<link rel="preconnect" href="https://a.espncdn.com" crossorigin />
		<link rel="dns-prefetch" href="https://a.espncdn.com" />
		
		<!-- Core Web Vitals Optimization -->
		<link rel="prefetch" as="image" href="/og-image.png" />
		
		<!-- Mobile Optimization -->
		<meta name="mobile-web-app-capable" content="yes" />
		<meta name="apple-mobile-web-app-capable" content="yes" />
		<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />

		<!-- Favicon & Manifest -->
		<link rel="icon" type="image/svg+xml" href="/favicon.svg?v=20260220_2" />
		<link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16.png?v=20260220_2" />
		<link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32.png?v=20260220_2" />
		<link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon.png?v=20260220_2" />
		<link rel="manifest" href="/manifest.json?v=20260220_2" />

		<!-- Open Graph (fallback for crawlers that don't render JS) -->
		<meta property="og:type" content="website" />
		<meta property="og:site_name" content="Fantasy Hype" />
		<meta property="og:title" content="Fantasy Hype — Win Your Fantasy League" />
		<meta property="og:description" content="Advanced analytics, mock drafts, trade tools, and data-driven insights for fantasy football." />
		<meta property="og:image" content="https://fantasyhype.com/og-image.png" />
		<meta property="og:url" content="https://fantasyhype.com/" />

		<!-- Twitter Card (fallback) -->
		<meta name="twitter:card" content="summary_large_image" />
		<meta name="twitter:title" content="Fantasy Hype — Win Your Fantasy League" />
		<meta name="twitter:description" content="Advanced analytics, mock drafts, trade tools, and data-driven insights for fantasy football." />
		<meta name="twitter:image" content="https://fantasyhype.com/og-image.png" />

		<!-- Google Consent Mode v2 — defaults (denied until user grants consent) -->
		<script>
			window.dataLayer = window.dataLayer || [];
			function gtag(){dataLayer.push(arguments);}
			gtag('consent', 'default', {
				'ad_storage': 'denied',
				'ad_user_data': 'denied',
				'ad_personalization': 'denied',
				'analytics_storage': 'denied',
				'wait_for_update': 500
			});
		</script>
		<!-- Google tag (gtag.js) -->
		<script async src="https://www.googletagmanager.com/gtag/js?id=G-1DWLJ3MKR5"></script>
		<script>
			window.dataLayer = window.dataLayer || [];
			function gtag(){dataLayer.push(arguments);}
			gtag('js', new Date());
			gtag('config', 'G-1DWLJ3MKR5');
		</script>
		<script>
			(function() {
				try {
					var saved = localStorage.getItem('theme');
					var theme = (saved === 'light' || saved === 'dark') ? saved : 'dark';
					var isDark = theme === 'dark';
					document.documentElement.classList.toggle('dark', isDark);
					document.documentElement.classList.toggle('theme-light', !isDark);
					if (document.body) {
						document.body.classList.toggle('theme-light', !isDark);
					} else {
						document.addEventListener('DOMContentLoaded', function() {
							document.body.classList.toggle('theme-light', !isDark);
						});
					}
					localStorage.setItem('theme', theme);
				} catch (e) {}
			})();
		</script>
		<script type="module" crossorigin src="/assets/index-DQTI-CkG.js"></script>
		<link rel="modulepreload" crossorigin href="/assets/vendor-supabase-DnmMWork.js">
		<link rel="modulepreload" crossorigin href="/assets/vendor-react-BDHgkP30.js">
		<link rel="modulepreload" crossorigin href="/assets/vendor-ui-D9Bcq382.js">
		<link rel="modulepreload" crossorigin href="/assets/page-game-D-IN2Aoq.js">
		<link rel="modulepreload" crossorigin href="/assets/page-trade-yYTEI6i0.js">
		<link rel="stylesheet" crossorigin href="/assets/index-Dad9f3IO.css">
		<script type="module">
window.onerror = (message, source, lineno, colno, errorObj) => {
	const errorDetails = errorObj ? JSON.stringify({
		name: errorObj.name,
		message: errorObj.message,
		stack: errorObj.stack,
		source,
		lineno,
		colno,
	}) : null;

	window.parent.postMessage({
		type: 'horizons-runtime-error',
		message,
		error: errorDetails
	}, '*');
};
</script>
		<script type="module">
const observer = new MutationObserver((mutations) => {
	for (const mutation of mutations) {
		for (const addedNode of mutation.addedNodes) {
			if (
				addedNode.nodeType === Node.ELEMENT_NODE &&
				(
					addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
					addedNode.classList?.contains('backdrop')
				)
			) {
				handleViteOverlay(addedNode);
			}
		}
	}
});

observer.observe(document.documentElement, {
	childList: true,
	subtree: true
});

function handleViteOverlay(node) {
	if (!node.shadowRoot) {
		return;
	}

	const backdrop = node.shadowRoot.querySelector('.backdrop');

	if (backdrop) {
		const overlayHtml = backdrop.outerHTML;
		const parser = new DOMParser();
		const doc = parser.parseFromString(overlayHtml, 'text/html');
		const messageBodyElement = doc.querySelector('.message-body');
		const fileElement = doc.querySelector('.file');
		const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
		const fileText = fileElement ? fileElement.textContent.trim() : '';
		const error = messageText + (fileText ? ' File:' + fileText : '');

		window.parent.postMessage({
			type: 'horizons-vite-error',
			error,
		}, '*');
	}
}
</script>
		<script type="module">
const originalConsoleError = console.error;
console.error = function(...args) {
	originalConsoleError.apply(console, args);

	let errorString = '';

	for (let i = 0; i < args.length; i++) {
		const arg = args[i];
		if (arg instanceof Error) {
			errorString = arg.stack || `${arg.name}: ${arg.message}`;
			break;
		}
	}

	if (!errorString) {
		errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
	}

	window.parent.postMessage({
		type: 'horizons-console-error',
		error: errorString
	}, '*');
};
</script>
		<script type="module">
const originalFetch = window.fetch;

window.fetch = function(...args) {
	const url = args[0] instanceof Request ? args[0].url : args[0];

	// Skip WebSocket URLs
	if (url.startsWith('ws:') || url.startsWith('wss:')) {
		return originalFetch.apply(this, args);
	}

	return originalFetch.apply(this, args)
		.then(async response => {
			const contentType = response.headers.get('Content-Type') || '';

			// Exclude HTML document responses
			const isDocumentResponse =
				contentType.includes('text/html') ||
				contentType.includes('application/xhtml+xml');

			if (!response.ok && !isDocumentResponse) {
					const responseClone = response.clone();
					const errorFromRes = await responseClone.text();
					const requestUrl = response.url;
					console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
			}

			return response;
		})
		.catch(error => {
			if (!url.match(/.html?$/i)) {
				console.error(error);
			}

			throw error;
		});
};
</script>
		<script type="module">
if (window.navigation && window.self !== window.top) {
	window.navigation.addEventListener('navigate', (event) => {
		const url = event.destination.url;

		try {
			const destinationUrl = new URL(url);
			const destinationOrigin = destinationUrl.origin;
			const currentOrigin = window.location.origin;

			if (destinationOrigin === currentOrigin) {
				return;
			}
		} catch (error) {
			return;
		}

		window.parent.postMessage({
			type: 'horizons-navigation-error',
			url,
		}, '*');
	});
}
</script>
	</head>
	<body>
		<div id="root"></div>
		<script>
			// Unregister any rogue service workers
			if ('serviceWorker' in navigator) {
				navigator.serviceWorker.getRegistrations().then(function(registrations) {
					registrations.forEach(function(registration) { registration.unregister(); });
				});
			}
		</script>
	</body>
</html>