From e63b13f50c598259b276988311df920efdec6a47 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 11 Feb 2026 12:56:44 +0000 Subject: [PATCH] Autosave: 20260211-125643 --- config/__pycache__/__init__.cpython-311.pyc | Bin 159 -> 159 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5552 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1557 bytes config/__pycache__/wsgi.cpython-311.pyc | Bin 679 -> 679 bytes core/__pycache__/__init__.cpython-311.pyc | Bin 157 -> 157 bytes core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1923 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 524 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 763 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1610 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 5922 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 1022 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 6139 bytes core/admin.py | 22 +- core/forms.py | 15 + core/migrations/0001_initial.py | 76 ++++ core/migrations/0002_video_video_type.py | 18 + .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 4651 bytes .../0002_video_video_type.cpython-311.pyc | Bin 0 -> 930 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes core/models.py | 71 +++- core/templates/base.html | 109 +++++- core/templates/core/index.html | 225 +++++------ core/templates/core/live_studio.html | 81 ++++ core/templates/core/shorts_list.html | 117 ++++++ core/templates/core/upload_video.html | 61 +++ core/templates/core/video_detail.html | 92 +++++ core/urls.py | 9 +- core/views.py | 91 +++-- seed_data.py | 32 ++ static/css/custom.css | 352 +++++++++++++++++- 30 files changed, 1181 insertions(+), 190 deletions(-) create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/0002_video_video_type.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_video_video_type.cpython-311.pyc create mode 100644 core/templates/core/live_studio.html create mode 100644 core/templates/core/shorts_list.html create mode 100644 core/templates/core/upload_video.html create mode 100644 core/templates/core/video_detail.html create mode 100644 seed_data.py diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a6362b2322713e75da67a35e209e76169dbae..7e51457a4e0d1b49afaf140adb8831ad44e82c32 100644 GIT binary patch delta 19 ZcmbQwIG>SwIWI340}$vH_DtlS0stxD1abfX delta 19 ZcmbQwIG>SwIWI340}xbw%b&y+NCMIWI340}$vH_H5){DhdEMcm*y1 delta 20 acmdm>y+NCMIWI340}xbw%iqYoR1^R_83p11 diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 0b85e94ece283a83ff1af1d71f1b265c943eb37a..2325870cd1318b695df4a03e808976da1fb80c41 100644 GIT binary patch delta 20 acmbQrGnI#XIWI340}$vH_H5+lVgmpz)dUa# delta 20 acmbQrGnI#XIWI340}xbw%iqY&#RdQ}b_B!# diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index 9c49e09df194d2dbcad4868349c9177db4b15571..30dd4f5154848ee986ae4c1ee5428484201eacc3 100644 GIT binary patch delta 20 acmZ3^x}24JIWI340}$vH_H5*y!vp{@r3AD9 delta 20 acmZ3^x}24JIWI340}xbw%iqX7hY0{RMg?d9 diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 74b111269bd81aac528770a53e2f849291524d56..7cd10fe79c2da0b6ed89774f5d056273078cd072 100644 GIT binary patch delta 19 ZcmbQsIG2%oIWI340}$vH_DtlS1OO?Q1Z)5R delta 19 ZcmbQsIG2%oIWI340}xbw%b&>mG1t0(b diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..31ca66dce62f7996f711e06ece7a0bc07fdb0fe8 100644 GIT binary patch literal 1923 zcma)6y>HV%6u_J= zu`(5*{xhwVp}Gl)i7iz-b>clc4s9Bs{`mPm-u>>q-+Sk8m5NE=dj0;hH>VQv6Fd1; z=r)c7CFBcXgi)Ua)S{Fyg{i(0sFoUNmKNxi9u%wsB?{s6Z80a{>JF^jg*Uqt@{}-b zn=l=$jC^zl_T7ayyLRBSn|Fvc)W@g|U@QP*@xqK|AEQ2i(E!Gw3p1Ab7z+a!O<*it zn6b>tFG;oX3w5YcsXHw2>c3FOswR!cPRut#u_cR-H=TN&`%-`9F&;|ux%Yv;j0JZB zwgcedn6L-0n}NPGx@*>61Vv*+C=t$Bp}u(4iyn zH!bj=EAW>p4Z%0y&|yWsK&v#S?7XB^l}ej>bJoKX<9>FCABbDPgXbc84cJjBr3Ykw z@9c9x?(F^V`9X)9W81SWW1mj7=~PEi=xT?Yht`w!=#4|1I7T>Bi89@@H;8gMWhw5{ z$u^xtmStq=ht}=($Re^VBg-av7r-85vTTf*CZK zUxE~9GTvfMOv%m6^V4LSypUCNaubu8*e?#7-29Z%oK(9a4xk!FATE|=n5@Vq$$f!A K0f>s&fI0#ks&dbZi00er4JsY_hnE)$E1K|Jw delta 20 acmeBS>0#ks&dbZi00dRv@;7obG64WD>I9Vl diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf2234fb21a6b62efc5cec11af9512dd0c9616..3fa604cf1af5b87adf8ee826eb8a21d561abd39a 100644 GIT binary patch delta 20 acmey(`kR$|IWI340}$vH_H5+-zytt2#Raec delta 20 acmey(`kR$|IWI340}xbw%iqZTfe8RYW(H&c diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac20295781245b035b46161884ad931631dd64d3 GIT binary patch literal 1610 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 b&SrZc24q%h_%Y=G)Yb5iY! ZIDle|KwK<4Sw>8X`vQXu5EZcjMF0tLAP)cl diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..842f789be71e03fc140c3f9b416df030b0f9bfcc 100644 GIT binary patch literal 1022 zcmb7?J!{)Q7{^c6`BhOIQc+r3Z6VZ9ti-{KF`itEA#|{D3SNxrJ7OiWW%S}Co;;e8 zp<6q4N?V!_kg?D&AQ^#;*3u!HAzP+CI@hHs8RFC1^K#Gc`QM#Bi((4F_;GfwU2+Kh z44vgj{xNReLFNM@h;TaUa!rmyBtm#S(&d{xha!k_1XKP9FAG0Km)5`E3vj;u4Up(% z?1F~~Jd43Nap1(3kq2=S_i~cJiLb;--OCYxlURwfb}vT+&T>D|gVweFKj$#oOp$aQ zWj3xuK^ZQk)byrh96a4mSoGp@vd)9E}wE$0a3LW04l2 zwyNpFxYaRC+fo8yVYGD3vLR|aL^B|&YXjO^c*D5U*A0~bVqvrx>2*d31ahSI4vnm1 z>XsQEsTrQ48U6@CvKk6H0C_=NwV(!!^g*bq%p|bPdY#GGhvo}^ANtmr28ll^lO2_C@#d+)WY)7G|wC&i2shk+*vDH`GRB0O~q(Ni0e|DQF zb`9d_v}8Vk;&2IIL=Y5=?;l!xyCZBz5_;PM47bbGSlZ(Dw{9bZ#&BHYx*Vvr#)Az4@>BUsqnMgaH yl=G$BmF(h*hbum=tTrVxm3Al6t|#sJ(%x0p#Z?bieO#Rjv2Me#MkU1c^yu{p8KTXzK+$mX!dFlCjrA0Z# zMIgg&v6f|~mKTE+PTs}j%f$y21Q}B7HCd2Z%Hjco_ytt-fsKKcv%#f9s3T+s+XWW+ Xi!Ab2SmZx2Gx0MuaD!kG4^TS*`7AWS diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..379fead8117ad77e8987aeb067fb53ce8bf3d2e0 100644 GIT binary patch literal 6139 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 literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0002_video_video_type.cpython-311.pyc b/core/migrations/__pycache__/0002_video_video_type.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30648063ab0710c0d43f32111322485ba96109cd GIT binary patch literal 930 zcmZuw&rj4q6n@iR+g31&Bpy^mVvLOmMbE^aZX^Y@R4kmi= zz>T{Hjgdcw0|zo!4~AO_oH+TWyM+*(X}qK%cc)Uu$a&G*>v=AC&z*V{ILcW$?^HRrWOL_T!ESi#SVj zY4tPYNgg#jRdhz=c!iQ3;Lv6WZ4Ft6wRH`+(Q8D})u>jiUTd@mI)KJ^h9+9Ot&1{t z?TegFv(X`8u5?~Eib$RjWrEAGxw*N=L7c`#9469SkCA86twT_34!EaNtDP5NilIPh zFOM=>HS=yJ3TZB@K>TVFuk%1~Iv3-#^YQ8;@#!}W7gtF8;Us~l%U0CQ;)v(6g?u$E zlY-m|H-dzxouW&1xArSY!#orP}F(e4MokRn+^Erp?<+J72))i-_82mFIUR6D1E-cqq4|^ z{~;6a^FbJKUzz8hKd?_WJ_&}lotrm1*c28WSA$COHG-|PSy|xRt8{JB+FGn!aBhEf z_w8E;H>VD+-#M6=*?zD;F|+sR)9|YR7PPk-g;0xBxPjVHjVCo$EyHn-fZ#+yrCSr$ z)`FViZlhtzGo*vPFzsZsxKjI4yD?NbrP}J=Y06IR`JuT_#SBsUVIY4;Q0a^@QqH_R bczF4%tTAR)a2dAU{cHD+RN>@5)%xClkT&*0 literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 9c833c8090679ee4c9ffd863c8f7abb0bb73a5db..8956bb33bb5a8fe877b6a9f59a0341f4b69b2a5a 100644 GIT binary patch delta 19 ZcmZ3%xPp;;IWI340}$vH_DtlS3jixF1dRXy delta 19 ZcmZ3%xPp;;IWI340}xbw%b& - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}LIVE VERSE | Universal Cosmic Platform{% endblock %} + + + + {% block extra_css %}{% endblock %} - - {% block content %}{% endblock %} - + + + + + + + +
+ {% block content %}{% endblock %} +
+ + + {% block extra_js %}{% endblock %} + + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..094cd45 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,86 @@ -{% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% extends 'base.html' %} +{% load static %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+ + +
+
All Galaxies
+ {% for category in categories %} +
{{ category.name }}
+ {% endfor %} +
Nebulas
+
Supernovas
+
Dark Matter
+
Stellar Events
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + + +
+

Cosmic Shorts

+ View All +
+ +
+ {% for i in "123456" %} +
+
+
Diving into the Heart of a Black Hole | Episode {{ i }}
+
1.2M views
+
+ +
+ +
+
+ {% endfor %} +
+ + +
+

Universal Discovery

+
+ +
+ {% for video in videos %} +
+
+ {% if video.thumbnail %} + {{ video.title }} + {% else %} +
+ +
+ {% endif %} +
12:45
+
+
+
+
+
+ +
+
+
+

{{ video.title }}

+

{{ video.channel.name }}

+
+ {{ video.views }} views + + {{ video.created_at|timesince }} ago +
+
+
+
+
+ {% empty %} +
+ +

No cosmic events discovered yet.

+

Be the first to upload to this galaxy!

+
+ {% endfor %} +
+ +{% endblock %} diff --git a/core/templates/core/live_studio.html b/core/templates/core/live_studio.html new file mode 100644 index 0000000..9935bea --- /dev/null +++ b/core/templates/core/live_studio.html @@ -0,0 +1,81 @@ +{% extends 'base.html' %} + +{% block title %}Live Studio | LIVE VERSE{% endblock %} + +{% block content %} +
+
+

Creator Studio

+
+ + New Upload +
+
+ +
+ +
+
+
+
Total Broadcast Reach
+
1.2M
+
+
+
Subscribers
+
45.2K
+
+
+
Avg. Views
+
8.4K
+
+
+
+
+
+ + +
+
+
+
Recent Transmissions
+
+
+
+ + + + + + + + + + + + {% for video in videos %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
ContentStatusViewsCommentsDate
+
+ +
{{ video.title }}
+
+
Public{{ video.views }}42{{ video.created_at|date:"M d, Y" }}
No transmissions found in your vault.
+
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/shorts_list.html b/core/templates/core/shorts_list.html new file mode 100644 index 0000000..fe5f97b --- /dev/null +++ b/core/templates/core/shorts_list.html @@ -0,0 +1,117 @@ +{% extends 'base.html' %} + +{% block title %}Shorts | LIVE VERSE{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ {% for short in shorts %} +
+
+ {% if short.thumbnail %} + + {% endif %} +
+ +
+
+ +
+
+
12K
+
+
842
+
+
+
+ +
+
+
+
@{{ short.channel.handle }}
+ +
+
{{ short.title }}
+

Original Sound - Space Melodies

+
+
+ {% empty %} +
+ +

No Shorts Orbiting Yet

+

Start uploading 9:16 cosmic content!

+
+ {% endfor %} +
+{% endblock %} diff --git a/core/templates/core/upload_video.html b/core/templates/core/upload_video.html new file mode 100644 index 0000000..c6933ee --- /dev/null +++ b/core/templates/core/upload_video.html @@ -0,0 +1,61 @@ +{% extends 'base.html' %} + +{% block title %}Upload to the Galaxy | LIVE VERSE{% endblock %} + +{% block content %} +
+
+
+
+
+

Transmit New Content

+

Your content will be broadcasted across the universal feed.

+
+
+
+ {% csrf_token %} + +
+ + {{ form.title }} +
+ +
+ + {{ form.description }} +
+ +
+
+ + {{ form.category }} +
+
+ + {{ form.video_type }} +
+
+ +
+
+ + {{ form.thumbnail }} +
+
+ + {{ form.video_file }} +
+
+ +
+ +
+
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/video_detail.html b/core/templates/core/video_detail.html new file mode 100644 index 0000000..e62a688 --- /dev/null +++ b/core/templates/core/video_detail.html @@ -0,0 +1,92 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{{ video.title }} | LIVE VERSE{% endblock %} + +{% block content %} +
+
+ +
+ +
+ {% if video.video_file %} + + {% else %} +
+ +

Establishing Intergalactic Link...

+

Wait for the signal to stabilize.

+
+ {% endif %} +
+ +
+

{{ video.title }}

+ +
+
+
+ +
+
+
{{ video.channel.name }}
+
452K Subscribers
+
+ +
+ +
+ + + + +
+
+ +
+
{{ video.views }} views • {{ video.created_at|date:"M d, Y" }}
+

{{ video.description|default:"No cosmic log provided for this transmission." }}

+
+
+
+ + +
+
Next in Orbit
+ +
+
+
+ + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..f221871 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,10 @@ from django.urls import path - -from .views import home +from . import views urlpatterns = [ - path("", home, name="home"), + path('', views.IndexView.as_view(), name='index'), + path('video//', views.VideoDetailView.as_view(), name='video_detail'), + path('shorts/', views.ShortsListView.as_view(), name='shorts_list'), + path('studio/', views.LiveStudioView.as_view(), name='live_studio'), + path('upload/', views.UploadVideoView.as_view(), name='upload_video'), ] diff --git a/core/views.py b/core/views.py index c9aed12..b788761 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,74 @@ -import os -import platform +from django.shortcuts import render, get_object_or_404, redirect +from django.views.generic import ListView, DetailView, CreateView, TemplateView +from django.contrib.auth.mixins import LoginRequiredMixin +from django.urls import reverse_lazy +from .models import Video, Channel, Category, LiveStream +from .forms import VideoUploadForm -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +class IndexView(ListView): + model = Video + template_name = 'core/index.html' + context_object_name = 'videos' + paginate_by = 20 + def get_queryset(self): + return Video.objects.filter(is_published=True, video_type='standard').select_related('channel') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['categories'] = Category.objects.all() + context['shorts'] = Video.objects.filter(video_type='short', is_published=True)[:10] + return context + +class VideoDetailView(DetailView): + model = Video + template_name = 'core/video_detail.html' + context_object_name = 'video' + + def get_object(self): + obj = super().get_object() + obj.views += 1 + obj.save() + return obj + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['related_videos'] = Video.objects.filter(category=self.object.category).exclude(id=self.object.id)[:10] + return context + +class ShortsListView(ListView): + model = Video + template_name = 'core/shorts_list.html' + context_object_name = 'shorts' + + def get_queryset(self): + return Video.objects.filter(video_type='short', is_published=True) + +class LiveStudioView(LoginRequiredMixin, TemplateView): + template_name = 'core/live_studio.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + channel = getattr(self.request.user, 'channel', None) + if channel: + context['live_streams'] = LiveStream.objects.filter(channel=channel) + context['videos'] = Video.objects.filter(channel=channel) + return context + +class UploadVideoView(LoginRequiredMixin, CreateView): + model = Video + form_class = VideoUploadForm + template_name = 'core/upload_video.html' + success_url = reverse_lazy('index') + + def form_valid(self, form): + # Ensure user has a channel + channel, created = Channel.objects.get_or_create( + user=self.request.user, + defaults={'name': self.request.user.username, 'handle': self.request.user.username.lower()} + ) + form.instance.channel = channel + return super().form_valid(form) def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() - - context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - } - return render(request, "core/index.html", context) + return IndexView.as_view()(request) diff --git a/seed_data.py b/seed_data.py new file mode 100644 index 0000000..6d1d260 --- /dev/null +++ b/seed_data.py @@ -0,0 +1,32 @@ +import os +import django + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') +django.setup() + +from core.models import Category, Channel, Video +from django.contrib.auth.models import User + +# Create categories +categories = ['Music', 'Gaming', 'Technology', 'Education', 'Entertainment'] +for cat_name in categories: + Category.objects.get_or_create(name=cat_name) + +# Create a sample user and channel if none exist +user, created = User.objects.get_or_create(username='admin') +if created: + user.set_password('admin123') + user.is_staff = True + user.is_superuser = True + user.save() + +Channel.objects.get_or_create( + user=user, + defaults={ + 'name': 'Live Verse Official', + 'handle': '@liveverse', + 'description': 'Welcome to the official Live Verse channel!' + } +) + +print("Seed data created successfully.") diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..4d0d7a6 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,350 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap'); + +:root { + --lv-accent: #FF3B3B; /* Crimson Red */ + --lv-accent-glow: rgba(255, 59, 59, 0.5); + --lv-black: #080808; + --lv-deep-space: #0F0000; + --lv-surface: rgba(20, 20, 20, 0.8); + --lv-text: #FFFFFF; + --lv-text-muted: #A0A0A0; + --lv-border: rgba(255, 59, 59, 0.15); + --glass-bg: rgba(15, 0, 0, 0.85); + --glass-border: rgba(255, 255, 255, 0.05); + --gradient-cosmic: linear-gradient(135deg, #FF3B3B 0%, #660000 100%); } + +body { + background: radial-gradient(circle at 50% 50%, #1a0000 0%, var(--lv-black) 100%); + background-attachment: fixed; + color: var(--lv-text); + font-family: 'Outfit', sans-serif; + margin: 0; + overflow-x: hidden; +} + +/* Red Starfield Effect */ +body::before { + content: ""; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(#ff0000, rgba(255,0,0,.1) 1px, transparent 40px), + radial-gradient(#ffffff, rgba(255,255,255,.05) 1px, transparent 30px); + background-size: 400px 400px, 300px 300px; + background-position: 0 0, 50px 50px; + opacity: 0.2; + z-index: -1; + pointer-events: none; + animation: drift 100s linear infinite; +} + +@keyframes drift { + from { background-position: 0 0; } + to { background-position: 400px 400px; } +} + +h1, h2, h3, h4, h5, h6 { + font-family: 'Space Grotesk', sans-serif; +} + +/* Navbar - Universal Style */ +.navbar { + background: var(--glass-bg); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border-bottom: 1px solid var(--lv-border); + padding: 1rem 2rem; + position: sticky; + top: 0; + z-index: 1000; +} + +.navbar-brand { + font-size: 1.6rem; + font-weight: 700; + letter-spacing: -0.5px; + background: linear-gradient(to right, #fff, var(--lv-accent)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + display: flex; + align-items: center; +} + +.navbar-brand i { + font-size: 1.8rem; + -webkit-text-fill-color: var(--lv-accent); + margin-right: 12px; + filter: drop-shadow(0 0 10px var(--lv-accent-glow)); +} + +.search-bar-container { + max-width: 500px; + width: 100%; +} + +.search-bar { + background: rgba(255, 255, 255, 0.03); + border: 1px solid var(--lv-border); + border-radius: 12px; + color: white; + padding: 0.7rem 1.2rem; + width: 100%; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.search-bar:focus { + outline: none; + background: rgba(255, 255, 255, 0.05); + border-color: var(--lv-accent); + box-shadow: 0 0 20px rgba(255, 59, 59, 0.2); +} + +/* Floating Sidebar - Unique Layout */ +.sidebar { + width: 260px; + height: calc(100vh - 120px); + position: fixed; + left: 20px; + top: 100px; + background: var(--lv-surface); + backdrop-filter: blur(10px); + border-radius: 24px; + padding: 1.5rem 1rem; + overflow-y: auto; + border: 1px solid var(--lv-border); + transition: all 0.3s ease; +} + +.sidebar-item { + display: flex; + align-items: center; + padding: 0.85rem 1.2rem; + color: var(--lv-text-muted); + text-decoration: none; + border-radius: 14px; + margin-bottom: 0.5rem; + transition: all 0.2s; + font-weight: 500; +} + +.sidebar-item:hover { + background-color: rgba(255, 59, 59, 0.08); + color: var(--lv-text); + transform: translateX(5px); +} + +.sidebar-item.active { + background: var(--gradient-cosmic); + color: #fff; + box-shadow: 0 4px 15px rgba(255, 59, 59, 0.3); +} + +.sidebar-item i { + margin-right: 1rem; + font-size: 1.2rem; + width: 24px; + text-align: center; +} + +/* Main Content */ +.main-wrapper { + margin-left: 300px; + padding: 2rem 3rem 5rem 1rem; +} + +/* Section Titles */ +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; +} + +.section-title { + font-size: 1.8rem; + font-weight: 700; + position: relative; + padding-left: 1rem; +} + +.section-title::before { + content: ""; + position: absolute; + left: 0; + top: 20%; + height: 60%; + width: 4px; + background: var(--lv-accent); + border-radius: 2px; + box-shadow: 0 0 10px var(--lv-accent-glow); +} + +/* Shorts Grid - Vertical Layout */ +.shorts-grid { + display: flex; + gap: 1.5rem; + overflow-x: auto; + padding-bottom: 1.5rem; + margin-bottom: 3rem; + scrollbar-width: thin; + scrollbar-color: var(--lv-border) transparent; +} + +.short-card { + min-width: 200px; + aspect-ratio: 9/16; + background: #111; + border-radius: 20px; + overflow: hidden; + position: relative; + border: 1px solid var(--lv-border); + transition: all 0.3s ease; + cursor: pointer; +} + +.short-card:hover { + transform: scale(1.03); + border-color: var(--lv-accent); + box-shadow: 0 0 20px rgba(255, 59, 59, 0.2); +} + +.short-overlay { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 1.5rem 1rem; + background: linear-gradient(transparent, rgba(0,0,0,0.8)); +} + +.short-title { + font-size: 0.95rem; + font-weight: 600; + margin-bottom: 0.3rem; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +/* Video Cards - Polished */ +.video-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 2rem; +} + +.video-card { + background: rgba(255, 255, 255, 0.02); + border-radius: 24px; + overflow: hidden; + border: 1px solid var(--glass-border); + transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); +} + +.video-card:hover { + transform: translateY(-10px); + background: rgba(255, 255, 255, 0.05); + border-color: var(--lv-border); + box-shadow: 0 20px 40px rgba(0,0,0,0.4); +} + +.thumbnail-container { + position: relative; + aspect-ratio: 16/9; +} + +.thumbnail-container img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.duration-badge { + position: absolute; + bottom: 10px; + right: 10px; + background: rgba(0,0,0,0.8); + backdrop-filter: blur(5px); + padding: 2px 8px; + border-radius: 6px; + font-size: 0.75rem; + font-weight: 600; +} + +.video-meta { + padding: 1.2rem; +} + +.video-title { + font-size: 1.1rem; + font-weight: 600; + margin-bottom: 0.6rem; + line-height: 1.3; + color: #fff; +} + +/* Action Buttons */ +.action-btn { + background: var(--lv-surface); + border: 1px solid var(--lv-border); + color: var(--lv-text); + padding: 0.6rem 1.2rem; + border-radius: 12px; + font-weight: 600; + display: flex; + align-items: center; + gap: 0.8rem; + transition: all 0.3s; +} + +.action-btn:hover { + background: var(--gradient-cosmic); + border-color: var(--lv-accent); + box-shadow: 0 0 15px var(--lv-accent-glow); +} + +.upload-btn { + background: var(--gradient-cosmic); + color: white; + border: none; + padding: 0.7rem 1.5rem; + border-radius: 14px; + font-weight: 600; + box-shadow: 0 4px 15px rgba(255, 59, 59, 0.3); +} + +/* Category Pill - Red */ +.category-badge { + background: rgba(255, 59, 59, 0.05); + color: var(--lv-text-muted); + padding: 0.6rem 1.4rem; + border-radius: 30px; + white-space: nowrap; + cursor: pointer; + border: 1px solid var(--lv-border); + font-size: 0.9rem; + font-weight: 600; + transition: all 0.3s; +} + +.category-badge:hover, .category-badge.active { + background: var(--lv-accent); + color: #fff; + border-color: var(--lv-accent); + box-shadow: 0 0 15px var(--lv-accent-glow); +} + +@media (max-width: 992px) { + .sidebar { + display: none; + } + .main-wrapper { + margin-left: 0; + padding: 1.5rem; + } +} \ No newline at end of file