mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2025-09-08 23:18:43 +00:00
602 lines
22 KiB
HTML
602 lines
22 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>bitvid | Decentralized Video Sharing</title>
|
|
|
|
<!-- Open Graph Meta Tags -->
|
|
<meta property="og:title" content="BitVid - Decentralized Video Sharing" />
|
|
<meta
|
|
property="og:description"
|
|
content="Share videos and follow creators freely, in a truly decentralized way."
|
|
/>
|
|
<meta property="og:image" content="assets/jpg/bitvid.jpg" />
|
|
<meta property="og:url" content="https://bitvid.network" />
|
|
<meta property="og:type" content="website" />
|
|
<meta property="og:locale" content="en_US" />
|
|
|
|
<!-- App Icons -->
|
|
<link rel="icon" href="assets/favicon.ico" sizes="any" />
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
|
<link
|
|
rel="icon"
|
|
type="image/png"
|
|
sizes="32x32"
|
|
href="assets/png/favicon-32x32.png"
|
|
/>
|
|
<link
|
|
rel="icon"
|
|
type="image/png"
|
|
sizes="16x16"
|
|
href="assets/png/favicon-16x16.png"
|
|
/>
|
|
<link rel="manifest" href="/site.webmanifest" />
|
|
<meta name="theme-color" content="#0f172a" />
|
|
|
|
<!-- Styles -->
|
|
<link href="css/tailwind.min.css" rel="stylesheet" />
|
|
<link href="css/style.css" rel="stylesheet" />
|
|
</head>
|
|
<body class="bg-gray-100">
|
|
<div
|
|
id="app"
|
|
class="container mx-auto px-4 py-8 min-h-screen flex flex-col"
|
|
>
|
|
<!-- Header -->
|
|
<header class="mb-8 flex items-center">
|
|
<!-- Logo on the left -->
|
|
<img
|
|
src="assets/svg/bitvid-logo-light-mode.svg"
|
|
alt="BitVid Logo"
|
|
class="h-16"
|
|
/>
|
|
|
|
<!-- Buttons on the far right -->
|
|
<div class="ml-auto flex items-center space-x-4">
|
|
<!-- Login Button -->
|
|
<button
|
|
id="loginButton"
|
|
style="background-color: #fe0032"
|
|
class="inline-flex items-center justify-center w-12 h-12 rounded-full text-white text-sm font-bold leading-none hover:bg-[#e6002c] focus:outline-none focus:ring-2 focus:ring-black focus:ring-offset-2"
|
|
>
|
|
login
|
|
</button>
|
|
|
|
<!-- Upload Button (hidden by default) -->
|
|
<button
|
|
id="uploadButton"
|
|
style="background-color: #fe0032"
|
|
class="hidden inline-flex items-center justify-center w-12 h-12 rounded-full text-white text-xl font-bold leading-none hover:bg-[#e6002c] focus:outline-none focus:ring-2 focus:ring-black focus:ring-offset-2"
|
|
>
|
|
+
|
|
</button>
|
|
|
|
<!-- Profile Button (hidden by default) -->
|
|
<button
|
|
id="profileButton"
|
|
class="hidden inline-flex items-center justify-center w-12 h-12 rounded-full bg-black text-white text-sm leading-none hover:bg-neutral-800 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
|
|
>
|
|
<!-- This inner DIV is just an avatar container, if you like -->
|
|
<div class="w-10 h-10 rounded-full overflow-hidden">
|
|
<img
|
|
id="profileAvatar"
|
|
src="assets/jpg/default-profile.jpg"
|
|
alt="Profile"
|
|
class="w-full h-full object-cover"
|
|
/>
|
|
</div>
|
|
</button>
|
|
</div>
|
|
</header>
|
|
|
|
<!-- Error Container -->
|
|
<div
|
|
id="errorContainer"
|
|
class="hidden bg-red-100 text-red-900 p-4 rounded-md mb-4"
|
|
></div>
|
|
|
|
<!-- Success Container -->
|
|
<div
|
|
id="successContainer"
|
|
class="hidden bg-green-100 text-green-900 p-4 rounded-md mb-4"
|
|
></div>
|
|
|
|
<!-- Main container for dynamic views (most-recent-videos.html, etc.) -->
|
|
<main id="viewContainer" class="flex-grow mb-8"></main>
|
|
|
|
<!-- Modal Container (external modals will be injected here) -->
|
|
<div id="modalContainer"></div>
|
|
|
|
<!-- Tagline / Slogan -->
|
|
<div class="text-center mb-8">
|
|
<h2 class="text-2xl font-bold text-gray-500 tracking-wide">
|
|
seed. zap. subscribe.
|
|
</h2>
|
|
</div>
|
|
|
|
<!-- Disclaimer Modal (wide, matching other modals) -->
|
|
<div
|
|
id="disclaimerModal"
|
|
class="fixed inset-0 z-50 hidden"
|
|
style="background: transparent"
|
|
>
|
|
<!-- Dark/blur overlay -->
|
|
<div
|
|
class="absolute inset-0 z-10"
|
|
style="
|
|
background-color: rgba(0, 0, 0, 0.9);
|
|
backdrop-filter: blur(10px);
|
|
-webkit-backdrop-filter: blur(10px);
|
|
"
|
|
></div>
|
|
|
|
<!-- Outer container with wide layout, just like content-appeals-form -->
|
|
<div
|
|
class="modal-container relative h-full w-full flex items-start justify-center overflow-y-auto z-20"
|
|
>
|
|
<!-- The .modal-content, same classes: bg-gray-900, w-full max-w-[90%], etc. -->
|
|
<div
|
|
class="modal-content bg-gray-900 w-full max-w-[90%] lg:max-w-6xl my-0 rounded-lg overflow-hidden relative"
|
|
>
|
|
<!-- Sticky top bar, if you want a top heading or 'X' button up here -->
|
|
<div
|
|
class="sticky top-0 bg-gradient-to-b from-black/80 to-transparent p-4 flex items-center justify-between"
|
|
>
|
|
<!-- If you want an X to close, you can add it here, for example:
|
|
<button
|
|
id="closeDisclaimerBtn"
|
|
class="flex items-center justify-center w-10 h-10 rounded-full bg-black/50 hover:bg-black/70 transition-all duration-200 backdrop-blur focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-black focus:ring-blue-500"
|
|
>
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
class="w-6 h-6 text-gray-300"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
>
|
|
<path
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
stroke-width="2"
|
|
d="M6 18L18 6M6 6l12 12"
|
|
/>
|
|
</svg>
|
|
</button>
|
|
-->
|
|
</div>
|
|
|
|
<!-- Main Content -->
|
|
<div class="p-6">
|
|
<!-- Scrollable disclaimers area -->
|
|
<div
|
|
class="space-y-6 text-gray-300"
|
|
style="max-height: 70vh; overflow-y: auto"
|
|
>
|
|
<!-- Example: Insert your disclaimers here -->
|
|
|
|
<div class="flex justify-center mb-8">
|
|
<img
|
|
src="assets/svg/bitvid-logo-dark-mode.svg"
|
|
alt="BitVid Logo"
|
|
class="h-16"
|
|
/>
|
|
</div>
|
|
<h2 class="text-2xl font-bold text-white mb-0">
|
|
Welcome to bitvid
|
|
</h2>
|
|
<!-- Warning Alert -->
|
|
<div
|
|
class="bg-yellow-900/20 border border-yellow-700/50 rounded-lg p-4 mb-6 flex items-start"
|
|
>
|
|
<svg
|
|
class="h-5 w-5 text-yellow-500 mt-0.5 mr-3 flex-shrink-0"
|
|
viewBox="0 0 24 24"
|
|
fill="none"
|
|
stroke="currentColor"
|
|
>
|
|
<path
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
stroke-width="2"
|
|
d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
|
|
/>
|
|
</svg>
|
|
<p class="text-yellow-200">
|
|
This platform is currently in development and only supports
|
|
Chrome and Firefox-based browsers. Other browsers are not
|
|
supported at this time. You may encounter bugs or missing
|
|
features. Give it a sec. Videos might take 10 to 60 seconds
|
|
to load initially.
|
|
</p>
|
|
</div>
|
|
<p>
|
|
bitvid is a decentralized video platform where content is
|
|
shared directly between users. We want you to understand a few
|
|
important points before you continue:
|
|
</p>
|
|
|
|
<div class="space-y-4">
|
|
<div class="bg-gray-800 rounded-lg p-4">
|
|
<h3 class="text-white font-semibold mb-2">
|
|
Early Access Status
|
|
</h3>
|
|
<p class="text-gray-400">
|
|
Currently, video posting is invite-only as we carefully
|
|
scale our platform. While anyone can watch videos, content
|
|
creation is limited to approved creators. This helps us
|
|
maintain quality content during our early stages.
|
|
</p>
|
|
</div>
|
|
<div class="bg-gray-800 rounded-lg p-4">
|
|
<h3 class="text-white font-semibold mb-2">
|
|
Content Responsibility & Moderation
|
|
</h3>
|
|
<p class="text-gray-400">
|
|
While we don't host videos directly, we maintain community
|
|
standards through access control. Users who violate our
|
|
guidelines may be blocked from accessing the platform. All
|
|
content must follow local laws and platform guidelines.
|
|
</p>
|
|
</div>
|
|
<div class="bg-gray-800 rounded-lg p-4">
|
|
<h3 class="text-white font-semibold mb-2">
|
|
Platform Status
|
|
</h3>
|
|
<p class="text-gray-400">
|
|
bitvid is a work in progress. Features may change or
|
|
break, and security improvements are ongoing. Your
|
|
feedback and patience help us build a better platform.
|
|
</p>
|
|
</div>
|
|
<div class="bg-gray-800 rounded-lg p-4">
|
|
<h3 class="text-white font-semibold mb-2">Get Involved</h3>
|
|
<p class="text-gray-400">
|
|
Are you a developer? We'd love your help! Visit our GitHub
|
|
repository to contribute to building the future of
|
|
decentralized video sharing.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Button at bottom -->
|
|
<div class="mt-6">
|
|
<button
|
|
id="acceptDisclaimer"
|
|
class="w-full bg-blue-500 text-white px-4 py-2 rounded-md hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:ring-offset-black transition-colors duration-200"
|
|
>
|
|
I Understand
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Footer -->
|
|
<footer class="mt-auto pb-8 text-center px-4">
|
|
<a
|
|
href="http://bitvid.network/"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
bitvid.network
|
|
</a>
|
|
|
|
|
<a
|
|
href="https://bitvid.btc.us"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
bitvid.btc.us
|
|
</a>
|
|
|
|
|
<a
|
|
href="https://bitvid.eth.limo"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
bitvid.eth.limo
|
|
</a>
|
|
<div class="mt-2 space-x-4">
|
|
<a
|
|
href="community-guidelines.html"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Community Guidelines
|
|
</a>
|
|
<a
|
|
href="https://github.com/PR0M3TH3AN/bitvid"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
GitHub
|
|
</a>
|
|
<a
|
|
href="https://primal.net/p/npub13yarr7j6vjqjjkahd63dmr27curypehx45ucue286ac7sft27y0srnpmpe"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Nostr
|
|
</a>
|
|
<a
|
|
href="https://habla.news/p/nprofile1qyv8wumn8ghj7un9d3shjtnndehhyapwwdhkx6tpdsq3gamnwvaz7tmjv4kxz7fwv3sk6atn9e5k7qgdwaehxw309ahx7uewd3hkcqgswaehxw309ahx7um5wgh8w6twv5q3yamnwvaz7tm0venxx6rpd9hzuur4vgqzpzf6x8a95eyp99dmwm4zmkx4a3cxgrnwdtfe3ej504m3aqjk4ugldyww3a"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Blog
|
|
</a>
|
|
<a
|
|
href="getting-started.html"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_self"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Getting Started
|
|
</a>
|
|
<a
|
|
href="about.html"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_self"
|
|
rel="noopener noreferrer"
|
|
>
|
|
About
|
|
</a>
|
|
<a
|
|
href="roadmap.html"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_self"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Roadmap
|
|
</a>
|
|
<a
|
|
href="https://beta.bitvid.network/"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_self"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Beta
|
|
</a>
|
|
<a
|
|
href="torrent/beacon.html"
|
|
class="text-gray-500 hover:text-gray-400 transition-colors duration-200"
|
|
target="_self"
|
|
rel="noopener noreferrer"
|
|
>
|
|
βeacon
|
|
</a>
|
|
</div>
|
|
<p
|
|
class="mt-2 text-xs text-gray-600 font-mono break-all max-w-full overflow-hidden"
|
|
>
|
|
IPNS:
|
|
<a href="ipns.html" class="text-blue-600 underline">
|
|
k51qzi5uqu5dgwr4oejq9rk41aoe9zcupenby6iqecsk5byc7rx48uecd133a1
|
|
</a>
|
|
</p>
|
|
</footer>
|
|
</div>
|
|
|
|
<!-- Load external modal components + attach event listeners -->
|
|
<script>
|
|
async function loadModal(url) {
|
|
try {
|
|
const response = await fetch(url);
|
|
if (!response.ok) {
|
|
throw new Error("Failed to load " + url);
|
|
}
|
|
const html = await response.text();
|
|
document
|
|
.getElementById("modalContainer")
|
|
.insertAdjacentHTML("beforeend", html);
|
|
console.log(url, "loaded");
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
}
|
|
|
|
Promise.all([
|
|
// Existing modals
|
|
loadModal("components/login-modal.html"),
|
|
loadModal("components/application-form.html"),
|
|
loadModal("components/content-appeals-form.html"),
|
|
|
|
// New forms
|
|
loadModal("components/general-feedback-form.html"),
|
|
loadModal("components/feature-request-form.html"),
|
|
loadModal("components/bug-fix-form.html"),
|
|
]).then(() => {
|
|
console.log("Modals loaded.");
|
|
|
|
//
|
|
// 1) Login button => open login modal
|
|
//
|
|
const loginNavBtn = document.getElementById("loginButton");
|
|
if (loginNavBtn) {
|
|
loginNavBtn.addEventListener("click", () => {
|
|
const loginModal = document.getElementById("loginModal");
|
|
if (loginModal) {
|
|
loginModal.classList.remove("hidden");
|
|
}
|
|
});
|
|
}
|
|
|
|
//
|
|
// 2) Close login modal
|
|
//
|
|
const closeLoginBtn = document.getElementById("closeLoginModal");
|
|
if (closeLoginBtn) {
|
|
closeLoginBtn.addEventListener("click", () => {
|
|
const loginModal = document.getElementById("loginModal");
|
|
if (loginModal) {
|
|
loginModal.classList.add("hidden");
|
|
}
|
|
});
|
|
}
|
|
|
|
//
|
|
// 3) “Application Form” button => open application form
|
|
//
|
|
const openAppFormBtn = document.getElementById("openApplicationModal");
|
|
if (openAppFormBtn) {
|
|
openAppFormBtn.addEventListener("click", () => {
|
|
// Hide the login modal first
|
|
const loginModal = document.getElementById("loginModal");
|
|
if (loginModal) {
|
|
loginModal.classList.add("hidden");
|
|
}
|
|
// Now show the application form modal
|
|
const appModal = document.getElementById("nostrFormModal");
|
|
if (appModal) {
|
|
appModal.classList.remove("hidden");
|
|
}
|
|
});
|
|
}
|
|
|
|
//
|
|
// 4) Close application form
|
|
//
|
|
const closeNostrFormBtn = document.getElementById(
|
|
"closeNostrFormModal"
|
|
);
|
|
if (closeNostrFormBtn) {
|
|
closeNostrFormBtn.addEventListener("click", () => {
|
|
const appModal = document.getElementById("nostrFormModal");
|
|
if (appModal) {
|
|
appModal.classList.add("hidden");
|
|
}
|
|
});
|
|
}
|
|
|
|
//
|
|
// 5) ?modal=appeals => open content appeals form
|
|
//
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|
const modalParam = urlParams.get("modal");
|
|
if (modalParam === "appeals") {
|
|
const appealsModal = document.getElementById("contentAppealsModal");
|
|
if (appealsModal) {
|
|
appealsModal.classList.remove("hidden");
|
|
}
|
|
}
|
|
|
|
//
|
|
// 6) Close content appeals modal
|
|
//
|
|
const closeAppealsBtn = document.getElementById(
|
|
"closeContentAppealsModal"
|
|
);
|
|
if (closeAppealsBtn) {
|
|
closeAppealsBtn.addEventListener("click", () => {
|
|
const appealsModal = document.getElementById("contentAppealsModal");
|
|
if (appealsModal) {
|
|
appealsModal.classList.add("hidden");
|
|
}
|
|
});
|
|
}
|
|
|
|
//
|
|
// 7) Show disclaimer modal on page load, hide on "I Understand"
|
|
//
|
|
const disclaimerModal = document.getElementById("disclaimerModal");
|
|
const acceptDisclaimerBtn = document.getElementById("acceptDisclaimer");
|
|
if (disclaimerModal) {
|
|
// Show immediately
|
|
disclaimerModal.classList.remove("hidden");
|
|
if (acceptDisclaimerBtn) {
|
|
acceptDisclaimerBtn.addEventListener("click", () => {
|
|
disclaimerModal.classList.add("hidden");
|
|
});
|
|
}
|
|
}
|
|
|
|
//
|
|
// 8) Query param checks for the three new forms
|
|
//
|
|
// ?modal=feedback => open generalFeedbackModal
|
|
// ?modal=feature => open featureRequestModal
|
|
// ?modal=bug => open bugFixModal
|
|
//
|
|
if (modalParam === "feedback") {
|
|
const feedbackModal = document.getElementById("generalFeedbackModal");
|
|
if (feedbackModal) {
|
|
feedbackModal.classList.remove("hidden");
|
|
}
|
|
} else if (modalParam === "feature") {
|
|
const featureModal = document.getElementById("featureRequestModal");
|
|
if (featureModal) {
|
|
featureModal.classList.remove("hidden");
|
|
}
|
|
} else if (modalParam === "bug") {
|
|
const bugModal = document.getElementById("bugFixModal");
|
|
if (bugModal) {
|
|
bugModal.classList.remove("hidden");
|
|
}
|
|
}
|
|
|
|
//
|
|
// 9) Close buttons for the three new forms
|
|
//
|
|
// general feedback
|
|
const closeFeedbackBtn = document.getElementById(
|
|
"closeGeneralFeedbackModal"
|
|
);
|
|
if (closeFeedbackBtn) {
|
|
closeFeedbackBtn.addEventListener("click", () => {
|
|
const feedbackModal = document.getElementById(
|
|
"generalFeedbackModal"
|
|
);
|
|
if (feedbackModal) {
|
|
feedbackModal.classList.add("hidden");
|
|
}
|
|
});
|
|
}
|
|
|
|
// feature request
|
|
const closeFeatureBtn = document.getElementById(
|
|
"closeFeatureRequestModal"
|
|
);
|
|
if (closeFeatureBtn) {
|
|
closeFeatureBtn.addEventListener("click", () => {
|
|
const featureModal = document.getElementById("featureRequestModal");
|
|
if (featureModal) {
|
|
featureModal.classList.add("hidden");
|
|
}
|
|
});
|
|
}
|
|
|
|
// bug fix
|
|
const closeBugBtn = document.getElementById("closeBugFixModal");
|
|
if (closeBugBtn) {
|
|
closeBugBtn.addEventListener("click", () => {
|
|
const bugModal = document.getElementById("bugFixModal");
|
|
if (bugModal) {
|
|
bugModal.classList.add("hidden");
|
|
}
|
|
});
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<!-- Other Scripts -->
|
|
<script src="js/libs/nostr.bundle.js"></script>
|
|
<script type="module" src="js/config.js"></script>
|
|
<script type="module" src="js/lists.js"></script>
|
|
<script type="module" src="js/accessControl.js"></script>
|
|
<script type="module" src="js/webtorrent.js"></script>
|
|
<script type="module" src="js/nostr.js"></script>
|
|
<script type="module" src="js/viewManager.js"></script>
|
|
<script type="module" src="js/app.js"></script>
|
|
</body>
|
|
</html>
|