From 565f6b39a8c8f2a85eafead5dfff9f63656dd065 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 16 Dec 2025 01:57:12 +0000 Subject: [PATCH] h --- config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5562 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1759 bytes config/settings.py | 11 +- config/urls.py | 6 +- core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 821 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 2400 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 547 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 2456 bytes core/forms.py | 7 + core/migrations/0001_initial.py | 24 +++ core/migrations/0002_rating.py | 27 +++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1231 bytes .../__pycache__/0002_rating.cpython-311.pyc | Bin 0 -> 1852 bytes core/models.py | 20 ++- core/templates/base.html | 5 +- core/templates/core/index.html | 155 ++---------------- core/templates/core/media_detail.html | 58 +++++++ core/urls.py | 9 +- core/views.py | 51 +++--- requirements.txt | 1 + static/css/custom.css | 94 ++++++++++- staticfiles/css/custom.css | 111 ++++++++++--- 22 files changed, 382 insertions(+), 197 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_rating.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_rating.cpython-311.pyc create mode 100644 core/templates/core/media_detail.html diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 5be02db206d695487566bb415cb6b1e287631fb4..ad5c32a176d0ffe68dab4291c6729d9d33953de6 100644 GIT binary patch delta 357 zcmdm>y-S;SIWI340}x!=<&bGNkyn!O(nj^WOhW05QA#O>QOc>DDMnS?3=B~!lO>oH z8C54+F)OmFF)^g7PflRgXVjQHfmu;m6Ub-I0viJ|D#bE|cNr4{!)hRgfGDlWSD1Yn zwI?gF_%iBDE?`kq*G;i+VL;R8kgAKSZ-L(A9W182`l&iaOes!L+9}Ra2AhAe^l}JP zvFqoirer4S-(m&Ro9FVDGcvB8EXv==Xt;Sg{~<=-Tb#bGE}o9@p+P>kxFF0RfB%po zBcPj#jDf^0=FGg3A`=kT3`CfN2n!Hl2_me4#4Xn1f}G5fBKyhxf`(k_KoLeDF21?> vl;A`r`3E90Gb%2Ms9zA)xWFLrfJd}}^9HZz4EBq>@(o-cxHi{|7%~C?>zY?l delta 307 zcmdm`y+NCIIWI340}#CB)yQ<2$ScWsWuy9CCXrOm6vHZR1_mH)1ftWKqm(9#F)K1E zPqtuIWL05eNL8I2$E?q&Hn|Tdsy=xGkkpubiP@J?bFu=9FQeAvJQhVp?a32ZL4BRx0o~YN{UQDTyqd%0U|6x zgcXRe0TQ=ZiwklxONtyO&l5D{N&|{80&(%Z%{K)nGO2uEV_@a&sJO@?euISvPS;&z Vk^R8VBEocmLEr=5=1vhqMgU?ZP^AC> diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 28817aa35512298e6df4bc5c0b678c917f71e36c..38479ac9f74ea827e58c5402d88214af55d74d0e 100644 GIT binary patch delta 603 zcma)1ze~eF6uyg>q-`3lIw>mRq7`WeMY{PTRS~R0Z9!a0NTN-#Nl8+K4C?4wf}n$| z3W^AhE{={7I>;^l3kv=Lz9j8XaPaYt_ucot@7=qLxlg zVJ&E>V1k+eb_m#V*ii*n_~SWP1ni*!(80x>of3@~*7BPx zA)km~KzmnY!t=?hFb0D#96OJ_adv5H)<-@0fhPUl^iJ6M;unWl;cWdp*A^!3s_o3G zPo#GuwTbl2_YLGR^fzz;zaG5pwF?#BJpMtbfhFb(0iS2SqXJ}j3oPCfE0a;!H_Kps|Tv)hlvB(0x&jq zJt;iF3?Qt@o49#8<0Phd_RPHGoYIukTPy{MB^jEGw>XMZOG+~H(u;v?w&Ie+lFZ~P zw#1a&%sl;D3{{-T`9-OErA0Z#RUG<>#Xz;i`nT9144?+yl>Fq<+|<01_@ey$5<4cd^I{umhcWi={ZT1ZXkHw8@&Ra+0^Wff>l$<=HLED}I% E08~w8umAu6 diff --git a/config/settings.py b/config/settings.py index 291d043..0d1c507 100644 --- a/config/settings.py +++ b/config/settings.py @@ -149,11 +149,12 @@ STATIC_URL = 'static/' # Collect static into a separate folder; avoid overlapping with STATICFILES_DIRS. STATIC_ROOT = BASE_DIR / 'staticfiles' -STATICFILES_DIRS = [ - BASE_DIR / 'static', - BASE_DIR / 'assets', - BASE_DIR / 'node_modules', -] +STATICFILES_DIRS = [BASE_DIR / "static"] + +MEDIA_URL = '/media/' +MEDIA_ROOT = BASE_DIR / 'media' + + # Email EMAIL_BACKEND = os.getenv( diff --git a/config/urls.py b/config/urls.py index bcfc074..cb9e1cf 100644 --- a/config/urls.py +++ b/config/urls.py @@ -15,14 +15,14 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import include, path -from django.conf import settings +from django.urls import path, include from django.conf.urls.static import static +from django.conf import settings urlpatterns = [ path("admin/", admin.site.urls), path("", include("core.urls")), -] +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) if settings.DEBUG: urlpatterns += static("/assets/", document_root=settings.BASE_DIR / "assets") diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d64a49e48ed94cdf2cc38ec7905eaa9695bfb662 GIT binary patch literal 821 zcmZuvJ8#rL5T5ng&VwA`5hNZGw74KHpo|a&g6h&B8aI}?og5DK`LebJbSYA#L83rP zPZ5Op2bBDRD^J@}rMu`-UB!$S111^oexBLc`DS)@zw~;mK=R@Hlk^Auf3nev_gk4i zCFKYdD3L)fA|XIIN@h+jBPqav=b+pJP#%h1w+%j)0N-d@i9F@MfMDr_%|IA$r_gzM zBCK_(k19=Gj&|3mnUGIdDX z?ep6mQk0Q9q$7S7RIEcZaqj zB{{~iS&ieoP<6)oS{(1yNoGBoduu#$VrKlE6f;$Rg*hK%@gRI%QPmP_znkk zRp{_-q2H9_WPstI&=@ui+#J6*E*GU&D3UqLy9E1xzUh@ahu-w+!$~s^eg5=y+M;g| zYzMCHv2mGUyJrbeU^$F${;L;rxaw1;S~J>?b@PF&iVUE7HRRDIqZ&wFoX z-pst2-~QUu6C*Hw`SbJA_W?rw#z||0n#}GzFe`)-D(Ivv6a@i!Q5VaBVn84wxk6~* zKA}M-%m-V_Yhdjuy#6SLJgE>!b^V7_7Y*l0Dzc4ADZ%Y38dKXCV&LIO^NXTuoCfPqAeXb zr|W=~7!BVi#cmpbkfLt)4Mt1q)S_;vbo(DrE2Km>R#xvQI;+fDb8cu_S1Sukk*X(R zW+3XQ&nuSkL~tdwY8gt!xUHy^YHer15@s3S-7Jt5a*yDB`D0PG+IK*3r=5mQXTe1w zmkPKct7PfS4VV^pyZzG{Ra6Vk51LG$G4b5~SLw{0QD&LybhTntGwcr2z&D<`ZSVzi zQPo&RGdRomx0hbL>xLBtEGo*9ye|vs<{}oLc?3v}Z1u_ym+ao*$NAMm&WTSNeZx-Q zupJrR#b|OV$&DyVMJ+Q$abt=C_NzMblA_$Is=B|!F<>`(X-?(iC8kpz$9e2(S)FCx zf*UF!?@DE+npMuqtYVpN&zNelLaFS_@OMCo9|H1(@OP1ykzmny1gp>d7D%oA+menx z7+h2*3FFpTfW$kFFNwY z+V!pE;PRl89DFurC(kvK=bYrZ+Qd#!2#xHJ*NN{Jx}?F|9^odp8-%-hTVt?LM+*q+ z;(>nkTOiW1iv0}*AEiMW>TIVmvIas=TY}{EHt-syyCp!w>yggdD@vX1#(Kavyfkmn zFla>AAmL9j>E0;zdK!2~-T;Z%0h$4N+cl|LrOK=u=H9;vtrs;a3V;i< zpb$9I;qs|hS{m}3DjPl}zrG)QddT$B!%nyOoh<*B+|7;}cCw|L6OFX%` zezX2Td)X_6ZS-jyT?Xg~YjZ|PV`c#yK#)oWIGS>Um8!0LD;%$+BU+5qi*_8CP8^wU z$Gh0QA7A$HrdQlNjRKNZAw0{~QfQ1P2mEKxUPB3AGODEZ*x zcN(_dQoNayCQ#s-nF0bpkv!}qPddqzogA$foS_TO(5T%z3C|||Yu@MV$fTE-TuSDL zL5shK@pw1ZRu*oVzbN#5jVuu3QRJ%6D_bi zmJcOixIDxUj|eLz;4=DNsqAT0ZO~ zP63`JvW-O6Nn~r+5RUQ!;?bL^9~K6aONHGiorkO$X*%s^{77@I8IZBkbQ->Bb7}u8 z;U_S313&ma%%YJ4sd^PT?_>T2ejawQCe5FK>;wcs*dj;m&S#5!WOqJ0!LR^W`Z`%2 h{PE)#xc+i)GZ_&u#5dCiHy?ie!rOcK76~sE{{kC2Fj4>j literal 209 zcmZ3^%ge<81S>LrWmp2~#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>OHV%|KQ~psG^sSNq*On(A~m_R zB)>?%JijQrxF9h(RX;huC{-U~j9x+IFAf_ZyEG@&u80Guoe_wOWr4&8W=2NF8w@fR Ku%RM0pb7xTsWln^ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 1f807fae1897c89361c99c5e868a26d00799b73f..586bc213de1b89010e55e72d460d222558a96409 100644 GIT binary patch literal 547 zcmZ`!ze~eF6n@uSlK!+Jf=~qMSSSrRilh!5#YJ4Ql-N7k*!(D$#MTayvHyV`o&13g z?)pch(4k~?>Q?C1$xEz*Mc=(U-hJPDAK!Z{6tckMD#wQH z9re1Z!X(ZPcQ;W!udsOUvx*$$$dzulotn=~m&MCO;Rs`!__?fD8F(3bBxOzAtU>-O{(Ray??G*_ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 6867ddf286a519cf1754ac97038f9f1e4605fbf2..1a7d9bc5bfb0f13fcd085f6cfb43a71be14962f1 100644 GIT binary patch literal 2456 zcma)7&1)M+6ra`Z>chL16v>K`I*nwzIF*{n4UH+mahw*MQb^S_ZfPT0%v!sVC2J*j zcIBk$s_`KQwHO*`AZZEIh1OND54p9_OaFwGSddsS6ne^~2uv?I_08B?OR)=i%)Xs@ zA2ajb{N~NCgM$MI=(j&EdLqnGIkYNmCJC@ zXJxL)tL}`O_W7bm^=7=PFXMx;`!321$R6N=>;*2$zB!Z_cuJ;ExNJ98O0t4&FIMC{ zRicsa+M-I* zIxj1_lrKJJY}fMA?LfASm5DqY$F0<&t`=?X21&TjcB_iMSe7x_9TtGu{N;DA%+A@~ zyf(ig74x#qY0`>NL}ys=&F&yY%v>Pv+3AX2{N2hd=UgzS%W@l*?fyC+P|% z7jGASJRTx_ipLYAN9^%QU>Y$3?8W2wD3OU>79`3gV5?|bj9Ox>C5|=4v2|>UV+}EB ziOJR3wm-b4w*0ZCKi2S%SpJdKciNE?t;l#YGX9HJfAc5fXQL50XGP9E`P7QMy_()b z%^Sa0%nv>>i?_|mFQGLA!x9XWGw?B3uMa&0*AzXO|F2*7^d9u=SFd#kCoqRYfGJo1 z=>n!u!Kr13d&%r`KI{wl04Dk?SCs=Vry3SWY?QFKS6<~yE*VvMgT-SyIk7$JiHrc? z0PW(?;J4fx5Y46&5rg#bzOn3~8GwxKS97R_-ZZUd6t4IsFtPREnv@=zv!qHO}3(`W;FF=)QqMY(Mc;h zSrgmA=zXyjj5mYv^=KoQu!4yi-wqwWf4UVKZH7kI&({|kp|e)#Y|YaaLTeW+;nfae zeaG8F!}qV$W^1#54IKj}1UrcFEi&6;Xf53mN1EbD-S~6TymsA`ZkXaoL(ExX&J=Uo zLik=9E{~9G2uVvwnp~2iJ)Ib|gK|MC<;p2-v5a*n`5L{nG&7D)UP!5BSt)AtR@*#z zk2LxW!JD+JAgG|Zr7yznO(w~CjOa@Aen0bG0P9Loxrko}6)CLRcfdLCOu9@aXXm$}$M4jbZ_D$_wdTojqtI_MyyoBj_kJ_yzT literal 1364 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 axEn$@Cp6G`@ht8p2anmp$valPsQv+8qUx&v literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 71a8362..93de57f 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,21 @@ from django.db import models +from django.contrib.auth.models import User -# Create your models here. +class MediaUpload(models.Model): + title = models.CharField(max_length=255, blank=True) + image = models.ImageField(upload_to='uploads/') + measurements = models.CharField(max_length=255, blank=True) + uploaded_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.title or str(self.uploaded_at) + +class Rating(models.Model): + media_upload = models.ForeignKey(MediaUpload, on_delete=models.CASCADE, related_name='ratings') + score = models.IntegerField(choices=[(i, str(i)) for i in range(1, 6)]) + comment = models.TextField(blank=True) + rater = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f'{self.media_upload.title or self.media_upload.id} - {self.score}' \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..aaf6432 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -3,7 +3,10 @@ - {% block title %}Knowledge Base{% endblock %} + {% block title %}Savage Ratings{% endblock %} + + + {% if project_description %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..9bd28db 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,18 @@ -{% extends "base.html" %} +{% extends 'base.html' %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% block title %}Savage Ratings{% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+

Get Brutally Honest Ratings

+

Upload your images and videos to get savage ratings from our panel.

+
+ {% csrf_token %} + {{ form.as_p }} + +
-

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 + +{% endblock %} diff --git a/core/templates/core/media_detail.html b/core/templates/core/media_detail.html new file mode 100644 index 0000000..d40ea1a --- /dev/null +++ b/core/templates/core/media_detail.html @@ -0,0 +1,58 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{{ media.title|default:"Media Detail" }}{% endblock %} + +{% block content %} +
+

{{ media.title }}

+ {{ media.title }} + {% if media.measurements %} +

Measurements: {{ media.measurements }}

+ {% endif %} + Back to home + +
+

Rate this media

+
+ {% csrf_token %} +
+ + +
+
+ + +
+ +
+ + {% if average_rating is not None %} +

Average Rating: {{ average_rating|floatformat:1 }} / 5

+ {% else %} +

No ratings yet.

+ {% endif %} + + {% if ratings %} +
+

Comments:

+ {% for rating in ratings %} +
+
+
Score: {{ rating.score }}
+ {% if rating.comment %} +

{{ rating.comment }}

+ {% endif %} +

By {% if rating.rater %}{{ rating.rater.username }}{% else %}Anonymous{% endif %} on {{ rating.created_at|date:"M d, Y H:i" }}

+
+
+ {% endfor %} +
+ {% endif %} +
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..95d94d5 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,8 @@ from django.urls import path - -from .views import home +from .views import index, media_detail, rate_media urlpatterns = [ - path("", home, name="home"), -] + path('', index, name='index'), + path('media//', media_detail, name='media_detail'), + path('media//rate/', rate_media, name='rate_media'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..b49e5db 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,34 @@ -import os -import platform +from django.shortcuts import render, redirect +from django.db.models import Avg +from .forms import MediaUploadForm +from .models import MediaUpload, Rating -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +def index(request): + if request.method == 'POST': + form = MediaUploadForm(request.POST, request.FILES) + if form.is_valid(): + media_upload = form.save() + return redirect('media_detail', pk=media_upload.pk) + else: + form = MediaUploadForm() + return render(request, 'core/index.html', {'form': form}) +def media_detail(request, pk): + media = MediaUpload.objects.get(pk=pk) + ratings = media.ratings.all() + average_rating = ratings.aggregate(Avg('score'))['score__avg'] + return render(request, 'core/media_detail.html', {'media': media, 'ratings': ratings, 'average_rating': average_rating}) -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() +def rate_media(request, pk): + if request.method == 'POST': + media_upload = MediaUpload.objects.get(pk=pk) + score = request.POST.get('score') + comment = request.POST.get('comment', '') + if request.user.is_authenticated: + rater = request.user + else: + rater = None - 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) + if score: + Rating.objects.create(media_upload=media_upload, score=score, comment=comment, rater=rater) + return redirect('media_detail', pk=pk) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index e22994c..e51ac05 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ Django==5.2.7 +Pillow==12.0.0 mysqlclient==2.2.7 python-dotenv==1.1.1 diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..d531ff1 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,94 @@ -/* Custom styles for the application */ body { - font-family: system-ui, -apple-system, sans-serif; + background-color: #1A1A1A; + color: #F5F5F5; + font-family: 'Lato', sans-serif; } + +h1, h2, h3, h4, h5, h6 { + font-family: 'Roboto', sans-serif; +} + +.hero { + background: linear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); + padding: 100px 0; + text-align: center; +} + +.hero h1 { + font-size: 4rem; + font-weight: 700; +} + +.btn-primary { + background-color: #FF3B30; + border-color: #FF3B30; +} + +.btn-primary:hover { + background-color: #E6352A; + border-color: #E6352A; +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 20px; +} + +form p { + margin-bottom: 15px; +} + +form input[type='text'], form input[type='file'] { + width: 100%; + padding: 10px; + border-radius: 5px; + border: 1px solid #ccc; +} + +.rating-section { + margin-top: 40px; + padding: 20px; + background-color: #2a2a2a; + border-radius: 8px; +} + +.rating-section h2, .rating-section h3 { + color: #F5F5F5; + margin-bottom: 20px; +} + +.form-label { + color: #F5F5F5; +} + +.form-control { + background-color: #3a3a3a; + color: #F5F5F5; + border: 1px solid #555; +} + +.form-control:focus { + background-color: #4a4a4a; + color: #F5F5F5; + border-color: #FF3B30; + box-shadow: 0 0 0 0.25rem rgba(255, 59, 48, 0.25); +} + +.comments-section { + margin-top: 30px; +} + +.comments-section .card { + background-color: #333; + border: 1px solid #444; + color: #F5F5F5; +} + +.comments-section .card-title { + color: #FF3B30; +} + +.comments-section .text-muted { + color: #bbb !important; +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..d531ff1 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,94 @@ - -:root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); -} body { - margin: 0; - font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); - color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - text-align: center; - overflow: hidden; - position: relative; + background-color: #1A1A1A; + color: #F5F5F5; + font-family: 'Lato', sans-serif; } + +h1, h2, h3, h4, h5, h6 { + font-family: 'Roboto', sans-serif; +} + +.hero { + background: linear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); + padding: 100px 0; + text-align: center; +} + +.hero h1 { + font-size: 4rem; + font-weight: 700; +} + +.btn-primary { + background-color: #FF3B30; + border-color: #FF3B30; +} + +.btn-primary:hover { + background-color: #E6352A; + border-color: #E6352A; +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 20px; +} + +form p { + margin-bottom: 15px; +} + +form input[type='text'], form input[type='file'] { + width: 100%; + padding: 10px; + border-radius: 5px; + border: 1px solid #ccc; +} + +.rating-section { + margin-top: 40px; + padding: 20px; + background-color: #2a2a2a; + border-radius: 8px; +} + +.rating-section h2, .rating-section h3 { + color: #F5F5F5; + margin-bottom: 20px; +} + +.form-label { + color: #F5F5F5; +} + +.form-control { + background-color: #3a3a3a; + color: #F5F5F5; + border: 1px solid #555; +} + +.form-control:focus { + background-color: #4a4a4a; + color: #F5F5F5; + border-color: #FF3B30; + box-shadow: 0 0 0 0.25rem rgba(255, 59, 48, 0.25); +} + +.comments-section { + margin-top: 30px; +} + +.comments-section .card { + background-color: #333; + border: 1px solid #444; + color: #F5F5F5; +} + +.comments-section .card-title { + color: #FF3B30; +} + +.comments-section .text-muted { + color: #bbb !important; +} \ No newline at end of file