NuvioStreaming_backup_24-10-25/index.html
2025-10-13 12:28:36 +05:30

2062 lines
No EOL
67 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nuvio - Media Hub</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* Privacy Policy Styles */
.privacy-policy {
min-height: 100vh;
padding: 4rem 0;
background: linear-gradient(135deg, #000000 0%, #0a0a0a 15%, #1a1a1a 35%, #0f0f0f 65%, #000000 100%);
background-attachment: fixed;
}
.privacy-content {
max-width: 800px;
margin: 0 auto;
position: relative;
}
.privacy-back-btn {
display: flex;
align-items: center;
gap: 0.5rem;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
padding: 0.75rem 1.25rem;
color: white;
font-size: 0.9rem;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
margin-bottom: 2rem;
backdrop-filter: blur(10px);
}
.privacy-back-btn:hover {
background: rgba(255, 255, 255, 0.15);
border-color: rgba(255, 255, 255, 0.3);
transform: translateY(-2px);
}
.privacy-content h1 {
font-size: 3rem;
font-weight: 800;
color: white;
margin-bottom: 0.5rem;
text-align: center;
background: linear-gradient(135deg, #ffffff 0%, #e0e0e0 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.last-updated {
text-align: center;
color: rgba(255, 255, 255, 0.6);
font-size: 0.9rem;
margin-bottom: 3rem;
}
.privacy-section {
margin-bottom: 2.5rem;
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 16px;
padding: 2rem;
backdrop-filter: blur(10px);
}
.privacy-section h2 {
font-size: 1.5rem;
font-weight: 700;
color: white;
margin-bottom: 1rem;
border-bottom: 2px solid rgba(255, 255, 255, 0.1);
padding-bottom: 0.5rem;
}
.privacy-section h3 {
font-size: 1.2rem;
font-weight: 600;
color: white;
margin: 1.5rem 0 0.75rem 0;
}
.privacy-section p {
color: rgba(255, 255, 255, 0.8);
line-height: 1.7;
margin-bottom: 1rem;
}
.privacy-section ul {
list-style: none;
padding: 0;
margin: 1rem 0;
}
.privacy-section li {
color: rgba(255, 255, 255, 0.8);
line-height: 1.7;
margin-bottom: 0.75rem;
padding-left: 1.5rem;
position: relative;
}
.privacy-section li::before {
content: '•';
color: rgba(255, 255, 255, 0.4);
position: absolute;
left: 0;
font-weight: bold;
}
.privacy-section a {
color: #4a9eff;
text-decoration: none;
transition: color 0.3s ease;
}
.privacy-section a:hover {
color: #66b3ff;
text-decoration: underline;
}
.privacy-link {
color: rgba(255, 255, 255, 0.8);
text-decoration: none;
font-size: 0.9rem;
font-weight: 500;
transition: all 0.3s ease;
position: relative;
padding: 0.5rem 0;
}
.privacy-link::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
background: linear-gradient(90deg, #4a9eff, #66b3ff);
transition: width 0.3s ease;
}
.privacy-link:hover {
color: white;
}
.privacy-link:hover::after {
width: 100%;
}
/* Mobile responsive for privacy policy */
@media (max-width: 768px) {
.privacy-policy {
padding: 2rem 0;
}
.privacy-content {
padding: 0 1rem;
}
.privacy-content h1 {
font-size: 2.2rem;
}
.privacy-section {
padding: 1.5rem;
margin-bottom: 2rem;
}
.privacy-section h2 {
font-size: 1.3rem;
}
.privacy-section h3 {
font-size: 1.1rem;
}
.privacy-back-btn {
padding: 0.625rem 1rem;
font-size: 0.85rem;
}
}
@media (max-width: 480px) {
.privacy-content h1 {
font-size: 1.8rem;
}
.privacy-section {
padding: 1.25rem;
border-radius: 12px;
}
.privacy-section h2 {
font-size: 1.2rem;
}
.privacy-section h3 {
font-size: 1rem;
}
.privacy-section p,
.privacy-section li {
font-size: 0.9rem;
}
}
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
html, body {
width: 100%;
min-height: 100%;
margin: 0;
padding: 0;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: linear-gradient(135deg, #000000 0%, #0a0a0a 15%, #1a1a1a 35%, #0f0f0f 65%, #000000 100%);
background-attachment: fixed;
color: #ffffff;
overflow-x: hidden;
line-height: 1.6;
width: 100vw;
min-height: 100vh;
display: flex;
flex-direction: column;
}
.container {
width: 100%;
margin: 0 auto;
padding: 0 3rem;
}
/* Hero Section */
.hero {
min-height: 100vh;
height: auto;
width: 100vw;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
background: transparent;
position: relative;
overflow: hidden;
padding: 2rem 0;
margin: 0;
}
.hero::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background:
radial-gradient(circle at 20% 80%, rgba(40, 40, 40, 0.15) 0%, transparent 50%),
radial-gradient(circle at 80% 20%, rgba(60, 60, 60, 0.15) 0%, transparent 50%),
radial-gradient(circle at 40% 40%, rgba(80, 80, 80, 0.1) 0%, transparent 50%);
animation: float 20s ease-in-out infinite;
}
.hero::after {
content: '';
position: absolute;
top: 10%;
left: 10%;
right: 10%;
bottom: 10%;
background:
linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.01) 50%, transparent 70%),
linear-gradient(-45deg, transparent 30%, rgba(100, 100, 100, 0.02) 50%, transparent 70%);
border-radius: 50%;
animation: rotate 30s linear infinite;
}
@keyframes float {
0%, 100% { transform: translateY(0px) rotate(0deg); }
33% { transform: translateY(-20px) rotate(1deg); }
66% { transform: translateY(10px) rotate(-1deg); }
}
@keyframes rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.hero-content {
position: relative;
z-index: 3;
max-width: 1100px;
padding: 0 2rem;
}
.hero-content::before {
content: '';
position: absolute;
top: -50px;
left: -50px;
right: -50px;
bottom: -50px;
background: radial-gradient(ellipse at center, rgba(255, 255, 255, 0.015) 0%, transparent 70%);
border-radius: 50%;
z-index: -1;
}
.hero-title {
display: flex;
align-items: center;
justify-content: center;
gap: 2rem;
margin-bottom: 2rem;
animation: fadeInUp 1s ease-out both;
}
.hero-logo {
width: clamp(7rem, 18vw, 12rem);
height: clamp(7rem, 18vw, 12rem);
object-fit: contain;
filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.3));
}
.hero h1 {
font-size: clamp(6rem, 15vw, 10rem);
font-weight: 800;
margin-bottom: 0;
background: linear-gradient(120deg, #ffffff 0%, #e8f0ff 25%, #f0e8ff 50%, #e8fffb 75%, #ffffff 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
background-size: 300% 300%;
letter-spacing: -0.05em;
line-height: 1.1;
text-transform: uppercase;
animation: nuvioGradient 20s ease-in-out infinite;
position: relative;
z-index: 1;
text-shadow: 0 0 40px rgba(255, 255, 255, 0.15);
transform-style: preserve-3d;
}
.hero h1::before {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg, rgba(100, 100, 100, 0.1) 0%, rgba(150, 150, 150, 0.1) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
transform: translateZ(-1px) scale(1.02);
filter: blur(2px);
opacity: 0.6;
}
@keyframes nuvioGradient {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
@keyframes titleFloat {
0%, 100% { transform: translateY(0px) rotateX(0deg); }
50% { transform: translateY(-10px) rotateX(2deg); }
}
.hero p {
font-family: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
font-size: clamp(1.8rem, 4.5vw, 2.2rem);
font-weight: 300;
letter-spacing: 0.02em;
opacity: 0.95;
margin-bottom: 3rem;
max-width: 700px;
margin-left: auto;
margin-right: auto;
line-height: 1.5;
color: #ffffff;
position: relative;
z-index: 1;
animation: fadeInUp 1s ease-out 0.5s both;
text-shadow: 0 2px 20px rgba(255, 255, 255, 0.1);
background: linear-gradient(135deg, #ffffff 0%, #e0e0e0 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
@keyframes fadeInUp {
0% {
opacity: 0;
transform: translateY(30px);
}
100% {
opacity: 0.9;
transform: translateY(0);
}
}
.download-buttons {
display: flex;
gap: 2rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 1rem;
animation: fadeInUp 1s ease-out 1s both;
}
.download-buttons::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 300px;
height: 300px;
background: radial-gradient(circle, rgba(100, 100, 100, 0.05) 0%, transparent 70%);
transform: translate(-50%, -50%);
border-radius: 50%;
animation: pulse 4s ease-in-out infinite;
z-index: -1;
}
@keyframes pulse {
0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.3; }
50% { transform: translate(-50%, -50%) scale(1.2); opacity: 0.1; }
}
.download-btn {
display: inline-flex;
align-items: center;
gap: 1rem;
padding: 1.25rem 2.5rem;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 60px;
color: white;
text-decoration: none;
font-size: 1.1rem;
font-weight: 500;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
backdrop-filter: blur(30px);
letter-spacing: 0.005em;
position: relative;
overflow: hidden;
}
.download-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
transition: left 0.6s;
}
.download-btn:hover::before {
left: 100%;
}
.download-btn:hover {
background: rgba(120, 120, 120, 0.15);
border-color: rgba(150, 150, 150, 0.4);
transform: translateY(-3px);
box-shadow: 0 15px 40px rgba(100, 100, 100, 0.2);
}
.download-btn svg {
width: 22px;
height: 22px;
opacity: 0.9;
}
.scroll-down {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
color: rgba(255, 255, 255, 0.7);
text-decoration: none;
transition: all 0.3s ease;
animation: fadeInUp 1s ease-out 1.5s both;
margin-top: 3rem;
}
.scroll-down:hover {
color: rgba(255, 255, 255, 1);
transform: translateY(-5px);
}
.scroll-down-arrow {
width: 24px;
height: 24px;
border: 2px solid currentColor;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
animation: bounce 2s infinite;
}
.scroll-down-arrow svg {
width: 12px;
height: 12px;
}
.scroll-down-text {
font-size: 0.9rem;
font-weight: 300;
letter-spacing: 0.1em;
text-transform: uppercase;
}
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-8px);
}
60% {
transform: translateY(-4px);
}
}
/* Features Section */
.features {
min-height: 100vh;
padding: 4rem 0;
background: transparent;
width: 100%;
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: center;
}
.features::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.05) 50%, transparent 100%);
}
.features::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image:
radial-gradient(circle at 20% 30%, rgba(255, 255, 255, 0.02) 1px, transparent 1px),
radial-gradient(circle at 80% 70%, rgba(255, 255, 255, 0.015) 1px, transparent 1px),
radial-gradient(circle at 40% 80%, rgba(255, 255, 255, 0.01) 1px, transparent 1px);
background-size: 100px 100px, 150px 150px, 200px 200px;
animation: floatParticles 20s linear infinite;
pointer-events: none;
}
@keyframes floatParticles {
0% { transform: translateY(0) rotate(0deg); }
100% { transform: translateY(-20px) rotate(360deg); }
}
.features h2 {
text-align: center;
font-size: 3.2rem;
font-weight: 700;
margin-bottom: 6rem;
color: #ffffff;
opacity: 0.95;
letter-spacing: -0.03em;
line-height: 1.2;
position: relative;
background: linear-gradient(135deg, #ffffff 0%, #cccccc 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.features h2::after {
content: '';
position: absolute;
bottom: -20px;
left: 50%;
transform: translateX(-50%);
width: 80px;
height: 3px;
background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.6) 50%, transparent 100%);
border-radius: 2px;
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 3rem;
}
/* Mobile Carousel Styles */
@media (max-width: 768px) {
.features-grid {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
gap: 2rem;
padding: 0 1rem;
scrollbar-width: none;
-ms-overflow-style: none;
}
.features-grid::-webkit-scrollbar {
display: none;
}
.feature-card {
flex: 0 0 85%;
scroll-snap-align: center;
max-width: 350px;
}
}
.feature-card {
background: rgba(255, 255, 255, 0.025);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 32px;
padding: 4rem 3rem;
text-align: left;
transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
backdrop-filter: blur(30px);
position: relative;
overflow: hidden;
cursor: pointer;
}
.feature-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.08) 0%,
rgba(255, 255, 255, 0.02) 50%,
transparent 100%);
opacity: 0;
transition: all 0.6s ease;
transform: translateX(-100%);
}
.feature-card::after {
content: '';
position: absolute;
top: -50%;
right: -50%;
width: 100%;
height: 200%;
background: linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.03) 50%, transparent 70%);
transform: rotate(45deg);
opacity: 0;
transition: all 0.8s ease;
}
.feature-card:hover::before {
opacity: 1;
transform: translateX(0);
}
.feature-card:hover::after {
opacity: 1;
animation: shimmerSweep 1.5s ease-in-out;
}
@keyframes shimmerSweep {
0% { transform: translateX(-100%) rotate(45deg); }
100% { transform: translateX(100%) rotate(45deg); }
}
.feature-card:hover {
transform: translateY(-12px) scale(1.02);
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.25);
box-shadow:
0 25px 80px rgba(0, 0, 0, 0.6),
0 0 0 1px rgba(255, 255, 255, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.feature-icon {
width: 80px;
height: 80px;
margin-bottom: 2rem;
color: #cccccc;
opacity: 0.9;
position: relative;
z-index: 1;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, 0.03);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.08);
transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
backdrop-filter: blur(20px);
}
.feature-icon svg {
width: 40px;
height: 40px;
transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.feature-card:hover .feature-icon {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
transform: translateY(-5px) scale(1.1);
box-shadow: 0 15px 40px rgba(255, 255, 255, 0.1);
}
.feature-card:hover .feature-icon svg {
transform: scale(1.2) rotate(5deg);
color: #ffffff;
}
.feature-card h3 {
font-size: 1.6rem;
font-weight: 700;
margin-bottom: 1.5rem;
color: #ffffff;
letter-spacing: -0.02em;
line-height: 1.3;
position: relative;
z-index: 1;
transition: all 0.4s ease;
}
.feature-card:hover h3 {
transform: translateY(-2px);
text-shadow: 0 4px 20px rgba(255, 255, 255, 0.2);
}
.feature-card p {
opacity: 0.75;
line-height: 1.8;
font-weight: 400;
font-size: 1.05rem;
position: relative;
z-index: 1;
transition: all 0.4s ease;
color: #e0e0e0;
}
.feature-card:hover p {
opacity: 0.9;
transform: translateY(-1px);
}
/* Screenshots Section */
.screenshots {
min-height: 100vh;
padding: 4rem 0;
background: transparent;
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
}
.screenshots h2 {
text-align: center;
font-size: 2.8rem;
font-weight: 600;
margin-bottom: 5rem;
color: #ffffff;
opacity: 0.95;
letter-spacing: -0.03em;
line-height: 1.2;
}
.screenshots-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 2.5rem;
}
.screenshot {
background: rgba(255, 255, 255, 0.025);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 28px;
padding: 2rem;
text-align: center;
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
backdrop-filter: blur(30px);
position: relative;
overflow: hidden;
cursor: pointer;
}
.screenshot::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg, rgba(168, 85, 247, 0.02) 0%, transparent 50%);
opacity: 0;
transition: opacity 0.5s ease;
}
.screenshot:hover::before {
opacity: 1;
}
.screenshot:hover {
transform: translateY(-5px) scale(1.02);
background: rgba(255, 255, 255, 0.05);
border-color: rgba(168, 85, 247, 0.25);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
}
.screenshot img {
width: 100%;
height: auto;
max-height: 500px;
object-fit: contain;
border-radius: 16px;
margin-bottom: 1.5rem;
opacity: 0.95;
position: relative;
z-index: 1;
transition: all 0.4s ease;
}
.screenshot:hover img {
transform: scale(1.05);
opacity: 1;
}
/* Modal Styles */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.95);
backdrop-filter: blur(20px);
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
visibility: hidden;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.modal-overlay.active {
opacity: 1;
visibility: visible;
}
.modal-content {
position: relative;
max-width: 90vw;
max-height: 90vh;
transform: scale(0.8) translateY(50px);
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.modal-overlay.active .modal-content {
transform: scale(1) translateY(0);
}
.modal-image {
width: 100%;
height: auto;
max-width: 100%;
max-height: 90vh;
object-fit: contain;
border-radius: 20px;
box-shadow: 0 25px 100px rgba(0, 0, 0, 0.8);
}
.modal-close {
position: absolute;
top: -50px;
right: 0;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 50%;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
color: white;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(20px);
}
.modal-close:hover {
background: rgba(255, 255, 255, 0.2);
transform: scale(1.1);
}
.modal-title {
position: absolute;
bottom: -60px;
left: 50%;
transform: translateX(-50%);
color: white;
font-size: 1.2rem;
font-weight: 500;
text-align: center;
opacity: 0.9;
}
/* iOS Installation Modal */
.ios-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.9);
backdrop-filter: blur(20px);
z-index: 2000;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
visibility: hidden;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.ios-modal.active {
opacity: 1;
visibility: visible;
}
.ios-modal-content {
background: rgba(20, 20, 20, 0.95);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 24px;
padding: 2.5rem;
max-width: 500px;
width: 90%;
backdrop-filter: blur(30px);
transform: scale(0.8) translateY(50px);
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
}
.ios-modal.active .ios-modal-content {
transform: scale(1) translateY(0);
}
.ios-modal-header {
text-align: center;
margin-bottom: 2rem;
}
.ios-modal-title {
color: white;
font-size: 1.8rem;
font-weight: 600;
margin-bottom: 0.5rem;
letter-spacing: -0.02em;
}
.ios-modal-subtitle {
color: rgba(255, 255, 255, 0.7);
font-size: 1rem;
font-weight: 400;
}
.ios-install-options {
display: flex;
flex-direction: column;
gap: 1rem;
}
.ios-install-option {
display: flex;
align-items: center;
gap: 1rem;
padding: 1.25rem;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
color: white;
text-decoration: none;
transition: all 0.3s ease;
cursor: pointer;
}
.ios-install-option:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
transform: translateY(-2px);
}
.ios-option-icon {
width: 48px;
height: 48px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.ios-option-icon img {
width: 32px;
height: 32px;
border-radius: 8px;
}
.ios-option-content {
flex: 1;
}
.ios-option-title {
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 0.25rem;
color: white;
}
.ios-option-description {
font-size: 0.9rem;
color: rgba(255, 255, 255, 0.6);
line-height: 1.4;
}
.ios-modal-close {
position: absolute;
top: 1rem;
right: 1rem;
background: rgba(255, 255, 255, 0.1);
border: none;
border-radius: 50%;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
color: white;
cursor: pointer;
transition: all 0.3s ease;
font-size: 1.2rem;
}
.ios-modal-close:hover {
background: rgba(255, 255, 255, 0.2);
transform: scale(1.1);
}
.copy-feedback {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: rgba(0, 0, 0, 0.8);
color: white;
padding: 1rem 2rem;
border-radius: 12px;
font-size: 0.9rem;
z-index: 3000;
opacity: 0;
transition: opacity 0.3s ease;
}
.copy-feedback.show {
opacity: 1;
}
/* Mobile Responsive Styles for iOS Modal */
@media (max-width: 768px) {
.ios-modal-content {
padding: 1.5rem;
margin: 1rem;
max-width: calc(100% - 2rem);
width: calc(100% - 2rem);
border-radius: 20px;
}
.ios-modal-title {
font-size: 1.5rem;
margin-bottom: 0.25rem;
}
.ios-modal-subtitle {
font-size: 0.9rem;
}
.ios-modal-header {
margin-bottom: 1.5rem;
}
.ios-install-option {
padding: 1rem;
gap: 0.75rem;
border-radius: 12px;
}
.ios-option-icon {
width: 40px;
height: 40px;
border-radius: 10px;
}
.ios-option-icon img {
width: 28px;
height: 28px;
border-radius: 6px;
}
.ios-option-title {
font-size: 1rem;
margin-bottom: 0.2rem;
}
.ios-option-description {
font-size: 0.85rem;
line-height: 1.3;
}
.ios-modal-close {
top: 0.75rem;
right: 0.75rem;
width: 32px;
height: 32px;
font-size: 1.1rem;
}
.copy-feedback {
padding: 0.75rem 1.5rem;
font-size: 0.85rem;
border-radius: 10px;
margin: 0 1rem;
max-width: calc(100% - 2rem);
}
}
@media (max-width: 480px) {
.ios-modal-content {
padding: 1.25rem;
margin: 0.75rem;
max-width: calc(100% - 1.5rem);
width: calc(100% - 1.5rem);
border-radius: 16px;
}
.ios-modal-title {
font-size: 1.3rem;
}
.ios-modal-subtitle {
font-size: 0.85rem;
}
.ios-install-option {
padding: 0.875rem;
gap: 0.625rem;
border-radius: 10px;
}
.ios-option-icon {
width: 36px;
height: 36px;
border-radius: 8px;
}
.ios-option-icon img {
width: 24px;
height: 24px;
border-radius: 5px;
}
.ios-option-title {
font-size: 0.95rem;
}
.ios-option-description {
font-size: 0.8rem;
}
.ios-modal-close {
top: 0.5rem;
right: 0.5rem;
width: 30px;
height: 30px;
font-size: 1rem;
}
.copy-feedback {
padding: 0.625rem 1.25rem;
font-size: 0.8rem;
border-radius: 8px;
}
}
.screenshot h4 {
font-size: 1rem;
font-weight: 500;
color: #ffffff;
opacity: 0.8;
position: relative;
z-index: 1;
}
/* Footer */
.footer {
padding: 5rem 0 3rem;
background: transparent;
text-align: center;
border-top: 1px solid rgba(255, 255, 255, 0.08);
width: 100%;
margin-top: auto;
}
.credits {
margin-bottom: 3rem;
padding: 2rem 0;
}
.credits h3 {
color: #ffffff;
font-size: 1.2rem;
margin-bottom: 2rem;
opacity: 0.9;
}
.credits-grid {
display: flex;
justify-content: center;
align-items: center;
gap: 3rem;
flex-wrap: wrap;
max-width: 800px;
margin: 0 auto;
}
.credit-item {
display: flex;
align-items: center;
gap: 0.5rem;
opacity: 0.8;
transition: opacity 0.3s ease, transform 0.3s ease;
}
.credit-item:hover {
opacity: 1;
transform: translateY(-2px);
}
.credit-logo {
height: 32px;
width: auto;
filter: brightness(0.9);
}
.stremio-logos {
display: flex;
align-items: center;
gap: 0.5rem;
}
.footer p {
opacity: 0.5;
margin-bottom: 3rem;
font-weight: 400;
font-size: 1rem;
}
.footer-links {
display: flex;
justify-content: center;
gap: 4rem;
flex-wrap: wrap;
margin-bottom: 2rem;
}
.footer-links a {
color: #cccccc;
text-decoration: none;
transition: all 0.3s ease;
font-weight: 500;
font-size: 1rem;
opacity: 0.8;
position: relative;
}
.footer-links a::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 2px;
background: #cccccc;
transition: width 0.3s ease;
}
.footer-links a:hover::after {
width: 100%;
}
.footer-links a:hover {
opacity: 1;
transform: translateY(-2px);
}
.github-link {
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.github-logo {
width: 20px;
height: 20px;
filter: invert(1);
}
/* Discord icon styling to make it white */
.footer-links a[href*="discord"] .github-logo {
filter: brightness(0) invert(1);
}
@media (max-width: 768px) {
.credits-grid {
gap: 2rem;
}
.credit-logo {
height: 28px;
}
}
/* Responsive */
@media (max-width: 1024px) {
.container {
padding: 0 2rem;
}
.features-grid {
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 2rem;
}
.feature-card {
padding: 3rem 2.5rem;
}
}
@media (max-width: 768px) {
.container {
padding: 0 1.5rem;
}
.hero {
padding: 2rem 0;
min-height: 100vh;
}
.hero-title {
flex-direction: column;
gap: 1rem;
}
.hero-logo {
width: clamp(5rem, 15vw, 8rem);
height: clamp(5rem, 15vw, 8rem);
}
.hero h1 {
font-size: clamp(3rem, 12vw, 8rem);
margin-bottom: 1.5rem;
}
.hero p {
font-size: 1.1rem;
margin-bottom: 2.5rem;
}
.scroll-down {
display: flex;
margin-top: 2rem;
}
.download-buttons {
flex-direction: column;
align-items: center;
gap: 1.5rem;
}
.download-btn {
width: 100%;
max-width: 300px;
justify-content: center;
}
.features,
.screenshots {
padding: 3rem 0;
min-height: 100vh;
}
.features h2 {
font-size: 2.5rem;
margin-bottom: 3rem;
}
.screenshots h2 {
font-size: 2.2rem;
margin-bottom: 3rem;
}
.features-grid {
grid-template-columns: 1fr;
gap: 2rem;
}
.feature-card {
padding: 3rem 2rem;
}
.screenshots-grid {
grid-template-columns: 1fr;
gap: 2rem;
}
.footer-links {
gap: 2rem;
}
}
@media (max-width: 480px) {
.container {
padding: 0 1rem;
}
.hero {
min-height: 80vh;
padding: 1.5rem 0;
}
.hero h1 {
font-size: clamp(2.5rem, 10vw, 6rem);
margin-bottom: 1rem;
}
.hero p {
font-size: 1rem;
margin-bottom: 2rem;
}
.features,
.screenshots {
padding: 3rem 0;
}
.features h2,
.screenshots h2 {
font-size: 1.8rem;
margin-bottom: 2rem;
}
.feature-card {
padding: 2rem 1.5rem;
}
.screenshot {
padding: 1.5rem;
}
}
/* Mobile focus highlight removal */
a, button, .download-btn, .privacy-back-btn, .ios-install-option, .ios-modal-close, .scroll-down {
-webkit-tap-highlight-color: transparent;
}
a:focus, a:active, button:focus, button:active,
.download-btn:focus, .download-btn:active,
.privacy-back-btn:focus, .privacy-back-btn:active,
.ios-install-option:focus, .ios-install-option:active,
.ios-modal-close:focus, .ios-modal-close:active,
.scroll-down:focus, .scroll-down:active {
outline: none;
box-shadow: none;
}
/* Apply tap highlight and focus removal globally, including feature cards and screenshots */
* {
-webkit-tap-highlight-color: transparent;
}
*:focus, *:active {
outline: none !important;
box-shadow: none !important;
}
</style>
</head>
<body>
<section class="hero">
<div class="hero-content">
<div class="hero-title">
<img src="assets/splash-icon.png" alt="Nuvio Logo" class="hero-logo">
<h1 data-text="NUVIO">NUVIO</h1>
</div>
<p>The Ultimate Open-Source Media Experience</p>
<div class="download-buttons">
<a href="https://github.com/tapframe/NuvioStreaming/releases" class="download-btn">
Download for Android
</a>
<a href="#" class="download-btn" id="ios-install-btn">
Install for iOS
</a>
</div>
<a href="#features" class="scroll-down">
<div class="scroll-down-arrow">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 13L12 18L17 13" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<span class="scroll-down-text">Explore</span>
</a>
</div>
</section>
<!-- iOS Installation Modal -->
<div id="ios-modal" class="ios-modal">
<div class="ios-modal-content">
<button class="ios-modal-close" id="ios-modal-close">×</button>
<div class="ios-modal-header">
<h3 class="ios-modal-title">Install Nuvio on iOS</h3>
<p class="ios-modal-subtitle">Choose your preferred installation method</p>
</div>
<div class="ios-install-options">
<a href="https://github.com/tapframe/NuvioStreaming/releases" class="ios-install-option" id="direct-download">
<div class="ios-option-icon">
<img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyIDJMMTMuMDkgOC4yNkwyMCA5TDEzLjA5IDE1Ljc0TDEyIDIyTDEwLjkxIDE1Ljc0TDQgOUwxMC45MSA4LjI2TDEyIDJaIiBmaWxsPSIjNjY2NjY2Ii8+Cjwvc3ZnPgo=" alt="Direct Download">
</div>
<div class="ios-option-content">
<div class="ios-option-title">Direct Download</div>
<div class="ios-option-description">Download the IPA file directly to your device</div>
</div>
</a>
<a href="https://tinyurl.com/NuvioAltstore" class="ios-install-option" id="altstore-install">
<div class="ios-option-icon">
<img src="https://upload.wikimedia.org/wikipedia/commons/2/20/AltStore_logo.png" alt="AltStore">
</div>
<div class="ios-option-content">
<div class="ios-option-title">Install via AltStore</div>
<div class="ios-option-description">One-click installation through AltStore</div>
</div>
</a>
<a href="https://tinyurl.com/NuvioSidestore" class="ios-install-option" id="sidestore-install">
<div class="ios-option-icon">
<img src="https://github.com/SideStore/assets/blob/main/icon.png?raw=true" alt="SideStore">
</div>
<div class="ios-option-content">
<div class="ios-option-title">Install via SideStore</div>
<div class="ios-option-description">One-click installation through SideStore</div>
</div>
</a>
<div class="ios-install-option" id="copy-url">
<div class="ios-option-icon">
<img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTggNUMzIDUgMyA1IDMgMTBWMTRDMyAxOSAzIDE5IDggMTlIMTZDMjEgMTkgMjEgMTkgMjEgMTRWMTBDMjEgNSAyMSA1IDE2IDVIOFoiIHN0cm9rZT0iIzY2NjY2NiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPHBhdGggZD0iTTEwIDEySDEwLjAxIiBzdHJva2U9IiM2NjY2NjYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0xNCAxMkgxNC4wMSIgc3Ryb2tlPSIjNjY2NjY2IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K" alt="Copy URL">
</div>
<div class="ios-option-content">
<div class="ios-option-title">Copy Source URL</div>
<div class="ios-option-description">Copy the repository URL to add manually</div>
</div>
</div>
</div>
</div>
</div>
<!-- Copy Feedback -->
<div id="copy-feedback" class="copy-feedback">
URL copied to clipboard!
</div>
<section class="features" id="features">
<div class="container">
<h2>POWERFUL FEATURES</h2>
<div class="features-grid">
<div class="feature-card" data-aos="fade-up" data-aos-delay="100">
<div class="feature-icon">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L3 7L12 12L21 7L12 2Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 17L12 22L21 17" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3 12L12 17L21 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<h3>Stremio Addon Support</h3>
<p>Full compatibility with Stremio addons, allowing you to access your favorite content providers seamlessly.</p>
</div>
<div class="feature-card" data-aos="fade-up" data-aos-delay="200">
<div class="feature-icon">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L13.09 8.26L22 9L17 14L18.18 23L12 19.77L5.82 23L7 14L2 9L10.91 8.26L12 2Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<h3>Advanced Rating System</h3>
<p>Comprehensive rating screens with IMDB, TMDB, Rotten Tomatoes, and Metacritic scores for informed viewing decisions.</p>
</div>
<div class="feature-card" data-aos="fade-up" data-aos-delay="300">
<div class="feature-icon">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 1L3 5V11C3 16.55 6.84 21.74 12 23C17.16 21.74 21 16.55 21 11V5L12 1Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9 12L11 14L15 10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<h3>Deep Customization</h3>
<p>Extensive customization options including themes, player settings, notification preferences, and personalized content discovery.</p>
</div>
<div class="feature-card" data-aos="fade-up" data-aos-delay="400">
<div class="feature-icon">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9 12L11 14L15 10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/>
</svg>
</div>
<h3>Watch Progress Tracking</h3>
<p>Seamless progress synchronization across devices with Trakt.tv integration and local watch history management.</p>
</div>
<div class="feature-card" data-aos="fade-up" data-aos-delay="500">
<div class="feature-icon">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21 16V8A2 2 0 0 0 19 6H5A2 2 0 0 0 3 8V16A2 2 0 0 0 5 18H19A2 2 0 0 0 21 16Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<polygon points="7 10 12 15 17 10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<h3>Multi-Platform Support</h3>
<p>Available on iOS and Android platforms with consistent experience and cross-device synchronization</p>
</div>
</div>
</div>
</section>
<section class="screenshots">
<div class="container">
<h2>SEE IT IN ACTION</h2>
<div class="screenshots-grid">
<div class="screenshot">
<img src="screenshots/Simulator Screenshot - iPhone 16 Pro - 2025-08-27 at 21.08.32-portrait.png" alt="Home Screen" loading="lazy">
<h4>Home Screen</h4>
</div>
<div class="screenshot">
<img src="screenshots/WhatsApp Image 2025-09-02 at 00.24.31-portrait.png" alt="App Interface" loading="lazy">
<h4>Details Page</h4>
</div>
<div class="screenshot">
<img src="screenshots/Simulator Screenshot - iPhone 16 Pro - 2025-08-27 at 21.09.43-portrait.png" alt="Home Screen 2" loading="lazy">
<h4>Home Screen 2</h4>
</div>
<div class="screenshot">
<img src="screenshots/Simulator Screenshot - iPhone 16 Pro - 2025-08-27 at 21.10.14-portrait.png" alt="Library" loading="lazy">
<h4>Library</h4>
</div>
<div class="screenshot">
<img src="screenshots/Simulator Screenshot - iPhone 16 Pro - 2025-08-27 at 21.12.41-landscape.png" alt="Player Loading" loading="lazy">
<h4>Player Loading</h4>
</div>
<div class="screenshot">
<img src="screenshots/Simulator Screenshot - iPhone 16 Pro - 2025-08-27 at 21.13.36-landscape.png" alt="Video Player" loading="lazy">
<h4>Video Player</h4>
</div>
<div class="screenshot">
<img src="screenshots/ratingscreen-portrait.png" alt="Ratings" loading="lazy">
<h4>Ratings</h4>
</div>
<div class="screenshot">
<img src="screenshots/seasonandepisode-portrait.png" alt="Episodes & Seasons" loading="lazy">
<h4>Episodes & Seasons</h4>
</div>
<div class="screenshot">
<img src="screenshots/search-portrait.png" alt="Search & Details" loading="lazy">
<h4>Search & Details</h4>
</div>
</div>
</div>
</section>
<!-- Privacy Policy Section -->
<section id="privacy-policy" class="privacy-policy" style="display: none;">
<div class="container">
<div class="privacy-content">
<button class="privacy-back-btn" onclick="hidePrivacyPolicy()">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M19 12H5M12 19l-7-7 7-7"/>
</svg>
Back
</button>
<h1>Privacy Policy</h1>
<p class="last-updated">Last updated: January 2025</p>
<div class="privacy-section">
<h2>Data Collection</h2>
<p>Nuvio does not collect personal information. We only store:</p>
<ul>
<li><strong>User preferences:</strong> App settings and viewing preferences for account sync</li>
<li><strong>Viewing history:</strong> Stored locally on your device for your own use</li>
</ul>
</div>
<div class="privacy-section">
<h2>How We Use Your Data</h2>
<p>Your data is stored for your own purposes:</p>
<ul>
<li>Sync your preferences and viewing history across your devices</li>
<li>Maintain your app settings and customizations</li>
</ul>
<p>We do not personalize recommendations or use your data for any other purposes.</p>
</div>
<div class="privacy-section">
<h2>Third-Party Services</h2>
<p>Nuvio integrates with third-party services that have their own privacy policies:</p>
<ul>
<li><strong>Trakt.tv:</strong> For tracking viewing progress (optional)</li>
<li><strong>TMDB:</strong> For movie and TV show information</li>
</ul>
</div>
<div class="privacy-section">
<h2>Open Source</h2>
<p>Nuvio is open-source. You can review our code and data handling on our <a href="https://github.com/tapframe/NuvioStreaming" target="_blank">GitHub repository</a> to verify our privacy practices.</p>
</div>
<div class="privacy-section">
<h2>Contact</h2>
<p>Questions about this policy? Contact us through our <a href="https://github.com/tapframe/NuvioStreaming/issues" target="_blank">GitHub repository</a>.</p>
</div>
</div>
</div>
</section>
<footer class="footer">
<div class="container">
<div class="credits">
<h3>Special Thanks</h3>
<div class="credits-grid">
<div class="credit-item">
<img src="https://www.themoviedb.org/assets/2/v4/logos/v2/blue_square_2-d537fb228cf3ded904ef09b136fe3fec72548ebc1fea3fbbd1ad9e36364db38b.svg" alt="TMDB" class="credit-logo">
</div>
<div class="credit-item">
<div class="stremio-logos">
<img src="https://www.stremio.com/website/stremio-logo-small.png" alt="Stremio" class="credit-logo">
<img src="https://www.stremio.com/website/stremio-txt-logo-small.png" alt="Stremio" class="credit-logo">
</div>
</div>
<div class="credit-item">
<img src="https://upload.wikimedia.org/wikipedia/commons/6/69/IMDB_Logo_2016.svg" alt="IMDb" class="credit-logo">
</div>
<div class="credit-item">
<img src="https://mdblist.com/static/mdblist_logo.png" alt="MDBList" class="credit-logo">
</div>
</div>
</div>
<p>Built with ❤️ using React Native & Expo</p>
<div class="footer-links">
<a href="https://discord.gg/6w8dr3TSDN" class="github-link" target="_blank">
<img src="https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66e3d7f4ef6498ac018f2c55_Symbol.svg" alt="Discord" class="github-logo">
Discord
</a>
<a href="https://github.com/tapframe/NuvioStreaming" class="github-link">
<img src="https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png" alt="GitHub" class="github-logo">
GitHub
</a>
<a href="#privacy-policy" class="privacy-link" onclick="showPrivacyPolicy()">
Privacy Policy
</a>
</div>
<p style="margin-top: 2rem; opacity: 0.3; font-size: 0.8rem;">
© 2025 Nuvio. Licensed under GNU GPLv3. Free and Open Source.
</p>
</div>
</footer>
<!-- Modal for expanded screenshots -->
<div class="modal-overlay" id="screenshotModal">
<div class="modal-content">
<button class="modal-close" onclick="closeModal()">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<line x1="18" y1="6" x2="6" y2="18"></line>
<line x1="6" y1="6" x2="18" y2="18"></line>
</svg>
</button>
<img class="modal-image" id="modalImage" src="" alt="">
<div class="modal-title" id="modalTitle"></div>
</div>
</div>
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script>
AOS.init({
duration: 800,
easing: 'ease-out-cubic',
once: true,
offset: 100
});
// Screenshot modal functionality
function openModal(imageSrc, title) {
const modal = document.getElementById('screenshotModal');
const modalImage = document.getElementById('modalImage');
const modalTitle = document.getElementById('modalTitle');
modalImage.src = imageSrc;
modalTitle.textContent = title;
modal.classList.add('active');
document.body.style.overflow = 'hidden';
}
function closeModal() {
const modal = document.getElementById('screenshotModal');
modal.classList.remove('active');
document.body.style.overflow = 'auto';
}
// Add click event listeners to all screenshots
document.addEventListener('DOMContentLoaded', function() {
const screenshots = document.querySelectorAll('.screenshot');
screenshots.forEach(screenshot => {
screenshot.addEventListener('click', function() {
const img = this.querySelector('img');
const title = this.querySelector('h4');
if (img && title) {
openModal(img.src, title.textContent);
}
});
});
// Close modal when clicking outside the image
document.getElementById('screenshotModal').addEventListener('click', function(e) {
if (e.target === this) {
closeModal();
}
});
// Close modal with Escape key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
closeModal();
}
});
});
</script>
<script>
// iOS Installation Modal functionality
document.addEventListener('DOMContentLoaded', function() {
const iosInstallBtn = document.getElementById('ios-install-btn');
const iosModal = document.getElementById('ios-modal');
const iosModalClose = document.getElementById('ios-modal-close');
const copyUrlBtn = document.getElementById('copy-url');
const copyFeedback = document.getElementById('copy-feedback');
// Source URL for manual installation
const sourceUrl = 'https://raw.githubusercontent.com/tapframe/NuvioStreaming/main/nuvio-source.json';
// Open modal
iosInstallBtn.addEventListener('click', function(e) {
e.preventDefault();
iosModal.classList.add('active');
document.body.style.overflow = 'hidden';
});
// Close modal
function closeModal() {
iosModal.classList.remove('active');
document.body.style.overflow = '';
}
iosModalClose.addEventListener('click', closeModal);
// Close modal when clicking outside
iosModal.addEventListener('click', function(e) {
if (e.target === iosModal) {
closeModal();
}
});
// Close modal with Escape key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && iosModal.classList.contains('active')) {
closeModal();
}
});
// Copy URL functionality
copyUrlBtn.addEventListener('click', function(e) {
e.preventDefault();
// Try to copy to clipboard
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(sourceUrl).then(function() {
showCopyFeedback();
}).catch(function() {
fallbackCopyTextToClipboard(sourceUrl);
});
} else {
fallbackCopyTextToClipboard(sourceUrl);
}
});
// Fallback copy method for older browsers
function fallbackCopyTextToClipboard(text) {
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.left = '-999999px';
textArea.style.top = '-999999px';
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
document.execCommand('copy');
showCopyFeedback();
} catch (err) {
console.error('Failed to copy text: ', err);
// Show URL in alert as last resort
alert('Copy this URL manually: ' + text);
}
document.body.removeChild(textArea);
}
// Show copy feedback
function showCopyFeedback() {
copyFeedback.classList.add('show');
setTimeout(function() {
copyFeedback.classList.remove('show');
}, 2000);
}
});
</script>
<script>
// Privacy Policy functionality
function showPrivacyPolicy() {
const privacySection = document.getElementById('privacy-policy');
const mainContent = document.querySelector('body > *:not(#privacy-policy)');
// Hide all main content
const allSections = document.querySelectorAll('body > *:not(#privacy-policy)');
allSections.forEach(section => {
if (section.id !== 'privacy-policy') {
section.style.display = 'none';
}
});
// Show privacy policy
privacySection.style.display = 'block';
// Scroll to top
window.scrollTo(0, 0);
// Prevent body scroll
document.body.style.overflow = 'auto';
}
function hidePrivacyPolicy() {
const privacySection = document.getElementById('privacy-policy');
// Hide privacy policy
privacySection.style.display = 'none';
// Show all main content
const allSections = document.querySelectorAll('body > *:not(#privacy-policy)');
allSections.forEach(section => {
if (section.id !== 'privacy-policy') {
section.style.display = '';
}
});
// Scroll to top
window.scrollTo(0, 0);
// Restore body scroll
document.body.style.overflow = '';
}
// Handle browser back button
window.addEventListener('popstate', function(event) {
if (window.location.hash === '#privacy-policy') {
showPrivacyPolicy();
} else {
hidePrivacyPolicy();
}
});
// Check if privacy policy should be shown on page load
document.addEventListener('DOMContentLoaded', function() {
if (window.location.hash === '#privacy-policy') {
showPrivacyPolicy();
}
});
</script>
</body>
</html>