From 5697d35f91e8508bec1391c974c40d43de127ac0 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 31 Jan 2026 10:18:58 +0000 Subject: [PATCH] heheh --- core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1668 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 4190 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 451 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 1322 bytes core/admin.py | 20 +- core/migrations/0001_initial.py | 57 ++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 3555 bytes core/models.py | 52 +++- core/templates/base.html | 73 +++++- core/templates/core/event_detail.html | 71 +++++ core/templates/core/index.html | 247 ++++++++---------- core/urls.py | 6 +- core/views.py | 33 +-- static/css/custom.css | 133 +++++++++- staticfiles/css/custom.css | 144 ++++++++-- 15 files changed, 642 insertions(+), 194 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/templates/core/event_detail.html diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..9759da77bd92fd7bf7cdff4e3bb66872dc501744 100644 GIT binary patch literal 1668 zcma)6&2Q936rb@|Hs0NYe32BAKmrte2&-O5ix3irst1}J;O5K7@eEmmckPbtwmDSV z1Ajnn^vEeym47CYR%kURq@K8K6i%G_-Z+ku%_1?jf1Zywzj^QXp8Zd==@MwqKl~Lf zn}qy_gQ_`aozrDX$UDLbr!nbJpHjjNZpKE(^v#atTOHfCDKUtkud6*omZ45I^#6W`1@Il^dIQ{z&ATEDb`@3KJ<>TAYXJo}7d|8Z78!cK~|l z*T=aZdcO{CuD$>1=*Gs8wK$kx>22X9=c`?pw5uv?tag=dzQb+M&QY#TMJb)F>^#b2 zp`5JDlPfS!EZ<9oa;pasOP8d1j5Vh6-&3+|cnJ9Oj*!ZH9%EWu0FxyV8prI=k+ zi<402S>A-TZEr$0(S8bH8sQp%s%yPpMR6{qoW+?bJdm{`AyMT$Ifu47@CEEGR)AT} z)&VXG_X32QecXFKnE$c2HCR~dZR1sL$DQMK!$3xBuF_4{+swtfEv2)RRb)acTPvoT zQdhQ+y7E*l$aB%gD|ULwrE zldS+;)Z!UxaUZpKbg_KUe%q^q&aZ>+Zt^fpy19&YqzUuNfzLw3nY3Xb@lPi4N2O|2 zbjsaA11&*W!#W?@k;{qtQhQQ(mMM3{gF=h7T&Jz zJI8dfPZx)VNmqyDD(v6u&#s@~!e@jNlNd|q_AW85X%_pKUhmWEL&Ku$Lvj`N7y2`6 uC%Et#0a@VGGy6ux(m19oeY%3aY@#ot@VDJxdVs!cqA#1svU=5Cm*)TR>W5+g delta 148 zcmZqSy~3EXoR^o20SKo5$j`I~(vLwL7+``jJ_`XE(-~42QW$d>av7r-85vTTf*CZK zUxE~9GTvfMOv%m6^V4Ly#g~$mn3tZfmz=%bkZhlH>PO4oI a2T+U=h>K+zCg-tAa$jIj0HPu`pb!AL#~-u+ diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..9e26940d0583cc82681d06bf79eb8624eca4e2dd 100644 GIT binary patch literal 4190 zcmaJ^U2GHC6`t|vapKLg5E26$7AN2=-7HXnwwonM*#$yGOjs}lWCJ|s<9^O*{)e0vApCN$G0+o%<9>wKE7=g!3W8SXEm|Ve54;q24QNm1vSs%4<6fL+N z>avx@w4!a}h+X5vs@x*4g&&I99xd{a%gR;mKA-JHtGL1W+>&AFFa8VtpYm>GMZK@+ zq?ossGAW-MEENl1m53X-qpQWcDW2jq<$)X5uOuxaX)TeY$+{;Yfk9{7IXzh<5~4_lv21zbOR0mUW3Ce#(!w^>>x z6y)j}N%`SR^hMXN(!A*g@7`nIu%hI2)if2wM2|=&la)8=@g-x0jF;||idJcy+$TBM zJ{`Yj(7WcUnj_;mgOYL25!0*dbO1V*CGRBCI2W4P{27q{RJa|ve`9@@##T49&P%n7f7eI=Q-L3 zLOA6Fe4g_3UHF*TAxRGbbwjX6iz-UFr@quWA4ffO)B0j<@cxu%KJ_u5_+fUhUDS8nj z=nv+ffxuxjeml~k>KR8m^w_kev6?jINMn_$rf_1*vZaZdG~q}SAnrT5dEDtcx|Oi| z(zU*{)0eJX-jRo@Ya73MoO$NAKmF2{Z`I^mj(n?fX(v9iIpD-co=w>CbG7(6Cw{K- z#jaln9N*>kArU_C9yrHa2s;Y4k^RAK4NkZPZFzw3Kk!)rK*hh@06>lefoq19=Gzv! zKnS21G{RscRy6+}FpDq^siDysnAvDo{~!^x(6-n$ON?pt{GT!8x3>0n&9HZcai)PG zz={^$j&#CIwx4NWba)!l9*uW8*Puz;(XKHDv=~6}yIK#xuj~e<*GSPy1p#YC01>is zM_+fv$$AZ>kwuIN#R7jXN0>h+Gf;i4XUw~LOw?t?;F~|5*8IMoS7V=9LVz{|# zP|GYw=h-*u&FFI_K(O-h>!qj)*p>P#6FOk-z04=`n{a{yNw(Luuc*Cbsf*Y_3mQKJ5?4n}eLWf|` zHeh3bP>wOfr0bY=0#%Yg0Mq&gz8SUUkKh6Lm7L^<9)nc;h=tc|>HtM$dIZT)Ag(mM zFg=@5GPmZY=RJsv%mC^a^2N(!orR+tx;Qz1adK*!eulk{A(=!ng5)?5H^PjrSnF_B zDJC#2m0F4hMt4P0)ao_e$f*nt6LW@HunKGB^P)xa#6wh9%&Bng6s&bO`WamIL@j#A z7%iB}YUz$%Fqeo%M{!!j#;2Tz83_9HRD+<~n~=;kF|fkz`a=D|U9LeYmv?))p5f|( z6B~N8_H5u!L(iA&*v(q(rW3nanc0aBR%e{(;Fe%VPu8L*o#@HRbORh~eeXMc?*lHz zk0AUV*}DFhL(lVee4!R!aN-MNlikw*YG|vc(x{=b>y=k>_5JF#_2x}Al*Mv>z{D?Cn{GO!*{_hADBRN?Ixam z&@}sFstYYGOa)A6OBYE1xK?V2$s>4rXY$*jFSc;Cy(eHWq(f~9B_gb_+(g)YFc?u* zSdPKsSYgQ|9B5nO+S5v@yGEB;>e#DE5MNO@dY$A8kPLWU7o%;QNzcOQaG{=qj~CiA z^b@Fem%TyX%J(>?g_)WZhiu6@tsfbA|AY6aRBy=|A?+!ZI%U2c4$P+{@ zIt!z>oZ0o`FmxV-r{OjGfi!M(i1UMERT+O?hnvvYfk|*m9wy<&Ix(q*Ms;**CaTNW zi(qEk3Ci}Pu$v4!}d=E{>dGMAJa^V8RrtJkKcudpS1KvX|+ zLcP4|3aX2$WdSAul%VYxlyn^cox=tsWAK{WK-%mdJ&gEp_z~G!+y3SAYj*T@EqdFD z-UgJA1~J_leDtMr_~XA0{B6jV=4#TMBh5j2l{m3E<0MWz)9l3gTH?HuIA6KCBOk@U zKf3j?EuXH*rycop<$l2y>nH2xRz{#*pE;(t&t!(?`6X6f|RH{t~^U;c!uFd@c^`41qw z0?+e1+@Rh0>~KlD^V#7>?9OM`ALAie+)Jtp8@FGg{B^5w=p7zVZ!f9NY+QMX^4G1# Xbc6>}?IoLMzPa!c<*)Z?WXAj-FyG6_ 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..f73949bec7b3b93a6b6a3d343b8551b6323123f5 100644 GIT binary patch literal 451 zcmZurJxc>Y5S_i-JM-Zo2zEkjECM0dOGtIKjaFAEXLd+V?<4HpB`OFh^AEJNQbY@X zfIs2_LBh6H=>q9exqFF);@g?s8Q$A@^K4lakgz`Q{15qlspbdfrdYbNxCaJ|1P~IJ z5MUb911;2DJ)|xrpaBv_QD?@R`J@B9%3Pyhwve*YU#6?M1}mRHy)swQIuW$*rM)>( zjV5R>4pD650HgGrVe0vT0B&rQkr(3aUP0O|KT40*I-j*|uJ%5zo1)4ty{H>EGae*d zEhLPAkHe%GQm8~#a?&(K9wjfZlp0tyY~^fc7g>~MHeO>VOJi;iV}6zNy$;%)m`hp? zZT4?grB)cTEWkG3k)PG>3Ce4s6GCRNpZ|^-9OnPU!UUr{a>l#k(+4xBwF#|FX>CSJ dBPTB(JT~6Xa_UT|Go{YL(08;^RUK|gr*EV)cKHAR delta 253 zcmX@ie4D9$IWI340}xbw%g@XL(vLwL7+{4mKHC5p(-~42QW$d>av7r-85vTTQkZj? za+#x;85x)uQW;ZNQkhd&*RU;PW?)zi#1N3q7{!vp9?YQ0@e(AU$#{#UAh9IlB_ouR zA)23?dW)e5WD!U*FEKaOPm^`x9l44BePj55q9B#UUO?glGb1D84F;JDsOSNM_ytt- nfsKKcv%#f9s3T+s+XWW+i!Ab2SmZx2Gx0MuaD!kG570OO5hXY1 diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..f2e321da57149191370c7e026a4bb1c88b49a526 100644 GIT binary patch literal 1322 zcmZuwzi$&s6rR~#?;7lNAV4HQhz$+01oq_!p#ch{Bn1+PAC;w(W$#Sv&Fv50%q$6! zExCY>f{q3xst^T zHubgRbv1^R(AL&3~vxY1p6q!6&z?44I`ov-PZ%7Vg#8=24dp{s+c4L-Xi7` zRJ0D{@}icQjE01=1h!sd5>3HaozWLlak~l7d0lTq$cQt0~3yv5{%G^#Z`s*#*`Z|TJ}Jf z^-@y=e$iqQnph)!cw(-2z5vm(5d-b2_2n?xKqWtvhtG$cYwi^B1!XUTMGZqfv zK;%xglPrt8@ZnQ%(12+(AtWYnZTtyuLcE>kI+~bh5D*-Gn6~EOBcdA{Hz!0VRMb45 z5=Yj=S&5iab9jro-iqf!C&(XUqX2b+E09Q;DvBV4_LVZ3WD0@t)uMYi) z)DDW%kL+y##y-8vE(1ua!0X_KI>vY(E%c6i_R(zbxMygbz_*4dbu&6%#?ThWdd1-< DhY~oy literal 1364 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 M&jkBtNI9zi0c%dPEC2ui literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 71a8362..af1c1ba 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,53 @@ from django.db import models +from django.conf import settings +from django.utils.text import slugify -# Create your models here. +class School(models.Model): + name = models.CharField(max_length=255) + slug = models.SlugField(unique=True, blank=True) + description = models.TextField(blank=True) + logo_url = models.URLField(blank=True, null=True, help_text="URL to the school logo") + created_at = models.DateTimeField(auto_now_add=True) + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.name) + super().save(*args, **kwargs) + + def __str__(self): + return self.name + +class Event(models.Model): + EVENT_TYPES = [ + ('assembly', 'Assembly'), + ('field_trip', 'Field Trip'), + ('parent_teacher', 'Parent-Teacher Night'), + ('sports', 'Sports Event'), + ('performance', 'Performance/Arts'), + ('other', 'Other'), + ] + school = models.ForeignKey(School, on_delete=models.CASCADE, related_name='events') + title = models.CharField(max_length=255) + description = models.TextField() + event_type = models.CharField(max_length=50, choices=EVENT_TYPES, default='other') + start_date = models.DateTimeField() + end_date = models.DateTimeField() + location = models.CharField(max_length=255) + capacity = models.PositiveIntegerField(default=100) + is_published = models.BooleanField(default=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"{self.title} ({self.school.name})" + +class Registration(models.Model): + event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='registrations') + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + registered_at = models.DateTimeField(auto_now_add=True) + attended = models.BooleanField(default=False) + + class Meta: + unique_together = ('event', 'user') + + def __str__(self): + return f"{self.user.username} - {self.event.title}" \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..ffab868 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -3,23 +3,78 @@ - {% block title %}Knowledge Base{% endblock %} + + {% block title %}School Event Hub{% endblock %} + {% if project_description %} - - - {% endif %} - {% if project_image_url %} - - {% endif %} + {% load static %} + + + + + + + + + + {% block head %}{% endblock %} - {% block content %}{% endblock %} + + +
+ {% block content %}{% endblock %} +
+ +
+
+
+
+

EduEvents

+

Connecting schools, parents, and students through meaningful events.

+
+
+

© 2026 EduEvents Management. All rights reserved.

+
+
+
+
+ + - + \ No newline at end of file diff --git a/core/templates/core/event_detail.html b/core/templates/core/event_detail.html new file mode 100644 index 0000000..9d001ba --- /dev/null +++ b/core/templates/core/event_detail.html @@ -0,0 +1,71 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{{ event.title }} - EduEvents{% endblock %} + +{% block content %} +
+ + +
+
+
+ {{ event.get_event_type_display }} +

{{ event.title }}

+ +
+
+

When

+

{{ event.start_date|date:"l, F j, Y" }}
{{ event.start_date|date:"g:i A" }} - {{ event.end_date|date:"g:i A" }}

+
+
+

Where

+

{{ event.location }}

+
+
+

Organizer

+

{{ event.school.name }}

+
+
+ +
+

About this Event

+
+ {{ event.description|linebreaks }} +
+
+
+
+ +
+
+
+

Registration

+ +
+ Capacity + {{ event.capacity }} slots +
+
+ Available + {{ event.capacity }} slots left +
+ + +

You must be logged in to register.

+
+ +
+

Need Help?

+

Contact {{ event.school.name }} administrative office for any queries regarding this event.

+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..c76cae3 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,112 @@ -{% extends "base.html" %} +{% extends 'base.html' %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% block title %}EduEvents - School Event Management{% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… + +
+
+
+
+

Manage School Events with Ease.

+

The all-in-one platform for schools to create, manage, and track event registrations and attendance. Join the community today.

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

Upcoming Events

+

Stay informed about the latest assemblies, field trips, and school nights.

+
+
+ +
+
+ +
+ {% for event in events %} +
+
+
+ {{ event.get_event_type_display }} +
+

{{ event.title }}

+

{{ event.description|truncatewords:20 }}

+ +
+
+ + + + + {{ event.start_date|date:"M d, Y @ H:i" }} +
+
+ + + + {{ event.location }} +
+
+ +
+
+ {{ event.school.name }} + View Details → +
+
+
+
+ {% empty %} +
+
+

No upcoming events scheduled at the moment. Please check back later!

+
+
+ {% endfor %} +
+
+
+ + +
+
+
+
+

50+

+

Schools Registered

+
+
+

10k+

+

Events Managed

+
+
+

100k+

+

Tickets Issued

+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..4566ee2 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,7 @@ from django.urls import path - -from .views import home +from .views import home, event_detail urlpatterns = [ path("", home, name="home"), -] + path("event//", event_detail, name="event_detail"), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..f411e8a 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,18 @@ -import os -import platform - -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone - +from django.shortcuts import render, get_object_or_404 +from .models import Event, School 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() - + """Render the landing screen with upcoming events.""" + events = Event.objects.filter(is_published=True).order_by('start_date')[:6] + schools = School.objects.all() + 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", ""), + "events": events, + "schools": schools, } return render(request, "core/index.html", context) + +def event_detail(request, event_id): + """Render the detailed view for a specific school event.""" + event = get_object_or_404(Event, id=event_id) + return render(request, "core/event_detail.html", {"event": event}) \ No newline at end of file diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..55e7dfa 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,131 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +:root { + --primary-color: #2D3436; + --accent-color: #00B894; + --bg-light: #F9FAFB; + --text-muted: #636E72; + --white: #ffffff; } + +body { + font-family: 'Inter', sans-serif; + background-color: var(--bg-light); + color: var(--primary-color); + line-height: 1.6; +} + +h1, h2, h3, h4, h5, .brand-font { + font-family: 'Playfair Display', serif; + font-weight: 700; +} + +.text-accent { + color: var(--accent-color) !important; +} + +.bg-accent { + background-color: var(--accent-color) !important; +} + +.btn-primary { + background-color: var(--accent-color); + border-color: var(--accent-color); + padding: 0.75rem 1.75rem; + font-weight: 600; + border-radius: 10px; + transition: all 0.3s ease; +} + +.btn-primary:hover { + background-color: #009476; + border-color: #009476; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 184, 148, 0.2); +} + +.navbar { + background: var(--white); + box-shadow: 0 2px 15px rgba(0,0,0,0.04); + padding: 1.25rem 0; +} + +.navbar-brand { + font-weight: 700; + font-size: 1.6rem; + letter-spacing: -0.5px; +} + +.hero-section { + padding: 100px 0; + background: radial-gradient(circle at top right, #e3fcf7, var(--bg-light)); + position: relative; + overflow: hidden; +} + +.hero-section::before { + content: ''; + position: absolute; + top: -10%; + right: -5%; + width: 300px; + height: 300px; + background: rgba(0, 184, 148, 0.05); + border-radius: 50%; + z-index: 0; +} + +.event-card { + border: none; + border-radius: 16px; + overflow: hidden; + transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1); + background: var(--white); + height: 100%; + box-shadow: 0 4px 6px rgba(0,0,0,0.02); +} + +.event-card:hover { + transform: translateY(-10px); + box-shadow: 0 20px 40px rgba(0,0,0,0.08); +} + +.event-type-badge { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 1px; + font-weight: 700; + padding: 6px 12px; + border-radius: 30px; + display: inline-block; + margin-bottom: 12px; +} + +.badge-assembly { background: #e3fcf7; color: #00b894; } +.badge-field_trip { background: #fff4e6; color: #fd7e14; } +.badge-parent_teacher { background: #f0f0ff; color: #6c5ce7; } +.badge-sports { background: #fff0f0; color: #ff7675; } +.badge-performance { background: #fdf2ff; color: #a29bfe; } +.badge-other { background: #f1f2f6; color: #2d3436; } + +.section-title { + margin-bottom: 3rem; + position: relative; + display: inline-block; +} + +.section-title::after { + content: ''; + position: absolute; + bottom: -10px; + left: 0; + width: 40px; + height: 4px; + background: var(--accent-color); + border-radius: 2px; +} + +.footer { + padding: 4rem 0; + background: var(--white); + border-top: 1px solid #eee; + margin-top: 5rem; +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..55e7dfa 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,131 @@ - :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: #2D3436; + --accent-color: #00B894; + --bg-light: #F9FAFB; + --text-muted: #636E72; + --white: #ffffff; } + 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; + font-family: 'Inter', sans-serif; + background-color: var(--bg-light); + color: var(--primary-color); + line-height: 1.6; } + +h1, h2, h3, h4, h5, .brand-font { + font-family: 'Playfair Display', serif; + font-weight: 700; +} + +.text-accent { + color: var(--accent-color) !important; +} + +.bg-accent { + background-color: var(--accent-color) !important; +} + +.btn-primary { + background-color: var(--accent-color); + border-color: var(--accent-color); + padding: 0.75rem 1.75rem; + font-weight: 600; + border-radius: 10px; + transition: all 0.3s ease; +} + +.btn-primary:hover { + background-color: #009476; + border-color: #009476; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 184, 148, 0.2); +} + +.navbar { + background: var(--white); + box-shadow: 0 2px 15px rgba(0,0,0,0.04); + padding: 1.25rem 0; +} + +.navbar-brand { + font-weight: 700; + font-size: 1.6rem; + letter-spacing: -0.5px; +} + +.hero-section { + padding: 100px 0; + background: radial-gradient(circle at top right, #e3fcf7, var(--bg-light)); + position: relative; + overflow: hidden; +} + +.hero-section::before { + content: ''; + position: absolute; + top: -10%; + right: -5%; + width: 300px; + height: 300px; + background: rgba(0, 184, 148, 0.05); + border-radius: 50%; + z-index: 0; +} + +.event-card { + border: none; + border-radius: 16px; + overflow: hidden; + transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1); + background: var(--white); + height: 100%; + box-shadow: 0 4px 6px rgba(0,0,0,0.02); +} + +.event-card:hover { + transform: translateY(-10px); + box-shadow: 0 20px 40px rgba(0,0,0,0.08); +} + +.event-type-badge { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 1px; + font-weight: 700; + padding: 6px 12px; + border-radius: 30px; + display: inline-block; + margin-bottom: 12px; +} + +.badge-assembly { background: #e3fcf7; color: #00b894; } +.badge-field_trip { background: #fff4e6; color: #fd7e14; } +.badge-parent_teacher { background: #f0f0ff; color: #6c5ce7; } +.badge-sports { background: #fff0f0; color: #ff7675; } +.badge-performance { background: #fdf2ff; color: #a29bfe; } +.badge-other { background: #f1f2f6; color: #2d3436; } + +.section-title { + margin-bottom: 3rem; + position: relative; + display: inline-block; +} + +.section-title::after { + content: ''; + position: absolute; + bottom: -10px; + left: 0; + width: 40px; + height: 4px; + background: var(--accent-color); + border-radius: 2px; +} + +.footer { + padding: 4rem 0; + background: var(--white); + border-top: 1px solid #eee; + margin-top: 5rem; +} \ No newline at end of file