<!DOCTYPE html>
<html lang="en" class="h-full bg-slate-950 text-slate-100 font-sans">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>NEÓN TIGRE // RECLAIM THE WILD</title>
<!-- Tailwind CSS CDN -->
<script src="https://cdn.tailwindcss.com"></script>
<!-- Google Fonts: Inter & JetBrains Mono -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<script>
tailwind.config = {
theme: {
extend: {
fontFamily: {
sans: ['Inter', 'sans-serif'],
mono: ['JetBrains Mono', 'monospace'],
},
},
},
}
</script>
<style>
/* 1. Continuous Linear Hue Cycle */
@keyframes hue-linear {
0% { filter: hue-rotate(0deg); }
100% { filter: hue-rotate(360deg); }
}
/* 2. Pulsing Saturation & Hue Shift */
@keyframes hue-pulse {
0%, 100% { filter: hue-rotate(0deg) saturate(100%); }
50% { filter: hue-rotate(180deg) saturate(220%); }
}
/* 3. High Vibrancy Rainbow Shift */
@keyframes hue-rainbow {
0% { filter: hue-rotate(0deg) saturate(160%) brightness(100%); }
33% { filter: hue-rotate(120deg) saturate(220%) brightness(110%); }
66% { filter: hue-rotate(240deg) saturate(250%) brightness(115%); }
100% { filter: hue-rotate(360deg) saturate(160%) brightness(100%); }
}
/* 4. Oscillating Sweep */
@keyframes hue-sweep {
0% { filter: hue-rotate(-90deg); }
100% { filter: hue-rotate(90deg); }
}
/* Utility Animation Classes using CSS Custom Properties */
.animate-hue-linear {
animation: hue-linear var(--anim-speed, 4s) infinite linear;
}
.animate-hue-pulse {
animation: hue-pulse var(--anim-speed, 4s) infinite ease-in-out;
}
.animate-hue-rainbow {
animation: hue-rainbow var(--anim-speed, 4s) infinite linear;
}
.animate-hue-sweep {
animation: hue-sweep var(--anim-speed, 4s) infinite alternate ease-in-out;
}
/* Subtle Glassmorphism Card Style */
.glass-card {
background: rgba(15, 23, 42, 0.75);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.08);
}
/* Custom Scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #090d16;
}
::-webkit-scrollbar-thumb {
background: #1e293b;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #334155;
}
</style>
</head>
<body class="min-h-full flex flex-col bg-slate-950 text-slate-100 antialiased selection:bg-indigo-500 selection:text-white">
<header class="w-full border-b border-slate-800/80 bg-slate-900/60 backdrop-blur sticky top-0 z-50">
<div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 h-16 flex items-center justify-between">
<div class="flex items-center space-x-3">
<div class="w-9 h-9 rounded-xl bg-gradient-to-tr from-orange-500 via-indigo-500 to-pink-500 p-0.5 shadow-lg shadow-orange-500/10">
<div class="w-full h-full bg-slate-950 rounded-[10px] flex items-center justify-center">
<!-- Cloudflare-inspired cloud logo -->
<svg class="w-5 h-5 text-orange-400" fill="currentColor" viewBox="0 0 24 24">
<path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z"/>
</svg>
</div>
</div>
<div>
<span class="font-bold text-base text-white tracking-tight flex items-center gap-2">
NEÓN TIGRE <span class="text-[10px] uppercase font-mono px-2 py-0.5 rounded-full bg-orange-500/10 text-orange-400 border border-orange-500/20">Cloudflare Pages</span>
</span>
</div>
</div>
<div class="flex items-center gap-3 text-xs">
<a href="#deployment-guide" class="px-3.5 py-1.5 rounded-lg font-medium bg-slate-800 hover:bg-slate-700 text-slate-200 transition-colors border border-slate-700 flex items-center gap-1.5">
<svg class="w-4 h-4 text-orange-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/>
</svg>
ABOUT US
</a>
</div>
</div>
</header>
<main class="flex-1 max-w-6xl w-full mx-auto p-4 sm:p-6 lg:p-8 flex flex-col items-center gap-10">
<!-- HERO SECTION / MAIN CARD -->
<section class="w-full glass-card rounded-3xl p-6 sm:p-10 shadow-2xl relative overflow-hidden flex flex-col items-center text-center">
<!-- Background Ambient Glow -->
<div class="absolute -top-24 -left-24 w-72 h-72 bg-indigo-500/10 rounded-full blur-3xl pointer-events-none"></div>
<div class="absolute -bottom-24 -right-24 w-72 h-72 bg-orange-500/10 rounded-full blur-3xl pointer-events-none"></div>
<!-- Badge Header -->
<div class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-slate-800/80 border border-slate-700/60 text-xs font-mono text-indigo-300 mb-6">
<span class="w-2 h-2 rounded-full bg-emerald-400 animate-pulse"></span>
Zero-GIF Pure CSS Animation Target
</div>
<!-- COLOR CHANGING LOGO PREVIEW STAGE -->
<div id="preview-box" class="w-full max-w-sm h-64 sm:h-72 bg-slate-950/80 border border-slate-800/80 rounded-2xl flex flex-col items-center justify-center p-6 my-2 relative group transition-colors duration-300 shadow-inner">
<!-- Live Indicator Tag -->
<div class="absolute top-3 left-3 text-[10px] font-mono text-slate-400 uppercase tracking-wider bg-slate-900/90 px-2 py-0.5 rounded border border-slate-800">
Live Rendering
</div>
<!-- Animated Graphic Target -->
<div id="logo-wrapper" class="w-36 h-36 sm:w-44 sm:h-44 flex items-center justify-center transition-all duration-300">
<!-- Default Vector Logo -->
<svg id="default-vector" class="w-full h-full animate-hue-linear" style="--anim-speed: 4s;" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="vectorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#3b82f6" />
<stop offset="50%" stop-color="#8b5cf6" />
<stop offset="100%" stop-color="#ec4899" />
</linearGradient>
</defs>
<circle cx="100" cy="100" r="85" stroke="url(#vectorGrad)" stroke-width="10" fill="none" opacity="0.3"/>
<path d="M100 25 L165 145 L125 145 L100 95 L75 145 L35 145 Z" fill="url(#vectorGrad)"/>
<circle cx="100" cy="95" r="22" fill="#020617"/>
<circle cx="100" cy="95" r="12" fill="url(#vectorGrad)"/>
</svg>
<!-- Custom Image Element (Hidden by default) -->
<img id="custom-img" src="" alt="Custom Logo" class="w-full h-full object-contain hidden rounded-xl" />
</div>
<p id="status-label" class="mt-4 text-xs font-mono text-slate-400">
Effect: Hue Cycle (360°) | Duration: 4.0s
</p>
</div>
<h1 class="text-2xl sm:text-4xl font-extrabold text-white tracking-tight mt-4">
Dynamic Color-Shifting Brand Hub
</h1>
<p class="text-sm sm:text-base text-slate-400 max-w-xl mt-2 leading-relaxed">
Hosted on Cloudflare Pages using zero JavaScript animation overhead. Test custom graphics, adjust the animation settings, or grab the HTML snippet below.
</p>
<div class="w-full max-w-3xl mt-8 pt-8 border-t border-slate-800/80 grid grid-cols-1 md:grid-cols-2 gap-6 text-left">
<!-- Controls Column 1 -->
<div class="space-y-4">
<h3 class="text-xs uppercase tracking-wider font-semibold text-indigo-400 flex items-center gap-2">
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>
Animation Parameters
</h3>
<!-- Animation Style Dropdown -->
<div>
<label for="effect-style" class="block text-xs font-medium text-slate-300 mb-1.5">Transition Effect Style</label>
<select id="effect-style" onchange="applyAnimationSettings()" class="w-full bg-slate-950 border border-slate-700/80 rounded-xl px-3 py-2 text-xs font-medium text-slate-200 focus:outline-none focus:ring-2 focus:ring-indigo-500">
<option value="hue-linear">Continuous Hue Loop (0° → 360°)</option>
<option value="hue-pulse">Pulsing Saturation & Hue Shift</option>
<option value="hue-rainbow">High-Vibrancy Rainbow Burst</option>
<option value="hue-sweep">Oscillating Sweep (-90° ↔ +90°)</option>
</select>
</div>
<!-- Animation Speed Slider -->
<div>
<div class="flex justify-between items-center text-xs mb-1.5">
<label for="speed-slider" class="font-medium text-slate-300">Animation Speed</label>
<span id="speed-display" class="font-mono text-indigo-400 font-bold bg-indigo-500/10 px-2 py-0.5 rounded border border-indigo-500/20 text-[11px]">4.0s</span>
</div>
<input type="range" id="speed-slider" min="0.5" max="10" step="0.5" value="4" oninput="applyAnimationSettings()" class="w-full h-1.5 bg-slate-800 rounded-lg appearance-none cursor-pointer accent-indigo-500" />
<div class="flex justify-between text-[10px] text-slate-500 font-mono mt-1">
<span>Fast (0.5s)</span>
<span>Default (4s)</span>
<span>Slow (10s)</span>
</div>
</div>
</div>
<!-- Controls Column 2 -->
<div class="space-y-4">
<h3 class="text-xs uppercase tracking-wider font-semibold text-indigo-400 flex items-center gap-2">
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002-2z"/></svg>
Test Custom Image / Logo
</h3>
<!-- Image URL Input -->
<div>
<label for="image-url-input" class="block text-xs font-medium text-slate-300 mb-1.5">Paste External Image or SVG URL</label>
<div class="flex gap-2">
<input type="url" id="image-url-input" placeholder="https://example.com/logo.png" class="flex-1 bg-slate-950 border border-slate-700/80 rounded-xl px-3 py-1.5 text-xs text-slate-200 placeholder-slate-600 focus:outline-none focus:ring-2 focus:ring-indigo-500 font-mono" />
<button onclick="loadCustomUrl()" class="px-3 py-1.5 bg-slate-800 hover:bg-slate-700 text-slate-200 text-xs font-medium rounded-xl border border-slate-700 transition-colors">
Apply
</button>
</div>
</div>
<!-- File Upload Input -->
<div>
<label class="block text-xs font-medium text-slate-300 mb-1.5">Or Upload Local Image / Logo File</label>
<div class="flex gap-2 items-center">
<input type="file" id="file-uploader" accept="image/*" onchange="handleFileUpload(event)" class="block w-full text-xs text-slate-400 file:mr-3 file:py-1.5 file:px-3 file:rounded-xl file:border-0 file:text-xs file:font-semibold file:bg-indigo-600 file:text-white hover:file:bg-indigo-500 file:cursor-pointer cursor-pointer bg-slate-950 border border-slate-800 rounded-xl p-1" />
<button onclick="resetToDefaultLogo()" class="px-3 py-1.5 bg-slate-800 hover:bg-slate-700 text-slate-300 text-xs font-medium rounded-xl border border-slate-700 whitespace-nowrap transition-colors">
Reset
</button>
</div>
</div>
</div>
</div>
</section>
<section id=“about-us” class="w-full glass-card rounded-3xl p-6 sm:p-8 shadow-xl">
<div class="border-b border-slate-800 pb-4 mb-6 flex items-center justify-between flex-wrap gap-3">
<div>
<h2 class="text-lg font-bold text-white flex items-center gap-2">
<svg class="w-5 h-5 text-orange-400" fill="currentColor" viewBox="0 0 24 24">
<path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z"/>
</svg>
ABOUT NEÓN TIGRE
</h2>
<p class="text-xs text-slate-400 mt-1">Deploy this exact single-page file and attach your Cloudflare domain in under 3 minutes.</p>
</div>
<span class="text-xs font-mono bg-orange-500/10 text-orange-400 border border-orange-500/20 px-2.5 py-1 rounded-full">100% Free Unlimited Hosting</span>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<!-- Step 1 -->
<div class="bg-slate-950/80 border border-slate-800/80 rounded-2xl p-5 flex flex-col justify-between">
<div>
<div class="w-8 h-8 rounded-xl bg-orange-500/10 text-orange-400 border border-orange-500/20 flex items-center justify-center font-bold text-sm mb-3">1</div>
<h3 class="font-semibold text-sm text-white mb-2">Save your HTML File</h3>
<p class="text-xs text-slate-400 leading-relaxed">
Save the code of this page as <code class="text-indigo-300 font-mono">index.html</code> on your computer inside an empty folder (e.g. <code class="text-indigo-300 font-mono">mysite/</code>).
</p>
</div>
</div>
<!-- Step 2 -->
<div class="bg-slate-950/80 border border-slate-800/80 rounded-2xl p-5 flex flex-col justify-between">
<div>
<div class="w-8 h-8 rounded-xl bg-orange-500/10 text-orange-400 border border-orange-500/20 flex items-center justify-center font-bold text-sm mb-3">2</div>
<h3 class="font-semibold text-sm text-white mb-2">Upload to Cloudflare</h3>
<ol class="text-xs text-slate-400 leading-relaxed list-disc list-inside space-y-1">
<li>Log in to your <strong>Cloudflare Dashboard</strong>.</li>
<li>Navigate to <strong>Workers & Pages</strong> → <strong>Create Application</strong> → <strong>Pages</strong>.</li>
<li>Choose <strong>Upload Assets</strong>, drag your folder, and click <strong>Deploy</strong>.</li>
</ol>
</div>
</div>
<!-- Step 3 -->
<div class="bg-slate-950/80 border border-slate-800/80 rounded-2xl p-5 flex flex-col justify-between">
<div>
<div class="w-8 h-8 rounded-xl bg-orange-500/10 text-orange-400 border border-orange-500/20 flex items-center justify-center font-bold text-sm mb-3">3</div>
<h3 class="font-semibold text-sm text-white mb-2">Attach Your Domain</h3>
<ol class="text-xs text-slate-400 leading-relaxed list-disc list-inside space-y-1">
<li>In your new Pages project, click <strong>Custom Domains</strong>.</li>
<li>Click <strong>Set up a custom domain</strong> and enter your Cloudflare domain name.</li>
<li>Cloudflare will configure DNS automatically!</li>
</ol>
</div>
</div>
</div>
</section>
</main>
<footer class="w-full border-t border-slate-800/80 py-6 bg-slate-950 text-center text-xs text-slate-500">
<p>© Single-Page Color Shift Template • Built for Cloudflare Pages Deployment</p>
</footer>
<script>
function applyAnimationSettings() {
const speed = document.getElementById('speed-slider').value;
const effect = document.getElementById('effect-style').value;
document.getElementById('speed-display').textContent = `${speed}s`;
const vectorLogo = document.getElementById('default-vector');
const customImg = document.getElementById('custom-img');
// Helper function to update active animation classes
const updateTarget = (el) => {
el.className = el.className.replace(/animate-hue-\w+/g, '').trim();
el.classList.add(`animate-${effect}`);
el.style.setProperty('--anim-speed', `${speed}s`);
};
updateTarget(vectorLogo);
updateTarget(customImg);
// Status text label update
const labelMap = {
'hue-linear': `Effect: Hue Cycle (0° → 360°) | Speed: ${speed}s`,
'hue-pulse': `Effect: Saturation & Hue Pulse | Speed: ${speed}s`,
'hue-rainbow': `Effect: Multi-Step Rainbow Burst | Speed: ${speed}s`,
'hue-sweep': `Effect: Oscillating Sweep (-90° ↔ +90°) | Speed: ${speed}s`
};
document.getElementById('status-label').textContent = labelMap[effect] || `Speed: ${speed}s`;
}
function loadCustomUrl() {
const url = document.getElementById('image-url-input').value.trim();
if (!url) return;
const vectorLogo = document.getElementById('default-vector');
const customImg = document.getElementById('custom-img');
customImg.src = url;
customImg.onerror = function() {
alert("Failed to load image from URL. Please ensure it is a direct image/SVG link.");
resetToDefaultLogo();
};
customImg.onload = function() {
vectorLogo.classList.add('hidden');
customImg.classList.remove('hidden');
applyAnimationSettings();
};
}
function handleFileUpload(event) {
const file = event.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(e) {
const vectorLogo = document.getElementById('default-vector');
const customImg = document.getElementById('custom-img');
customImg.src = e.target.result;
vectorLogo.classList.add('hidden');
customImg.classList.remove('hidden');
applyAnimationSettings();
};
reader.readAsDataURL(file);
}
function resetToDefaultLogo() {
const vectorLogo = document.getElementById('default-vector');
const customImg = document.getElementById('custom-img');
document.getElementById('image-url-input').value = '';
document.getElementById('file-uploader').value = '';
customImg.classList.add('hidden');
customImg.src = '';
vectorLogo.classList.remove('hidden');
applyAnimationSettings();
}
// Initialize animation properties on load
window.onload = function() {
applyAnimationSettings();
};
</script>
</body>
</html>