feat(pdf-tools): add bookmark pdf tool and lucide icons integration
- Add 'bookmark-pdf' to singlePdfLoadTools - Create new lucide-init.ts for icon initialization - Update HTML files to use local lucide initialization - Add bookmark.html page with full bookmark editor functionality - Update tools config to include bookmark tool - Modify main.ts to handle tool cards with href links
This commit is contained in:
10
about.html
10
about.html
@@ -4,10 +4,6 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>About Bentopdf - Fast, Private, and Free PDF Tools</title>
|
<title>About Bentopdf - Fast, Private, and Free PDF Tools</title>
|
||||||
<script src="https://unpkg.com/lucide@latest"></script>
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
||||||
<link rel="icon" type="image/png" href="images/favicon.svg" />
|
|
||||||
<link href="/src/css/styles.css" rel="stylesheet" />
|
<link href="/src/css/styles.css" rel="stylesheet" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@@ -343,9 +339,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script>
|
|
||||||
lucide.createIcons();
|
<script type="module" src="src/js/utils/lucide-init.ts"></script>
|
||||||
</script>
|
|
||||||
<script type="module" src="src/js/mobileMenu.ts"></script>
|
<script type="module" src="src/js/mobileMenu.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Contact Us - BentoPDF</title>
|
<title>Contact Us - BentoPDF</title>
|
||||||
<script src="https://unpkg.com/lucide@latest"></script>
|
|
||||||
<link rel="icon" type="image/png" href="images/favicon.svg" />
|
|
||||||
<link href="/src/css/styles.css" rel="stylesheet" />
|
<link href="/src/css/styles.css" rel="stylesheet" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@@ -208,9 +206,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script>
|
<script type="module" src="src/js/utils/lucide-init.ts"></script>
|
||||||
lucide.createIcons();
|
|
||||||
</script>
|
|
||||||
<script type="module" src="src/js/mobileMenu.ts"></script>
|
<script type="module" src="src/js/mobileMenu.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
10
faq.html
10
faq.html
@@ -4,11 +4,6 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Frequently Asked Questions - BentoPDF</title>
|
<title>Frequently Asked Questions - BentoPDF</title>
|
||||||
|
|
||||||
<script src="https://unpkg.com/lucide@latest"></script>
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
||||||
<link rel="icon" type="image/png" href="images/favicon.svg" />
|
|
||||||
<link href="/src/css/styles.css" rel="stylesheet" />
|
<link href="/src/css/styles.css" rel="stylesheet" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@@ -396,9 +391,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script>
|
<script type="module" src="src/js/utils/lucide-init.ts"></script>
|
||||||
lucide.createIcons();
|
|
||||||
</script>
|
|
||||||
<script type="module" src="src/js/mobileMenu.ts"></script>
|
<script type="module" src="src/js/mobileMenu.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -915,6 +915,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
<script type="module" src="src/js/utils/lucide-init.ts"></script>
|
||||||
<script type="module" src="src/js/main.ts"></script>
|
<script type="module" src="src/js/main.ts"></script>
|
||||||
<script type="module" src="src/js/mobileMenu.ts"></script>
|
<script type="module" src="src/js/mobileMenu.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -4,10 +4,6 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Privacy Policy - BentoPDF</title>
|
<title>Privacy Policy - BentoPDF</title>
|
||||||
<script src="https://unpkg.com/lucide@latest"></script>
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
||||||
<link rel="icon" type="image/png" href="images/favicon.svg" />
|
|
||||||
<link href="/src/css/styles.css" rel="stylesheet" />
|
<link href="/src/css/styles.css" rel="stylesheet" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@@ -318,9 +314,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
<script>
|
<script type="module" src="src/js/utils/lucide-init.ts"></script>
|
||||||
lucide.createIcons();
|
|
||||||
</script>
|
|
||||||
<script type="module" src="src/js/mobileMenu.ts"></script>
|
<script type="module" src="src/js/mobileMenu.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ export const singlePdfLoadTools = [
|
|||||||
'add-attachments',
|
'add-attachments',
|
||||||
'sanitize-pdf',
|
'sanitize-pdf',
|
||||||
'remove-restrictions',
|
'remove-restrictions',
|
||||||
|
'bookmark-pdf',
|
||||||
];
|
];
|
||||||
|
|
||||||
export const simpleTools = [
|
export const simpleTools = [
|
||||||
|
|||||||
@@ -76,7 +76,14 @@ export const categories = [
|
|||||||
subtitle:
|
subtitle:
|
||||||
'Annotate, highlight, redact, comment, add shapes/images, search, and view PDFs.',
|
'Annotate, highlight, redact, comment, add shapes/images, search, and view PDFs.',
|
||||||
},
|
},
|
||||||
// { id: 'crop', name: 'Crop PDF', icon: 'crop', subtitle: 'Trim the margins of every page in your PDF.' },
|
{
|
||||||
|
// id: 'bookmark-pdf',
|
||||||
|
href: '/src/pages/bookmark.html',
|
||||||
|
name: 'Edit Bookmarks',
|
||||||
|
icon: 'bookmark',
|
||||||
|
subtitle:
|
||||||
|
'Add, edit, import, delete and extract PDF bookmarks.',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'add-page-numbers',
|
id: 'add-page-numbers',
|
||||||
name: 'Page Numbers',
|
name: 'Page Numbers',
|
||||||
|
|||||||
1812
src/js/logic/bookmark-pdf.ts
Normal file
1812
src/js/logic/bookmark-pdf.ts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -137,10 +137,19 @@ const init = () => {
|
|||||||
'grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 md:gap-6';
|
'grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 md:gap-6';
|
||||||
|
|
||||||
category.tools.forEach((tool) => {
|
category.tools.forEach((tool) => {
|
||||||
const toolCard = document.createElement('div');
|
let toolCard: HTMLDivElement | HTMLAnchorElement;
|
||||||
|
|
||||||
|
if (tool.href) {
|
||||||
|
toolCard = document.createElement('a');
|
||||||
|
toolCard.href = tool.href;
|
||||||
toolCard.className =
|
toolCard.className =
|
||||||
'tool-card bg-gray-800 rounded-xl p-4 cursor-pointer flex flex-col items-center justify-center text-center';
|
'tool-card block bg-gray-800 rounded-xl p-4 cursor-pointer flex flex-col items-center justify-center text-center no-underline hover:shadow-lg transition duration-200';
|
||||||
|
} else {
|
||||||
|
toolCard = document.createElement('div');
|
||||||
|
toolCard.className =
|
||||||
|
'tool-card bg-gray-800 rounded-xl p-4 cursor-pointer flex flex-col items-center justify-center text-center hover:shadow-lg transition duration-200';
|
||||||
toolCard.dataset.toolId = tool.id;
|
toolCard.dataset.toolId = tool.id;
|
||||||
|
}
|
||||||
|
|
||||||
const icon = document.createElement('i');
|
const icon = document.createElement('i');
|
||||||
icon.className = 'w-10 h-10 mb-3 text-indigo-400';
|
icon.className = 'w-10 h-10 mb-3 text-indigo-400';
|
||||||
@@ -253,3 +262,5 @@ const init = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', init);
|
document.addEventListener('DOMContentLoaded', init);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import createModule from '@neslinesli93/qpdf-wasm';
|
import createModule from '@neslinesli93/qpdf-wasm';
|
||||||
import { showLoader, hideLoader, showAlert } from '../ui';
|
import { showLoader, hideLoader, showAlert } from '../ui';
|
||||||
|
import { createIcons } from 'lucide';
|
||||||
|
|
||||||
const STANDARD_SIZES = {
|
const STANDARD_SIZES = {
|
||||||
A4: { width: 595.28, height: 841.89 },
|
A4: { width: 595.28, height: 841.89 },
|
||||||
@@ -177,3 +178,13 @@ export async function initializeQpdf() {
|
|||||||
|
|
||||||
return qpdfInstance;
|
return qpdfInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function initializeIcons(): void {
|
||||||
|
createIcons({
|
||||||
|
attrs: {
|
||||||
|
class: 'bento-icon',
|
||||||
|
'stroke-width': '1.5',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
5
src/js/utils/lucide-init.ts
Normal file
5
src/js/utils/lucide-init.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { createIcons, icons } from 'lucide';
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
createIcons({ icons });
|
||||||
|
});
|
||||||
780
src/pages/bookmark.html
Normal file
780
src/pages/bookmark.html
Normal file
@@ -0,0 +1,780 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Advanced PDF Bookmark Tool</title>
|
||||||
|
|
||||||
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
<!-- <link href="../../src/css/styles.css" rel="stylesheet" /> -->
|
||||||
|
<style>
|
||||||
|
.sortable-ghost {
|
||||||
|
opacity: 0.4;
|
||||||
|
border: 2px dashed #2b7fff;
|
||||||
|
}
|
||||||
|
.sortable-drag {
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
z-index: 1000;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
background: white;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
max-width: 500px;
|
||||||
|
width: 100%;
|
||||||
|
max-height: 90vh;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-minimized {
|
||||||
|
position: fixed;
|
||||||
|
top: 1rem;
|
||||||
|
right: 1rem;
|
||||||
|
max-width: 350px;
|
||||||
|
max-height: none;
|
||||||
|
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
|
||||||
|
z-index: 1001;
|
||||||
|
}
|
||||||
|
|
||||||
|
.child-container {
|
||||||
|
position: relative;
|
||||||
|
padding-left: 1.5rem;
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.child-container::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0.75rem;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: 2px;
|
||||||
|
background: #e5e7eb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.child-container > li {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.child-container > li::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: -0.75rem;
|
||||||
|
top: 1.25rem;
|
||||||
|
width: 0.75rem;
|
||||||
|
height: 2px;
|
||||||
|
background: #e5e7eb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.style-preview {
|
||||||
|
padding: 0.5rem;
|
||||||
|
border: 1px solid #e5e7eb;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
min-height: 2.5rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.destination-marker {
|
||||||
|
position: absolute;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
margin-left: -15px;
|
||||||
|
margin-top: -15px;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.destination-marker svg {
|
||||||
|
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdf-canvas-wrapper {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pdf-canvas-wrapper.picking-mode {
|
||||||
|
cursor: crosshair;
|
||||||
|
}
|
||||||
|
|
||||||
|
.coordinate-tooltip {
|
||||||
|
position: absolute;
|
||||||
|
background: rgba(0, 0, 0, 0.8);
|
||||||
|
color: white;
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 20;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.destination-overlay {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: rgba(59, 130, 246, 0.1);
|
||||||
|
border: 2px solid #3b82f6;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 5;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="bg-gray-50">
|
||||||
|
<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="../../public/images/favicon.svg"
|
||||||
|
alt="Bento PDF Logo"
|
||||||
|
class="h-8 w-8"
|
||||||
|
/>
|
||||||
|
<span class="text-white font-bold text-xl ml-2">
|
||||||
|
<a href="index.html">BentoPDF</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Desktop Navigation -->
|
||||||
|
<div class="hidden md:flex items-center space-x-8 text-white">
|
||||||
|
<a href="index.html" 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="index.html#tools-header" class="nav-link">All Tools</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Mobile Hamburger Button -->
|
||||||
|
<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>
|
||||||
|
<!-- Hamburger Icon -->
|
||||||
|
<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>
|
||||||
|
<!-- Close Icon -->
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<!-- Mobile Menu Dropdown -->
|
||||||
|
<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="index.html" 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="index.html#tools-header" class="mobile-nav-link"
|
||||||
|
>All Tools</a
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<div
|
||||||
|
id="uploader"
|
||||||
|
class="min-h-screen flex items-center justify-center p-4"
|
||||||
|
>
|
||||||
|
<div class="bg-white rounded-lg shadow-lg p-8 max-w-md w-full">
|
||||||
|
<h2 class="text-2xl font-bold text-gray-800 mb-4">PDF Bookmark Tool</h2>
|
||||||
|
<p class="text-gray-600 mb-6">
|
||||||
|
Upload a PDF to begin editing bookmarks
|
||||||
|
</p>
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
id="file-input"
|
||||||
|
accept=".pdf"
|
||||||
|
class="w-full px-4 py-2 border border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class="mt-4">
|
||||||
|
<label class="flex items-center gap-2 text-sm text-gray-700">
|
||||||
|
<input type="checkbox" id="auto-extract-checkbox" class="w-4 h-4" />
|
||||||
|
<span>Auto-extract existing bookmarks</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6 pt-6 border-t border-gray-200">
|
||||||
|
<h3 class="text-sm font-semibold text-gray-700 mb-3">
|
||||||
|
Or Import Bookmarks
|
||||||
|
</h3>
|
||||||
|
<div class="space-y-2">
|
||||||
|
<label class="block">
|
||||||
|
<span class="text-xs text-gray-500"
|
||||||
|
>CSV format: title,page,level</span
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
id="csv-input"
|
||||||
|
accept=".csv"
|
||||||
|
class="w-full px-4 py-2 border border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50 text-sm mt-1"
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
<label class="block">
|
||||||
|
<span class="text-xs text-gray-500">JSON format</span>
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
id="json-input"
|
||||||
|
accept=".json"
|
||||||
|
class="w-full px-4 py-2 border border-gray-300 rounded-lg cursor-pointer hover:bg-gray-50 text-sm mt-1"
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="app" class="hidden">
|
||||||
|
<header class="bg-white shadow-sm sticky top-0 z-50">
|
||||||
|
<div class="max-w-7xl mx-auto px-4 py-3">
|
||||||
|
<div class="flex items-center justify-between flex-wrap gap-2">
|
||||||
|
<h1 class="text-xl font-bold text-gray-800" id="filename-display">
|
||||||
|
PDF Bookmark Editor
|
||||||
|
</h1>
|
||||||
|
<div class="flex gap-2 flex-wrap">
|
||||||
|
<button
|
||||||
|
id="undo-btn"
|
||||||
|
class="px-3 py-2 text-sm bg-gray-100 hover:bg-gray-200 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1"
|
||||||
|
disabled
|
||||||
|
>
|
||||||
|
<i data-lucide="undo-2" class="w-4 h-4"></i> Undo
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="redo-btn"
|
||||||
|
class="px-3 py-2 text-sm bg-gray-100 hover:bg-gray-200 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1"
|
||||||
|
disabled
|
||||||
|
>
|
||||||
|
<i data-lucide="redo-2" class="w-4 h-4"></i> Redo
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="delete-all-btn"
|
||||||
|
class="px-3 py-2 text-sm bg-red-100 hover:bg-red-200 text-red-700 rounded flex items-center gap-1"
|
||||||
|
>
|
||||||
|
<i data-lucide="trash-2" class="w-4 h-4"></i> Delete All
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="reset-btn"
|
||||||
|
class="px-3 py-2 text-sm bg-orange-100 hover:bg-orange-200 text-orange-700 rounded flex items-center gap-1"
|
||||||
|
>
|
||||||
|
<i data-lucide="rotate-ccw" class="w-4 h-4"></i> Reset
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="lg:hidden bg-white border-b border-gray-200">
|
||||||
|
<div class="flex">
|
||||||
|
<button
|
||||||
|
id="show-viewer-btn"
|
||||||
|
class="flex-1 py-3 text-sm font-medium bg-blue-50 text-blue-600"
|
||||||
|
>
|
||||||
|
PDF Viewer
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="show-bookmarks-btn"
|
||||||
|
class="flex-1 py-3 text-sm font-medium"
|
||||||
|
>
|
||||||
|
Bookmarks
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="max-w-7xl mx-auto p-4">
|
||||||
|
<div class="flex flex-col lg:flex-row gap-4">
|
||||||
|
<div id="viewer-section" class="w-full lg:w-[50%] flex-shrink-0">
|
||||||
|
<div class="bg-white rounded-lg shadow-lg p-4">
|
||||||
|
<div
|
||||||
|
class="flex flex-wrap items-center justify-between gap-2 mb-4"
|
||||||
|
>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<button
|
||||||
|
id="prev-page"
|
||||||
|
class="px-3 py-2 bg-gray-100 hover:bg-gray-200 rounded text-sm"
|
||||||
|
>
|
||||||
|
←
|
||||||
|
</button>
|
||||||
|
<span
|
||||||
|
id="page-indicator"
|
||||||
|
class="text-sm font-medium text-gray-700 whitespace-nowrap"
|
||||||
|
>Page 1 / 1</span
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
id="next-page"
|
||||||
|
class="px-3 py-2 bg-gray-100 hover:bg-gray-200 rounded text-sm"
|
||||||
|
>
|
||||||
|
→
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<span class="text-sm text-gray-600">Go to:</span>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
id="goto-page"
|
||||||
|
min="1"
|
||||||
|
class="w-16 px-2 py-1 border border-gray-300 rounded text-sm"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
id="goto-btn"
|
||||||
|
class="px-3 py-1 bg-blue-500 hover:bg-blue-600 text-white rounded text-sm"
|
||||||
|
>
|
||||||
|
Go
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="picking-mode-banner"
|
||||||
|
class="hidden mb-4 p-3 bg-blue-100 border-2 border-blue-400 rounded-lg"
|
||||||
|
>
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<i
|
||||||
|
data-lucide="crosshair"
|
||||||
|
class="w-5 h-5 text-blue-600"
|
||||||
|
></i>
|
||||||
|
<span class="text-sm font-medium text-blue-800"
|
||||||
|
>Click on the PDF to set bookmark destination</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
id="cancel-picking-btn"
|
||||||
|
class="px-3 py-1 bg-red-500 hover:bg-red-600 text-white rounded text-xs"
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="overflow-auto border border-gray-200 rounded"
|
||||||
|
id="canvas-container"
|
||||||
|
>
|
||||||
|
<div class="pdf-canvas-wrapper" id="pdf-canvas-wrapper">
|
||||||
|
<canvas
|
||||||
|
id="pdf-canvas"
|
||||||
|
class="max-w-full h-auto mx-auto"
|
||||||
|
></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="bookmarks-section"
|
||||||
|
class="hidden lg:block w-full lg:w-[50%] flex-shrink-0"
|
||||||
|
>
|
||||||
|
<div class="bg-white rounded-lg shadow-lg p-4">
|
||||||
|
<h3 class="text-lg font-bold text-gray-800 mb-4">Bookmarks</h3>
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
<div class="relative">
|
||||||
|
<i
|
||||||
|
data-lucide="search"
|
||||||
|
class="absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400"
|
||||||
|
></i>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="search-bookmarks"
|
||||||
|
placeholder="Search bookmarks..."
|
||||||
|
class="w-full pl-10 pr-3 py-2 border border-gray-300 rounded-lg text-sm"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-4 p-3 bg-gray-50 rounded-lg">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="bookmark-title"
|
||||||
|
placeholder="Bookmark title..."
|
||||||
|
class="w-full px-3 py-2 border border-gray-300 rounded-lg mb-2 text-sm"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
id="add-top-level-btn"
|
||||||
|
class="w-full px-3 py-2 bg-gradient-to-b from-blue-500 to-blue-600 hover:shadow-xl text-white rounded text-sm font-medium flex items-center justify-center gap-2 focus:ring-2 focus:ring-blue-400 transition duration-200"
|
||||||
|
>
|
||||||
|
<i data-lucide="plus" class="w-4 h-4"></i>
|
||||||
|
<span
|
||||||
|
>Add to Page <span id="current-page-display">1</span></span
|
||||||
|
>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
<label
|
||||||
|
class="flex items-center gap-2 text-sm font-medium text-gray-700 mb-2"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
id="batch-mode-checkbox"
|
||||||
|
class="w-4 h-4"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
>Batch Mode (<span id="selected-count">0</span>
|
||||||
|
selected)</span
|
||||||
|
>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="batch-operations"
|
||||||
|
class="hidden p-3 bg-blue-50 rounded-lg border border-blue-200"
|
||||||
|
>
|
||||||
|
<div class="text-xs font-semibold text-gray-700 mb-2">
|
||||||
|
Batch Operations
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<button
|
||||||
|
id="select-all-btn"
|
||||||
|
class="flex-1 px-3 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded text-xs flex items-center justify-center gap-1"
|
||||||
|
>
|
||||||
|
<i data-lucide="check-square" class="w-3 h-3"></i>
|
||||||
|
Select All
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="deselect-all-btn"
|
||||||
|
class="flex-1 px-3 py-2 bg-gray-500 hover:bg-gray-600 text-white rounded text-xs flex items-center justify-center gap-1"
|
||||||
|
>
|
||||||
|
<i data-lucide="square" class="w-3 h-3"></i> Deselect
|
||||||
|
All
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<select
|
||||||
|
id="batch-color-select"
|
||||||
|
class="text-xs p-2 border rounded"
|
||||||
|
>
|
||||||
|
<option value="">Set Color...</option>
|
||||||
|
<option value="null">None</option>
|
||||||
|
<option value="red">Red</option>
|
||||||
|
<option value="blue">Blue</option>
|
||||||
|
<option value="green">Green</option>
|
||||||
|
<option value="yellow">Yellow</option>
|
||||||
|
<option value="purple">Purple</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select
|
||||||
|
id="batch-style-select"
|
||||||
|
class="text-xs p-2 border rounded"
|
||||||
|
>
|
||||||
|
<option value="">Set Style...</option>
|
||||||
|
<option value="null">Normal</option>
|
||||||
|
<option value="bold">Bold</option>
|
||||||
|
<option value="italic">Italic</option>
|
||||||
|
<option value="bold-italic">Bold & Italic</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="batch-delete-btn"
|
||||||
|
class="px-3 py-2 bg-red-500 hover:bg-red-600 text-white rounded text-xs flex items-center justify-center gap-1"
|
||||||
|
>
|
||||||
|
<i data-lucide="trash-2" class="w-3 h-3"></i> Delete
|
||||||
|
Selected
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 mb-4">
|
||||||
|
<button
|
||||||
|
id="expand-all-btn"
|
||||||
|
class="flex-1 px-3 py-2 bg-gradient-to-b from-gray-100 to-gray-200 hover:shadow-md text-gray-700 rounded text-sm font-medium flex items-center justify-center gap-1 focus:ring-2 focus:ring-gray-300 transition duration-200"
|
||||||
|
>
|
||||||
|
<i data-lucide="chevrons-down" class="w-4 h-4"></i> Expand All
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="collapse-all-btn"
|
||||||
|
class="flex-1 px-3 py-2 bg-gradient-to-b from-gray-100 to-gray-200 hover:shadow-md text-gray-700 rounded text-sm font-medium flex items-center justify-center gap-1 focus:ring-2 focus:ring-gray-300 transition duration-200"
|
||||||
|
>
|
||||||
|
<i data-lucide="chevrons-up" class="w-4 h-4"></i> Collapse All
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-2 gap-2 mb-4">
|
||||||
|
<div class="relative">
|
||||||
|
<button
|
||||||
|
id="import-dropdown-btn"
|
||||||
|
class="w-full px-3 py-2 bg-gradient-to-b from-gray-100 to-gray-200 hover:shadow-md text-gray-700 rounded text-sm font-medium flex items-center justify-center gap-1 focus:ring-2 focus:ring-gray-300 transition duration-200"
|
||||||
|
>
|
||||||
|
<i data-lucide="upload" class="w-4 h-4"></i> Import
|
||||||
|
<i data-lucide="chevron-down" class="w-3 h-3"></i>
|
||||||
|
</button>
|
||||||
|
<div
|
||||||
|
id="import-dropdown"
|
||||||
|
class="hidden absolute top-full left-0 mt-1 w-full bg-white border border-gray-200 rounded-lg shadow-lg z-10"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
id="import-csv-btn"
|
||||||
|
class="w-full px-3 py-2 text-sm text-left flex items-center gap-2 rounded-t-lg bg-gradient-to-b from-gray-50 to-gray-100 hover:shadow-sm hover:from-gray-100 hover:to-gray-200 transition duration-150"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
data-lucide="file-text"
|
||||||
|
class="w-4 h-4 text-gray-600"
|
||||||
|
></i>
|
||||||
|
Import CSV
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="import-json-btn"
|
||||||
|
class="w-full px-3 py-2 text-sm text-left flex items-center gap-2 rounded-b-lg bg-gradient-to-b from-gray-50 to-gray-100 hover:shadow-sm hover:from-gray-100 hover:to-gray-200 transition duration-150"
|
||||||
|
>
|
||||||
|
<i data-lucide="braces" class="w-4 h-4 text-gray-600"></i>
|
||||||
|
Import JSON
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="relative">
|
||||||
|
<button
|
||||||
|
id="export-dropdown-btn"
|
||||||
|
class="w-full px-3 py-2 bg-gradient-to-b from-gray-100 to-gray-200 hover:shadow-md text-gray-700 rounded text-sm font-medium flex items-center justify-center gap-1 focus:ring-2 focus:ring-gray-300 transition duration-200"
|
||||||
|
>
|
||||||
|
<i data-lucide="download" class="w-4 h-4"></i> Export
|
||||||
|
<i data-lucide="chevron-down" class="w-3 h-3"></i>
|
||||||
|
</button>
|
||||||
|
<div
|
||||||
|
id="export-dropdown"
|
||||||
|
class="hidden absolute top-full left-0 mt-1 w-full bg-white border border-gray-200 rounded-lg shadow-lg z-10"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
id="export-csv-btn"
|
||||||
|
class="w-full px-3 py-2 text-sm text-left hover:bg-gray-50 flex items-center gap-2 rounded-t-lg"
|
||||||
|
>
|
||||||
|
<i data-lucide="file-text" class="w-4 h-4"></i> Export CSV
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="export-json-btn"
|
||||||
|
class="w-full px-3 py-2 text-sm text-left hover:bg-gray-50 flex items-center gap-2 rounded-b-lg"
|
||||||
|
>
|
||||||
|
<i data-lucide="braces" class="w-4 h-4"></i> Export JSON
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="mb-4 max-h-96 overflow-y-auto border border-gray-200 rounded-lg p-2"
|
||||||
|
>
|
||||||
|
<ul id="bookmark-tree-list" class="space-y-2"></ul>
|
||||||
|
<div
|
||||||
|
id="no-bookmarks"
|
||||||
|
class="text-center py-8 text-gray-400 text-sm"
|
||||||
|
>
|
||||||
|
No bookmarks yet. Add one above!
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2">
|
||||||
|
<button
|
||||||
|
id="download-btn"
|
||||||
|
class="w-full px-4 py-2 bg-gradient-to-b from-blue-600 to-blue-700 hover:shadow-xl text-white rounded font-medium flex items-center justify-center gap-2 focus:ring-2 focus:ring-blue-400 transition duration-200"
|
||||||
|
>
|
||||||
|
Save PDF with Bookmarks
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="extract-existing-btn"
|
||||||
|
class="w-full px-4 py-2 bg-gradient-to-b from-green-500 to-green-600 hover:shadow-xl text-white rounded font-medium flex items-center justify-center gap-2 focus:ring-2 focus:ring-green-400 transition duration-200"
|
||||||
|
>
|
||||||
|
Extract Existing Bookmarks
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input type="file" id="csv-import-hidden" accept=".csv" class="hidden" />
|
||||||
|
<input type="file" id="json-import-hidden" accept=".json" class="hidden" />
|
||||||
|
|
||||||
|
<div id="modal-container"></div>
|
||||||
|
|
||||||
|
<footer class="mt-16 border-t-2 border-gray-700 py-8 bg-[#111827]">
|
||||||
|
<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="../../public/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>
|
||||||
|
</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="./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"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
class="w-6 h-6"
|
||||||
|
fill="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://discord.gg/q42xWQmJ"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="text-gray-400 hover:text-indigo-400"
|
||||||
|
title="Discord"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
class="w-6 h-6"
|
||||||
|
fill="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://www.instagram.com/thebentopdf/"
|
||||||
|
class="text-gray-400 hover:text-indigo-400"
|
||||||
|
title="Instagram"
|
||||||
|
>
|
||||||
|
<i data-lucide="instagram"></i>
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://www.linkedin.com/company/bentopdf/"
|
||||||
|
class="text-gray-400 hover:text-indigo-400"
|
||||||
|
title="LinkedIn"
|
||||||
|
>
|
||||||
|
<i data-lucide="linkedin"></i>
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://x.com/BentoPDF"
|
||||||
|
class="text-gray-400 hover:text-indigo-400"
|
||||||
|
title="X (Twitter)"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
class="w-6 h-6"
|
||||||
|
fill="currentColor"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
<script type="module" src="../js/utils/lucide-init.ts"></script>
|
||||||
|
<script type="module" src="../js/logic/bookmark-pdf.ts"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -4,9 +4,6 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Terms and Conditions - Bentopdf</title>
|
<title>Terms and Conditions - Bentopdf</title>
|
||||||
<script src="https://unpkg.com/lucide@latest"></script>
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
||||||
<link rel="icon" type="image/png" href="images/favicon.svg" />
|
<link rel="icon" type="image/png" href="images/favicon.svg" />
|
||||||
<link href="/src/css/styles.css" rel="stylesheet" />
|
<link href="/src/css/styles.css" rel="stylesheet" />
|
||||||
</head>
|
</head>
|
||||||
@@ -307,9 +304,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
<script>
|
<script type="module" src="src/js/utils/lucide-init.ts"></script>
|
||||||
lucide.createIcons();
|
|
||||||
</script>
|
|
||||||
<script type="module" src="src/js/mobileMenu.ts"></script>
|
<script type="module" src="src/js/mobileMenu.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ export default defineConfig(({ mode }) => ({
|
|||||||
faq: resolve(__dirname, 'faq.html'),
|
faq: resolve(__dirname, 'faq.html'),
|
||||||
privacy: resolve(__dirname, 'privacy.html'),
|
privacy: resolve(__dirname, 'privacy.html'),
|
||||||
terms: resolve(__dirname, 'terms.html'),
|
terms: resolve(__dirname, 'terms.html'),
|
||||||
|
bookmark: resolve(__dirname, 'src/pages/bookmark.html'),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user