feat: Add licensing page and FAQ script, update site content and navigation, and refine PDF tool logic for multi tool

This commit is contained in:
abdullahalam123
2025-11-20 19:58:41 +05:30
parent 092f84be23
commit 8a8ae3f0c5
13 changed files with 1996 additions and 1517 deletions

View File

@@ -1,8 +1,6 @@
<p align="center"><img src="public/images/favicon.svg" width="80"></p> <p align="center"><img src="public/images/favicon.svg" width="80"></p>
<h1 align="center">BentoPDF</h1> <h1 align="center">BentoPDF</h1>
<hr>
**BentoPDF** is a powerful, privacy-first, client-side PDF toolkit that is self hostable and allows you to manipulate, edit, merge, and process PDF files directly in your browser. No server-side processing is required, ensuring your files remain secure and private. **BentoPDF** is a powerful, privacy-first, client-side PDF toolkit that is self hostable and allows you to manipulate, edit, merge, and process PDF files directly in your browser. No server-side processing is required, ensuring your files remain secure and private.
![Docker Pulls](https://img.shields.io/docker/pulls/bentopdf/bentopdf) [![Ko-fi](https://img.shields.io/badge/Buy%20me%20a%20Coffee-yellow?logo=kofi&style=flat-square)](https://ko-fi.com/alio0) ![GitHub Stars](https://img.shields.io/github/stars/alam00000/bentopdf?style=social) ![Docker Pulls](https://img.shields.io/docker/pulls/bentopdf/bentopdf) [![Ko-fi](https://img.shields.io/badge/Buy%20me%20a%20Coffee-yellow?logo=kofi&style=flat-square)](https://ko-fi.com/alio0) ![GitHub Stars](https://img.shields.io/github/stars/alam00000/bentopdf?style=social)
@@ -10,6 +8,17 @@
![BentoPDF Tools](public/images/bentopdf-tools.png) ![BentoPDF Tools](public/images/bentopdf-tools.png)
---
## 📜 Licensing
BentoPDF is dual-licensed:
- **AGPL-3.0** for open-source projects where you share your full source code publicly
- **Commercial License** for proprietary/closed-source applications - **[Get Lifetime License for $49](https://ko-fi.com/s/f32ca4cb75)** (a one-time lifetime purchase, includes all feature updates forever)
For more details, see our [Licensing Page](https://bentopdf.com/licensing.html)
<hr> <hr>
## ⭐ Stargazers over time ## ⭐ Stargazers over time
@@ -435,7 +444,3 @@ BentoPDF wouldn't be possible without the amazing open-source tools and librarie
- **[cpdf](https://www.coherentpdf.com/)** For content preserving pdf operations. - **[cpdf](https://www.coherentpdf.com/)** For content preserving pdf operations.
Your work inspires and empowers developers everywhere. Thank you for making open-source amazing! Your work inspires and empowers developers everywhere. Thank you for making open-source amazing!
## 📜 License
This project is licensed under the **GNU AGPLv3**. See the [LICENSE](https://github.com/alam00000/bentopdf/blob/main/LICENSE) file for details.

View File

@@ -1,25 +1,19 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head>
<head>
<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>
<link href="/src/css/styles.css" rel="stylesheet" /> <link href="/src/css/styles.css" rel="stylesheet" />
</head> </head>
<body class="antialiased bg-gray-900 text-gray-300"> <body class="antialiased bg-gray-900 text-gray-300">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30"> <nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16"> <div class="flex justify-between items-center h-16">
<div <div class="flex-shrink-0 flex items-center cursor-pointer" id="home-logo">
class="flex-shrink-0 flex items-center cursor-pointer" <img src="images/favicon.svg" alt="Bento PDF Logo" class="h-8 w-8" />
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"> <span class="text-white font-bold text-xl ml-2">
<a href="index.html">BentoPDF</a> <a href="index.html">BentoPDF</a>
</span> </span>
@@ -30,52 +24,25 @@
<a href="index.html" class="nav-link">Home</a> <a href="index.html" class="nav-link">Home</a>
<a href="./about.html" class="nav-link">About</a> <a href="./about.html" class="nav-link">About</a>
<a href="./contact.html" class="nav-link">Contact</a> <a href="./contact.html" class="nav-link">Contact</a>
<a href="./licensing.html" class="nav-link">Licensing</a>
<a href="index.html#tools-header" class="nav-link">All Tools</a> <a href="index.html#tools-header" class="nav-link">All Tools</a>
</div> </div>
<!-- Mobile Hamburger Button --> <!-- Mobile Hamburger Button -->
<div class="md:hidden flex items-center"> <div class="md:hidden flex items-center">
<button <button id="mobile-menu-button" type="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" 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-controls="mobile-menu" aria-expanded="false">
aria-expanded="false"
>
<span class="sr-only">Open main menu</span> <span class="sr-only">Open main menu</span>
<!-- Hamburger Icon --> <!-- Hamburger Icon -->
<svg <svg id="menu-icon" class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
id="menu-icon" stroke="currentColor" aria-hidden="true">
class="block h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
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>
<!-- Close Icon --> <!-- Close Icon -->
<svg <svg id="close-icon" class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none"
id="close-icon" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
class="hidden h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
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> </svg>
</button> </button>
</div> </div>
@@ -83,17 +50,13 @@
</div> </div>
<!-- Mobile Menu Dropdown --> <!-- Mobile Menu Dropdown -->
<div <div id="mobile-menu" class="hidden md:hidden bg-gray-800 border-t border-gray-700">
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"> <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="index.html" class="mobile-nav-link">Home</a>
<a href="./about.html" class="mobile-nav-link">About</a> <a href="./about.html" class="mobile-nav-link">About</a>
<a href="./contact.html" class="mobile-nav-link">Contact</a> <a href="./contact.html" class="mobile-nav-link">Contact</a>
<a href="index.html#tools-header" class="mobile-nav-link" <a href="./licensing.html" class="mobile-nav-link">Licensing</a>
>All Tools</a <a href="index.html#tools-header" class="mobile-nav-link">All Tools</a>
>
</div> </div>
</div> </div>
</nav> </nav>
@@ -111,10 +74,7 @@
<section id="mission-section" class="py-16 max-w-4xl mx-auto"> <section id="mission-section" class="py-16 max-w-4xl mx-auto">
<div class="text-center"> <div class="text-center">
<i <i data-lucide="rocket" class="w-16 h-16 text-indigo-400 mx-auto mb-6"></i>
data-lucide="rocket"
class="w-16 h-16 text-indigo-400 mx-auto mb-6"
></i>
<h2 class="text-3xl md:text-4xl font-bold text-white mb-4"> <h2 class="text-3xl md:text-4xl font-bold text-white mb-4">
Our Mission Our Mission
</h2> </h2>
@@ -127,14 +87,10 @@
</div> </div>
</section> </section>
<div <div class="bg-gray-800 rounded-xl p-8 md:p-12 my-16 border border-gray-700">
class="bg-gray-800 rounded-xl p-8 md:p-12 my-16 border border-gray-700"
>
<div class="grid grid-cols-1 md:grid-cols-2 gap-12 items-center"> <div class="grid grid-cols-1 md:grid-cols-2 gap-12 items-center">
<div class="text-center md:text-left"> <div class="text-center md:text-left">
<span class="text-indigo-400 font-bold uppercase" <span class="text-indigo-400 font-bold uppercase">Our Core Philosophy</span>
>Our Core Philosophy</span
>
<h2 class="text-3xl md:text-4xl font-bold text-white mt-2 mb-4"> <h2 class="text-3xl md:text-4xl font-bold text-white mt-2 mb-4">
Privacy First. Always. Privacy First. Always.
</h2> </h2>
@@ -149,16 +105,9 @@
</div> </div>
<div class="flex justify-center"> <div class="flex justify-center">
<div class="relative w-48 h-48"> <div class="relative w-48 h-48">
<div <div class="absolute inset-0 bg-indigo-500 rounded-full opacity-20 animate-pulse"></div>
class="absolute inset-0 bg-indigo-500 rounded-full opacity-20 animate-pulse" <div class="absolute inset-4 bg-indigo-500 rounded-full opacity-30 animate-pulse delay-500"></div>
></div> <i data-lucide="shield-check" class="w-48 h-48 text-indigo-400"></i>
<div
class="absolute inset-4 bg-indigo-500 rounded-full opacity-30 animate-pulse delay-500"
></div>
<i
data-lucide="shield-check"
class="w-48 h-48 text-indigo-400"
></i>
</div> </div>
</div> </div>
</div> </div>
@@ -170,10 +119,7 @@
</h2> </h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-5xl mx-auto"> <div class="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-5xl mx-auto">
<div class="bg-gray-800 p-6 rounded-lg flex items-start gap-4"> <div class="bg-gray-800 p-6 rounded-lg flex items-start gap-4">
<i <i data-lucide="zap" class="w-10 h-10 text-indigo-400 flex-shrink-0 mt-1"></i>
data-lucide="zap"
class="w-10 h-10 text-indigo-400 flex-shrink-0 mt-1"
></i>
<div> <div>
<h3 class="text-xl font-bold text-white">Built for Speed</h3> <h3 class="text-xl font-bold text-white">Built for Speed</h3>
<p class="text-gray-400 mt-2"> <p class="text-gray-400 mt-2">
@@ -184,10 +130,7 @@
</div> </div>
</div> </div>
<div class="bg-gray-800 p-6 rounded-lg flex items-start gap-4"> <div class="bg-gray-800 p-6 rounded-lg flex items-start gap-4">
<i <i data-lucide="badge-dollar-sign" class="w-10 h-10 text-indigo-400 flex-shrink-0 mt-1"></i>
data-lucide="badge-dollar-sign"
class="w-10 h-10 text-indigo-400 flex-shrink-0 mt-1"
></i>
<div> <div>
<h3 class="text-xl font-bold text-white">Completely Free</h3> <h3 class="text-xl font-bold text-white">Completely Free</h3>
<p class="text-gray-400 mt-2"> <p class="text-gray-400 mt-2">
@@ -198,10 +141,7 @@
</div> </div>
</div> </div>
<div class="bg-gray-800 p-6 rounded-lg flex items-start gap-4"> <div class="bg-gray-800 p-6 rounded-lg flex items-start gap-4">
<i <i data-lucide="user-plus" class="w-10 h-10 text-indigo-400 flex-shrink-0 mt-1"></i>
data-lucide="user-plus"
class="w-10 h-10 text-indigo-400 flex-shrink-0 mt-1"
></i>
<div> <div>
<h3 class="text-xl font-bold text-white">No Account Required</h3> <h3 class="text-xl font-bold text-white">No Account Required</h3>
<p class="text-gray-400 mt-2"> <p class="text-gray-400 mt-2">
@@ -212,10 +152,7 @@
</div> </div>
</div> </div>
<div class="bg-gray-800 p-6 rounded-lg flex items-start gap-4"> <div class="bg-gray-800 p-6 rounded-lg flex items-start gap-4">
<i <i data-lucide="code-2" class="w-10 h-10 text-indigo-400 flex-shrink-0 mt-1"></i>
data-lucide="code-2"
class="w-10 h-10 text-indigo-400 flex-shrink-0 mt-1"
></i>
<div> <div>
<h3 class="text-xl font-bold text-white">Open Source Spirit</h3> <h3 class="text-xl font-bold text-white">Open Source Spirit</h3>
<p class="text-gray-400 mt-2"> <p class="text-gray-400 mt-2">
@@ -240,10 +177,8 @@
needs. Experience the difference that privacy and performance can needs. Experience the difference that privacy and performance can
make. make.
</p> </p>
<a <a href="index.html#tools-header"
href="index.html#tools-header" class="inline-block px-8 py-3 rounded-full bg-gradient-to-b from-indigo-500 to-indigo-600 text-white font-semibold focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-900 focus:ring-indigo-400 hover:shadow-xl hover:shadow-indigo-500/30 transition-all duration-200 transform hover:-translate-y-1">
class="inline-block px-8 py-3 rounded-full bg-gradient-to-b from-indigo-500 to-indigo-600 text-white font-semibold focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-900 focus:ring-indigo-400 hover:shadow-xl hover:shadow-indigo-500/30 transition-all duration-200 transform hover:-translate-y-1"
>
Explore All Tools Explore All Tools
</a> </a>
</section> </section>
@@ -283,6 +218,9 @@
<div> <div>
<h3 class="font-bold text-white mb-4">Legal</h3> <h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400"> <ul class="space-y-2 text-gray-400">
<li>
<a href="./licensing.html" class="hover:text-indigo-400">Licensing</a>
</li>
<li> <li>
<a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a> <a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a>
</li> </li>
@@ -333,5 +271,6 @@
<script type="module" src="src/js/utils/lucide-init.ts"></script> <script type="module" src="src/js/utils/lucide-init.ts"></script>
<script type="module" src="src/version.ts"></script> <script type="module" src="src/version.ts"></script>
<script type="module" src="src/js/mobileMenu.ts"></script> <script type="module" src="src/js/mobileMenu.ts"></script>
</body> </body>
</html> </html>

View File

@@ -1,25 +1,19 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head>
<head>
<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>
<link href="/src/css/styles.css" rel="stylesheet" /> <link href="/src/css/styles.css" rel="stylesheet" />
</head> </head>
<body class="antialiased bg-gray-900 text-gray-300"> <body class="antialiased bg-gray-900 text-gray-300">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30"> <nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16"> <div class="flex justify-between items-center h-16">
<div <div class="flex-shrink-0 flex items-center cursor-pointer" id="home-logo">
class="flex-shrink-0 flex items-center cursor-pointer" <img src="images/favicon.svg" alt="Bento PDF Logo" class="h-8 w-8" />
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"> <span class="text-white font-bold text-xl ml-2">
<a href="index.html">BentoPDF</a> <a href="index.html">BentoPDF</a>
</span> </span>
@@ -30,52 +24,25 @@
<a href="index.html" class="nav-link">Home</a> <a href="index.html" class="nav-link">Home</a>
<a href="./about.html" class="nav-link">About</a> <a href="./about.html" class="nav-link">About</a>
<a href="./contact.html" class="nav-link">Contact</a> <a href="./contact.html" class="nav-link">Contact</a>
<a href="./licensing.html" class="nav-link">Licensing</a>
<a href="index.html#tools-header" class="nav-link">All Tools</a> <a href="index.html#tools-header" class="nav-link">All Tools</a>
</div> </div>
<!-- Mobile Hamburger Button --> <!-- Mobile Hamburger Button -->
<div class="md:hidden flex items-center"> <div class="md:hidden flex items-center">
<button <button id="mobile-menu-button" type="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" 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-controls="mobile-menu" aria-expanded="false">
aria-expanded="false"
>
<span class="sr-only">Open main menu</span> <span class="sr-only">Open main menu</span>
<!-- Hamburger Icon --> <!-- Hamburger Icon -->
<svg <svg id="menu-icon" class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
id="menu-icon" stroke="currentColor" aria-hidden="true">
class="block h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
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>
<!-- Close Icon --> <!-- Close Icon -->
<svg <svg id="close-icon" class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none"
id="close-icon" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
class="hidden h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
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> </svg>
</button> </button>
</div> </div>
@@ -83,17 +50,13 @@
</div> </div>
<!-- Mobile Menu Dropdown --> <!-- Mobile Menu Dropdown -->
<div <div id="mobile-menu" class="hidden md:hidden bg-gray-800 border-t border-gray-700">
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"> <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="index.html" class="mobile-nav-link">Home</a>
<a href="./about.html" class="mobile-nav-link">About</a> <a href="./about.html" class="mobile-nav-link">About</a>
<a href="./contact.html" class="mobile-nav-link">Contact</a> <a href="./contact.html" class="mobile-nav-link">Contact</a>
<a href="index.html#tools-header" class="mobile-nav-link" <a href="./licensing.html" class="mobile-nav-link">Licensing</a>
>All Tools</a <a href="index.html#tools-header" class="mobile-nav-link">All Tools</a>
>
</div> </div>
</div> </div>
</nav> </nav>
@@ -112,11 +75,8 @@
<div class="max-w-2xl mx-auto text-center py-8"> <div class="max-w-2xl mx-auto text-center py-8">
<p class="text-lg text-gray-400"> <p class="text-lg text-gray-400">
You can reach us directly by email at: You can reach us directly by email at:
<a <a href="mailto:contact@bentopdf.com"
href="mailto:contact@bentopdf.com" class="text-indigo-400 underline hover:text-indigo-300">contact@bentopdf.com</a>
class="text-indigo-400 underline hover:text-indigo-300"
>contact@bentopdf.com</a
>
</p> </p>
</div> </div>
</div> </div>
@@ -155,6 +115,9 @@
<div> <div>
<h3 class="font-bold text-white mb-4">Legal</h3> <h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400"> <ul class="space-y-2 text-gray-400">
<li>
<a href="./licensing.html" class="hover:text-indigo-400">Licensing</a>
</li>
<li> <li>
<a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a> <a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a>
</li> </li>
@@ -205,5 +168,6 @@
<script type="module" src="src/js/utils/lucide-init.ts"></script> <script type="module" src="src/js/utils/lucide-init.ts"></script>
<script type="module" src="src/version.ts"></script> <script type="module" src="src/version.ts"></script>
<script type="module" src="src/js/mobileMenu.ts"></script> <script type="module" src="src/js/mobileMenu.ts"></script>
</body> </body>
</html> </html>

157
faq.html
View File

@@ -1,25 +1,19 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head>
<head>
<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>
<link href="/src/css/styles.css" rel="stylesheet" /> <link href="/src/css/styles.css" rel="stylesheet" />
</head> </head>
<body class="antialiased bg-gray-900 text-gray-300"> <body class="antialiased bg-gray-900 text-gray-300">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30"> <nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16"> <div class="flex justify-between items-center h-16">
<div <div class="flex-shrink-0 flex items-center cursor-pointer" id="home-logo">
class="flex-shrink-0 flex items-center cursor-pointer" <img src="images/favicon.svg" alt="Bento PDF Logo" class="h-8 w-8" />
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"> <span class="text-white font-bold text-xl ml-2">
<a href="index.html">BentoPDF</a> <a href="index.html">BentoPDF</a>
</span> </span>
@@ -30,52 +24,25 @@
<a href="index.html" class="nav-link">Home</a> <a href="index.html" class="nav-link">Home</a>
<a href="./about.html" class="nav-link">About</a> <a href="./about.html" class="nav-link">About</a>
<a href="./contact.html" class="nav-link">Contact</a> <a href="./contact.html" class="nav-link">Contact</a>
<a href="./licensing.html" class="nav-link">Licensing</a>
<a href="index.html#tools-header" class="nav-link">All Tools</a> <a href="index.html#tools-header" class="nav-link">All Tools</a>
</div> </div>
<!-- Mobile Hamburger Button --> <!-- Mobile Hamburger Button -->
<div class="md:hidden flex items-center"> <div class="md:hidden flex items-center">
<button <button id="mobile-menu-button" type="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" 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-controls="mobile-menu" aria-expanded="false">
aria-expanded="false"
>
<span class="sr-only">Open main menu</span> <span class="sr-only">Open main menu</span>
<!-- Hamburger Icon --> <!-- Hamburger Icon -->
<svg <svg id="menu-icon" class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
id="menu-icon" stroke="currentColor" aria-hidden="true">
class="block h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
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>
<!-- Close Icon --> <!-- Close Icon -->
<svg <svg id="close-icon" class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none"
id="close-icon" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
class="hidden h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
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> </svg>
</button> </button>
</div> </div>
@@ -83,17 +50,13 @@
</div> </div>
<!-- Mobile Menu Dropdown --> <!-- Mobile Menu Dropdown -->
<div <div id="mobile-menu" class="hidden md:hidden bg-gray-800 border-t border-gray-700">
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"> <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="index.html" class="mobile-nav-link">Home</a>
<a href="./about.html" class="mobile-nav-link">About</a> <a href="./about.html" class="mobile-nav-link">About</a>
<a href="./contact.html" class="mobile-nav-link">Contact</a> <a href="./contact.html" class="mobile-nav-link">Contact</a>
<a href="index.html#tools-header" class="mobile-nav-link" <a href="./licensing.html" class="mobile-nav-link">Licensing</a>
>All Tools</a <a href="index.html#tools-header" class="mobile-nav-link">All Tools</a>
>
</div> </div>
</div> </div>
</nav> </nav>
@@ -110,17 +73,12 @@
</section> </section>
<div class="max-w-4xl mx-auto space-y-4"> <div class="max-w-4xl mx-auto space-y-4">
<details <details class="bg-gray-800 border border-gray-700 rounded-lg p-5 group">
class="bg-gray-800 border border-gray-700 rounded-lg p-5 group"
>
<summary class="flex items-center justify-between cursor-pointer"> <summary class="flex items-center justify-between cursor-pointer">
<h3 class="font-semibold text-white text-lg"> <h3 class="font-semibold text-white text-lg">
Are my files safe and private? Are my files safe and private?
</h3> </h3>
<i <i data-lucide="plus" class="w-6 h-6 text-indigo-400 icon flex-shrink-0"></i>
data-lucide="plus"
class="w-6 h-6 text-indigo-400 icon flex-shrink-0"
></i>
</summary> </summary>
<div class="mt-4 text-gray-400"> <div class="mt-4 text-gray-400">
<p> <p>
@@ -132,17 +90,12 @@
</div> </div>
</details> </details>
<details <details class="bg-gray-800 border border-gray-700 rounded-lg p-5 group">
class="bg-gray-800 border border-gray-700 rounded-lg p-5 group"
>
<summary class="flex items-center justify-between cursor-pointer"> <summary class="flex items-center justify-between cursor-pointer">
<h3 class="font-semibold text-white text-lg"> <h3 class="font-semibold text-white text-lg">
Is BentoPDF really free? What's the catch? Is BentoPDF really free? What's the catch?
</h3> </h3>
<i <i data-lucide="plus" class="w-6 h-6 text-indigo-400 icon flex-shrink-0"></i>
data-lucide="plus"
class="w-6 h-6 text-indigo-400 icon flex-shrink-0"
></i>
</summary> </summary>
<div class="mt-4 text-gray-400"> <div class="mt-4 text-gray-400">
<p> <p>
@@ -154,17 +107,12 @@
</div> </div>
</details> </details>
<details <details class="bg-gray-800 border border-gray-700 rounded-lg p-5 group">
class="bg-gray-800 border border-gray-700 rounded-lg p-5 group"
>
<summary class="flex items-center justify-between cursor-pointer"> <summary class="flex items-center justify-between cursor-pointer">
<h3 class="font-semibold text-white text-lg"> <h3 class="font-semibold text-white text-lg">
Do I need an internet connection to use the tools? Do I need an internet connection to use the tools?
</h3> </h3>
<i <i data-lucide="plus" class="w-6 h-6 text-indigo-400 icon flex-shrink-0"></i>
data-lucide="plus"
class="w-6 h-6 text-indigo-400 icon flex-shrink-0"
></i>
</summary> </summary>
<div class="mt-4 text-gray-400"> <div class="mt-4 text-gray-400">
<p> <p>
@@ -178,17 +126,12 @@
</div> </div>
</details> </details>
<details <details class="bg-gray-800 border border-gray-700 rounded-lg p-5 group">
class="bg-gray-800 border border-gray-700 rounded-lg p-5 group"
>
<summary class="flex items-center justify-between cursor-pointer"> <summary class="flex items-center justify-between cursor-pointer">
<h3 class="font-semibold text-white text-lg"> <h3 class="font-semibold text-white text-lg">
Are there any file size or usage limitations? Are there any file size or usage limitations?
</h3> </h3>
<i <i data-lucide="plus" class="w-6 h-6 text-indigo-400 icon flex-shrink-0"></i>
data-lucide="plus"
class="w-6 h-6 text-indigo-400 icon flex-shrink-0"
></i>
</summary> </summary>
<div class="mt-4 text-gray-400"> <div class="mt-4 text-gray-400">
<p> <p>
@@ -201,17 +144,12 @@
</div> </div>
</details> </details>
<details <details class="bg-gray-800 border border-gray-700 rounded-lg p-5 group">
class="bg-gray-800 border border-gray-700 rounded-lg p-5 group"
>
<summary class="flex items-center justify-between cursor-pointer"> <summary class="flex items-center justify-between cursor-pointer">
<h3 class="font-semibold text-white text-lg"> <h3 class="font-semibold text-white text-lg">
Why did my PDF fail to process? Why did my PDF fail to process?
</h3> </h3>
<i <i data-lucide="plus" class="w-6 h-6 text-indigo-400 icon flex-shrink-0"></i>
data-lucide="plus"
class="w-6 h-6 text-indigo-400 icon flex-shrink-0"
></i>
</summary> </summary>
<div class="mt-4 text-gray-400"> <div class="mt-4 text-gray-400">
<p>Failures are rare but can happen for a few reasons:</p> <p>Failures are rare but can happen for a few reasons:</p>
@@ -232,29 +170,19 @@
</div> </div>
</details> </details>
<details <details class="bg-gray-800 border border-gray-700 rounded-lg p-5 group">
class="bg-gray-800 border border-gray-700 rounded-lg p-5 group"
>
<summary class="flex items-center justify-between cursor-pointer"> <summary class="flex items-center justify-between cursor-pointer">
<h3 class="font-semibold text-white text-lg"> <h3 class="font-semibold text-white text-lg">
Do you track my activity on BentoPDF? Do you track my activity on BentoPDF?
</h3> </h3>
<i <i data-lucide="plus" class="w-6 h-6 text-indigo-400 icon flex-shrink-0"></i>
data-lucide="plus"
class="w-6 h-6 text-indigo-400 icon flex-shrink-0"
></i>
</summary> </summary>
<div class="mt-4 text-gray-400"> <div class="mt-4 text-gray-400">
<p> <p>
We care about your privacy. BentoPDF does not track personal We care about your privacy. BentoPDF does not track personal
information. We use information. We use
<a <a href="https://simpleanalytics.com" class="text-indigo-400 hover:underline" target="_blank"
href="https://simpleanalytics.com" rel="noopener noreferrer">Simple Analytics</a>
class="text-indigo-400 hover:underline"
target="_blank"
rel="noopener noreferrer"
>Simple Analytics</a
>
solely to see anonymous visit counts. This means we can know how solely to see anonymous visit counts. This means we can know how
many users visit our site, but many users visit our site, but
<strong>we never know who you are</strong>. Simple Analytics is <strong>we never know who you are</strong>. Simple Analytics is
@@ -263,17 +191,12 @@
</div> </div>
</details> </details>
<details <details class="bg-gray-800 border border-gray-700 rounded-lg p-5 group">
class="bg-gray-800 border border-gray-700 rounded-lg p-5 group"
>
<summary class="flex items-center justify-between cursor-pointer"> <summary class="flex items-center justify-between cursor-pointer">
<h3 class="font-semibold text-white text-lg"> <h3 class="font-semibold text-white text-lg">
What technology does BentoPDF use? What technology does BentoPDF use?
</h3> </h3>
<i <i data-lucide="plus" class="w-6 h-6 text-indigo-400 icon flex-shrink-0"></i>
data-lucide="plus"
class="w-6 h-6 text-indigo-400 icon flex-shrink-0"
></i>
</summary> </summary>
<div class="mt-4 text-gray-400"> <div class="mt-4 text-gray-400">
<p> <p>
@@ -298,10 +221,8 @@
If you can't find the answer you're looking for, feel free to reach If you can't find the answer you're looking for, feel free to reach
out to our support team. We're always Bento to help. out to our support team. We're always Bento to help.
</p> </p>
<a <a href="contact.html"
href="contact.html" class="inline-block px-8 py-3 rounded-full bg-gray-700 text-white font-semibold focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-900 focus:ring-indigo-400 hover:bg-gray-600 transition-colors duration-200">
class="inline-block px-8 py-3 rounded-full bg-gray-700 text-white font-semibold focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-900 focus:ring-indigo-400 hover:bg-gray-600 transition-colors duration-200"
>
Contact Us Contact Us
</a> </a>
</section> </section>
@@ -341,6 +262,9 @@
<div> <div>
<h3 class="font-bold text-white mb-4">Legal</h3> <h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400"> <ul class="space-y-2 text-gray-400">
<li>
<a href="./licensing.html" class="hover:text-indigo-400">Licensing</a>
</li>
<li> <li>
<a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a> <a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a>
</li> </li>
@@ -391,5 +315,6 @@
<script type="module" src="src/js/utils/lucide-init.ts"></script> <script type="module" src="src/js/utils/lucide-init.ts"></script>
<script type="module" src="src/version.ts"></script> <script type="module" src="src/version.ts"></script>
<script type="module" src="src/js/mobileMenu.ts"></script> <script type="module" src="src/js/mobileMenu.ts"></script>
</body> </body>
</html> </html>

View File

@@ -7,6 +7,7 @@
<title>BentoPDF - The Privacy First PDF Toolkit</title> <title>BentoPDF - The Privacy First PDF Toolkit</title>
<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" />
<script async src="https://scripts.simpleanalyticscdn.com/latest.js"></script>
</head> </head>
<body class="antialiased"> <body class="antialiased">
@@ -25,6 +26,7 @@
<a href="index.html" class="nav-link">Home</a> <a href="index.html" class="nav-link">Home</a>
<a href="./about.html" class="nav-link">About</a> <a href="./about.html" class="nav-link">About</a>
<a href="./contact.html" class="nav-link">Contact</a> <a href="./contact.html" class="nav-link">Contact</a>
<a href="./licensing.html" class="nav-link">Licensing</a>
<a href="index.html#tools-header" class="nav-link">All Tools</a> <a href="index.html#tools-header" class="nav-link">All Tools</a>
</div> </div>
@@ -55,6 +57,7 @@
<a href="index.html" class="mobile-nav-link">Home</a> <a href="index.html" class="mobile-nav-link">Home</a>
<a href="./about.html" class="mobile-nav-link">About</a> <a href="./about.html" class="mobile-nav-link">About</a>
<a href="./contact.html" class="mobile-nav-link">Contact</a> <a href="./contact.html" class="mobile-nav-link">Contact</a>
<a href="./licensing.html" class="mobile-nav-link">Licensing</a>
<a href="index.html#tools-header" class="mobile-nav-link">All Tools</a> <a href="index.html#tools-header" class="mobile-nav-link">All Tools</a>
</div> </div>
</div> </div>
@@ -616,6 +619,9 @@
<div> <div>
<h3 class="font-bold text-white mb-4">Legal</h3> <h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400"> <ul class="space-y-2 text-gray-400">
<li>
<a href="./licensing.html" class="hover:text-indigo-400">Licensing</a>
</li>
<li> <li>
<a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a> <a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a>
</li> </li>

656
licensing.html Normal file
View File

@@ -0,0 +1,656 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Licensing - BentoPDF</title>
<link href="/src/css/styles.css" rel="stylesheet" />
</head>
<body class="antialiased bg-gray-900 text-gray-300">
<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="index.html">BentoPDF</a>
</span>
</div>
<!-- Desktop Navigation -->
<div class="hidden md:flex items-center space-x-8">
<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="./licensing.html" class="nav-link">Licensing</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="./licensing.html" class="mobile-nav-link">Licensing</a>
<a href="index.html#tools-header" class="mobile-nav-link">All Tools</a>
</div>
</div>
</nav>
<div id="app" class="min-h-screen container mx-auto p-4 md:p-8">
<section id="licensing-hero" class="text-center py-16 md:py-24">
<h1 class="text-3xl md:text-6xl font-bold text-white mb-4">
Licensing for
<span class="marker-slanted">BentoPDF</span>
</h1>
<p class="text-lg md:text-xl text-gray-400">
Choose the license that fits your needs.
</p>
</section>
<div class="section-divider"></div>
<section id="licensing-options" class="py-16 max-w-6xl mx-auto">
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<!-- Open Source License -->
<div class="bg-gray-800 rounded-xl p-8 border border-gray-700">
<div class="flex items-center gap-4 mb-6">
<i data-lucide="code-2" class="w-12 h-12 text-green-400 flex-shrink-0"></i>
<h2 class="text-3xl font-bold text-white">Open Source</h2>
</div>
<p class="text-gray-400 mb-6 leading-relaxed">
BentoPDF is licensed under the
<strong class="text-white">GNU Affero General Public License v3.0 (AGPL-3.0)</strong>.
You are free to use, modify, and distribute BentoPDF in your open-source projects.
</p>
<div class="space-y-4">
<div class="flex items-start gap-3">
<i data-lucide="check-circle" class="w-6 h-6 text-green-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-1">Free to Use</h3>
<p class="text-gray-400 text-sm">
Use BentoPDF for free in open-source projects where you
make your source code publicly available.
</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="check-circle" class="w-6 h-6 text-green-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-1">
Modify & Distribute
</h3>
<p class="text-gray-400 text-sm">
Modify the source code and distribute your version, as long
as you comply with AGPL-3.0 requirements.
</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="alert-circle" class="w-6 h-6 text-yellow-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-1">Share Alike</h3>
<p class="text-gray-400 text-sm">
Any modifications or derivative works must also be licensed
under AGPL-3.0 and made publicly available.
</p>
</div>
</div>
</div>
<a href="https://github.com/alam00000/bentopdf" target="_blank" rel="noopener noreferrer"
class="inline-block mt-8 px-6 py-3 rounded-lg bg-green-600 text-white font-semibold hover:bg-green-700 transition-colors">
View on GitHub
</a>
</div>
<!-- Commercial License -->
<div class="bg-gray-800 rounded-xl p-8 border border-indigo-500">
<div class="flex items-center gap-4 mb-6">
<i data-lucide="briefcase" class="w-12 h-12 text-indigo-400 flex-shrink-0"></i>
<h2 class="text-3xl font-bold text-white">Commercial</h2>
</div>
<p class="text-gray-400 mb-6 leading-relaxed">
If you want to use BentoPDF in a
<strong class="text-white">closed-source or proprietary application</strong>
without sharing your source code, you must purchase a commercial license.
</p>
<div class="space-y-4">
<div class="flex items-start gap-3">
<i data-lucide="lock" class="w-6 h-6 text-indigo-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-1">
Proprietary Use
</h3>
<p class="text-gray-400 text-sm">
Use BentoPDF in closed-source applications without the
obligation to disclose your source code.
</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="shield-check" class="w-6 h-6 text-indigo-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-1">
Enterprise Support
</h3>
<p class="text-gray-400 text-sm">
Get priority support, custom features, and assistance with
integration.
</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="zap" class="w-6 h-6 text-indigo-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-1">
Early Access to New Features
</h3>
<p class="text-gray-400 text-sm">
Commercial license holders get early access to new features and updates.
</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="file-check" class="w-6 h-6 text-indigo-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-1">
Flexible Terms
</h3>
<p class="text-gray-400 text-sm">
Licensing terms tailored to your business needs and project
requirements.
</p>
</div>
</div>
</div>
<div
class="mt-8 bg-gradient-to-r from-indigo-900/40 to-purple-900/40 rounded-lg p-6 border border-indigo-500/50">
<div class="text-center">
<p class="text-white text-2xl font-bold mb-2">Lifetime License</p>
<p class="text-indigo-300 text-4xl font-bold mb-3">$49 <span
class="text-lg font-normal text-gray-400">one-time</span></p>
<p class="text-gray-300 text-sm mb-4">Includes all feature updates forever</p>
<a href="https://ko-fi.com/s/f32ca4cb75" target="_blank" rel="noopener noreferrer"
class="inline-block px-8 py-3 rounded-lg bg-indigo-600 text-white font-semibold hover:bg-indigo-700 transition-colors shadow-lg">
Purchase Lifetime License
</a>
</div>
</div>
<p class="mt-4 text-sm text-gray-400 italic text-center">
💡 Custom requests and development are available for separate charges. <a href="./contact.html"
class="text-indigo-400 hover:underline">Contact us</a> for details.
</p>
</div>
</div>
</section>
<div class="section-divider"></div>
<section id="license-comparison" class="py-16 max-w-6xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold text-center text-white mb-4">
Do I Need a <span class="marker-slanted">Commercial License?</span>
</h2>
<p class="text-center text-gray-400 mb-12 max-w-3xl mx-auto">
Use this quick reference chart to determine if your use case requires a commercial license.
</p>
<div class="overflow-x-auto">
<table class="w-full bg-gray-800 rounded-xl overflow-hidden border border-gray-700">
<thead>
<tr class="bg-gray-700">
<th class="px-6 py-4 text-left text-white font-semibold border-b border-gray-600">Use Case
</th>
<th class="px-6 py-4 text-center text-white font-semibold border-b border-gray-600 w-48">
License Required</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-700">
<tr class="hover:bg-gray-750 transition-colors">
<td class="px-6 py-4 text-gray-300">Personal use (not hosting as a service)</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-green-900/30 text-green-400 rounded-full text-sm font-semibold">
<i data-lucide="check" class="w-4 h-4"></i> AGPL (Free)
</span>
</td>
</tr>
<tr class="hover:bg-gray-750 transition-colors">
<td class="px-6 py-4 text-gray-300">Open-source project with publicly available source code
</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-green-900/30 text-green-400 rounded-full text-sm font-semibold">
<i data-lucide="check" class="w-4 h-4"></i> AGPL (Free)
</span>
</td>
</tr>
<tr class="hover:bg-gray-750 transition-colors">
<td class="px-6 py-4 text-gray-300">Public website where you share your full modified source
code under AGPL</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-green-900/30 text-green-400 rounded-full text-sm font-semibold">
<i data-lucide="check" class="w-4 h-4"></i> AGPL (Free)
</span>
</td>
</tr>
<tr class="hover:bg-gray-750 transition-colors">
<td class="px-6 py-4 text-gray-300">Educational/research project with publicly shared code
</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-green-900/30 text-green-400 rounded-full text-sm font-semibold">
<i data-lucide="check" class="w-4 h-4"></i> AGPL (Free)
</span>
</td>
</tr>
<tr class="bg-red-900/10 hover:bg-red-900/20 transition-colors">
<td class="px-6 py-4 text-gray-300 font-medium">SaaS or web application (closed-source)</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-red-900/30 text-red-400 rounded-full text-sm font-semibold">
<i data-lucide="shopping-cart" class="w-4 h-4"></i> Commercial
</span>
</td>
</tr>
<tr class="bg-red-900/10 hover:bg-red-900/20 transition-colors">
<td class="px-6 py-4 text-gray-300 font-medium">Internal company tool/dashboard (source not
shared with users)</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-red-900/30 text-red-400 rounded-full text-sm font-semibold">
<i data-lucide="shopping-cart" class="w-4 h-4"></i> Commercial
</span>
</td>
</tr>
<tr class="bg-red-900/10 hover:bg-red-900/20 transition-colors">
<td class="px-6 py-4 text-gray-300 font-medium">Commercial product (keeping source code
private)</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-red-900/30 text-red-400 rounded-full text-sm font-semibold">
<i data-lucide="shopping-cart" class="w-4 h-4"></i> Commercial
</span>
</td>
</tr>
<tr class="bg-red-900/10 hover:bg-red-900/20 transition-colors">
<td class="px-6 py-4 text-gray-300 font-medium">Network service where source code is not
accessible to users</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-red-900/30 text-red-400 rounded-full text-sm font-semibold">
<i data-lucide="shopping-cart" class="w-4 h-4"></i> Commercial
</span>
</td>
</tr>
<tr class="bg-red-900/10 hover:bg-red-900/20 transition-colors">
<td class="px-6 py-4 text-gray-300 font-medium">Any app where you want to keep modifications
private</td>
<td class="px-6 py-4 text-center">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-red-900/30 text-red-400 rounded-full text-sm font-semibold">
<i data-lucide="shopping-cart" class="w-4 h-4"></i> Commercial
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="mt-8 text-center">
<p class="text-gray-400 text-sm">
Still not sure? <a href="./contact.html"
class="text-indigo-400 hover:underline font-semibold">Contact us</a> to discuss your specific
use case.
</p>
</div>
</section>
<div class="section-divider"></div>
<section id="agpl-requirements" class="py-16 max-w-6xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold text-center text-white mb-12">
AGPL <span class="marker-slanted">Requirements</span>
</h2>
<div class="bg-gray-800 rounded-xl p-8 border border-gray-700 mb-8">
<p class="text-gray-300 mb-6 leading-relaxed">
When using BentoPDF under AGPL-3.0, you must comply with the following requirements:
</p>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="flex items-start gap-3">
<i data-lucide="file-text" class="w-6 h-6 text-indigo-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-2">Producer Line & Copyright</h3>
<p class="text-gray-400 text-sm">
You should mention our open-source and include AGPL license details in the PDF metadata.
You should also retain the producer line in all PDFs created or modified using our
open-source.
</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="code" class="w-6 h-6 text-indigo-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-2">Code Modifications</h3>
<p class="text-gray-400 text-sm">
Any modifications to our open-source must be disclosed under the AGPL. This includes
sharing the modified code with any users interacting with it.
</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="check-circle-2" class="w-6 h-6 text-indigo-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-2">AGPL-Compliant Environments Only</h3>
<p class="text-gray-400 text-sm">
Usage of our open-source Community Edition must be limited to AGPL-compliant
environments, where all AGPL requirements are fully respected.
</p>
</div>
</div>
<div class="flex items-start gap-3">
<i data-lucide="git-branch" class="w-6 h-6 text-indigo-400 flex-shrink-0 mt-1"></i>
<div>
<h3 class="text-white font-semibold mb-2">Source Code Disclosure</h3>
<p class="text-gray-400 text-sm">
You cannot deploy our open-source as part of a server-based application or service
without disclosing your own application's full source code under AGPL to any users
interacting with it.
</p>
</div>
</div>
</div>
</div>
</section>
<div class="section-divider"></div>
<section id="agpl-compliance" class="py-16 max-w-6xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold text-center text-white mb-12">
What is <span class="marker-slanted">AGPL-Compliant?</span>
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<!-- AGPL-Compliant -->
<div class="bg-green-900/20 border-2 border-green-500/30 rounded-xl p-6">
<div class="flex items-center gap-3 mb-4">
<i data-lucide="check-circle" class="w-8 h-8 text-green-400"></i>
<h3 class="text-2xl font-bold text-white">AGPL-Compliant</h3>
</div>
<ul class="space-y-3">
<li class="flex items-start gap-2">
<i data-lucide="check" class="w-5 h-5 text-green-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Open-source projects where you share your full source
code publicly</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="check" class="w-5 h-5 text-green-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Personal use where you're not distributing or hosting it
as a service</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="check" class="w-5 h-5 text-green-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Publicly hosted tools where you provide the complete
source code (including modifications) under AGPL</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="check" class="w-5 h-5 text-green-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Educational or research projects that make all code
publicly available</span>
</li>
</ul>
</div>
<!-- NOT AGPL-Compliant -->
<div class="bg-red-900/20 border-2 border-red-500/30 rounded-xl p-6">
<div class="flex items-center gap-3 mb-4">
<i data-lucide="x-circle" class="w-8 h-8 text-red-400"></i>
<h3 class="text-2xl font-bold text-white">NOT AGPL-Compliant</h3>
</div>
<ul class="space-y-3">
<li class="flex items-start gap-2">
<i data-lucide="x" class="w-5 h-5 text-red-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Proprietary/closed-source SaaS applications</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="x" class="w-5 h-5 text-red-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Internal company tools where source code is not shared
with users</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="x" class="w-5 h-5 text-red-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Commercial products that don't disclose the full source
code</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="x" class="w-5 h-5 text-red-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Network services that don't provide source code access
to users</span>
</li>
<li class="flex items-start gap-2">
<i data-lucide="x" class="w-5 h-5 text-red-400 flex-shrink-0 mt-0.5"></i>
<span class="text-gray-300 text-sm">Any application where you want to keep your source code
private</span>
</li>
</ul>
<p class="mt-4 text-sm text-yellow-400 italic">
⚠️ These use cases require a commercial license.
</p>
</div>
</div>
</section>
<div class="section-divider"></div>
<section id="licensing-faq" class="py-16 max-w-4xl mx-auto">
<h2 class="text-3xl md:text-4xl font-bold text-center text-white mb-12">
Licensing <span class="marker-slanted">FAQs</span>
</h2>
<div id="faq-accordion" class="space-y-4">
<div class="faq-item bg-gray-800 rounded-lg border border-gray-700">
<button class="faq-question w-full flex justify-between items-center text-left p-6">
<span class="text-lg font-semibold text-white">Do I need a commercial license if I'm using
BentoPDF on my
website?</span>
<i data-lucide="chevron-down" class="faq-icon w-6 h-6 text-gray-400 transition-transform"></i>
</button>
<div class="faq-answer max-h-0 overflow-hidden transition-all duration-300 ease-in-out">
<p class="p-6 pt-0 text-gray-400">
If you're using BentoPDF on a public website and have not modified the
source code, you do not need a commercial license. However, if you modify
BentoPDF in any way and make it available to users over a network, the
AGPLv3 requires you to provide your modified source code to those users.
If you want to keep your modifications closed-source, or if you are
integrating BentoPDF into a proprietary or commercial product, you will
need a commercial license. Contact us to discuss your specific use case.
</p>
</div>
</div>
<div class="faq-item bg-gray-800 rounded-lg border border-gray-700">
<button class="faq-question w-full flex justify-between items-center text-left p-6">
<span class="text-lg font-semibold text-white">Can I use BentoPDF for internal company
tools?</span>
<i data-lucide="chevron-down" class="faq-icon w-6 h-6 text-gray-400 transition-transform"></i>
</button>
<div class="faq-answer max-h-0 overflow-hidden transition-all duration-300 ease-in-out">
<p class="p-6 pt-0 text-gray-400">
If your internal tool is closed-source and not shared publicly,
you will need a commercial license. The AGPL-3.0 license
requires that you make the source code of any network-accessible
service using BentoPDF available to its users. If you cannot or
do not want to do that, a commercial license is the right
choice.
</p>
</div>
</div>
<div class="faq-item bg-gray-800 rounded-lg border border-gray-700">
<button class="faq-question w-full flex justify-between items-center text-left p-6">
<span class="text-lg font-semibold text-white">What if I modify BentoPDF for my own use?</span>
<i data-lucide="chevron-down" class="faq-icon w-6 h-6 text-gray-400 transition-transform"></i>
</button>
<div class="faq-answer max-h-0 overflow-hidden transition-all duration-300 ease-in-out">
<p class="p-6 pt-0 text-gray-400">
If you modify BentoPDF and deploy it as a network service
(e.g., a web application), you must make your modified source
code available under AGPL-3.0. If you do not want to share your
modifications, you must obtain a commercial license.
</p>
</div>
</div>
<div class="faq-item bg-gray-800 rounded-lg border border-gray-700">
<button class="faq-question w-full flex justify-between items-center text-left p-6">
<span class="text-lg font-semibold text-white">How do I purchase a commercial license?</span>
<i data-lucide="chevron-down" class="faq-icon w-6 h-6 text-gray-400 transition-transform"></i>
</button>
<div class="faq-answer max-h-0 overflow-hidden transition-all duration-300 ease-in-out">
<p class="p-6 pt-0 text-gray-400">
BentoPDF is available under a lifetime, one-time purchase commercial license.
You can purchase it directly here:
<a href="https://ko-fi.com/s/f32ca4cb75" class="text-indigo-400 hover:underline">Buy Commercial License</a>.
<br><br>
If you have specific requirements or want a custom licensing arrangement,
feel free to <a href="./contact.html" class="text-indigo-400 hover:underline">contact us</a>
with details about your use case, company size, and deployment needs.
We're happy to work with you to find the best fit.
</p>
</div>
</div>
</div>
</section>
<div class="section-divider"></div>
<section id="cta-section" class="text-center py-16">
<h2 class="text-3xl font-bold text-white mb-4">
Still have questions?
</h2>
<p class="text-lg text-gray-400 mb-8 max-w-2xl mx-auto">
We're here to help. Reach out to discuss your licensing needs.
</p>
<a href="./contact.html"
class="inline-block px-8 py-3 rounded-full bg-gradient-to-b from-indigo-500 to-indigo-600 text-white font-semibold focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-900 focus:ring-indigo-400 hover:shadow-xl hover:shadow-indigo-500/30 transition-all duration-200 transform hover:-translate-y-1">
Contact Us
</a>
</section>
</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">
&copy; 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">
<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="src/js/utils/lucide-init.ts"></script>
<script type="module" src="src/version.ts"></script>
<script type="module" src="src/js/faq.ts"></script>
<script type="module" src="src/js/mobileMenu.ts"></script>
</body>
</html>

View File

@@ -1,25 +1,19 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head>
<head>
<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>
<link href="/src/css/styles.css" rel="stylesheet" /> <link href="/src/css/styles.css" rel="stylesheet" />
</head> </head>
<body class="antialiased bg-gray-900 text-gray-300"> <body class="antialiased bg-gray-900 text-gray-300">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30"> <nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16"> <div class="flex justify-between items-center h-16">
<div <div class="flex-shrink-0 flex items-center cursor-pointer" id="home-logo">
class="flex-shrink-0 flex items-center cursor-pointer" <img src="images/favicon.svg" alt="Bento PDF Logo" class="h-8 w-8" />
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"> <span class="text-white font-bold text-xl ml-2">
<a href="index.html">BentoPDF</a> <a href="index.html">BentoPDF</a>
</span> </span>
@@ -30,52 +24,25 @@
<a href="index.html" class="nav-link">Home</a> <a href="index.html" class="nav-link">Home</a>
<a href="./about.html" class="nav-link">About</a> <a href="./about.html" class="nav-link">About</a>
<a href="./contact.html" class="nav-link">Contact</a> <a href="./contact.html" class="nav-link">Contact</a>
<a href="./licensing.html" class="nav-link">Licensing</a>
<a href="index.html#tools-header" class="nav-link">All Tools</a> <a href="index.html#tools-header" class="nav-link">All Tools</a>
</div> </div>
<!-- Mobile Hamburger Button --> <!-- Mobile Hamburger Button -->
<div class="md:hidden flex items-center"> <div class="md:hidden flex items-center">
<button <button id="mobile-menu-button" type="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" 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-controls="mobile-menu" aria-expanded="false">
aria-expanded="false"
>
<span class="sr-only">Open main menu</span> <span class="sr-only">Open main menu</span>
<!-- Hamburger Icon --> <!-- Hamburger Icon -->
<svg <svg id="menu-icon" class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
id="menu-icon" stroke="currentColor" aria-hidden="true">
class="block h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
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>
<!-- Close Icon --> <!-- Close Icon -->
<svg <svg id="close-icon" class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none"
id="close-icon" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
class="hidden h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
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> </svg>
</button> </button>
</div> </div>
@@ -83,17 +50,13 @@
</div> </div>
<!-- Mobile Menu Dropdown --> <!-- Mobile Menu Dropdown -->
<div <div id="mobile-menu" class="hidden md:hidden bg-gray-800 border-t border-gray-700">
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"> <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="index.html" class="mobile-nav-link">Home</a>
<a href="./about.html" class="mobile-nav-link">About</a> <a href="./about.html" class="mobile-nav-link">About</a>
<a href="./contact.html" class="mobile-nav-link">Contact</a> <a href="./contact.html" class="mobile-nav-link">Contact</a>
<a href="index.html#tools-header" class="mobile-nav-link" <a href="./licensing.html" class="mobile-nav-link">Licensing</a>
>All Tools</a <a href="index.html#tools-header" class="mobile-nav-link">All Tools</a>
>
</div> </div>
</div> </div>
</nav> </nav>
@@ -170,19 +133,12 @@
<p> <p>
We use privacy-respecting analytics platforms for this purpose. We use privacy-respecting analytics platforms for this purpose.
Specifically, we use Specifically, we use
<a <a href="https://simpleanalytics.com" target="_blank" rel="noopener noreferrer"
href="https://simpleanalytics.com" class="text-indigo-400 hover:underline">Simple Analytics</a>
target="_blank"
rel="noopener noreferrer"
class="text-indigo-400 hover:underline"
>Simple Analytics</a
>
to track anonymous visit counts. This means we can see how many to track anonymous visit counts. This means we can see how many
users visit our site, but users visit our site, but
<strong <strong>we never collect personal information or identify individual
>we never collect personal information or identify individual users</strong>. Simple Analytics is fully GDPR-compliant and respects user
users</strong
>. Simple Analytics is fully GDPR-compliant and respects user
privacy. We do not use tracking cookies for advertising or privacy. We do not use tracking cookies for advertising or
cross-site profiling. cross-site profiling.
</p> </p>
@@ -266,6 +222,9 @@
<div> <div>
<h3 class="font-bold text-white mb-4">Legal</h3> <h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400"> <ul class="space-y-2 text-gray-400">
<li>
<a href="./licensing.html" class="hover:text-indigo-400">Licensing</a>
</li>
<li> <li>
<a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a> <a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a>
</li> </li>
@@ -315,5 +274,6 @@
<script type="module" src="src/js/utils/lucide-init.ts"></script> <script type="module" src="src/js/utils/lucide-init.ts"></script>
<script type="module" src="src/version.ts"></script> <script type="module" src="src/version.ts"></script>
<script type="module" src="src/js/mobileMenu.ts"></script> <script type="module" src="src/js/mobileMenu.ts"></script>
</body> </body>
</html> </html>

23
src/js/faq.ts Normal file
View File

@@ -0,0 +1,23 @@
// Simple FAQ accordion handler for standalone pages
document.addEventListener('DOMContentLoaded', () => {
const faqAccordion = document.getElementById('faq-accordion');
if (faqAccordion) {
faqAccordion.addEventListener('click', (e) => {
const questionButton = (e.target as HTMLElement).closest('.faq-question');
if (!questionButton) return;
const faqItem = questionButton.parentElement;
const answer = faqItem?.querySelector('.faq-answer') as HTMLElement;
if (!faqItem || !answer) return;
faqItem.classList.toggle('open');
if (faqItem.classList.contains('open')) {
answer.style.maxHeight = answer.scrollHeight + 'px';
} else {
answer.style.maxHeight = '0px';
}
});
}
});

View File

@@ -1,7 +1,7 @@
import { showLoader, hideLoader, showAlert } from '../ui.ts'; import { showLoader, hideLoader, showAlert } from '../ui.ts';
import { downloadFile, readFileAsArrayBuffer } from '../utils/helpers.ts'; import { downloadFile, readFileAsArrayBuffer } from '../utils/helpers.ts';
import { state } from '../state.ts'; import { state } from '../state.ts';
import { renderPagesProgressively, cleanupLazyRendering } from '../utils/render-utils.ts'; import { renderPagesProgressively, cleanupLazyRendering, createPlaceholder } from '../utils/render-utils.ts';
import { createIcons, icons } from 'lucide'; import { createIcons, icons } from 'lucide';
import { PDFDocument as PDFLibDocument } from 'pdf-lib'; import { PDFDocument as PDFLibDocument } from 'pdf-lib';
@@ -202,7 +202,7 @@ async function renderPageMergeThumbnails() {
onProgress: (current, total) => { onProgress: (current, total) => {
currentPageNumber++; currentPageNumber++;
showLoader( showLoader(
`Rendering page previews: ${currentPageNumber}/${totalPages}` `Rendering page previews...`
); );
}, },
onBatchComplete: () => { onBatchComplete: () => {

View File

@@ -20,6 +20,7 @@ interface PageData {
canvas: HTMLCanvasElement | null; canvas: HTMLCanvasElement | null;
pdfDoc: PDFLibDocument; pdfDoc: PDFLibDocument;
originalPageIndex: number; originalPageIndex: number;
fileName: string; // Added for lazy loading identification
} }
function generateId(): string { function generateId(): string {
@@ -104,7 +105,7 @@ function showLoading(current: number, total: number) {
loader.classList.remove('hidden'); loader.classList.remove('hidden');
const percentage = Math.round((current / total) * 100); const percentage = Math.round((current / total) * 100);
progress.style.width = `${percentage}%`; progress.style.width = `${percentage}%`;
text.textContent = `Rendering pages... ${current} of ${total}`; text.textContent = `Rendering pages...`;
} }
async function withButtonLoading(buttonId: string, action: () => Promise<void>) { async function withButtonLoading(buttonId: string, action: () => Promise<void>) {
@@ -198,6 +199,18 @@ function initializeTool() {
}); });
}); });
document.getElementById('select-all-btn')?.addEventListener('click', () => {
if (isRendering) return;
snapshot();
selectAll();
});
document.getElementById('deselect-all-btn')?.addEventListener('click', () => {
if (isRendering) return;
snapshot();
deselectAll();
});
document.getElementById('export-pdf-btn')?.addEventListener('click', () => { document.getElementById('export-pdf-btn')?.addEventListener('click', () => {
if (isRendering) return; if (isRendering) return;
if (allPages.length === 0) { if (allPages.length === 0) {
@@ -356,6 +369,7 @@ async function loadPdfs(files: File[]) {
canvas: null, // Will be filled when rendered canvas: null, // Will be filled when rendered
pdfDoc, pdfDoc,
originalPageIndex: i, originalPageIndex: i,
fileName: file.name,
}); });
} }
@@ -402,6 +416,9 @@ async function loadPdfs(files: File[]) {
if (renderCancelled) { if (renderCancelled) {
renderCancelled = false; renderCancelled = false;
} }
if (allPages.length === 0) {
resetAll();
}
} }
} }
@@ -431,14 +448,22 @@ function createPageElement(canvas: HTMLCanvasElement | null, index: number): HTM
card.className = 'bg-gray-800 rounded-lg border-2 border-gray-700 p-2 relative group cursor-move'; card.className = 'bg-gray-800 rounded-lg border-2 border-gray-700 p-2 relative group cursor-move';
card.dataset.pageIndex = index.toString(); card.dataset.pageIndex = index.toString();
card.dataset.pageId = pageData.id; // Set ID for reconciliation card.dataset.pageId = pageData.id; // Set ID for reconciliation
// Add attributes for lazy loading identification
card.dataset.pageNumber = (pageData.pageIndex + 1).toString();
if (pageData.fileName) {
card.dataset.fileName = pageData.fileName;
}
if (!pageData.canvas) {
card.dataset.lazyLoad = 'true';
}
if (selectedPages.has(index)) { if (selectedPages.has(index)) {
card.classList.add('border-indigo-500', 'ring-2', 'ring-indigo-500'); card.classList.add('border-indigo-500', 'ring-2', 'ring-indigo-500');
} }
const preview = document.createElement('div'); const preview = document.createElement('div');
preview.className = 'bg-white rounded mb-2 overflow-hidden w-full flex items-center justify-center relative'; preview.className = 'bg-white rounded mb-2 overflow-hidden w-full flex items-center justify-center relative h-36 sm:h-64';
preview.style.minHeight = '160px';
preview.style.height = '250px';
if (canvas) { if (canvas) {
const previewCanvas = canvas; const previewCanvas = canvas;
@@ -574,6 +599,9 @@ function setupSortable() {
fallbackTolerance: 3, fallbackTolerance: 3,
delay: 200, delay: 200,
delayOnTouchOnly: true, delayOnTouchOnly: true,
scroll: document.getElementById('main-scroll-container'),
scrollSensitivity: 100, // Increase sensitivity for smoother scrolling
bubbleScroll: false, // Prevent bubbling scroll to parent
onEnd: (evt) => { onEnd: (evt) => {
const oldIndex = evt.oldIndex!; const oldIndex = evt.oldIndex!;
const newIndex = evt.newIndex!; const newIndex = evt.newIndex!;
@@ -724,6 +752,7 @@ async function handleInsertPdf(e: Event) {
canvas: null, // Placeholder canvas: null, // Placeholder
pdfDoc, pdfDoc,
originalPageIndex: i, originalPageIndex: i,
fileName: file.name,
}); });
} }
@@ -752,9 +781,7 @@ async function handleInsertPdf(e: Event) {
if (preview) { if (preview) {
// Re-create the preview content // Re-create the preview content
preview.innerHTML = ''; preview.innerHTML = '';
preview.className = 'bg-white rounded mb-2 overflow-hidden w-full flex items-center justify-center relative'; preview.className = 'bg-white rounded mb-2 overflow-hidden w-full flex items-center justify-center relative h-36 sm:h-64';
(preview as HTMLElement).style.minHeight = '160px';
(preview as HTMLElement).style.height = '250px';
const previewCanvas = canvas; const previewCanvas = canvas;
previewCanvas.className = 'max-w-full max-h-full object-contain'; previewCanvas.className = 'max-w-full max-h-full object-contain';
@@ -814,6 +841,7 @@ function addBlankPage() {
canvas, canvas,
pdfDoc: null as any, pdfDoc: null as any,
originalPageIndex: -1, originalPageIndex: -1,
fileName: '', // Blank page has no file
}; };
allPages.push(blankPageData); allPages.push(blankPageData);
@@ -1066,6 +1094,12 @@ function updatePageDisplay() {
}; };
} }
// Update visual rotation
const canvas = card.querySelector('canvas');
if (canvas) {
canvas.style.transform = `rotate(${pageData.visualRotation}deg)`;
}
// Update action buttons // Update action buttons
const actionsInner = card.querySelector('.flex.items-center.gap-1.bg-gray-900\\/90'); const actionsInner = card.querySelector('.flex.items-center.gap-1.bg-gray-900\\/90');
if (actionsInner) { if (actionsInner) {

View File

@@ -1,5 +1,5 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en" class="overflow-hidden">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
@@ -36,10 +36,10 @@
</style> </style>
</head> </head>
<body class="antialiased bg-gray-900 h-screen overflow-hidden"> <body class="antialiased bg-gray-900 h-[100dvh] overflow-hidden flex flex-col">
<!-- Navigation --> <!-- Navigation -->
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30"> <nav class="bg-gray-800 border-b border-gray-700 flex-none z-30">
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16"> <div class="flex justify-between items-center h-16">
<div class="flex-shrink-0 flex items-center"> <div class="flex-shrink-0 flex items-center">
@@ -58,10 +58,10 @@
</nav> </nav>
<!-- Main Container --> <!-- Main Container -->
<div class="flex flex-col h-[calc(100vh-4rem)]"> <div class="flex flex-col flex-1 overflow-hidden relative">
<!-- Toolbar --> <!-- Toolbar -->
<div class="bg-gray-800 border-b border-gray-700 p-2 sm:p-3 overflow-x-auto scrollbar-hide toolbar-container sm:sticky sm:top-16 sm:z-20"> <div class="bg-gray-800 border-b border-gray-700 p-2 sm:p-3 toolbar-container flex-none z-20">
<div <div
class="flex flex-wrap items-center justify-center sm:justify-start gap-2 bg-gray-900 p-2 sm:p-4 rounded-lg w-full"> class="flex flex-wrap items-center justify-center sm:justify-start gap-2 bg-gray-900 p-2 sm:p-4 rounded-lg w-full">
@@ -186,7 +186,7 @@
</div> </div>
<!-- Content Area --> <!-- Content Area -->
<div class="flex-1 overflow-auto p-3 sm:p-4 sm:pt-20 sm:pb-8 md:pt-4 md:pb-4"> <div id="main-scroll-container" class="flex-1 overflow-auto p-3 pb-24 sm:p-4 sm:pb-8 md:pt-4 md:pb-4">
<div id="upload-area" <div id="upload-area"
class="hidden border-2 border-dashed border-gray-600 rounded-lg p-6 sm:p-12 text-center max-w-full cursor-pointer" class="hidden border-2 border-dashed border-gray-600 rounded-lg p-6 sm:p-12 text-center max-w-full cursor-pointer"
onclick="document.getElementById('pdf-file-input').click()"> onclick="document.getElementById('pdf-file-input').click()">

View File

@@ -1,25 +1,20 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head>
<head>
<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>
<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>
<body class="antialiased bg-gray-900 text-gray-300">
<body class="antialiased bg-gray-900 text-gray-300">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30"> <nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16"> <div class="flex justify-between items-center h-16">
<div <div class="flex-shrink-0 flex items-center cursor-pointer" id="home-logo">
class="flex-shrink-0 flex items-center cursor-pointer" <img src="images/favicon.svg" alt="Bento PDF Logo" class="h-8 w-8" />
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"> <span class="text-white font-bold text-xl ml-2">
<a href="index.html">BentoPDF</a> <a href="index.html">BentoPDF</a>
</span> </span>
@@ -30,52 +25,25 @@
<a href="index.html" class="nav-link">Home</a> <a href="index.html" class="nav-link">Home</a>
<a href="./about.html" class="nav-link">About</a> <a href="./about.html" class="nav-link">About</a>
<a href="./contact.html" class="nav-link">Contact</a> <a href="./contact.html" class="nav-link">Contact</a>
<a href="./licensing.html" class="nav-link">Licensing</a>
<a href="index.html#tools-header" class="nav-link">All Tools</a> <a href="index.html#tools-header" class="nav-link">All Tools</a>
</div> </div>
<!-- Mobile Hamburger Button --> <!-- Mobile Hamburger Button -->
<div class="md:hidden flex items-center"> <div class="md:hidden flex items-center">
<button <button id="mobile-menu-button" type="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" 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-controls="mobile-menu" aria-expanded="false">
aria-expanded="false"
>
<span class="sr-only">Open main menu</span> <span class="sr-only">Open main menu</span>
<!-- Hamburger Icon --> <!-- Hamburger Icon -->
<svg <svg id="menu-icon" class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
id="menu-icon" stroke="currentColor" aria-hidden="true">
class="block h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
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>
<!-- Close Icon --> <!-- Close Icon -->
<svg <svg id="close-icon" class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none"
id="close-icon" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
class="hidden h-6 w-6" <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
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> </svg>
</button> </button>
</div> </div>
@@ -83,17 +51,13 @@
</div> </div>
<!-- Mobile Menu Dropdown --> <!-- Mobile Menu Dropdown -->
<div <div id="mobile-menu" class="hidden md:hidden bg-gray-800 border-t border-gray-700">
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"> <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="index.html" class="mobile-nav-link">Home</a>
<a href="./about.html" class="mobile-nav-link">About</a> <a href="./about.html" class="mobile-nav-link">About</a>
<a href="./contact.html" class="mobile-nav-link">Contact</a> <a href="./contact.html" class="mobile-nav-link">Contact</a>
<a href="index.html#tools-header" class="mobile-nav-link" <a href="./licensing.html" class="mobile-nav-link">Licensing</a>
>All Tools</a <a href="index.html#tools-header" class="mobile-nav-link">All Tools</a>
>
</div> </div>
</div> </div>
</nav> </nav>
@@ -121,10 +85,8 @@
manipulating Portable Document Format (PDF) files. All operations manipulating Portable Document Format (PDF) files. All operations
performed by the Service are executed locally within your web performed by the Service are executed locally within your web
browser. browser.
<strong <strong>No files or data are uploaded to or stored on our
>No files or data are uploaded to or stored on our servers.</strong>
servers.</strong
>
</p> </p>
<h2>3. User Conduct and Responsibilities</h2> <h2>3. User Conduct and Responsibilities</h2>
@@ -256,6 +218,9 @@
<div> <div>
<h3 class="font-bold text-white mb-4">Legal</h3> <h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400"> <ul class="space-y-2 text-gray-400">
<li>
<a href="./licensing.html" class="hover:text-indigo-400">Licensing</a>
</li>
<li> <li>
<a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a> <a href="./terms.html" class="hover:text-indigo-400">Terms and Conditions</a>
</li> </li>
@@ -305,5 +270,6 @@
<script type="module" src="src/js/utils/lucide-init.ts"></script> <script type="module" src="src/js/utils/lucide-init.ts"></script>
<script type="module" src="src/version.ts"></script> <script type="module" src="src/version.ts"></script>
<script type="module" src="src/js/mobileMenu.ts"></script> <script type="module" src="src/js/mobileMenu.ts"></script>
</body> </body>
</html> </html>

View File

@@ -51,6 +51,7 @@ export default defineConfig(({ mode }) => ({
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'), bookmark: resolve(__dirname, 'src/pages/bookmark.html'),
licensing: resolve(__dirname, 'licensing.html'),
'table-of-contents': resolve( 'table-of-contents': resolve(
__dirname, __dirname,
'src/pages/table-of-contents.html' 'src/pages/table-of-contents.html'