327 lines
14 KiB
HTML
327 lines
14 KiB
HTML
|
|
<!doctype html>
|
||
|
|
<html lang="en">
|
||
|
|
|
||
|
|
<head>
|
||
|
|
<meta charset="UTF-8" />
|
||
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
|
|
<title>PDF Layers - Manage OCG Layers - BentoPDF</title>
|
||
|
|
<meta name="description"
|
||
|
|
content="View, toggle, add, and delete Optional Content Groups (OCG) in your PDF files. Free, secure, and runs entirely in your browser.">
|
||
|
|
<link rel="icon" type="image/png" href="/images/favicon.svg" />
|
||
|
|
<link href="/src/css/styles.css" rel="stylesheet" />
|
||
|
|
<link rel="icon" href="/favicon.ico" sizes="any" />
|
||
|
|
<style>
|
||
|
|
.layers-container {
|
||
|
|
background: #374151;
|
||
|
|
border-radius: 0.75rem;
|
||
|
|
padding: 1rem;
|
||
|
|
margin-top: 1.5rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layers-list {
|
||
|
|
max-height: 400px;
|
||
|
|
overflow-y: auto;
|
||
|
|
margin-bottom: 1rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-item {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: space-between;
|
||
|
|
padding: 0.75rem 0.5rem;
|
||
|
|
border-bottom: 1px solid #4B5563;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-item:last-child {
|
||
|
|
border-bottom: none;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-toggle {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 0.75rem;
|
||
|
|
cursor: pointer;
|
||
|
|
flex: 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-toggle input[type="checkbox"] {
|
||
|
|
width: 1.25rem;
|
||
|
|
height: 1.25rem;
|
||
|
|
accent-color: #6366F1;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-name {
|
||
|
|
color: #E5E7EB;
|
||
|
|
font-size: 0.875rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-locked {
|
||
|
|
font-size: 0.75rem;
|
||
|
|
margin-left: 0.5rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-actions {
|
||
|
|
display: flex;
|
||
|
|
gap: 0.5rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-actions button {
|
||
|
|
background: #4B5563;
|
||
|
|
border: none;
|
||
|
|
color: #9CA3AF;
|
||
|
|
padding: 0.25rem 0.5rem;
|
||
|
|
border-radius: 0.25rem;
|
||
|
|
cursor: pointer;
|
||
|
|
font-size: 0.75rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-actions button:hover {
|
||
|
|
background: #6B7280;
|
||
|
|
color: #fff;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layer-delete:hover {
|
||
|
|
background: #DC2626 !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
.layers-empty {
|
||
|
|
text-align: center;
|
||
|
|
padding: 2rem;
|
||
|
|
color: #9CA3AF;
|
||
|
|
}
|
||
|
|
|
||
|
|
.add-layer-form {
|
||
|
|
display: flex;
|
||
|
|
gap: 0.5rem;
|
||
|
|
margin-bottom: 1rem;
|
||
|
|
flex-wrap: wrap;
|
||
|
|
}
|
||
|
|
|
||
|
|
.add-layer-form input {
|
||
|
|
flex: 1;
|
||
|
|
min-width: 200px;
|
||
|
|
background: #1F2937;
|
||
|
|
border: 1px solid #4B5563;
|
||
|
|
border-radius: 0.5rem;
|
||
|
|
padding: 0.625rem;
|
||
|
|
color: #fff;
|
||
|
|
}
|
||
|
|
|
||
|
|
.add-layer-form button {
|
||
|
|
background: #6366F1;
|
||
|
|
border: none;
|
||
|
|
color: #fff;
|
||
|
|
padding: 0.625rem 1rem;
|
||
|
|
border-radius: 0.5rem;
|
||
|
|
cursor: pointer;
|
||
|
|
font-weight: 600;
|
||
|
|
white-space: nowrap;
|
||
|
|
}
|
||
|
|
|
||
|
|
@media (max-width: 640px) {
|
||
|
|
.add-layer-form button {
|
||
|
|
width: 100%;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
.add-layer-form button:hover {
|
||
|
|
background: #4F46E5;
|
||
|
|
}
|
||
|
|
</style>
|
||
|
|
</head>
|
||
|
|
|
||
|
|
<body class="antialiased bg-gray-900">
|
||
|
|
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
|
||
|
|
<div class="container mx-auto px-4">
|
||
|
|
<div class="flex justify-between items-center h-16">
|
||
|
|
<div class="flex-shrink-0 flex items-center cursor-pointer" id="home-logo">
|
||
|
|
<img src="/images/favicon.svg" alt="Bento PDF Logo" class="h-8 w-8" />
|
||
|
|
<span class="text-white font-bold text-xl ml-2">
|
||
|
|
<a href="/">BentoPDF</a>
|
||
|
|
</span>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="hidden md:flex items-center space-x-8 text-white">
|
||
|
|
<a href="/" class="nav-link">Home</a>
|
||
|
|
<a href="/about.html" class="nav-link">About</a>
|
||
|
|
<a href="/contact.html" class="nav-link">Contact</a>
|
||
|
|
<a href="/" class="nav-link">All Tools</a>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="md:hidden flex items-center">
|
||
|
|
<button id="mobile-menu-button" type="button"
|
||
|
|
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
|
||
|
|
aria-controls="mobile-menu" aria-expanded="false">
|
||
|
|
<span class="sr-only">Open main menu</span>
|
||
|
|
<svg id="menu-icon" class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none"
|
||
|
|
viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
|
||
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||
|
|
d="M4 6h16M4 12h16M4 18h16" />
|
||
|
|
</svg>
|
||
|
|
<svg id="close-icon" class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none"
|
||
|
|
viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
|
||
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||
|
|
d="M6 18L18 6M6 6l12 12" />
|
||
|
|
</svg>
|
||
|
|
</button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div id="mobile-menu" class="hidden md:hidden bg-gray-800 border-t border-gray-700">
|
||
|
|
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
|
||
|
|
<a href="/" class="mobile-nav-link">Home</a>
|
||
|
|
<a href="/about.html" class="mobile-nav-link">About</a>
|
||
|
|
<a href="/contact.html" class="mobile-nav-link">Contact</a>
|
||
|
|
<a href="/" class="mobile-nav-link">All Tools</a>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</nav>
|
||
|
|
|
||
|
|
<div id="uploader" class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900">
|
||
|
|
<div id="tool-uploader"
|
||
|
|
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700">
|
||
|
|
<button id="back-to-tools"
|
||
|
|
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold">
|
||
|
|
<i data-lucide="arrow-left" class="cursor-pointer"></i>
|
||
|
|
<span class="cursor-pointer">Back to Tools</span>
|
||
|
|
</button>
|
||
|
|
|
||
|
|
<h1 class="text-2xl font-bold text-white mb-2">PDF Layers</h1>
|
||
|
|
<p class="text-gray-400 mb-6">
|
||
|
|
Manage Optional Content Groups (OCG) in your PDF. View, toggle visibility, add new layers, or delete
|
||
|
|
existing ones.
|
||
|
|
</p>
|
||
|
|
|
||
|
|
<div id="drop-zone"
|
||
|
|
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300">
|
||
|
|
<div class="flex flex-col items-center justify-center pt-5 pb-6">
|
||
|
|
<i data-lucide="upload-cloud" class="w-10 h-10 mb-3 text-gray-400"></i>
|
||
|
|
<p class="mb-2 text-sm text-gray-400"><span class="font-semibold">Click to select a PDF</span> or
|
||
|
|
drag and drop</p>
|
||
|
|
<p class="text-xs text-gray-500">Single PDF file only</p>
|
||
|
|
<p class="text-xs text-gray-500">Your files never leave your device.</p>
|
||
|
|
</div>
|
||
|
|
<input id="file-input" type="file" class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
|
||
|
|
accept="application/pdf">
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div id="file-display-area" class="mt-4 space-y-2"></div>
|
||
|
|
|
||
|
|
<div id="process-btn-container" class="hidden mt-6">
|
||
|
|
<button id="process-btn" class="btn-gradient w-full">Load Layers</button>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div id="layers-container" class="hidden">
|
||
|
|
<div class="layers-container">
|
||
|
|
<div class="add-layer-form">
|
||
|
|
<input type="text" id="new-layer-name" placeholder="Enter new layer name..." />
|
||
|
|
<button id="add-layer-btn">Add Layer</button>
|
||
|
|
</div>
|
||
|
|
<div id="layers-list" class="layers-list">
|
||
|
|
<div class="layers-empty">
|
||
|
|
<p>Loading layers...</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<button id="save-layers-btn" class="btn-gradient w-full mt-4">Download Modified PDF</button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div id="loader-modal" class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50">
|
||
|
|
<div class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl">
|
||
|
|
<div class="solid-spinner"></div>
|
||
|
|
<p id="loader-text" class="text-white text-lg font-medium">
|
||
|
|
Processing...
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- Custom Input Modal -->
|
||
|
|
<div id="input-modal" class="hidden fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50">
|
||
|
|
<div class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700">
|
||
|
|
<h3 id="input-title" class="text-xl font-bold text-white mb-2">Add Layer</h3>
|
||
|
|
<p id="input-message" class="text-gray-300 mb-4">Enter name for the new layer:</p>
|
||
|
|
<input type="text" id="input-value"
|
||
|
|
class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 mb-4 focus:ring-indigo-500 focus:border-indigo-500"
|
||
|
|
placeholder="Layer Name">
|
||
|
|
<div class="flex justify-end gap-3">
|
||
|
|
<button id="input-cancel"
|
||
|
|
class="px-4 py-2 bg-gray-600 hover:bg-gray-500 text-white rounded-lg transition-colors">Cancel</button>
|
||
|
|
<button id="input-confirm"
|
||
|
|
class="px-4 py-2 bg-indigo-600 hover:bg-indigo-700 text-white font-semibold rounded-lg transition-colors">Add</button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div id="alert-modal" class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden">
|
||
|
|
<div class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700">
|
||
|
|
<h3 id="alert-title" class="text-xl font-bold text-white mb-2">Alert</h3>
|
||
|
|
<p id="alert-message" class="text-gray-300 mb-6"></p>
|
||
|
|
<button id="alert-ok"
|
||
|
|
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200">
|
||
|
|
OK
|
||
|
|
</button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<footer class="mt-16 border-t-2 border-gray-700 py-8">
|
||
|
|
<div class="container mx-auto px-4">
|
||
|
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left">
|
||
|
|
<div class="mb-8 md:mb-0">
|
||
|
|
<div class="flex items-center justify-center md:justify-start mb-4">
|
||
|
|
<img src="/images/favicon.svg" alt="Bento PDF Logo" class="h-10 w-10 mr-3" />
|
||
|
|
<span class="text-xl font-bold text-white">BentoPDF</span>
|
||
|
|
</div>
|
||
|
|
<p class="text-gray-400 text-sm">
|
||
|
|
© 2025 BentoPDF. All rights reserved.
|
||
|
|
</p>
|
||
|
|
<p class="text-gray-500 text-xs mt-2">
|
||
|
|
Version <span id="app-version"></span>
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div>
|
||
|
|
<h3 class="font-bold text-white mb-4">Company</h3>
|
||
|
|
<ul class="space-y-2 text-gray-400">
|
||
|
|
<li><a href="/about.html" class="hover:text-indigo-400">About Us</a></li>
|
||
|
|
<li><a href="/faq.html" class="hover:text-indigo-400">FAQ</a></li>
|
||
|
|
<li><a href="/contact.html" class="hover:text-indigo-400">Contact Us</a></li>
|
||
|
|
</ul>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div>
|
||
|
|
<h3 class="font-bold text-white mb-4">Legal</h3>
|
||
|
|
<ul class="space-y-2 text-gray-400">
|
||
|
|
<li><a href="/licensing.html" class="hover:text-indigo-400">Licensing</a></li>
|
||
|
|
<li><a href="/terms.html" class="hover:text-indigo-400">Terms and Conditions</a></li>
|
||
|
|
<li><a href="/privacy.html" class="hover:text-indigo-400">Privacy Policy</a></li>
|
||
|
|
</ul>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div>
|
||
|
|
<h3 class="font-bold text-white mb-4">Follow Us</h3>
|
||
|
|
<div class="flex justify-center md:justify-start space-x-4">
|
||
|
|
<a href="https://github.com/alam00000/bentopdf" target="_blank" rel="noopener noreferrer"
|
||
|
|
class="text-gray-400 hover:text-indigo-400" title="GitHub">
|
||
|
|
<i data-lucide="github"></i>
|
||
|
|
</a>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</footer>
|
||
|
|
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
|
||
|
|
<script type="module" src="/src/js/utils/full-width.ts"></script>
|
||
|
|
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
|
||
|
|
<script type="module" src="/src/version.ts"></script>
|
||
|
|
<script type="module" src="/src/js/logic/pdf-layers-page.ts"></script>
|
||
|
|
<script type="module" src="/src/js/mobileMenu.ts"></script>
|
||
|
|
<script type="module" src="/src/js/main.ts"></script>
|
||
|
|
</body>
|
||
|
|
|
||
|
|
</html>
|