My website has successfully launched!

import { useState, useEffect } from "react"; // ── DESIGN TOKENS ────────────────────────────────────────────── const T = { bg:"#0a0a0f", surface:"#13131a", card:"#1a1a26", border:"#ffffff12", accent:"#3b82f6", accentHi:"#60a5fa", accentDim:"#1d4ed8", text:"#f0f0f8", muted:"#8888aa", danger:"#ef4444", dangerDim:"#7f1d1d", success:"#22c55e", successDim:"#14532d", gold:"#f59e0b", goldDim:"#78350f", purple:"#a855f7", purpleDim:"#581c87", }; // ── DATA ─────────────────────────────────────────────────────── const VIDEOS = [ {id:1,title:"How to Build a React App from Scratch",channel:"CodeWithAli",views:"1.2M",time:"2 days ago",dur:"12:45",thumb:"https://picsum.photos/seed/v1/640/360",avatar:"https://picsum.photos/seed/a1/80/80",subs:"450K",likes:24300,dislikes:310,comments:1820,cat:"Tech"}, {id:2,title:"Top 10 Travel Destinations 2026",channel:"WorldExplorer",views:"3.4M",time:"1 week ago",dur:"18:22",thumb:"https://picsum.photos/seed/v2/640/360",avatar:"https://picsum.photos/seed/a2/80/80",subs:"1.1M",likes:89200,dislikes:940,comments:4310,cat:"Travel"}, {id:3,title:"Learn Python in 1 Hour – Full Course",channel:"TechMaster",views:"5.6M",time:"3 days ago",dur:"59:58",thumb:"https://picsum.photos/seed/v3/640/360",avatar:"https://picsum.photos/seed/a3/80/80",subs:"2.3M",likes:142000,dislikes:1200,comments:9800,cat:"Tech"}, {id:4,title:"Amazing Cooking Recipes You Must Try!",channel:"ChefKhan",views:"890K",time:"5 days ago",dur:"22:10",thumb:"https://picsum.photos/seed/v4/640/360",avatar:"https://picsum.photos/seed/a4/80/80",subs:"320K",likes:17500,dislikes:290,comments:640,cat:"Food"}, {id:5,title:"The Future of Artificial Intelligence",channel:"AIInsider",views:"2.1M",time:"4 days ago",dur:"35:04",thumb:"https://picsum.photos/seed/v5/640/360",avatar:"https://picsum.photos/seed/a5/80/80",subs:"780K",likes:56000,dislikes:720,comments:3200,cat:"Tech"}, {id:6,title:"20-Minute Morning Workout Routine",channel:"FitLife",views:"670K",time:"1 day ago",dur:"20:00",thumb:"https://picsum.photos/seed/v6/640/360",avatar:"https://picsum.photos/seed/a6/80/80",subs:"210K",likes:9800,dislikes:110,comments:720,cat:"Fitness"}, {id:7,title:"Cinematic Drone Footage – Iceland 4K",channel:"AeroLens",views:"4.2M",time:"6 days ago",dur:"08:33",thumb:"https://picsum.photos/seed/v7/640/360",avatar:"https://picsum.photos/seed/a7/80/80",subs:"900K",likes:110000,dislikes:450,comments:5600,cat:"Travel"}, {id:8,title:"Lofi Hip Hop Beats – Study and Chill",channel:"ChillwaveStudios",views:"9.8M",time:"2 weeks ago",dur:"3:02:00",thumb:"https://picsum.photos/seed/v8/640/360",avatar:"https://picsum.photos/seed/a8/80/80",subs:"3.5M",likes:310000,dislikes:800,comments:22000,cat:"Music"}, ]; const INIT_COMMENTS = [ {id:1,user:"Ahmed_Dev",avatar:"https://picsum.photos/seed/c1/60/60",text:"This video is absolutely amazing! Learned so much from it 🔥",likes:234,time:"2 hours ago"}, {id:2,user:"Sara_PK",avatar:"https://picsum.photos/seed/c2/60/60",text:"The explanation is so clear and easy to understand. Keep it up!",likes:89,time:"5 hours ago"}, {id:3,user:"TechBro99",avatar:"https://picsum.photos/seed/c3/60/60",text:"Been watching this channel for 2 years. Best content creator!",likes:56,time:"1 day ago"}, {id:4,user:"ZaraFoods",avatar:"https://picsum.photos/seed/c4/60/60",text:"Please make more videos like this, absolutely loved it 💯",likes:41,time:"3 days ago"}, ]; const PLAYLISTS = ["Watch Later","Favourites","React Tutorials","Travel Vibes","Workout Mix"]; const fmt = n => n>=1e6?(n/1e6).toFixed(1)+"M":n>=1000?(n/1000).toFixed(1)+"K":String(n); // ── GLOBAL CSS ───────────────────────────────────────────────── const CSS = ` @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap'); *,*::before,*::after{box-sizing:border-box;margin:0;padding:0} body{background:${T.bg};color:${T.text};font-family:'Inter',sans-serif} ::-webkit-scrollbar{width:5px;height:5px} ::-webkit-scrollbar-track{background:${T.surface}} ::-webkit-scrollbar-thumb{background:${T.border};border-radius:3px} .vt-app{min-height:100vh;background:${T.bg};color:${T.text}} /* NAV */ .vt-nav{position:fixed;top:0;left:0;right:0;height:60px;z-index:200;background:${T.bg}dd;backdrop-filter:blur(20px);border-bottom:1px solid ${T.border};display:flex;align-items:center;gap:12px;padding:0 16px} .vt-logo{display:flex;align-items:center;gap:8px;cursor:pointer;font-weight:900;font-size:20px;color:${T.text};white-space:nowrap;user-select:none} .vt-logo-icon{width:36px;height:36px;border-radius:10px;background:linear-gradient(135deg,${T.accent},${T.accentDim});display:flex;align-items:center;justify-content:center;font-size:16px;box-shadow:0 0 20px ${T.accent}55;flex-shrink:0} .vt-search{flex:1;max-width:480px;display:flex;border-radius:28px;background:${T.surface};border:1px solid ${T.border};overflow:hidden;transition:border-color .2s,box-shadow .2s} .vt-search:focus-within{border-color:${T.accent}88;box-shadow:0 0 0 3px ${T.accent}22} .vt-search input{flex:1;background:transparent;border:none;outline:none;color:${T.text};font-size:14px;padding:0 16px;font-family:inherit} .vt-search input::placeholder{color:${T.muted}} .vt-search-btn{background:${T.accent};border:none;color:#fff;padding:0 18px;cursor:pointer;font-size:16px;transition:background .2s;display:flex;align-items:center} .vt-search-btn:hover{background:${T.accentHi}} .vt-nav-actions{display:flex;gap:6px;margin-left:auto;align-items:center} .vt-nav-btn{background:none;border:none;color:${T.muted};cursor:pointer;padding:8px 12px;border-radius:8px;font-size:13px;font-weight:600;font-family:inherit;transition:color .2s,background .2s;white-space:nowrap} .vt-nav-btn:hover,.vt-nav-btn.active{color:${T.text};background:${T.card}} .vt-signin-btn{background:${T.accent};color:#fff;border:none;border-radius:20px;padding:8px 20px;cursor:pointer;font-weight:700;font-size:13px;font-family:inherit;transition:background .2s,transform .1s} .vt-signin-btn:hover{background:${T.accentHi};transform:translateY(-1px)} .vt-user-chip{display:flex;align-items:center;gap:8px;background:${T.card};border:1px solid ${T.accent}44;border-radius:20px;padding:5px 14px 5px 8px;font-size:13px;font-weight:600;color:${T.accentHi};cursor:default} .vt-user-chip img{width:26px;height:26px;border-radius:50%;object-fit:cover} /* SIDEBAR */ .vt-overlay{position:fixed;inset:0;z-index:90;background:#000000aa;opacity:0;transition:opacity .3s;pointer-events:none} .vt-overlay.show{opacity:1;pointer-events:all} .vt-sidebar{position:fixed;left:0;top:60px;bottom:0;width:240px;background:${T.surface};border-right:1px solid ${T.border};padding:16px 0;z-index:100;overflow-y:auto;transform:translateX(-100%);transition:transform .32s cubic-bezier(.4,0,.2,1)} .vt-sidebar.open{transform:translateX(0)} .vt-side-item{display:flex;align-items:center;gap:12px;padding:11px 20px;cursor:pointer;font-size:14px;font-weight:500;color:${T.muted};border-radius:0 28px 28px 0;margin:2px 12px 2px 0;transition:color .2s,background .2s} .vt-side-item:hover{color:${T.text};background:${T.card}} .vt-side-item.active{color:${T.accent};background:${T.accent}18} .vt-side-icon{font-size:18px;width:22px;text-align:center;display:flex;align-items:center;justify-content:center} .vt-side-section{padding:12px 20px 6px;font-size:11px;font-weight:700;color:${T.muted};letter-spacing:1.2px;text-transform:uppercase;border-top:1px solid ${T.border};margin-top:8px} .vt-side-avatar{width:28px;height:28px;border-radius:50%;object-fit:cover} /* MAIN */ .vt-main{padding-top:60px;min-height:100vh} .vt-content{max-width:1400px;margin:0 auto;padding:24px 20px} /* CHIPS */ .vt-chips{display:flex;gap:8px;flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;margin-bottom:24px;scrollbar-width:none} .vt-chips::-webkit-scrollbar{height:0} .vt-chip{background:${T.card};color:${T.muted};border:1px solid ${T.border};border-radius:20px;padding:7px 18px;cursor:pointer;font-weight:600;font-size:13px;white-space:nowrap;transition:all .2s;font-family:inherit} .vt-chip:hover{color:${T.text};border-color:${T.accent}66} .vt-chip.active{background:${T.accent};color:#fff;border-color:${T.accent}} /* VIDEO GRID */ .vt-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:20px} .vt-card{background:${T.card};border-radius:14px;overflow:hidden;cursor:pointer;border:1px solid ${T.border};transition:transform .22s,border-color .22s,box-shadow .22s} .vt-card:hover{transform:translateY(-5px);border-color:${T.accent}44;box-shadow:0 16px 48px #00000070} .vt-thumb-wrap{position:relative;aspect-ratio:16/9;overflow:hidden} .vt-thumb-wrap img{width:100%;height:100%;object-fit:cover;transition:transform .32s;display:block} .vt-card:hover .vt-thumb-wrap img{transform:scale(1.05)} .vt-thumb-grad{position:absolute;inset:0;background:linear-gradient(to top,#000c 0%,transparent 55%);opacity:0;transition:opacity .3s} .vt-card:hover .vt-thumb-grad{opacity:1} .vt-duration{position:absolute;bottom:8px;right:8px;background:#000d;color:#fff;font-size:11px;font-weight:700;padding:3px 7px;border-radius:5px;letter-spacing:.3px} .vt-card-body{padding:12px 14px 16px} .vt-card-row{display:flex;gap:10px} .vt-ch-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0;cursor:pointer;border:2px solid ${T.border};transition:border-color .2s} .vt-ch-avatar:hover{border-color:${T.accent}} .vt-card-title{font-size:14px;font-weight:700;color:${T.text};line-height:1.45;margin-bottom:5px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden} .vt-card-ch{font-size:12px;color:${T.accent};font-weight:600;cursor:pointer;margin-bottom:2px} .vt-card-ch:hover{color:${T.accentHi}} .vt-card-meta{font-size:12px;color:${T.muted}} /* WATCH LAYOUT */ .vt-watch-grid{display:grid;grid-template-columns:1fr 380px;gap:24px;align-items:start} .vt-player-wrap{width:100%;aspect-ratio:16/9;background:#000;border-radius:14px;overflow:hidden;position:relative;box-shadow:0 20px 60px #00000090} .vt-player-img{width:100%;height:100%;object-fit:cover;display:block} .vt-player-ui{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;background:linear-gradient(to top,#000f 0%,#0006 35%,transparent 65%);opacity:0;transition:opacity .25s} .vt-player-wrap:hover .vt-player-ui{opacity:1} .vt-player-center{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;gap:28px;align-items:center} .vt-pbtn{background:none;border:none;color:#fff;cursor:pointer;font-size:24px;padding:8px;border-radius:50%;transition:background .15s,transform .15s;display:flex;align-items:center;justify-content:center;line-height:1} .vt-pbtn:hover{background:#ffffff22;transform:scale(1.18)} .vt-pbtn.big{width:68px;height:68px;font-size:30px;background:${T.accent};box-shadow:0 0 36px ${T.accent}99} .vt-pbtn.big:hover{background:${T.accentHi};transform:scale(1.1)} .vt-progress-area{padding:0 16px 6px} .vt-progress{width:100%;height:4px;-webkit-appearance:none;appearance:none;background:#ffffff28;border-radius:2px;cursor:pointer;outline:none;transition:height .15s;accent-color:${T.accent}} .vt-progress:hover{height:7px} .vt-ctrl-row{display:flex;align-items:center;justify-content:space-between;padding:0 12px 12px;gap:6px} .vt-ctrl-l,.vt-ctrl-r{display:flex;align-items:center;gap:4px} .vt-ptime{color:#ffffffcc;font-size:13px;font-weight:600;padding:0 6px;white-space:nowrap} .vt-vol{width:68px;height:3px;-webkit-appearance:none;appearance:none;background:#ffffff35;border-radius:2px;cursor:pointer;outline:none;accent-color:#fff} /* VIDEO TITLE & INFO */ .vt-video-title{font-size:20px;font-weight:800;color:${T.text};margin:16px 0 12px;line-height:1.3} .vt-ch-meta-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-bottom:16px;border-bottom:1px solid ${T.border};margin-bottom:16px} .vt-ch-name{font-weight:700;font-size:15px;cursor:pointer;color:${T.text}} .vt-ch-name:hover{color:${T.accent}} .vt-ch-subs{font-size:12px;color:${T.muted}} .vt-sub-btn{border:none;border-radius:20px;padding:9px 22px;font-weight:700;font-size:14px;cursor:pointer;font-family:inherit;transition:all .2s;display:flex;align-items:center;gap:6px;white-space:nowrap} .vt-sub-btn.off{background:${T.text};color:${T.bg}} .vt-sub-btn.off:hover{background:${T.accentHi};color:#fff} .vt-sub-btn.on{background:${T.card};color:${T.muted};border:1px solid ${T.border}} /* ═══════════════════════════════════════════════════════════════ ACTION CONTROL PANEL ═══════════════════════════════════════════════════════════════ */ .acp-panel{ background:linear-gradient(135deg,${T.surface} 0%,${T.card} 100%); border:1px solid ${T.border}; border-radius:18px; padding:20px 24px; margin:0 0 20px; display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:14px; box-shadow:0 4px 24px #00000040; position:relative; overflow:hidden; } .acp-panel::before{ content:'';position:absolute;inset:0; background:radial-gradient(ellipse at 50% 0%,${T.accent}0d 0%,transparent 70%); pointer-events:none; } .acp-section{display:flex;align-items:center;gap:8px;flex-wrap:wrap} .acp-divider{width:1px;height:32px;background:${T.border};flex-shrink:0} /* PILL BUTTONS */ .acp-pill{ display:inline-flex;align-items:center;gap:7px; border:1.5px solid ${T.border}; border-radius:28px;padding:9px 18px; cursor:pointer;font-weight:700;font-size:13px;font-family:inherit; transition:all .22s cubic-bezier(.4,0,.2,1); position:relative;overflow:hidden; background:${T.card};color:${T.text}; white-space:nowrap;user-select:none; } .acp-pill::after{ content:'';position:absolute;inset:0; background:currentColor;opacity:0;transition:opacity .15s; border-radius:inherit; } .acp-pill:hover::after{opacity:.06} .acp-pill:active{transform:scale(.96)} .acp-pill svg{flex-shrink:0;transition:transform .22s} /* Like — blue */ .acp-pill.like{color:${T.text};border-color:${T.border}} .acp-pill.like:hover{border-color:${T.accent}88;color:${T.accentHi};background:${T.accent}11} .acp-pill.like.on{background:${T.accent}22;border-color:${T.accent};color:${T.accentHi};box-shadow:0 0 18px ${T.accent}33} .acp-pill.like.on svg{transform:scale(1.2) rotate(-8deg)} /* Dislike — muted → red on active */ .acp-pill.dislike{color:${T.text};border-color:${T.border}} .acp-pill.dislike:hover{border-color:${T.danger}66;color:${T.danger};background:${T.danger}11} .acp-pill.dislike.on{background:${T.danger}20;border-color:${T.danger};color:${T.danger};box-shadow:0 0 18px ${T.danger}22} .acp-pill.dislike.on svg{transform:scale(1.2) rotate(8deg)} /* Share — purple */ .acp-pill.share{color:${T.text};border-color:${T.border}} .acp-pill.share:hover{border-color:${T.purple}88;color:${T.purple};background:${T.purple}11} /* Save — gold */ .acp-pill.save{color:${T.text};border-color:${T.border}} .acp-pill.save:hover{border-color:${T.gold}88;color:${T.gold};background:${T.gold}11} .acp-pill.save.on{background:${T.gold}22;border-color:${T.gold};color:${T.gold};box-shadow:0 0 18px ${T.gold}22} .acp-pill.save.on svg{transform:scale(1.15)} /* Report — danger ghost */ .acp-pill.report{color:${T.muted};border-color:transparent;background:transparent;padding-left:10px;padding-right:10px} .acp-pill.report:hover{color:${T.danger};border-color:${T.danger}44;background:${T.danger}0d} /* LIKE BAR (ratio visual) */ .like-bar-wrap{display:flex;flex-direction:column;gap:4px;min-width:120px} .like-bar-track{height:4px;background:${T.border};border-radius:2px;overflow:hidden} .like-bar-fill{height:100%;border-radius:2px;background:linear-gradient(90deg,${T.accent},${T.accentHi});transition:width .4s ease} .like-bar-label{font-size:11px;color:${T.muted};font-weight:600;display:flex;justify-content:space-between} /* TOAST */ .acp-toast{ position:fixed;bottom:80px;left:50%;transform:translateX(-50%) translateY(20px); background:${T.surface};border:1px solid ${T.border};border-radius:12px; padding:10px 20px;font-size:13px;font-weight:600;color:${T.text}; z-index:600;pointer-events:none; opacity:0;transition:opacity .25s,transform .25s; box-shadow:0 8px 32px #00000060; display:flex;align-items:center;gap:8px; white-space:nowrap; } .acp-toast.show{opacity:1;transform:translateX(-50%) translateY(0)} /* SHARE MODAL */ .vt-modal-bg{position:fixed;inset:0;z-index:500;background:#000000bb;display:flex;align-items:center;justify-content:center;padding:16px;opacity:0;transition:opacity .2s;pointer-events:none} .vt-modal-bg.show{opacity:1;pointer-events:all} .vt-modal{background:${T.surface};border-radius:18px;padding:28px;width:100%;max-width:460px;border:1px solid ${T.border};transform:scale(.94) translateY(12px);transition:transform .22s;box-shadow:0 24px 80px #00000070} .vt-modal-bg.show .vt-modal{transform:scale(1) translateY(0)} .vt-modal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px} .vt-modal-head h3{font-size:18px;font-weight:800} .vt-modal-sub{font-size:13px;color:${T.muted};margin-bottom:20px} .vt-share-url{display:flex;background:${T.card};border:1px solid ${T.border};border-radius:10px;overflow:hidden;margin-bottom:20px} .vt-share-url span{flex:1;padding:11px 14px;font-size:13px;color:${T.muted};overflow:hidden;white-space:nowrap;text-overflow:ellipsis} .vt-share-url button{background:${T.accent};border:none;color:#fff;padding:0 18px;cursor:pointer;font-weight:700;font-family:inherit;white-space:nowrap;transition:background .2s;font-size:13px} .vt-share-url button:hover{background:${T.accentHi}} .vt-share-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:20px} .vt-share-item{display:flex;flex-direction:column;align-items:center;gap:6px;background:${T.card};border:1px solid ${T.border};border-radius:12px;padding:14px 8px;cursor:pointer;transition:border-color .2s,transform .15s} .vt-share-item:hover{border-color:${T.accent}66;transform:translateY(-2px)} .vt-share-item .pi{font-size:24px} .vt-share-item span{font-size:11px;font-weight:600;color:${T.muted}} .vt-modal-close{background:${T.card};border:1px solid ${T.border};border-radius:10px;padding:11px;color:${T.text};font-weight:700;font-size:13px;font-family:inherit;cursor:pointer;width:100%;transition:border-color .2s} .vt-modal-close:hover{border-color:${T.accent}55} /* PLAYLIST MODAL */ .pl-list{display:flex;flex-direction:column;gap:8px;margin-bottom:20px;max-height:260px;overflow-y:auto} .pl-item{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1.5px solid ${T.border};border-radius:10px;cursor:pointer;transition:all .2s;background:${T.card}} .pl-item:hover{border-color:${T.gold}55;background:${T.gold}09} .pl-item.checked{border-color:${T.gold};background:${T.gold}14} .pl-icon{width:36px;height:36px;border-radius:8px;background:${T.surface};display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0} .pl-item.checked .pl-icon{background:${T.gold}22} .pl-label{flex:1;font-size:14px;font-weight:600;color:${T.text}} .pl-check{width:20px;height:20px;border-radius:50%;border:2px solid ${T.border};display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:900;transition:all .2s;flex-shrink:0} .pl-item.checked .pl-check{background:${T.gold};border-color:${T.gold};color:#000} .pl-new-row{display:flex;gap:8px;margin-bottom:16px} .pl-new-input{flex:1;background:${T.card};border:1.5px solid ${T.border};border-radius:8px;padding:10px 12px;color:${T.text};font-size:13px;font-family:inherit;outline:none;transition:border-color .2s} .pl-new-input:focus{border-color:${T.gold}88} .pl-new-input::placeholder{color:${T.muted}} .pl-new-btn{background:${T.gold};color:#000;border:none;border-radius:8px;padding:0 16px;font-weight:700;font-family:inherit;cursor:pointer;font-size:13px;transition:background .2s;white-space:nowrap} .pl-new-btn:hover{background:#fbbf24} .pl-save-btn{width:100%;background:${T.gold};color:#000;border:none;border-radius:10px;padding:12px;font-weight:800;font-size:14px;font-family:inherit;cursor:pointer;transition:background .2s} .pl-save-btn:hover{background:#fbbf24} /* REPORT MODAL */ .report-list{display:flex;flex-direction:column;gap:6px;margin-bottom:20px} .report-item{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1.5px solid ${T.border};border-radius:10px;cursor:pointer;background:${T.card};transition:all .2s;font-size:14px;font-weight:500;color:${T.text}} .report-item:hover{border-color:${T.danger}55;background:${T.danger}09;color:${T.danger}} .report-item.selected{border-color:${T.danger};background:${T.danger}14;color:${T.danger}} .report-submit{width:100%;background:${T.danger};color:#fff;border:none;border-radius:10px;padding:12px;font-weight:800;font-size:14px;font-family:inherit;cursor:pointer;margin-top:4px;transition:background .2s} .report-submit:hover{background:#dc2626} .report-submit:disabled{background:${T.card};color:${T.muted};cursor:not-allowed} /* REST OF WATCH PAGE */ .vt-desc-box{background:${T.card};border-radius:12px;padding:14px 16px;margin:0 0 20px;font-size:14px;color:${T.muted};line-height:1.6;border:1px solid ${T.border}} .vt-desc-box strong{color:${T.text}} .vt-tag{background:${T.card};border:1px solid ${T.border};color:${T.muted};border-radius:16px;padding:4px 12px;font-size:12px;font-weight:600;display:inline-block} .vt-comments-head{font-size:16px;font-weight:800;margin-bottom:18px} .vt-comment-input-row{display:flex;gap:12px;margin-bottom:24px;align-items:flex-start} .vt-comment-input-row img{width:42px;height:42px;border-radius:50%;object-fit:cover;flex-shrink:0} .vt-ctextarea{flex:1;background:${T.card};border:1px solid ${T.border};border-radius:10px;padding:12px 14px;color:${T.text};font-size:14px;font-family:inherit;resize:none;outline:none;transition:border-color .2s;width:100%} .vt-ctextarea:focus{border-color:${T.accent}66} .vt-ctextarea::placeholder{color:${T.muted}} .vt-comment-acts-row{display:flex;gap:8px;justify-content:flex-end;margin-top:8px} .vt-comment-card{display:flex;gap:12px;padding:14px 0;border-bottom:1px solid ${T.border}} .vt-comment-card img{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0} .vt-cuser{font-size:13px;font-weight:700;color:${T.accentHi}} .vt-ctime{color:${T.muted};font-weight:400;font-size:12px;margin-left:6px} .vt-ctext{font-size:14px;color:${T.text};line-height:1.5;margin:4px 0 8px} .vt-cact{display:flex;gap:6px} .vt-ibtn{background:none;border:none;color:${T.muted};cursor:pointer;font-size:13px;font-weight:600;font-family:inherit;padding:3px 8px;border-radius:6px;transition:color .2s,background .2s;display:flex;align-items:center;gap:4px} .vt-ibtn:hover{color:${T.text};background:${T.card}} .vt-act-btn{display:flex;align-items:center;gap:6px;background:${T.card};color:${T.text};border:1px solid ${T.border};border-radius:20px;padding:8px 16px;cursor:pointer;font-weight:700;font-size:13px;font-family:inherit;transition:all .2s} .vt-act-btn:hover{border-color:${T.accent}66;color:${T.accent}} .vt-act-btn.active{background:${T.accent}22;border-color:${T.accent};color:${T.accent}} .vt-up-next-title{font-size:15px;font-weight:800;margin-bottom:14px} .vt-mini-card{display:flex;gap:10px;margin-bottom:10px;cursor:pointer;padding:8px;border-radius:10px;transition:background .2s} .vt-mini-card:hover{background:${T.card}} .vt-mini-thumb{position:relative;flex-shrink:0} .vt-mini-thumb img{width:158px;height:89px;object-fit:cover;border-radius:8px;display:block} .vt-mini-title{font-size:13px;font-weight:700;color:${T.text};line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden} .vt-mini-ch{font-size:12px;color:${T.accent};margin-top:4px} .vt-mini-meta{font-size:12px;color:${T.muted};margin-top:2px} /* TRENDING */ .vt-trend-row{display:flex;gap:16px;padding:16px;border-bottom:1px solid ${T.border};cursor:pointer;border-radius:12px;transition:background .2s;align-items:flex-start;margin:0 -4px} .vt-trend-row:hover{background:${T.card}} .vt-rank{font-size:30px;font-weight:900;color:${T.border};width:44px;text-align:center;flex-shrink:0;line-height:1;padding-top:6px} .vt-rank.top{color:${T.gold}} /* CHANNEL */ .vt-ch-banner{background:linear-gradient(135deg,${T.accentDim} 0%,${T.bg} 100%);border-radius:18px;padding:36px 32px;margin-bottom:24px;display:flex;gap:24px;align-items:center;flex-wrap:wrap;border:1px solid ${T.accent}33;position:relative;overflow:hidden} .vt-ch-banner::before{content:'';position:absolute;inset:0;background:url('https://picsum.photos/seed/banner/1200/300') center/cover;opacity:.07} .vt-ch-banner>*{position:relative} .vt-big-avatar{width:96px;height:96px;border-radius:50%;border:4px solid rgba(255,255,255,.2);object-fit:cover;flex-shrink:0} .vt-ch-tabs{display:flex;gap:2px;border-bottom:1px solid ${T.border};margin-bottom:24px} .vt-ch-tab{background:none;border:none;padding:12px 22px;font-weight:700;color:${T.muted};border-bottom:3px solid transparent;cursor:pointer;font-family:inherit;font-size:14px;transition:color .2s,border-color .2s;margin-bottom:-1px} .vt-ch-tab.active{color:${T.accent};border-bottom-color:${T.accent}} /* AUTH */ .vt-auth-wrap{min-height:calc(100vh - 60px);display:flex;align-items:center;justify-content:center;padding:24px} .vt-auth-box{width:100%;max-width:440px;background:${T.surface};border-radius:20px;padding:40px 36px;border:1px solid ${T.border};box-shadow:0 24px 80px #00000060} .vt-auth-logo{text-align:center;margin-bottom:28px} .vt-auth-logo .icon{font-size:40px} .vt-auth-logo h2{font-size:26px;font-weight:900;color:${T.accent};margin-top:8px} .vt-auth-logo p{color:${T.muted};font-size:14px;margin-top:4px} .vt-input{width:100%;background:${T.card};border:1px solid ${T.border};border-radius:10px;padding:12px 14px;color:${T.text};font-size:14px;font-family:inherit;outline:none;margin-bottom:12px;transition:border-color .2s} .vt-input:focus{border-color:${T.accent}88} .vt-input::placeholder{color:${T.muted}} .vt-submit-btn{width:100%;background:${T.accent};color:#fff;border:none;border-radius:12px;padding:14px;font-weight:800;font-size:16px;font-family:inherit;cursor:pointer;margin-top:4px;transition:background .2s,transform .1s} .vt-submit-btn:hover{background:${T.accentHi};transform:translateY(-1px)} .vt-divider{display:flex;align-items:center;gap:12px;margin:16px 0;color:${T.muted};font-size:13px} .vt-divider::before,.vt-divider::after{content:'';flex:1;height:1px;background:${T.border}} .vt-social-btns{display:flex;gap:10px} .vt-social-btn{flex:1;background:${T.card};border:1px solid ${T.border};border-radius:10px;padding:11px;color:${T.text};font-weight:600;font-size:13px;font-family:inherit;cursor:pointer;transition:border-color .2s} .vt-social-btn:hover{border-color:${T.accent}66} .vt-success{text-align:center} .vt-success .big-e{font-size:56px;margin-bottom:16px} .vt-success h3{font-size:20px;font-weight:800;margin-bottom:8px} .vt-success p{color:${T.muted};margin-bottom:24px} .vt-link{color:${T.accent};cursor:pointer;font-weight:600} /* BOTTOM NAV */ .vt-bottom-nav{display:none;position:fixed;bottom:0;left:0;right:0;z-index:200;background:${T.surface}ee;backdrop-filter:blur(20px);border-top:1px solid ${T.border};height:60px;align-items:stretch} .vt-bnav-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;cursor:pointer;background:none;border:none;color:${T.muted};font-size:11px;font-weight:600;font-family:inherit;transition:color .2s} .vt-bnav-item.active{color:${T.accent}} .vt-bnav-icon{font-size:20px;display:flex;align-items:center;justify-content:center} /* EMPTY */ .vt-empty{text-align:center;padding:80px 20px;color:${T.muted}} .vt-empty .ei{font-size:52px;margin-bottom:16px} .vt-empty h3{font-size:18px;font-weight:700;color:${T.text};margin-bottom:8px} @media(max-width:900px){ .vt-watch-grid{grid-template-columns:1fr} .vt-nav-btn{display:none} .vt-bottom-nav{display:flex} .vt-main{padding-bottom:60px} .vt-video-title{font-size:17px} .acp-panel{padding:16px} .acp-divider{display:none} } @media(max-width:600px){ .vt-content{padding:16px 12px} .vt-grid{grid-template-columns:1fr} .vt-ch-banner{padding:24px 16px} .vt-auth-box{padding:28px 20px} .acp-pill{padding:8px 13px;font-size:12px} .vt-mini-thumb img{width:130px;height:73px} } `; function injectCSS(){ if(document.getElementById("vt-css"))return; const s=document.createElement("style"); s.id="vt-css";s.textContent=CSS; document.head.appendChild(s); } // ── SVG ICONS ───────────────────────────────────────────────── const Ic = { Play: ()=>, Pause: ()=>, Like: ()=>, Dislike: ()=>, Share: ()=>, Save: ()=>, SaveFill:()=>, Flag: ()=>, Bell: ()=>, Check: ()=>, Plus: ()=>, X: ()=>, Full: ()=>, Vol: ()=>, Menu: ()=>, Search: ()=>, }; // ── MAIN COMPONENT ──────────────────────────────────────────── export default function StreamX(){ useEffect(()=>{ injectCSS(); },[]); // ── STATE ────────────────────────────────────────────────── const [page,setPage]=useState("home"); const [activeVideo,setActiveVideo]=useState(null); const [activeChannel,setActiveChannel]=useState(null); const [subscribed,setSubscribed]=useState({}); const [liked,setLiked]=useState({}); const [disliked,setDisliked]=useState({}); const [savedVideos,setSavedVideos]=useState({}); // global saved state const [savedPlaylists,setSavedPlaylists]=useState({}); // videoId → Set of playlist names const [playlists,setPlaylists]=useState(PLAYLISTS); const [comments,setComments]=useState(INIT_COMMENTS); const [newComment,setNewComment]=useState(""); const [searchQ,setSearchQ]=useState(""); const [signupData,setSignupData]=useState({name:"",email:"",password:""}); const [signedUp,setSignedUp]=useState(false); const [sidebarOpen,setSidebarOpen]=useState(false); const [playing,setPlaying]=useState(false); const [progress,setProgress]=useState(22); const [volume,setVolume]=useState(80); const [activeTab,setActiveTab]=useState("Videos"); const [trendTab,setTrendTab]=useState("Now"); const [chip,setChip]=useState("All"); // Modal states const [shareModal,setShareModal]=useState(false); const [playlistModal,setPlaylistModal]=useState(false); const [reportModal,setReportModal]=useState(false); const [copied,setCopied]=useState(false); const [newPLName,setNewPLName]=useState(""); const [reportReason,setReportReason]=useState(""); const [reported,setReported]=useState({}); // Toast const [toast,setToast]=useState({show:false,msg:"",icon:""}); // ── HELPERS ──────────────────────────────────────────────── const showToast=(msg,icon="✓")=>{ setToast({show:true,msg,icon}); setTimeout(()=>setToast(t=>({...t,show:false})),2200); }; const openVideo=v=>{setActiveVideo(v);setPage("watch");setPlaying(false);setProgress(0);window.scrollTo(0,0);}; const openChannel=v=>{setActiveChannel(v);setPage("channel");setActiveTab("Videos");window.scrollTo(0,0);}; const nav=pg=>{setPage(pg);setSidebarOpen(false);window.scrollTo(0,0);}; const toggleLike=id=>{ const next=!liked[id]; setLiked(l=>({...l,[id]:next})); if(disliked[id]) setDisliked(d=>({...d,[id]:false})); showToast(next?"Added to liked videos 👍":"Like removed","👍"); }; const toggleDislike=id=>{ const next=!disliked[id]; setDisliked(d=>({...d,[id]:next})); if(liked[id]) setLiked(l=>({...l,[id]:false})); showToast(next?"Disliked 👎":"Dislike removed","👎"); }; const toggleSave=(vid)=>{ const next=!savedVideos[vid]; setSavedVideos(s=>({...s,[vid]:next})); if(next){ setPlaylistModal(true); } else { showToast("Removed from saved","🗑"); } }; const handleCopy=()=>{setCopied(true);showToast("Link copied!","🔗");setTimeout(()=>setCopied(false),2200);}; const postComment=()=>{ if(!newComment.trim())return; setComments(p=>[{id:Date.now(),user:signedUp?(signupData.name||"You"):"Guest",avatar:"https://picsum.photos/seed/me/60/60",text:newComment,likes:0,time:"Just now"},...p]); setNewComment(""); showToast("Comment posted","💬"); }; const togglePlaylist=(vid,name)=>{ setSavedPlaylists(sp=>{ const cur=new Set(sp[vid]||[]); if(cur.has(name)) cur.delete(name); else cur.add(name); return {...sp,[vid]:[...cur]}; }); }; const addNewPlaylist=()=>{ if(!newPLName.trim())return; if(!playlists.includes(newPLName.trim())){ setPlaylists(p=>[...p,newPLName.trim()]); } setNewPLName(""); }; const submitReport=(vid)=>{ if(!reportReason)return; setReported(r=>({...r,[vid]:true})); setReportModal(false); setReportReason(""); showToast("Report submitted. Thanks for keeping StreamX safe.","🚩"); }; const filtered=VIDEOS.filter(v=>{ const q=searchQ.toLowerCase(); const mq=!q||v.title.toLowerCase().includes(q)||v.channel.toLowerCase().includes(q); const mc=chip==="All"||v.cat===chip; return mq&&mc; }); // ── NAV ──────────────────────────────────────────────────── const NavBar=()=>( ); // ── SIDEBAR ──────────────────────────────────────────────── const Sidebar=()=>( <>
setSidebarOpen(false)}/> ); // ── VIDEO CARD ───────────────────────────────────────────── const VideoCard=({v})=>(
openVideo(v)}> {v.title}
{v.dur}
{e.stopPropagation();openChannel(v);}}/>
openVideo(v)}>{v.title}
{e.stopPropagation();openChannel(v);}}>{v.channel}
{v.views} views · {v.time}
); // ── HOME ─────────────────────────────────────────────────── const HomePage=()=>{ const chips=["All","Tech","Travel","Food","Fitness","Music"]; return(
{chips.map(c=>)}
{filtered.length===0 ?
🔍

No results for "{searchQ}"

Try different keywords

:
{filtered.map(v=>)}
}
); }; // ── PLAYER ───────────────────────────────────────────────── const VideoPlayer=({v})=>(
{v.title}/
setProgress(+e.target.value)}/>
{String(Math.floor(progress/100*720/60)).padStart(2,"0")}:{String(Math.floor(progress/100*720%60)).padStart(2,"0")} / {v.dur} setVolume(+e.target.value)}/>
); // ══════════════════════════════════════════════════════════ // ACTION CONTROL PANEL // ══════════════════════════════════════════════════════════ const ActionPanel=({v})=>{ const vid=v.id; const isLiked=!!liked[vid]; const isDisliked=!!disliked[vid]; const isSaved=!!savedVideos[vid]; const isReported=!!reported[vid]; const totalVotes=v.likes+v.dislikes+(isLiked?1:0)-(isDisliked?0:0); const likeRatio=Math.round((v.likes+(isLiked?1:0))/totalVotes*100); return(
{/* LEFT: Like / Dislike + ratio bar */}
{/* Like half */} {/* Dislike half */}
{/* Like ratio bar */}
{likeRatio}% positive {fmt(totalVotes)} votes
{/* CENTER: Share / Save */}
{/* Share */} {/* Save to Playlist */} {/* Download (static) */}
{/* RIGHT: Report */}
); }; // ── SHARE MODAL ──────────────────────────────────────────── const ShareModal=({v})=>(
{if(e.target===e.currentTarget)setShareModal(false);}}>

Share this video

Share "{v?.title?.slice(0,40)}…"

https://streamx.app/watch?v={v?.id}
{[["💬","WhatsApp"],["✈️","Telegram"],["🐦","Twitter / X"],["📘","Facebook"],["💼","LinkedIn"],["📱","SMS"],["📧","Email"],["🔗","Embed"]].map(([ic,name])=>(
{setShareModal(false);showToast(`Shared on ${name}`,"↗");}}> {ic}{name}
))}
); // ── PLAYLIST MODAL ───────────────────────────────────────── const PlaylistModal=({v})=>{ if(!v) return null; const vid=v.id; const chosen=new Set(savedPlaylists[vid]||[]); return(
{if(e.target===e.currentTarget)setPlaylistModal(false);}}>

Save to playlist

Choose one or more playlists

setNewPLName(e.target.value)} onKeyDown={e=>e.key==="Enter"&&addNewPlaylist()}/>
{playlists.map(name=>(
togglePlaylist(vid,name)}>
{["⏱","⭐","💻","✈️","💪"][playlists.indexOf(name)%5]}
{name}
{chosen.has(name)&&"✓"}
))}
); }; // ── REPORT MODAL ─────────────────────────────────────────── const REPORT_REASONS=["Sexual content","Violent or repulsive content","Hateful or abusive content","Harassment or bullying","Harmful or dangerous acts","Misinformation","Spam or misleading","Child safety concern"]; const ReportModal=({v})=>(
{if(e.target===e.currentTarget)setReportModal(false);}}>

Report video

Help us understand why this content is inappropriate

{REPORT_REASONS.map(r=>(
setReportReason(r)}> {reportReason===r?"🔴":"⚪"}{r}
))}
); // ── WATCH PAGE ───────────────────────────────────────────── const WatchPage=()=>{ if(!activeVideo) return null; const v=activeVideo; const vid=v.id; return(
{/* Modals */}
{/* LEFT COLUMN */}

{v.title}

{/* Channel row + Subscribe */}
openChannel(v)}/>
openChannel(v)}>{v.channel}
{v.subs} subscribers
{/* ★ ACTION CONTROL PANEL ★ */} {/* Description */}
{v.views} views · {v.time}

{v.title} — a deep dive for everyone interested in {v.cat}. Like, save, and subscribe for more from {v.channel}!

#Trending{" "}#{v.cat}{" "}#StreamX
{/* Comments */}
💬 {comments.length} Comments