tfrere's picture
update
2b6f74b
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Browser Screenshot Tool</title>
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/tailwind.min.css"
rel="stylesheet"
/>
<style>
.loading {
display: none;
}
.screenshot-container {
max-width: 100%;
overflow-x: auto;
}
.screenshot-image {
max-width: 100%;
}
</style>
</head>
<body class="bg-gray-100 min-h-screen">
<div class="container mx-auto px-4 py-8">
<h1 class="text-3xl font-bold text-center mb-8">
Browser Screenshot Tool
</h1>
<div class="bg-white p-6 rounded-lg shadow-md">
<form id="screenshot-form" class="mb-4">
<div class="mb-4">
<label for="url" class="block text-gray-700 font-medium mb-2"
>URL to capture</label
>
<input
type="url"
id="url"
name="url"
value="https://google.com"
class="w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
required
/>
</div>
<button
type="submit"
class="w-full bg-blue-500 hover:bg-blue-600 text-white font-medium py-2 px-4 rounded-lg"
>
Take Screenshot
</button>
</form>
<div id="loading" class="loading flex justify-center items-center py-8">
<svg
class="animate-spin -ml-1 mr-3 h-8 w-8 text-blue-500"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
>
<circle
class="opacity-25"
cx="12"
cy="12"
r="10"
stroke="currentColor"
stroke-width="4"
></circle>
<path
class="opacity-75"
fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
></path>
</svg>
<span class="text-lg text-gray-700">Taking screenshot...</span>
</div>
<div
id="error"
class="hidden bg-red-100 text-red-700 p-4 rounded-lg mt-4"
></div>
<div id="screenshot" class="hidden mt-6">
<h2 class="text-xl font-semibold mb-4">Result:</h2>
<div class="screenshot-container border rounded-lg p-2">
<img
id="screenshot-image"
class="screenshot-image mx-auto"
src=""
alt="Screenshot"
/>
</div>
</div>
</div>
</div>
<script>
document
.getElementById("screenshot-form")
.addEventListener("submit", async function (e) {
e.preventDefault();
const url = document.getElementById("url").value;
const loadingEl = document.getElementById("loading");
const errorEl = document.getElementById("error");
const screenshotEl = document.getElementById("screenshot");
const screenshotImageEl = document.getElementById("screenshot-image");
// Reset UI
errorEl.classList.add("hidden");
errorEl.textContent = "";
screenshotEl.classList.add("hidden");
loadingEl.style.display = "flex";
try {
// Create form data
const formData = new FormData();
formData.append("url", url);
// Send request
const response = await fetch("/take-screenshot", {
method: "POST",
body: formData,
});
const data = await response.json();
if (response.ok && data.success) {
// Show screenshot
screenshotImageEl.src = data.screenshot_url;
screenshotEl.classList.remove("hidden");
} else {
// Show error
errorEl.textContent =
data.error ||
"An error occurred while capturing the screenshot.";
errorEl.classList.remove("hidden");
}
} catch (error) {
// Show error
errorEl.textContent =
"An error occurred while connecting to the server.";
errorEl.classList.remove("hidden");
console.error(error);
} finally {
// Hide loading
loadingEl.style.display = "none";
}
});
</script>
</body>
</html>