From d57d2a227fc4d229cbcf6810a78e6281da0b9a21 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 31 Jan 2026 04:04:22 +0000 Subject: [PATCH] hamaghafursmaldet --- 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 -> 785 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 524 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 763 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 1432 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 446 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 3483 bytes core/admin.py | 8 +- core/migrations/0001_initial.py | 28 ++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1429 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes core/models.py | 19 +- core/templates/base.html | 74 +++-- core/templates/core/index.html | 296 +++++++++--------- core/urls.py | 8 +- core/views.py | 90 ++++-- static/css/custom.css | 110 ++++++- staticfiles/css/custom.css | 119 ++++++- 22 files changed, 546 insertions(+), 206 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a6362b2322713e75da67a35e209e76169dbae..c2b34351e912f755e04d33ba4f1fbcadddbfb8fd 100644 GIT binary patch delta 19 ZcmbQwIG>SwIWI340}v$E)K27{0st!x1fc)` delta 19 ZcmbQwIG>SwIWI340}xbw%b&y+NCMIWI340}v$E)NbTnDhdEN)CFAt 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..ee51d805cc12aa902e59f91470a914cbf236ffc7 100644 GIT binary patch delta 20 acmbQrGnI#XIWI340}v$E)NbVFVgmp#F$6yV 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..eaee1fe256e8ede5dead0081c0d755c16d89323b 100644 GIT binary patch delta 20 acmZ3^x}24JIWI340}v$E)NbUS!vp{_0R-a! 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..047881b31777477ed3e28de63d8ef1e6c420777e 100644 GIT binary patch delta 19 ZcmbQsIG2%oIWI340}v$E)K27{1OO_;1e*W= 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..56aeaf3c0be8ea861c671e6f98bf1f075c5da410 100644 GIT binary patch literal 785 zcmZWmziZqu6n?UOcg`i(KyxW1lu$~S8*-+dOQA!5K$~{RQ1BuYOUXHr?Tc(TJ!rv0 zpli1L2Ukk|nG`Y@O@U6?E?lQfee#_HAy3lN_nxHh>Am->(`f_B&+k9NF9hJPF=}bf z!E}h=6gY4qAtF8@z%6b|E3$o?fCYl=JM|-BkCEpL*Gw#U2i!RZ-oRUp+B>%K4z8Ju zaXYIG@SD834ZYTt@$`spFdl{Rm0?87eH%)#9k4jKeSn}2H{C$v6a@H$gKu%-+uZUU zZu<@HAaMhUo4QkTyf(}|N4vX78nZ~~whGe&D#ceJ^@8!z0ZRwE9Vo#v!70mnmRi6d zY7rG;*I-ja#Ad7fpL#9rQfe3})on_ngy+ab^%A9rIg|5~B^jm}<>q(WqxRs=~wy`RdG8mSKb#N%ZL5qL)qOdw#rA(i_d1LZvDul^?>iQcrWP( zNt~&0N0}z-Cgvw(s!V^itHd6rg*mjhjJqoGEb@wBs_0e`-MBAjb$O-M(KJ0wk5El) zLP!Zu&hO3=9-rTxmt?tEJ>EER|B$r{vNo|C@?rw_)ybQS?z3xi@Xx4g8?5#F_p6Wn E2Re<$kN^Mx delta 151 zcmbQpc7@S@IWI340}xFAk)LS~q#uJgFu(+5d=>&SrZc24q%h_%0#ks&dbZi00fCOwHvt^nE))M1P}lK 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..b06b68049b1b34e75ba6946db13b5ceaf23019f2 100644 GIT binary patch delta 20 acmey(`kR$|IWI340}v$E)NbVdzytt4AqC$6 delta 20 acmey(`kR$|IWI340}xbw%iqZTfe8RYW(H&c diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..7f239d4ce15357253b42d65c7b0058a127f0332c 100644 GIT binary patch literal 1432 zcmZuxy>Ht_6hD4QqGWwBanp~a4vjQ}P}m&O6dnrq%Zly9a)8)P0WJrccb4c-WO|fr z*Kh%$$l#%ahXNjg0!2}{F6^OW{({aDz(L?tpp!QR%H$<|CyFwn=E(cqyZ7Gl{oZ>g z{gKOM5R4!9f3Uw45&D;J;*l5%{W%bh5J5z6P+c$t0f}f45%C!!5*4=KTr`d)gic{b z!;px)hDwQZzAXu1vhES;_}0)oSmfcR{|^X9h$2HE$PlX#>NmlVL`3DSm<9wqla2)l z0W%s#a?C>}iL>M}5IP-^GE!qcDJq>QV?N5jCmnzH7=+V!gN)3;IuR=%MtY1#mSmnG zBR43^1e7H^_WeA`K`HW~a?f_?nq|5rsU(Kd%ENB~yd98}mGZ*!Hx*bZv72?!$VNr*KnAUN}W@!9_f;0W!bEm))R9NGZ;k@s`-iv($it9z0*qX9)_6Vh?bIt??- z_MZT?ZR$WY*{9B?&(CQWvwF>|Q@y#-bQ?{b?otbwFnz~kPyDB*MRm(#RFCe)?9=bV z6vlpoVZ2w2Yc)I66ybaR2LLV9y>jj6nRekWyuU8|{xFi-%H2LE{>BZ9$@eG0a(Tmu zP=)(NL`X-v$c-XZXv5r_n6Vf&891=hyJu5}FrHPI=54?=)2}feB22H--NwKkrXUmFbNw*402!^@ zbsFh2mnpLM;0)uznZ{v6pYdPb0C-gYZ-7hoJyE`z?4cN14|-Wt)DE_T!p)OA?SkGZ z=s`hmEp?09VKOLcCttmoY!~M{#rdE(-&*df(}&jrb^7Gdi|cK*+)>McT5jF%=BExe zgZxw{uLXInwb)f}bGO@nebQFvI_g}Y&b99MWFhfs4~-xxByRETIK1S#S8p*yDe~-i zd(&jgbgSMh*@&u}sPO-(D0vNhE(>y@d=|BTo_!1kezp7xKu;0`p^I*`-+X(rDgdYd S!@>4X`!Biv)mw~%aQ^{NpHSHV literal 209 zcmZ3^%ge<81k-=yXIcX3#~=<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%RM0pb7xLi8T)Z diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..03c758d1b3665f539d8b68227c91419c3b40dceb 100644 GIT binary patch literal 446 zcmZ8cy-&hG6o1!V3#B0>I=HwRLSndu(KtD~7#AE&>77vQ2f4O_MiWK{2L}^P+#LLf z{xKzCAYGl!XdnouLhsU5BR9UxR~_IJ?-IY90&H+FH}())CZ7Q$?zgoc5fg zGbPKwxbQ?j&LKCvkc)vThfW}_jM#NTmRri4o_W4FtQB&bcb%{u)l=!mQf(pCXQY}g z3rbn2avRGyA`vo-KVXh2SnRS+6bP2K(lAMx7zj5_BFXxZJdb;hE0`NeEaSWN-sPgW z7eqYu#lEayv)VLnp_=K0kO^#O>oS4OY+Yt17}oIMcH{Q=?&PVT(dvj+$Fw@3Ma*v9 a?>w+~JEM&eZH#GSX6O}dXsaX3IOYd#0&gh* delta 243 zcmdnTe49yqIWI340}xbw%g@XL(vLwL7+{4mKHE%GS4~b~UBkAFnSo(75JNyZV-!mY zdoY70$4iiaCgUxZg2a-HmyA$OMt*MUErueHF(A3T#N1RrP1al7DOrhm>G^u4MLESq zAj594mSv`v7Zem_Up@pd`cvJCHyS>;fuX!edFc+O(U+RTVj&Nj%BezfIL7V5*Y<$I&UV!0PRv-1$V|> zU^6U3`EJEi@MgR=&MLlwKjR17BYKrUA(#mQ?)w^LIMEM~7nuc=3_Pbs=94bVi>0C{ zVatytQN~hEOEMOJlc>edB~nt0L;{-25xlY_ZAyib_MCxmw(B`08o7p1#`P zW({t(&d$Dssi-Hu8ON*h6I2?fh=La2WXiC+ni?5lB4VmD*!wcT7-Tsl(&>+g=Aj!T0OZxmus2*};0V(wj#H-B0U5oDu{7 z!^fb=)k2Ow2h)SS+TIt5?j;947(L%RpFvvO(Z063YPEic>tMP|XLXO*_W|F$y}JJv zdIa_Nc((>CJX9{-Z}xb9ml4CgI>bn4x8R>@$GbBT()qQaE(Q33J$Q5vesB*y+{J57 zadlbn7W?8_&cS+X0{Z9B-u@{b*m3RemD+h{wiw;- zP4eKp#s2)Wgmw=+;XQ$o}yU|V1dZMSR;UL zEK^t_r-1=Y(K~nblN-OB+ZtIYlaid1)iM#Nc0tRHP8FpILc4D+UrNHTf(ebE{XziT%`(yQdZL>TqGBS zE!Rn5YjR!{X&#Wd1S{_ST4T7?#Zpc}IXjx6p3E5&+xl3e{-g12;Bw5Q(!!BkE zk`tz^mbXG*&fU7MX{ER9t^Tpw zsj)(8OcchhUl^OaFt(8N;KLA)#Zt96MuR>=>0pk!Cy7g04b#qtX;wS808&;oOgox= zWF?PS-h!m%RnhXy-neyj!E&!kn#I~4v!Fz@d{nn0FI!%c&rY44u>yH%Q~yw z#X_R;mY5TMXBv!~?WQTUG-?3Qx%0L4V_6|%-(+bd!9X~Dt zO_NPBa9H0%rZ4pMR}Z62U!vhl)UJIu*BU+B96kGFr7?QZ7`+Hgb2zcnS6eZLQ`J6m zP%s9^s(y1I(HaSX*pFQ${q^ik@pm&o!dwjp+F**Y=|5 zNHu5<4B3L={`;$~P`nw6Kiq7DCXCR;5B)~yL@RW<89LnvO&g)h@FROfIy2 zqRt(G$2@ejdeh_we?R}b`TEGEr-K0CY4Dc~{&Jna-1fQ?!8YoGx__kYM~7q8kU22c zMy|lL4XRhnaR2sVwNkB^k$5XI){KnRmcN(3mH)E--FhQ3Wkjaxk*WXu$Q`2czhcZo zi9Kd-KNbHW|6TrPsBvl0xU^UwxeZT)&lr5B&S!oMN85-A%rm=g-fHl320vHl=O9aw zVI!Pqg~yxWar3|tGkVlKc+?ykesJTP8xL0-L*vHKcsqb1$6p{%B>0MgD%%bre(?U~ z78h@F@p|HPgPStAsrt-p6E11o?6bjy854Hq%;DHh$c!J`QO%LW&c`;^iqACTGxc*f z8}Uz#_@`~odoQ8#TwjTNoU{CEdwRr`Id*?VsASu_LkGR)zTe{vvBDpY5E@lrp*-E1T;m3 zbapU3eKD==zarbTUH5PNAA?L;kuKq%!6$mxB-;SmZiZn@6uM{sOcc0h|4fvszwa^8 kXubC_(V2ShW1?8S_i3{(<{AS9_W%F@ literal 1364 zcmZ`(&1)M+6ra_{dS%J>I&SM!uH%hUh$T{~CE!96oTjQ1oHkCdQ$lozPf-Q6#oM~=1-7}AYwoe=&3h>36z}rW~~)fO5P4{-h1=r&HMPV zzfVm~BA|nRhVUX&zZ=1NEJDd#(kRMro?7~GlVKiARAFbK7y={g8`rq_)Wa;XDEltUWCmB zkq~sth&3ZeP{;A878u54V{Oaty2i>_vx<&kIwj51DaMXgGg(=)ND+pj!HI^Q9g`Br z#tzdA%!;PvWg3a1>()Z2BR!#4DWHiJ1dw>FOuS)~xge&2p-9tZ06jh%7)=`o)~k%rY>m)oo?Fy$ z*3WOp#5FJD)_FvD(?z&0py>SutcBjF^RHFyMAbU#a#vk`t*)G?D;+i6Rnx7Fo|by~ z_(Z$b)~@ZR_tUQyT0itB&pp5LYvy^Tl^e+D)6aYJ%l+g^CzEdC%omzVp>MZ5DOS%5y(&3}_Ht_6u%>7iu!US#g2+bA02|C3S!ZLmkx2-B(5A6ax%nC0RaU;>(12K5~-4s zKY|AJ(4jz4AX_zeP*GTaK*o+8DS(4Fc02~aoy?@V zOd`)vdG1UY%My>bndul^W?L>-+BTsrw=r25ev%X6;$tkfq^OPws!IgdWfRpS5~6dv z%5(vdhzy$Ot~%3Tf=PtT4V6Iz!hks*I}(Y8$kC=-$SUop8hOkY7}LS$HAv3daWWb6hg#FP!~iK&X<;q~`pG8M8w7ER3X@W#8P zHE}&ja!}k4cx-c8)h(`8S&Kev7#5cpsd8y!tsLP=qt~_dhC_`mB|On_Sle)p^gVjS zV=i@=(PA$sPwrD^+jgmL8Ewkd9dIPLv%ew0GKRA=4s}qO-6oF-quw;!=Go`MDsh!; z>&znb&`E=W#~tSG0eYXd$}*Vc+S9Lr*ayHXn_sMLe64s2)7?HCQJHEf4!|6V3-d3pIR)ISWg(m8U(B?*aOTnt@) zJbT{EXOGu|2wqT*Yk`Vlr61$IT0G6%e3M!9a<^aY`?=e%BY)oV>bhq+Ud|omTtDY} z=`LWr!czaaUs!s5-7Bn)3afr$)l1($&E&merN84BE3h)_6>Fnn%`eux^yX=%;FYxg zzF*S3Pdk(M<@W(XA3c!HLwXrf&}1G;rrM1w-ig2;=$AVX? zj!IR(RQ1y9K`Od1A7oMHX8)W1(?FIM=Yz#mEPjrFTnZA%*Rsm-m*R1jr!{#3S0YAs z4a>AEWIH^`@bJb}(*!KU-UaThdT-np_nj3G#qYv>4kVB<#({!x*+ZXPeFNnNRswXD Syo&qjTj#=X`9Ich-+uuA;)EOk literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 9c833c8090679ee4c9ffd863c8f7abb0bb73a5db..c1aeff236374fdc9b1e1866d5b0804c079a05ec4 100644 GIT binary patch delta 19 ZcmZ3%xPp;;IWI340}v$E)K27{3ji!z1iSzM 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 %}Cloud Malware Detection{% endblock %} + {% if project_description %} + + {% endif %} + {% load static %} + + + + + + + + + + + + + {% block extra_head %}{% endblock %} + + - - {% block content %}{% endblock %} +
+ {% block content %}{% endblock %} +
+ +
+
+

© 2026 Cloud Malware Detection Web App. Built with Django & Security in mind.

+
+
+ + + + {% 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..c02b0b2 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,161 @@ {% extends "base.html" %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% block title %}Cloud Malware Detection Web App - Home{% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+
+
+

Cloud Malware Detection Web App

+

Securely scan your files for potential threats using advanced static analysis and hash matching.

+ +
+
+
+ +
+
+
-

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 + + +
+
+
+
+
+

Upload File for Analysis

+
+ {% csrf_token %} +
+ +
+ +
Click or drag file here to upload
+

Maximum file size: 10MB

+
+
+
+ +
+
+
+
+ + {% if result %} +
+
+ Scan Result: {{ result.risk_level }} RISK +
+
+

{{ result.filename }}

+

SHA256 Hash: {{ result.file_hash }}

+

Reasons for Assessment:

+
    + {% for reason in result.reasons.split|slice:":-1" %} +
  • {{ reason }}
  • + {% empty %} +
  • {{ result.reasons }}
  • + {% endfor %} +
+
+
+ {% endif %} + +
+

Recent Scans

+
+ + + + + + + + + + {% for scan in recent_scans %} + + + + + + {% empty %} + + + + {% endfor %} + +
FilenameRisk LevelDate
{{ scan.filename }} + + {{ scan.risk_level }} + + {{ scan.created_at|date:"M d, Y H:i" }}
No recent scans found.
+
+
+
+
+
+{% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..6018759 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,7 @@ from django.urls import path - -from .views import home +from . import views urlpatterns = [ - path("", home, name="home"), -] + path("", views.index, name="index"), + path("scan/", views.scan_file, name="scan_file"), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..0c5c4eb 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,71 @@ +import hashlib import os -import platform +from django.shortcuts import render, redirect +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +from .models import FileScan -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +def index(request): + scans = FileScan.objects.all()[:10] + return render(request, "core/index.html", {"recent_scans": scans}) - -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) +def scan_file(request): + if request.method == 'POST' and request.FILES.get('file'): + uploaded_file = request.FILES['file'] + filename = uploaded_file.name + content = uploaded_file.read() + + # Calculate SHA256 + sha256_hash = hashlib.sha256(content).hexdigest() + + # Basic Static Analysis + risk_level = 'LOW' + reasons = [] + + # 1. Extension check + ext = os.path.splitext(filename)[1].lower() + danger_exts = ['.exe', '.dll', '.bin', '.sh', '.bat', '.msi', '.js', '.vbs', '.ps1', '.py'] + if ext in danger_exts: + risk_level = 'MEDIUM' + reasons.append(f"Suspicious file extension: {ext}") + + # 2. Content check (basic keyword search) + suspicious_keywords = [ + b'eval(', b'exec(', b'os.system(', b'subprocess.run(', b'base64.b64decode(', + b'chmod +x', b'rm -rf', b'powershell', b'cmd.exe' + ] + found_keywords = [] + for kw in suspicious_keywords: + if kw in content: + found_keywords.append(kw.decode()) + + if found_keywords: + risk_level = 'HIGH' + reasons.append(f"Found suspicious code patterns: {', '.join(found_keywords)}") + + if not reasons: + reasons.append("No immediate threats found via static analysis.") + + # Save to DB + scan = FileScan.objects.create( + filename=filename, + file_hash=sha256_hash, + risk_level=risk_level, + reasons="; ".join(reasons) + ) + + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': + return JsonResponse({ + 'filename': scan.filename, + 'hash': scan.file_hash, + 'risk_level': scan.risk_level, + 'reasons': scan.reasons, + 'created_at': scan.created_at.strftime('%Y-%m-%d %H:%M:%S') + }) + + return render(request, "core/index.html", { + "result": scan, + "recent_scans": FileScan.objects.all()[:10] + }) + + return redirect('index') \ No newline at end of file diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..bebe23f 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,108 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +:root { + --primary-bg: #1a1a1a; + --secondary-bg: #2d2d2d; + --accent: #00ff9d; + --accent-hover: #00e68e; + --hazard: #ff9f43; + --danger: #ee5253; + --text-light: #f8f9fa; + --text-muted: #adb5bd; } + +body { + background-color: var(--primary-bg); + color: var(--text-light); + font-family: 'Inter', sans-serif; +} + +.font-heading { + font-family: 'Space Grotesk', sans-serif; +} + +.text-accent { + color: var(--accent); +} + +.bg-secondary-dark { + background-color: var(--secondary-bg); +} + +.btn-accent { + background-color: var(--accent); + color: #1a1a1a; + border: none; + transition: all 0.3s ease; +} + +.btn-accent:hover { + background-color: var(--accent-hover); + color: #1a1a1a; + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(0, 255, 157, 0.3); +} + +.border-accent { + border-color: var(--accent) !important; +} + +.border-dashed { + border-style: dashed !important; +} + +.cursor-pointer { + cursor: pointer; +} + +.animate-glow { + animation: glow 3s infinite alternate; +} + +@keyframes glow { + from { + text-shadow: 0 0 10px rgba(0, 255, 157, 0.2); + } + to { + text-shadow: 0 0 30px rgba(0, 255, 157, 0.6); + } +} + +.card { + border-radius: 1rem; + overflow: hidden; +} + +.upload-zone { + transition: all 0.3s ease; +} + +.upload-zone:hover .border-dashed { + border-color: var(--accent) !important; + background-color: rgba(0, 255, 157, 0.05); +} + +.table-dark { + background-color: var(--secondary-bg); +} + +.table-secondary-dark { + background-color: #333; +} + +.hero-section { + background: radial-gradient(circle at top right, rgba(0, 255, 157, 0.1), transparent); +} + +.result-card { + animation: slideUp 0.5s ease-out; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..bebe23f 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,108 @@ - :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); + --primary-bg: #1a1a1a; + --secondary-bg: #2d2d2d; + --accent: #00ff9d; + --accent-hover: #00e68e; + --hazard: #ff9f43; + --danger: #ee5253; + --text-light: #f8f9fa; + --text-muted: #adb5bd; } + body { - margin: 0; + background-color: var(--primary-bg); + color: var(--text-light); 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; } + +.font-heading { + font-family: 'Space Grotesk', sans-serif; +} + +.text-accent { + color: var(--accent); +} + +.bg-secondary-dark { + background-color: var(--secondary-bg); +} + +.btn-accent { + background-color: var(--accent); + color: #1a1a1a; + border: none; + transition: all 0.3s ease; +} + +.btn-accent:hover { + background-color: var(--accent-hover); + color: #1a1a1a; + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(0, 255, 157, 0.3); +} + +.border-accent { + border-color: var(--accent) !important; +} + +.border-dashed { + border-style: dashed !important; +} + +.cursor-pointer { + cursor: pointer; +} + +.animate-glow { + animation: glow 3s infinite alternate; +} + +@keyframes glow { + from { + text-shadow: 0 0 10px rgba(0, 255, 157, 0.2); + } + to { + text-shadow: 0 0 30px rgba(0, 255, 157, 0.6); + } +} + +.card { + border-radius: 1rem; + overflow: hidden; +} + +.upload-zone { + transition: all 0.3s ease; +} + +.upload-zone:hover .border-dashed { + border-color: var(--accent) !important; + background-color: rgba(0, 255, 157, 0.05); +} + +.table-dark { + background-color: var(--secondary-bg); +} + +.table-secondary-dark { + background-color: #333; +} + +.hero-section { + background: radial-gradient(circle at top right, rgba(0, 255, 157, 0.1), transparent); +} + +.result-card { + animation: slideUp 0.5s ease-out; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} \ No newline at end of file