From cb3414f60cb10a75cb44d8265cd5258a0220530e Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 1 Feb 2026 01:56:52 +0000 Subject: [PATCH] SIMBI --- config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5617 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1821 bytes config/settings.py | 4 + config/urls.py | 5 + core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1154 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 3026 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 348 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 1568 bytes core/admin.py | 13 +- core/migrations/0001_initial.py | 45 ++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2874 bytes core/models.py | 39 ++- core/templates/base.html | 52 +++- core/templates/core/index.html | 249 ++++++++---------- core/urls.py | 7 +- core/views.py | 35 +-- static/css/custom.css | 76 +++++- staticfiles/css/custom.css | 85 ++++-- 18 files changed, 422 insertions(+), 188 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__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 96bce5584823cd4ebfccfc40c2b36df8beaee7db..439576c9f3238271917bdb1dc39f898634a2c51a 100644 GIT binary patch delta 164 zcmdm>{ZX5DIWI340}zOBtjnyP$ScYCXruZS7Gakt{Z!5r*D7uXhA4v+=3oX*w@s{5 zxdf}&a#K?>6ZLPgf@w{|&C~h$nXGSd`ntM!I>v_v`P|}yFoXR4LyCBSCKm~U2!0^( wi^C>2KczG$)vhQL$YliL;@6u`3EpOwc)%mlzntV%8 ciYpDMk`aiD?`{4kc$=B~0)r3`6$t``0At=1@&Et; diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 0b85e94ece283a83ff1af1d71f1b265c943eb37a..fd844e6914171e905d9d02ecbb8c81d6f189e865 100644 GIT binary patch delta 213 zcmbQrGnbEVIWI340}x1WtjnxroyaG_xM-sK0!F`yCsM>xd6*bdIaArQ1VJi50LT`a z%*UuS@q{HWhTvus#?MTQ!jm;vRtVkV^mTRdbc_!T^0~zYW==lM;?6AtG=mX{i@g{p z%d*aAW@ikXyr0!k;|2@=1hWZdGc>M9>Fn^hV&i{7IN+jiz!f0L642lcf*;rzSOq2@ OX4RC%rJ_g*Xfgn+d^!98 delta 97 zcmbQsH$Td-Y0i(&p6DgAu7+E%-VEoR+C^-25%ZkbM utWMlgK&6a8T>Oz?@)_3o%uI~Ilk?adMH{>uyg#r4d5j+zKxB~wP!Rwf%^7z9 diff --git a/config/settings.py b/config/settings.py index 291d043..53ba80a 100644 --- a/config/settings.py +++ b/config/settings.py @@ -180,3 +180,7 @@ if EMAIL_USE_SSL: # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +MEDIA_URL = 'media/' +MEDIA_ROOT = BASE_DIR / 'media' + diff --git a/config/urls.py b/config/urls.py index bcfc074..a0b2ff5 100644 --- a/config/urls.py +++ b/config/urls.py @@ -27,3 +27,8 @@ urlpatterns = [ if settings.DEBUG: urlpatterns += static("/assets/", document_root=settings.BASE_DIR / "assets") urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +else: + # Always serve assets in this environment as they are stored in BASE_DIR / "assets" + urlpatterns += static("/assets/", document_root=settings.BASE_DIR / "assets") + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..a4f604c3143c51586afc450fbf7fb1f167f17951 100644 GIT binary patch literal 1154 zcmbVLJ5Ss|5T3Ptz6W=Jcm&8x5h#U`!d2;_L{TE82vCI1jpg$$;ENxZwVmXe=n8(o zb^HS&M3q00CJjgwr>&4u(Sb-sl^Gu<;Za1{^?si5?tVM-&H8JjQ3GsK-@f?c8o*C- zie_FIXW!A-1`eDB5Hg!F;2PHhE!1s2G;D)`27`Ik$p*seuBj@H6S<*q9946i zFy>i6cHMD4WNvUVQxE(kb-15&0=KJ1a&O%aD8oh~T%IthvI}QO3+GRon{g(~G5O=8`RSy0St65g0g<2ME2(el+>6w>+4b@4X#N zz3Qz{mv@Tw|EX*JqAWvU4P``r5~=EX76iE%%G}6RR8>E5TrWi-QOEmqDg}o&l}_G6 zSe2t>P7~x|&5$)$07-o#p%;{pMG0AdCq$c8t*RR3Z8zG8m%KPirQectrav7r-85vTTf*CZK zUxE~9GTvfMOv%m6^V4Ly#g~$mn3tZfmz2zTi)AOTXO`l=z@Pv`MQlJ30DQ+EtN;K2 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..e2681fe892a62e29733219cf6a91a5233f1d7216 100644 GIT binary patch literal 3026 zcmbW3OKclO7{_*xBlj_abd0f)4qu4ochfiwc4hCE71>sHtxVL+>mXOe8Pesp#h zS{ET7ddQ)NNFZ^jD)oRuqUMkz#~wIv+(j#4?Forf4oE@aR1WaXu5A(rfy89z^F03h z%{Q|%zsa|;ScHM}$KDsp8v%y-g;u)B-zglfLE&o#F^E-}DqCh*TK1{FDp%%M#>ZS^ z5chyVJZ9JU?#o*o!#suTrLx~u`9T%<7gYcSi%c%GPhZNhPM}&xSk<5u(v>Q1)@!)Z zap?Z^0$gTkfS4(>h$;IJi+n4-GUsD3zt+`2h?qnCuD>s^K%XkG8{7hKPa%7$9PCqs zP) zcjP_-Q`+&l6(?ZSlsg87z9=*|r*4A>g(%gmQPYj}?2!;&%|aiBF8NrW7fP< zhNR=WIz;SWQsvsZ!`BQ|ZH82LZrb<`=Y)-hT9=We*GU>iC8xmbuufDq^tx25e_Vo*RZ;* z(IK+W$HrIdRXlDi(S;nxcX0(KN5(&^lXa~jSMYeHPVl&Q496PxoS-CWI+3Ji+}i|W zojP40Ef1!}v=hb6$)5%;{5WvI8n|c=Tr?9!c(#!}cGW9BD}Dd5S29DzLpt|DF5`qG zsU}ykBsmdDf)NdsmZOq%$B@-d&%llOQfdA@sr2FPd1>~YTi0jji-az-6P{g_$%2Aa zh1Xr-~DJ)aC1e?NhBOt6*h|$Y&_$sP0Z{13V*lq{iS3#Hav zJO1LvvK@bMd&G>7S@AJDKGwR{PM_Ocu+!)ExbNo7^o*6BvC}iHn{DBY=jEMmZkR&e z67sf?2N#*q&1E|?x;J9ZG|kL?D|6q@+;81#r(WJ1wNo!|r}yT})U=hFwo}us#h!fd z+2jw%%oMFm(asb>FP`7b*y8!UNmIOHiC1j#O6%Qj}P~^mo5q62{UaU0w<43$K zxV;o)ZtCmpCqIAU{^;j^6!9?E*ne=Jhx-H8?Z~}0fD%CUG)e+cL?>9(4Fua6h{)b- zhHuF0$|V&HtuHv?+nC^L!;owH^r)8zy>>{98hT0XQ<`+>O6bi;64cOJry15f$J#i_ z(8d?Q9782Nzce4x6Y@0!xPxCW0sa7-M{)R=gJ^vPG6Vt$jjt&hoX%xnw@VK)4DBA< zyhBEPHWQt>b!qhq6%B#`TBR~y<;=tcJWu#<;$F!NO}KlokUK?2K}P5c)m z2Lw6_A99g)U!`V-Y62@RRUBbSA^NHWIIdvwD(#7QEtCmlf;I%<4k1|6oao#2x{BqR z$B?k1NpeL8Bsr1mRe7a@7Jp;44tSoVBfUlqogJB?=5MS_(<(KmA#1;aIf|9Rc4!c= zk_og5N2o&f&Y8lLB~01E6!0LK-3-{t?DnjgoUoD;c5r7qj4%RmTmn1W!~5=U%t1Q^g^loij~@hspeIYI{**`70#c`KQ> zlX(~*I<&E1M~AkB?(q!yNuo<1#n6?y7ncQ1CC|cHgncI{%x<%cSj=c&41;ZFT8hlStL 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..300fa030345f461164b6715e40d6d3365828ba39 100644 GIT binary patch delta 88 zcmcc3bccy|IWI340|;!a%gmn0TfoMenU|7UF|lc(#SI3D3#jM=8v`q6gG+}{N9YXk a3oMEkSro6ZD1KmO;%92$2Eig8ph*Cf;29$T delta 87 zcmcb^beoBHIWI340}xbw%g@Z3$Xme5l98XAI&&<$bVpF;%92$2Eig8ph*Cutr<)J diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..ad9e3258a016c4fd0592db1d4f233cf670cf8379 100644 GIT binary patch literal 1568 zcmbVM&u<$=6rSC+cQ=kxXO}E(NGWcR>^MqorIivz1*Ad|3Q!{vda)4JW_MaU?0U@X zEcqb^?Ewx*J#dKB3x}RUP&o8Y$e&~9kj3BcsVmBYY=}0KV`Jz2%WFr6W*^2V#m%` z$&TCdPvZ12ZdbOIhS-oAu|~WhHw0V#RoPX@8^Zw50QOiz*=M~x9QKpVS7PVtm(g6M zNd>0YR`0ESxSF<2udH-@-Vmf6f8cvTU&Oo_ZqvHdNd_phvV$$+48-7xb z=00U13=36u7q;>h;ySqm=3_~v8rsA%M+#c!Bs?0okY6KIeo%GT^}xLPR5BfhstB{I zR9@f4ycRi?Dj0s}LyusC**L}3Bv%?&I#;}uRIyNvz%AnOCZ*5h#f?G*xv=1`v%~xX z+=7-*5H4&Y{H<3vEm(*ce_w^0UcSCf;}Lg!jcvghd4Dn$fM*H)(ZbL9NBQ8R=Q1#6 z_KKaUx%SjtYid56nh)+BYnS(~b+k-d%N*QoYMGX{7;1|hZMm&2x3rZ|TM0fr*01d4 zJ9@UQXAkZ-^=wPO73#M-`bt}0Y3a8^{dVx#v2k^;+%e|c#(c|I2#tlH_>7(QO~=T# zjcm)vg+{Jp+-w^+pT6HR?u5pjquHayquJ2-I4JgHFnzr{o$0=r?p~hlzBR|!m6={j zP02mLRPf1j9VGQ%vdx)=gNLp0rEq+y8CyDKf04}^6_H2Px?_?D2)lIB-Y{zqQQoT{ zOjymls2enS=JrX|@%p`$U1URM@b*S+jH>rL!0&L!+f2Ps-(xYp13$nSX7bO8=P=ci o1VQM6u^@W7AQePU7rfg%zq;Uh^ZdFP(@*Ke3}LwkE~<#lKT$4VLjV8( 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}_cmch7rz2g3b2&!EYqS$ zm4DL2K${F5I(Dnapo5E|8d9Kx#*7`000-fw0-d}mNTx3DeMd@;YQeCJf&a1Q65A%?oT%8KcQad)ph9nz#$ItDp%&=E2u&vP!2SLyho_FJd_t}Hit)d<2@m_ zJ9g9?@Aq00Lv|)l*m)a`x2A^dyyKzH^!2bfw30)pX%8h1qR>n$HRS&}50`j@Yo&*H zWri@>lbBkp_3m*Fux2oSvwtIh?|Js#yx%{8IxTZ^ComtN51|tBt@FpZLLJPX zKqgM9g9Q(Bl;Hyi+AsaUaiHTPPkxk{A^D;w@7F!-wNq-K;9=hCtM#gU>7V6oI43os zJb{*Bm#)z0W`B2X(eMVgENoCgK}9O8U(W|=T(&J;sv20fFruSPLutsyW2ufG)2N9J zMOKwPOydu+QPE8-X>tS8p!K+kVdD$yxA#Wx*|7Jso3d%wVJdLvzgv58f9@7mZP_qb zm=4+Lkq^+3>W;2du}Mb|-j;3Eg2O|8B&k@dSvz#Zv@5%~Y90QMp?PBhK6Fg=I7^z{ zs9@s|F_GYl!nUS-X#*bw- zh)>)sC&HFKRbcT}G0n(^xO+uqe;>5~1l|Nisq-W;dBr$d^UDB!LW!2E7!7 zw-u}+h~quWMqmx56;nI(A{N~SK7OXcH7^*jjNjagZpd}zBNZApF4E{-Y~V)ImbF86 z2trg@#r8a{D2BBoHC4HaY0MumLUaV!8Q3&wR52yFYC(u;sJWwC`d-xZxtN99`AHg) zJPMLTW0C~7f(_A;Xk3!Mv}Kj~0HYB_Q!FSk8b`Rvm}*r8n+7WuI(p5k$xU{j80^re z@inD(6{@w!T&K}%JF?O1UI%7=H;i^=t)|nEZ7HfrBbL&@d%A{c0HQ~uTae1$nj)mj z?~bwMTLAQj@ikpnv8?%{*m^^*^&~O9iF+5_&)h4Z#Qn8e*wGufU{_de74Rcm1%gK5 zE8VD@O^98gsvEfQ=7KCNEiEleJ+~K|j}3P5dCdrP%pc*Nd3yBwWBlyXQa8v?gr9D7 zBV07|UCfQ7JBj2UiAgeb{`-gS)cJPs_Z%rpL^H^g=}ejKlu1OZlb9mO{Qlc+GEXji zN^Z(zr9#vu`T84@eBvaZxXCA7j!Rq>I*DnLTG%hTsfBicq%JwBOK$2C5kKi9vSfDU z*_=DO(yoGu**nhc9e4H)5$_Hte?Iryg1b_3S8kEyhLhZIlN&_b>?CGM?&7neo4ZI> zAAzBwur9#o{hPu|uYK*cjKM8nkS5usXJI$H^xS%pBiWLZExFke5kDQ!)4uoukEG8gtAx|s_vCP=2}WQuO4NW{{BpuI&hYffg(&8!jeT6c1EV!Rs~ zkH%hd(7a|%H~l8A(|;$f&;RoxNRl_44ep+?jduafz%yAQwL;$}X9yJ2Q26rcOk4AO`JgBzwilUU9Qmh>7>8o7QGF(*xzr)DnMwoCqor) zPkY<2DT0X=GNQ=>~Y7?}j=49N|*_zr%e - - + +{% load static %} - {% block title %}Knowledge Base{% endblock %} + + {% block title %}SIMSBI - Sistem Informasi Manajemen Surat & Buku Induk{% endblock %} + {% if project_description %} @@ -13,13 +15,53 @@ {% endif %} - {% load static %} + + + + + + + + + + + {% block head %}{% endblock %} - {% block content %}{% endblock %} + + +
+ {% block content %}{% endblock %} +
+ +
+
+

© 2026 SIMSBI - Sistem Informasi Manajemen Sekolah Digital

+
+
+ + + {% block scripts %}{% endblock %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..1197e4c 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,110 @@ -{% 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… -
-

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" }} -

+
+
+

Selamat Datang di SIMSBI

+

Sistem Informasi Manajemen Surat & Buku Induk Siswa Digital Terintegrasi

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

{{ total_letters }}

+

Total Surat

+
+
+
+
+

{{ letters_in }}

+

Surat Masuk

+
+
+
+
+

{{ letters_out }}

+

Surat Keluar

+
+
+
+
+

{{ total_students }}

+

Total Siswa

+
+
+
+ +
+
+
+
+

Surat Terbaru

+ + Input Surat +
+
+ + + + + + + + + + + + {% for letter in recent_letters %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
No. SuratPerihalTipeTanggalAksi
{{ letter.letter_number }}{{ letter.subject }} + + {{ letter.get_type_display }} + + {{ letter.date|date:"d M Y" }} + Detail +
Belum ada data surat.
+
+
+
+ +
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..34bd639 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,6 @@ from django.urls import path - -from .views import home +from .views import index urlpatterns = [ - path("", home, name="home"), -] + path("", index, name="index"), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..aa6fd52 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,28 @@ import os import platform - -from django import get_version as django_version from django.shortcuts import render from django.utils import timezone +from .models import Letter, Student - -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" +def index(request): + """Render the SIMSBI dashboard.""" now = timezone.now() - + + # Simple stats + total_letters = Letter.objects.count() + letters_in = Letter.objects.filter(type='IN').count() + letters_out = Letter.objects.filter(type='OUT').count() + total_students = Student.objects.count() + + recent_letters = Letter.objects.all().order_by('-created_at')[:5] + context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), + "project_name": "SIMSBI", + "total_letters": total_letters, + "letters_in": letters_in, + "letters_out": letters_out, + "total_students": total_students, + "recent_letters": recent_letters, "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 render(request, "core/index.html", context) \ No newline at end of file diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..98975b6 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,74 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +/* SIMSBI Custom Styles */ +:root { + --primary-color: #10b981; /* Emerald 500 */ + --primary-hover: #059669; /* Emerald 600 */ + --secondary-color: #1e293b; /* Slate 800 */ + --accent-color: #3b82f6; /* Blue 500 */ + --bg-light: #f8fafc; /* Slate 50 */ + --card-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); } + +body { + font-family: 'Inter', sans-serif; + background-color: var(--bg-light); + color: var(--secondary-color); +} + +h1, h2, h3, h4, .brand-font { + font-family: 'Playfair Display', serif; + font-weight: 700; +} + +.navbar { + background-color: white; + border-bottom: 1px solid #e2e8f0; +} + +.navbar-brand { + color: var(--primary-color) !important; + font-weight: 800; + font-size: 1.5rem; +} + +.btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); +} + +.btn-primary:hover { + background-color: var(--primary-hover); + border-color: var(--primary-hover); +} + +.card { + border: none; + border-radius: 12px; + box-shadow: var(--card-shadow); +} + +.stat-card { + transition: transform 0.2s; +} + +.stat-card:hover { + transform: translateY(-5px); +} + +.hero-section { + background: linear-gradient(135deg, #10b981 0%, #059669 100%); + color: white; + padding: 60px 0; + border-radius: 0 0 24px 24px; + margin-bottom: 40px; +} + +.table thead th { + background-color: #f1f5f9; + border-bottom: 2px solid #e2e8f0; + text-transform: uppercase; + font-size: 0.75rem; + letter-spacing: 0.05em; +} + +.badge-in { background-color: #dcfce7; color: #166534; } +.badge-out { background-color: #fee2e2; color: #991b1b; } \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..98975b6 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,74 @@ - +/* SIMSBI Custom Styles */ :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-color: #10b981; /* Emerald 500 */ + --primary-hover: #059669; /* Emerald 600 */ + --secondary-color: #1e293b; /* Slate 800 */ + --accent-color: #3b82f6; /* Blue 500 */ + --bg-light: #f8fafc; /* Slate 50 */ + --card-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 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: var(--bg-light); + color: var(--secondary-color); } + +h1, h2, h3, h4, .brand-font { + font-family: 'Playfair Display', serif; + font-weight: 700; +} + +.navbar { + background-color: white; + border-bottom: 1px solid #e2e8f0; +} + +.navbar-brand { + color: var(--primary-color) !important; + font-weight: 800; + font-size: 1.5rem; +} + +.btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); +} + +.btn-primary:hover { + background-color: var(--primary-hover); + border-color: var(--primary-hover); +} + +.card { + border: none; + border-radius: 12px; + box-shadow: var(--card-shadow); +} + +.stat-card { + transition: transform 0.2s; +} + +.stat-card:hover { + transform: translateY(-5px); +} + +.hero-section { + background: linear-gradient(135deg, #10b981 0%, #059669 100%); + color: white; + padding: 60px 0; + border-radius: 0 0 24px 24px; + margin-bottom: 40px; +} + +.table thead th { + background-color: #f1f5f9; + border-bottom: 2px solid #e2e8f0; + text-transform: uppercase; + font-size: 0.75rem; + letter-spacing: 0.05em; +} + +.badge-in { background-color: #dcfce7; color: #166534; } +.badge-out { background-color: #fee2e2; color: #991b1b; } \ No newline at end of file