Spaces:
Running
Running
Create a community organization website with welcome hero, about our mission, programs and services offered, event calendar, member spotlights, resources library, donation/support options, and get involved form. with full backend integration api processor
Browse files- README.md +7 -4
- api.js +365 -0
- components/footer.js +222 -0
- components/navbar.js +172 -0
- donate.html +350 -0
- events.html +316 -0
- get-involved.html +313 -0
- index.html +274 -19
- members.html +228 -0
- programs.html +164 -0
- resources.html +329 -0
- script.js +87 -0
- style.css +63 -19
README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji: 👁
|
| 4 |
colorFrom: blue
|
| 5 |
-
colorTo:
|
|
|
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: CommunityConnect Hub 🌟
|
|
|
|
| 3 |
colorFrom: blue
|
| 4 |
+
colorTo: pink
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
api.js
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// API simulation layer for CommunityConnect Hub
|
| 2 |
+
class CommunityAPI {
|
| 3 |
+
constructor() {
|
| 4 |
+
this.baseURL = 'https://api.communityconnect.org';
|
| 5 |
+
}
|
| 6 |
+
|
| 7 |
+
// Simulate API delay
|
| 8 |
+
delay(ms = 500) {
|
| 9 |
+
return new Promise(resolve => setTimeout(resolve, ms));
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
// Events API
|
| 13 |
+
async getUpcomingEvents(limit = 20) {
|
| 14 |
+
await this.delay();
|
| 15 |
+
return [
|
| 16 |
+
{
|
| 17 |
+
id: 1,
|
| 18 |
+
title: "Community Health Fair",
|
| 19 |
+
date: "2024-01-15",
|
| 20 |
+
time: "10:00 AM - 4:00 PM",
|
| 21 |
+
location: "Community Center",
|
| 22 |
+
description: "Free health screenings, wellness workshops, and nutrition advice for all ages.",
|
| 23 |
+
category: "social",
|
| 24 |
+
attendees: "Open to all"
|
| 25 |
+
},
|
| 26 |
+
{
|
| 27 |
+
id: 2,
|
| 28 |
+
title: "Youth Mentorship Program Kickoff",
|
| 29 |
+
date: "2024-01-20",
|
| 30 |
+
time: "6:00 PM - 8:00 PM",
|
| 31 |
+
location: "Main Hall",
|
| 32 |
+
description: "Join us for the launch of our new youth mentorship initiative.",
|
| 33 |
+
category: "volunteer",
|
| 34 |
+
attendees: "Registration required"
|
| 35 |
+
},
|
| 36 |
+
{
|
| 37 |
+
id: 3,
|
| 38 |
+
title: "Career Development Workshop",
|
| 39 |
+
date: "2024-01-25",
|
| 40 |
+
time: "9:00 AM - 12:00 PM",
|
| 41 |
+
location: "Conference Room A",
|
| 42 |
+
description: "Learn resume writing, interview skills, and job search strategies.",
|
| 43 |
+
category: "workshop",
|
| 44 |
+
attendees: "Limited seats"
|
| 45 |
+
},
|
| 46 |
+
{
|
| 47 |
+
id: 4,
|
| 48 |
+
title: "Annual Fundraising Gala",
|
| 49 |
+
date: "2024-02-10",
|
| 50 |
+
time: "7:00 PM - 11:00 PM",
|
| 51 |
+
location: "Grand Ballroom",
|
| 52 |
+
description: "An evening of celebration and fundraising for our community programs.",
|
| 53 |
+
category: "fundraiser",
|
| 54 |
+
attendees: "Ticketed event"
|
| 55 |
+
}
|
| 56 |
+
].slice(0, limit);
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
// Member spotlights API
|
| 60 |
+
async getMemberSpotlights(limit = 12) {
|
| 61 |
+
await this.delay();
|
| 62 |
+
const members = [
|
| 63 |
+
{
|
| 64 |
+
id: 1,
|
| 65 |
+
name: "Sarah Johnson",
|
| 66 |
+
role: "Community Leader",
|
| 67 |
+
avatar: "https://static.photos/people/200x200/1",
|
| 68 |
+
testimonial: "Being part of this community has transformed my life. The support and opportunities here are incredible.",
|
| 69 |
+
category: "leader",
|
| 70 |
+
rating: 5,
|
| 71 |
+
socialLinks: [
|
| 72 |
+
{ icon: "linkedin", url: "#" },
|
| 73 |
+
{ icon: "twitter", url: "#" }
|
| 74 |
+
]
|
| 75 |
+
},
|
| 76 |
+
{
|
| 77 |
+
id: 2,
|
| 78 |
+
name: "Michael Chen",
|
| 79 |
+
role: "Volunteer Coordinator",
|
| 80 |
+
avatar: "https://static.photos/people/200x200/2",
|
| 81 |
+
testimonial: "I've found my purpose here helping others. Every day brings new opportunities to make a difference.",
|
| 82 |
+
category: "volunteer",
|
| 83 |
+
rating: 5,
|
| 84 |
+
socialLinks: [
|
| 85 |
+
{ icon: "facebook", url: "#" },
|
| 86 |
+
{ icon: "instagram", url: "#" }
|
| 87 |
+
]
|
| 88 |
+
},
|
| 89 |
+
{
|
| 90 |
+
id: 3,
|
| 91 |
+
name: "Emily Rodriguez",
|
| 92 |
+
role: "Program Director",
|
| 93 |
+
avatar: "https://static.photos/people/200x200/3",
|
| 94 |
+
testimonial: "Our programs are changing lives daily. I'm proud to be part of such an impactful organization.",
|
| 95 |
+
category: "staff",
|
| 96 |
+
rating: 5,
|
| 97 |
+
socialLinks: [
|
| 98 |
+
{ icon: "linkedin", url: "#" },
|
| 99 |
+
{ icon: "mail", url: "#" }
|
| 100 |
+
]
|
| 101 |
+
},
|
| 102 |
+
{
|
| 103 |
+
id: 4,
|
| 104 |
+
name: "David Kim",
|
| 105 |
+
role: "Youth Mentor",
|
| 106 |
+
avatar: "https://static.photos/people/200x200/4",
|
| 107 |
+
testimonial: "Mentoring young people is the most rewarding work I've ever done. Seeing them succeed is priceless.",
|
| 108 |
+
category: "volunteer",
|
| 109 |
+
rating: 5
|
| 110 |
+
},
|
| 111 |
+
{
|
| 112 |
+
id: 5,
|
| 113 |
+
name: "Lisa Thompson",
|
| 114 |
+
role: "Board Member",
|
| 115 |
+
avatar: "https://static.photos/people/200x200/5",
|
| 116 |
+
testimonial: "This organization represents the best of our community - collaboration, compassion, and commitment.",
|
| 117 |
+
category: "leader",
|
| 118 |
+
rating: 5
|
| 119 |
+
},
|
| 120 |
+
{
|
| 121 |
+
id: 6,
|
| 122 |
+
name: "James Wilson",
|
| 123 |
+
role: "Operations Manager",
|
| 124 |
+
avatar: "https://static.photos/people/200x200/6",
|
| 125 |
+
testimonial: "Keeping our programs running smoothly is my passion. Behind the scenes work that makes magic happen!",
|
| 126 |
+
category: "staff",
|
| 127 |
+
rating: 4
|
| 128 |
+
}
|
| 129 |
+
];
|
| 130 |
+
return members.slice(0, limit);
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
// Programs API
|
| 134 |
+
async getPrograms() {
|
| 135 |
+
await this.delay();
|
| 136 |
+
return [
|
| 137 |
+
{
|
| 138 |
+
id: 1,
|
| 139 |
+
title: "Youth Mentorship",
|
| 140 |
+
description: "Pair young community members with experienced mentors for guidance and support.",
|
| 141 |
+
icon: "users",
|
| 142 |
+
color: "primary",
|
| 143 |
+
features: [
|
| 144 |
+
"One-on-one mentoring",
|
| 145 |
+
"Academic support",
|
| 146 |
+
"Career guidance",
|
| 147 |
+
"Personal development workshops"
|
| 148 |
+
]
|
| 149 |
+
},
|
| 150 |
+
{
|
| 151 |
+
id: 2,
|
| 152 |
+
title: "Career Development",
|
| 153 |
+
description: "Comprehensive job training and career advancement resources.",
|
| 154 |
+
icon: "briefcase",
|
| 155 |
+
color: "secondary",
|
| 156 |
+
features: [
|
| 157 |
+
"Resume workshops",
|
| 158 |
+
"Interview preparation",
|
| 159 |
+
"Job placement assistance",
|
| 160 |
+
"Skills training programs"
|
| 161 |
+
]
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
id: 3,
|
| 165 |
+
title: "Health & Wellness",
|
| 166 |
+
description: "Programs promoting physical and mental well-being for all ages.",
|
| 167 |
+
icon: "heart",
|
| 168 |
+
color: "primary",
|
| 169 |
+
features: [
|
| 170 |
+
"Health screenings",
|
| 171 |
+
"Fitness classes",
|
| 172 |
+
"Mental health support",
|
| 173 |
+
"Nutrition workshops"
|
| 174 |
+
]
|
| 175 |
+
},
|
| 176 |
+
{
|
| 177 |
+
id: 4,
|
| 178 |
+
title: "Senior Services",
|
| 179 |
+
description: "Support and activities tailored for our senior community members.",
|
| 180 |
+
icon: "home",
|
| 181 |
+
color: "secondary",
|
| 182 |
+
features: [
|
| 183 |
+
"Social gatherings",
|
| 184 |
+
"Transportation assistance",
|
| 185 |
+
"Health monitoring",
|
| 186 |
+
"Educational programs"
|
| 187 |
+
]
|
| 188 |
+
},
|
| 189 |
+
{
|
| 190 |
+
id: 5,
|
| 191 |
+
title: "Education & Tutoring",
|
| 192 |
+
description: "Academic support and educational enrichment programs.",
|
| 193 |
+
icon: "book-open",
|
| 194 |
+
color: "primary",
|
| 195 |
+
features: [
|
| 196 |
+
"After-school tutoring",
|
| 197 |
+
"Adult education classes",
|
| 198 |
+
"STEM workshops",
|
| 199 |
+
"Literacy programs"
|
| 200 |
+
]
|
| 201 |
+
},
|
| 202 |
+
{
|
| 203 |
+
id: 6,
|
| 204 |
+
title: "Community Events",
|
| 205 |
+
description: "Regular events fostering community connection and engagement.",
|
| 206 |
+
icon: "calendar",
|
| 207 |
+
color: "secondary",
|
| 208 |
+
features: [
|
| 209 |
+
"Seasonal festivals",
|
| 210 |
+
"Cultural celebrations",
|
| 211 |
+
"Community clean-ups",
|
| 212 |
+
"Sports tournaments"
|
| 213 |
+
]
|
| 214 |
+
}
|
| 215 |
+
];
|
| 216 |
+
}
|
| 217 |
+
|
| 218 |
+
// Services API
|
| 219 |
+
async getServices() {
|
| 220 |
+
await this.delay();
|
| 221 |
+
return [
|
| 222 |
+
{
|
| 223 |
+
id: 1,
|
| 224 |
+
title: "Legal Aid Clinic",
|
| 225 |
+
description: "Free legal consultation services for community members in need.",
|
| 226 |
+
icon: "gavel",
|
| 227 |
+
tags: ["Legal", "Free", "Appointment Required"]
|
| 228 |
+
},
|
| 229 |
+
{
|
| 230 |
+
id: 2,
|
| 231 |
+
title: "Food Bank",
|
| 232 |
+
description: "Emergency food assistance for families and individuals.",
|
| 233 |
+
icon: "shopping-cart",
|
| 234 |
+
tags: ["Food Security", "Emergency", "Weekly Distribution"]
|
| 235 |
+
},
|
| 236 |
+
{
|
| 237 |
+
id: 3,
|
| 238 |
+
title: "Childcare Services",
|
| 239 |
+
description: "Affordable childcare for working parents and guardians.",
|
| 240 |
+
icon: "baby",
|
| 241 |
+
tags: ["Childcare", "Affordable", "Licensed"]
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
id: 4,
|
| 245 |
+
title: "Transportation Services",
|
| 246 |
+
description: "Transportation assistance for medical appointments and community events.",
|
| 247 |
+
icon: "truck",
|
| 248 |
+
tags: ["Transport", "Medical", "Senior Focus"]
|
| 249 |
+
}
|
| 250 |
+
];
|
| 251 |
+
}
|
| 252 |
+
|
| 253 |
+
// Resources API
|
| 254 |
+
async getResources() {
|
| 255 |
+
await this.delay();
|
| 256 |
+
return [
|
| 257 |
+
{
|
| 258 |
+
id: 1,
|
| 259 |
+
title: "Community Resource Guide",
|
| 260 |
+
description: "Comprehensive guide to all local services and support systems.",
|
| 261 |
+
type: "guides",
|
| 262 |
+
featured: true,
|
| 263 |
+
tags: ["Guide", "Resource", "Local"],
|
| 264 |
+
downloads: 1240,
|
| 265 |
+
date: "2024-01-10"
|
| 266 |
+
},
|
| 267 |
+
{
|
| 268 |
+
id: 2,
|
| 269 |
+
title: "Resume Template Pack",
|
| 270 |
+
description: "Professional resume templates for various industries and experience levels.",
|
| 271 |
+
type: "templates",
|
| 272 |
+
featured: true,
|
| 273 |
+
tags: ["Resume", "Job Search", "Career"],
|
| 274 |
+
downloads: 890,
|
| 275 |
+
date: "2024-01-08"
|
| 276 |
+
},
|
| 277 |
+
{
|
| 278 |
+
id: 3,
|
| 279 |
+
title: "Budget Planning Worksheet",
|
| 280 |
+
description: "Interactive worksheet for personal and family budget planning.",
|
| 281 |
+
type: "templates",
|
| 282 |
+
tags: ["Finance", "Planning", "Budget"],
|
| 283 |
+
downloads: 567,
|
| 284 |
+
date: "2024-01-05"
|
| 285 |
+
},
|
| 286 |
+
{
|
| 287 |
+
id: 4,
|
| 288 |
+
title: "Volunteer Training Videos",
|
| 289 |
+
description: "Video series on effective volunteering and community engagement.",
|
| 290 |
+
type: "videos",
|
| 291 |
+
featured: true,
|
| 292 |
+
tags: ["Training", "Volunteer", "Video"],
|
| 293 |
+
downloads: 432,
|
| 294 |
+
date: "2024-01-03"
|
| 295 |
+
},
|
| 296 |
+
{
|
| 297 |
+
id: 5,
|
| 298 |
+
title: "Health Information Packet",
|
| 299 |
+
description: "Important health resources and wellness information.",
|
| 300 |
+
type: "documents",
|
| 301 |
+
tags: ["Health", "Wellness", "Information"],
|
| 302 |
+
downloads: 780,
|
| 303 |
+
date: "2024-01-02"
|
| 304 |
+
},
|
| 305 |
+
{
|
| 306 |
+
id: 6,
|
| 307 |
+
title: "Youth Activity Guide",
|
| 308 |
+
description: "Fun and educational activities for children and teens.",
|
| 309 |
+
type: "guides",
|
| 310 |
+
tags: ["Youth", "Activities", "Education"],
|
| 311 |
+
downloads: 654,
|
| 312 |
+
date: "2023-12-28"
|
| 313 |
+
}
|
| 314 |
+
];
|
| 315 |
+
}
|
| 316 |
+
|
| 317 |
+
// Success Stories API
|
| 318 |
+
async getSuccessStories() {
|
| 319 |
+
await this.delay();
|
| 320 |
+
return [
|
| 321 |
+
{
|
| 322 |
+
id: 1,
|
| 323 |
+
name: "Maria Garcia",
|
| 324 |
+
role: "Program Graduate",
|
| 325 |
+
avatar: "https://static.photos/people/200x200/7",
|
| 326 |
+
story: "The career development program helped me land my dream job. I'm now financially independent and giving back to the community.",
|
| 327 |
+
achievement: "Secured Management Position"
|
| 328 |
+
},
|
| 329 |
+
{
|
| 330 |
+
id: 2,
|
| 331 |
+
name: "Robert Taylor",
|
| 332 |
+
role: "Youth Program Participant",
|
| 333 |
+
avatar: "https://static.photos/people/200x200/8",
|
| 334 |
+
story: "The mentorship program changed my life. My mentor guided me through college applications and scholarship opportunities.",
|
| 335 |
+
achievement: "Full Scholarship Winner"
|
| 336 |
+
},
|
| 337 |
+
{
|
| 338 |
+
id: 3,
|
| 339 |
+
name: "Amanda Lee",
|
| 340 |
+
role: "Volunteer of the Year",
|
| 341 |
+
avatar: "https://static.photos/people/200x200/9",
|
| 342 |
+
story: "Volunteering here gave me purpose. I've helped organize over 20 events and mentored 15 young people this year alone.",
|
| 343 |
+
achievement: "500+ Volunteer Hours"
|
| 344 |
+
}
|
| 345 |
+
];
|
| 346 |
+
}
|
| 347 |
+
|
| 348 |
+
// Form submission APIs
|
| 349 |
+
async processDonation(donationData) {
|
| 350 |
+
await this.delay();
|
| 351 |
+
console.log('Processing donation:', donationData);
|
| 352 |
+
// In a real implementation, this would send data to a backend server
|
| 353 |
+
return { success: true, message: 'Donation processed successfully' };
|
| 354 |
+
}
|
| 355 |
+
|
| 356 |
+
async submitGetInvolvedForm(formData) {
|
| 357 |
+
await this.delay();
|
| 358 |
+
console.log('Submitting involvement form:', formData);
|
| 359 |
+
// In a real implementation, this would save to a database and trigger notifications
|
| 360 |
+
return { success: true, message: 'Form submitted successfully' };
|
| 361 |
+
}
|
| 362 |
+
}
|
| 363 |
+
|
| 364 |
+
// Initialize API
|
| 365 |
+
const api = new CommunityAPI();
|
components/footer.js
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomFooter extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
footer {
|
| 7 |
+
background: #1f2937;
|
| 8 |
+
color: white;
|
| 9 |
+
padding: 3rem 1rem 1rem;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
.footer-container {
|
| 13 |
+
max-width: 1200px;
|
| 14 |
+
margin: 0 auto;
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
.footer-grid {
|
| 18 |
+
display: grid;
|
| 19 |
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
| 20 |
+
gap: 2rem;
|
| 21 |
+
margin-bottom: 2rem;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
.footer-section h3 {
|
| 25 |
+
font-size: 1.25rem;
|
| 26 |
+
font-weight: bold;
|
| 27 |
+
margin-bottom: 1rem;
|
| 28 |
+
color: #60a5fa;
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
.footer-links {
|
| 32 |
+
display: flex;
|
| 33 |
+
flex-direction: column;
|
| 34 |
+
gap: 0.5rem;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
.footer-link {
|
| 38 |
+
color: #d1d5db;
|
| 39 |
+
text-decoration: none;
|
| 40 |
+
transition: color 0.3s;
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
.footer-link:hover {
|
| 44 |
+
color: #60a5fa;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
.social-links {
|
| 48 |
+
display: flex;
|
| 49 |
+
gap: 1rem;
|
| 50 |
+
margin-top: 1rem;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
.social-link {
|
| 54 |
+
width: 40px;
|
| 55 |
+
height: 40px;
|
| 56 |
+
background: #374151;
|
| 57 |
+
border-radius: 50%;
|
| 58 |
+
display: flex;
|
| 59 |
+
align-items: center;
|
| 60 |
+
justify-content: center;
|
| 61 |
+
color: #d1d5db;
|
| 62 |
+
transition: background 0.3s, color 0.3s;
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
.social-link:hover {
|
| 66 |
+
background: #2563eb;
|
| 67 |
+
color: white;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
.newsletter-form {
|
| 71 |
+
display: flex;
|
| 72 |
+
margin-top: 1rem;
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
.newsletter-input {
|
| 76 |
+
flex: 1;
|
| 77 |
+
padding: 0.5rem 1rem;
|
| 78 |
+
border: none;
|
| 79 |
+
border-radius: 0.375rem 0 0 0.375rem;
|
| 80 |
+
background: #374151;
|
| 81 |
+
color: white;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
.newsletter-input::placeholder {
|
| 85 |
+
color: #9ca3af;
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
.newsletter-button {
|
| 89 |
+
padding: 0.5rem 1.25rem;
|
| 90 |
+
background: #2563eb;
|
| 91 |
+
color: white;
|
| 92 |
+
border: none;
|
| 93 |
+
border-radius: 0 0.375rem 0.375rem 0;
|
| 94 |
+
cursor: pointer;
|
| 95 |
+
transition: background 0.3s;
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.newsletter-button:hover {
|
| 99 |
+
background: #1d4ed8;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
.footer-bottom {
|
| 103 |
+
padding-top: 2rem;
|
| 104 |
+
border-top: 1px solid #374151;
|
| 105 |
+
display: flex;
|
| 106 |
+
flex-direction: column;
|
| 107 |
+
sm:flex-direction: row;
|
| 108 |
+
justify-content: space-between;
|
| 109 |
+
align-items: center;
|
| 110 |
+
gap: 1rem;
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
.footer-bottom-text {
|
| 114 |
+
color: #9ca3af;
|
| 115 |
+
font-size: 0.875rem;
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
.footer-bottom-links {
|
| 119 |
+
display: flex;
|
| 120 |
+
gap: 1rem;
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
.footer-bottom-link {
|
| 124 |
+
color: #9ca3af;
|
| 125 |
+
text-decoration: none;
|
| 126 |
+
font-size: 0.875rem;
|
| 127 |
+
transition: color 0.3s;
|
| 128 |
+
}
|
| 129 |
+
|
| 130 |
+
.footer-bottom-link:hover {
|
| 131 |
+
color: #60a5fa;
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
@media (min-width: 640px) {
|
| 135 |
+
.footer-grid {
|
| 136 |
+
grid-template-columns: 2fr 1fr 1fr 1fr;
|
| 137 |
+
}
|
| 138 |
+
|
| 139 |
+
.footer-bottom {
|
| 140 |
+
flex-direction: row;
|
| 141 |
+
}
|
| 142 |
+
}
|
| 143 |
+
</style>
|
| 144 |
+
|
| 145 |
+
<footer>
|
| 146 |
+
<div class="footer-container">
|
| 147 |
+
<div class="footer-grid">
|
| 148 |
+
<div class="footer-section">
|
| 149 |
+
<h3>CommunityConnect Hub</h3>
|
| 150 |
+
<p class="text-gray-300 mb-4">
|
| 151 |
+
Building stronger communities through collaboration, education, and meaningful connections.
|
| 152 |
+
</p>
|
| 153 |
+
<div class="social-links">
|
| 154 |
+
<a href="#" class="social-link">
|
| 155 |
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 156 |
+
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
|
| 157 |
+
</svg>
|
| 158 |
+
</a>
|
| 159 |
+
<a href="#" class="social-link">
|
| 160 |
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 161 |
+
<path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/>
|
| 162 |
+
</svg>
|
| 163 |
+
</a>
|
| 164 |
+
<a href="#" class="social-link">
|
| 165 |
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 166 |
+
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
|
| 167 |
+
</svg>
|
| 168 |
+
</a>
|
| 169 |
+
<a href="#" class="social-link">
|
| 170 |
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 171 |
+
<path d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.857-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.857a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 110 6.666 3.333 3.333 0 010-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z"/>
|
| 172 |
+
</svg>
|
| 173 |
+
</a>
|
| 174 |
+
</div>
|
| 175 |
+
</div>
|
| 176 |
+
|
| 177 |
+
<div class="footer-section">
|
| 178 |
+
<h3>Quick Links</h3>
|
| 179 |
+
<div class="footer-links">
|
| 180 |
+
<a href="index.html" class="footer-link">Home</a>
|
| 181 |
+
<a href="programs.html" class="footer-link">Programs</a>
|
| 182 |
+
<a href="events.html" class="footer-link">Events</a>
|
| 183 |
+
<a href="members.html" class="footer-link">Members</a>
|
| 184 |
+
<a href="resources.html" class="footer-link">Resources</a>
|
| 185 |
+
</div>
|
| 186 |
+
</div>
|
| 187 |
+
|
| 188 |
+
<div class="footer-section">
|
| 189 |
+
<h3>Get Involved</h3>
|
| 190 |
+
<div class="footer-links">
|
| 191 |
+
<a href="get-involved.html" class="footer-link">Volunteer</a>
|
| 192 |
+
<a href="donate.html" class="footer-link">Donate</a>
|
| 193 |
+
<a href="#" class="footer-link">Partner With Us</a>
|
| 194 |
+
<a href="#" class="footer-link">Join Newsletter</a>
|
| 195 |
+
</div>
|
| 196 |
+
</div>
|
| 197 |
+
|
| 198 |
+
<div class="footer-section">
|
| 199 |
+
<h3>Stay Updated</h3>
|
| 200 |
+
<p class="text-gray-300 mb-4">Subscribe to our newsletter for the latest updates.</p>
|
| 201 |
+
<form class="newsletter-form" onsubmit="handleNewsletterSubmit(event)">
|
| 202 |
+
<input type="email" class="newsletter-input" placeholder="Your email" required>
|
| 203 |
+
<button type="submit" class="newsletter-button">→</button>
|
| 204 |
+
</form>
|
| 205 |
+
</div>
|
| 206 |
+
</div>
|
| 207 |
+
|
| 208 |
+
<div class="footer-bottom">
|
| 209 |
+
<p class="footer-bottom-text">© 2024 CommunityConnect Hub. All rights reserved.</p>
|
| 210 |
+
<div class="footer-bottom-links">
|
| 211 |
+
<a href="#" class="footer-bottom-link">Privacy Policy</a>
|
| 212 |
+
<a href="#" class="footer-bottom-link">Terms of Service</a>
|
| 213 |
+
<a href="#" class="footer-bottom-link">Contact</a>
|
| 214 |
+
</div>
|
| 215 |
+
</div>
|
| 216 |
+
</div>
|
| 217 |
+
</footer>
|
| 218 |
+
`;
|
| 219 |
+
}
|
| 220 |
+
}
|
| 221 |
+
|
| 222 |
+
customElements.define('custom-footer', CustomFooter);
|
components/navbar.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomNavbar extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
nav {
|
| 7 |
+
background: white;
|
| 8 |
+
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
| 9 |
+
position: sticky;
|
| 10 |
+
top: 0;
|
| 11 |
+
z-index: 1000;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
.nav-container {
|
| 15 |
+
max-width: 1200px;
|
| 16 |
+
margin: 0 auto;
|
| 17 |
+
padding: 1rem 1.5rem;
|
| 18 |
+
display: flex;
|
| 19 |
+
justify-content: space-between;
|
| 20 |
+
align-items: center;
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
.logo {
|
| 24 |
+
font-size: 1.5rem;
|
| 25 |
+
font-weight: bold;
|
| 26 |
+
color: #2563eb;
|
| 27 |
+
text-decoration: none;
|
| 28 |
+
display: flex;
|
| 29 |
+
align-items: center;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
.logo-text {
|
| 33 |
+
margin-left: 0.5rem;
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
.nav-links {
|
| 37 |
+
display: none;
|
| 38 |
+
gap: 2rem;
|
| 39 |
+
align-items: center;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
.nav-link {
|
| 43 |
+
color: #4b5563;
|
| 44 |
+
text-decoration: none;
|
| 45 |
+
font-weight: 500;
|
| 46 |
+
transition: color 0.3s;
|
| 47 |
+
position: relative;
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
.nav-link:hover {
|
| 51 |
+
color: #2563eb;
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
.nav-link::after {
|
| 55 |
+
content: '';
|
| 56 |
+
position: absolute;
|
| 57 |
+
bottom: -0.25rem;
|
| 58 |
+
left: 0;
|
| 59 |
+
right: 0;
|
| 60 |
+
height: 2px;
|
| 61 |
+
background: #2563eb;
|
| 62 |
+
transform: scaleX(0);
|
| 63 |
+
transition: transform 0.3s;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
.nav-link:hover::after {
|
| 67 |
+
transform: scaleX(1);
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
.nav-button {
|
| 71 |
+
background: #2563eb;
|
| 72 |
+
color: white;
|
| 73 |
+
padding: 0.5rem 1.25rem;
|
| 74 |
+
border-radius: 0.5rem;
|
| 75 |
+
text-decoration: none;
|
| 76 |
+
font-weight: 500;
|
| 77 |
+
transition: background 0.3s;
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
.nav-button:hover {
|
| 81 |
+
background: #1d4ed8;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
.mobile-menu-button {
|
| 85 |
+
display: block;
|
| 86 |
+
background: none;
|
| 87 |
+
border: none;
|
| 88 |
+
cursor: pointer;
|
| 89 |
+
padding: 0.5rem;
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
.mobile-menu {
|
| 93 |
+
display: none;
|
| 94 |
+
position: absolute;
|
| 95 |
+
top: 100%;
|
| 96 |
+
left: 0;
|
| 97 |
+
right: 0;
|
| 98 |
+
background: white;
|
| 99 |
+
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
|
| 100 |
+
padding: 1rem;
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
.mobile-menu.active {
|
| 104 |
+
display: block;
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
.mobile-link {
|
| 108 |
+
display: block;
|
| 109 |
+
padding: 0.75rem 0;
|
| 110 |
+
color: #4b5563;
|
| 111 |
+
text-decoration: none;
|
| 112 |
+
border-bottom: 1px solid #e5e7eb;
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
.mobile-link:last-child {
|
| 116 |
+
border-bottom: none;
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
@media (min-width: 768px) {
|
| 120 |
+
.nav-links {
|
| 121 |
+
display: flex;
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
.mobile-menu-button {
|
| 125 |
+
display: none;
|
| 126 |
+
}
|
| 127 |
+
|
| 128 |
+
.mobile-menu {
|
| 129 |
+
display: none !important;
|
| 130 |
+
}
|
| 131 |
+
}
|
| 132 |
+
</style>
|
| 133 |
+
|
| 134 |
+
<nav>
|
| 135 |
+
<div class="nav-container">
|
| 136 |
+
<a href="index.html" class="logo">
|
| 137 |
+
🌟
|
| 138 |
+
<span class="logo-text">CommunityConnect</span>
|
| 139 |
+
</a>
|
| 140 |
+
|
| 141 |
+
<div class="nav-links">
|
| 142 |
+
<a href="index.html" class="nav-link">Home</a>
|
| 143 |
+
<a href="programs.html" class="nav-link">Programs</a>
|
| 144 |
+
<a href="events.html" class="nav-link">Events</a>
|
| 145 |
+
<a href="members.html" class="nav-link">Members</a>
|
| 146 |
+
<a href="resources.html" class="nav-link">Resources</a>
|
| 147 |
+
<a href="donate.html" class="nav-button">Donate</a>
|
| 148 |
+
</div>
|
| 149 |
+
|
| 150 |
+
<button class="mobile-menu-button" onclick="toggleMobileMenu()">
|
| 151 |
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
| 152 |
+
<line x1="3" y1="12" x2="21" y2="12"></line>
|
| 153 |
+
<line x1="3" y1="6" x2="21" y2="6"></line>
|
| 154 |
+
<line x1="3" y1="18" x2="21" y2="18"></line>
|
| 155 |
+
</svg>
|
| 156 |
+
</button>
|
| 157 |
+
|
| 158 |
+
<div class="mobile-menu" id="mobile-menu">
|
| 159 |
+
<a href="index.html" class="mobile-link">Home</a>
|
| 160 |
+
<a href="programs.html" class="mobile-link">Programs</a>
|
| 161 |
+
<a href="events.html" class="mobile-link">Events</a>
|
| 162 |
+
<a href="members.html" class="mobile-link">Members</a>
|
| 163 |
+
<a href="resources.html" class="mobile-link">Resources</a>
|
| 164 |
+
<a href="donate.html" class="mobile-link">Donate</a>
|
| 165 |
+
</div>
|
| 166 |
+
</div>
|
| 167 |
+
</nav>
|
| 168 |
+
`;
|
| 169 |
+
}
|
| 170 |
+
}
|
| 171 |
+
|
| 172 |
+
customElements.define('custom-navbar', CustomNavbar);
|
donate.html
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Donate & Support - CommunityConnect Hub</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌟</text></svg>">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
primary: {
|
| 18 |
+
50: '#eff6ff',
|
| 19 |
+
100: '#dbeafe',
|
| 20 |
+
200: '#bfdbfe',
|
| 21 |
+
300: '#93c5fd',
|
| 22 |
+
400: '#60a5fa',
|
| 23 |
+
500: '#3b82f6',
|
| 24 |
+
600: '#2563eb',
|
| 25 |
+
700: '#1d4ed8',
|
| 26 |
+
800: '#1e40af',
|
| 27 |
+
900: '#1e3a8a',
|
| 28 |
+
},
|
| 29 |
+
secondary: {
|
| 30 |
+
50: '#f0fdfa',
|
| 31 |
+
100: '#ccfbf1',
|
| 32 |
+
200: '#99f6e4',
|
| 33 |
+
300: '#5eead4',
|
| 34 |
+
400: '#2dd4bf',
|
| 35 |
+
500: '#14b8a6',
|
| 36 |
+
600: '#0d9488',
|
| 37 |
+
700: '#0f766e',
|
| 38 |
+
800: '#115e59',
|
| 39 |
+
900: '#134e4a',
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</script>
|
| 46 |
+
</head>
|
| 47 |
+
<body class="bg-gray-50">
|
| 48 |
+
<!-- Navigation Component -->
|
| 49 |
+
<custom-navbar></custom-navbar>
|
| 50 |
+
|
| 51 |
+
<!-- Hero Section -->
|
| 52 |
+
<section class="bg-gradient-to-r from-primary-600 to-secondary-600 text-white py-20">
|
| 53 |
+
<div class="container mx-auto px-6">
|
| 54 |
+
<h1 class="text-4xl lg:text-5xl font-bold mb-4">Donate & Support</h1>
|
| 55 |
+
<p class="text-xl text-primary-100">Your generosity helps us continue our mission of building stronger communities.</p>
|
| 56 |
+
</div>
|
| 57 |
+
</section>
|
| 58 |
+
|
| 59 |
+
<!-- Donation Progress -->
|
| 60 |
+
<section class="py-12 bg-white">
|
| 61 |
+
<div class="container mx-auto px-6">
|
| 62 |
+
<div class="max-w-4xl mx-auto">
|
| 63 |
+
<div class="text-center mb-8">
|
| 64 |
+
<h2 class="text-3xl font-bold text-gray-800 mb-4">Annual Campaign Progress</h2>
|
| 65 |
+
<p class="text-gray-600 mb-6">Help us reach our goal of $100,000 this year</p>
|
| 66 |
+
<div class="relative">
|
| 67 |
+
<div class="bg-gray-200 rounded-full h-8 mb-2">
|
| 68 |
+
<div class="bg-gradient-to-r from-primary-500 to-secondary-500 h-8 rounded-full transition-all duration-500" style="width: 75%"></div>
|
| 69 |
+
</div>
|
| 70 |
+
<div class="flex justify-between text-sm">
|
| 71 |
+
<span class="font-semibold">$75,000 raised</span>
|
| 72 |
+
<span class="font-semibold">$100,000 goal</span>
|
| 73 |
+
</div>
|
| 74 |
+
</div>
|
| 75 |
+
</div>
|
| 76 |
+
</div>
|
| 77 |
+
</div>
|
| 78 |
+
</section>
|
| 79 |
+
|
| 80 |
+
<!-- Donation Options -->
|
| 81 |
+
<section class="py-12">
|
| 82 |
+
<div class="container mx-auto px-6">
|
| 83 |
+
<div class="grid lg:grid-cols-2 gap-12 max-w-6xl mx-auto">
|
| 84 |
+
<!-- One-time Donation -->
|
| 85 |
+
<div class="bg-white rounded-xl shadow-lg p-8">
|
| 86 |
+
<h3 class="text-2xl font-bold mb-6">Make a One-Time Donation</h3>
|
| 87 |
+
<form id="one-time-form">
|
| 88 |
+
<div class="grid grid-cols-3 gap-4 mb-6">
|
| 89 |
+
<button type="button" class="amount-btn py-3 border-2 rounded-lg hover:border-primary-500 hover:bg-primary-50 transition-colors" data-amount="25">
|
| 90 |
+
$25
|
| 91 |
+
</button>
|
| 92 |
+
<button type="button" class="amount-btn py-3 border-2 rounded-lg hover:border-primary-500 hover:bg-primary-50 transition-colors" data-amount="50">
|
| 93 |
+
$50
|
| 94 |
+
</button>
|
| 95 |
+
<button type="button" class="amount-btn py-3 border-2 rounded-lg hover:border-primary-500 hover:bg-primary-50 transition-colors" data-amount="100">
|
| 96 |
+
$100
|
| 97 |
+
</button>
|
| 98 |
+
<button type="button" class="amount-btn py-3 border-2 rounded-lg hover:border-primary-500 hover:bg-primary-50 transition-colors" data-amount="250">
|
| 99 |
+
$250
|
| 100 |
+
</button>
|
| 101 |
+
<button type="button" class="amount-btn py-3 border-2 rounded-lg hover:border-primary-500 hover:bg-primary-50 transition-colors" data-amount="500">
|
| 102 |
+
$500
|
| 103 |
+
</button>
|
| 104 |
+
<input type="number" placeholder="Other" class="px-4 py-3 border-2 rounded-lg focus:outline-none focus:border-primary-500" id="custom-amount">
|
| 105 |
+
</div>
|
| 106 |
+
|
| 107 |
+
<div class="mb-4">
|
| 108 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Donation Type</label>
|
| 109 |
+
<select class="w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500">
|
| 110 |
+
<option>General Support</option>
|
| 111 |
+
<option>Youth Programs</option>
|
| 112 |
+
<option>Education</option>
|
| 113 |
+
<option>Health & Wellness</option>
|
| 114 |
+
<option>Infrastructure</option>
|
| 115 |
+
</select>
|
| 116 |
+
</div>
|
| 117 |
+
|
| 118 |
+
<div class="mb-6">
|
| 119 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Dedication (Optional)</label>
|
| 120 |
+
<input type="text" placeholder="In honor of..." class="w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500">
|
| 121 |
+
</div>
|
| 122 |
+
|
| 123 |
+
<button type="submit" class="w-full bg-primary-600 text-white py-3 rounded-lg font-semibold hover:bg-primary-700 transition-colors">
|
| 124 |
+
Donate Now
|
| 125 |
+
</button>
|
| 126 |
+
</form>
|
| 127 |
+
</div>
|
| 128 |
+
|
| 129 |
+
<!-- Monthly Donation -->
|
| 130 |
+
<div class="bg-gradient-to-br from-secondary-50 to-primary-50 rounded-xl shadow-lg p-8">
|
| 131 |
+
<div class="flex items-center mb-6">
|
| 132 |
+
<i data-feather="repeat" class="w-8 h-8 text-secondary-600 mr-3"></i>
|
| 133 |
+
<h3 class="text-2xl font-bold">Become a Monthly Partner</h3>
|
| 134 |
+
</div>
|
| 135 |
+
<p class="text-gray-600 mb-6">Join our community of monthly donors and provide steady support for our programs throughout the year.</p>
|
| 136 |
+
|
| 137 |
+
<form id="monthly-form">
|
| 138 |
+
<div class="grid grid-cols-2 gap-4 mb-6">
|
| 139 |
+
<button type="button" class="monthly-amount-btn py-3 bg-white border-2 rounded-lg hover:border-secondary-500 hover:bg-secondary-50 transition-colors" data-amount="10">
|
| 140 |
+
$10/mo
|
| 141 |
+
</button>
|
| 142 |
+
<button type="button" class="monthly-amount-btn py-3 bg-white border-2 rounded-lg hover:border-secondary-500 hover:bg-secondary-50 transition-colors" data-amount="25">
|
| 143 |
+
$25/mo
|
| 144 |
+
</button>
|
| 145 |
+
<button type="button" class="monthly-amount-btn py-3 bg-white border-2 rounded-lg hover:border-secondary-500 hover:bg-secondary-50 transition-colors" data-amount="50">
|
| 146 |
+
$50/mo
|
| 147 |
+
</button>
|
| 148 |
+
<button type="button" class="monthly-amount-btn py-3 bg-white border-2 rounded-lg hover:border-secondary-500 hover:bg-secondary-50 transition-colors" data-amount="100">
|
| 149 |
+
$100/mo
|
| 150 |
+
</button>
|
| 151 |
+
</div>
|
| 152 |
+
|
| 153 |
+
<button type="submit" class="w-full bg-secondary-600 text-white py-3 rounded-lg font-semibold hover:bg-secondary-700 transition-colors">
|
| 154 |
+
Start Monthly Donation
|
| 155 |
+
</button>
|
| 156 |
+
</form>
|
| 157 |
+
|
| 158 |
+
<div class="mt-6 p-4 bg-white rounded-lg">
|
| 159 |
+
<p class="text-sm text-gray-600">
|
| 160 |
+
<strong>Monthly donors receive:</strong><br>
|
| 161 |
+
✓ Quarterly impact reports<br>
|
| 162 |
+
✓ Exclusive event invitations<br>
|
| 163 |
+
✓ Special recognition
|
| 164 |
+
</p>
|
| 165 |
+
</div>
|
| 166 |
+
</div>
|
| 167 |
+
</div>
|
| 168 |
+
</div>
|
| 169 |
+
</section>
|
| 170 |
+
|
| 171 |
+
<!-- Other Ways to Give -->
|
| 172 |
+
<section class="py-20 bg-white">
|
| 173 |
+
<div class="container mx-auto px-6">
|
| 174 |
+
<div class="text-center mb-12">
|
| 175 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Other Ways to Give</h2>
|
| 176 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 177 |
+
</div>
|
| 178 |
+
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
| 179 |
+
<div class="text-center p-6 rounded-xl hover:shadow-lg transition-shadow">
|
| 180 |
+
<div class="bg-primary-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 181 |
+
<i data-feather="credit-card" class="w-8 h-8 text-primary-600"></i>
|
| 182 |
+
</div>
|
| 183 |
+
<h3 class="font-semibold mb-2">Corporate Sponsorship</h3>
|
| 184 |
+
<p class="text-sm text-gray-600 mb-4">Partner with us as a corporate sponsor</p>
|
| 185 |
+
<a href="#" class="text-primary-600 font-medium text-sm hover:underline">Learn More →</a>
|
| 186 |
+
</div>
|
| 187 |
+
<div class="text-center p-6 rounded-xl hover:shadow-lg transition-shadow">
|
| 188 |
+
<div class="bg-secondary-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 189 |
+
<i data-feather="gift" class="w-8 h-8 text-secondary-600"></i>
|
| 190 |
+
</div>
|
| 191 |
+
<h3 class="font-semibold mb-2">In-Kind Donations</h3>
|
| 192 |
+
<p class="text-sm text-gray-600 mb-4">Donate goods and services</p>
|
| 193 |
+
<a href="#" class="text-primary-600 font-medium text-sm hover:underline">Learn More →</a>
|
| 194 |
+
</div>
|
| 195 |
+
<div class="text-center p-6 rounded-xl hover:shadow-lg transition-shadow">
|
| 196 |
+
<div class="bg-primary-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 197 |
+
<i data-feather="users" class="w-8 h-8 text-primary-600"></i>
|
| 198 |
+
</div>
|
| 199 |
+
<h3 class="font-semibold mb-2">Volunteer</h3>
|
| 200 |
+
<p class="text-sm text-gray-600 mb-4">Give your time and skills</p>
|
| 201 |
+
<a href="#" class="text-primary-600 font-medium text-sm hover:underline">Learn More →</a>
|
| 202 |
+
</div>
|
| 203 |
+
<div class="text-center p-6 rounded-xl hover:shadow-lg transition-shadow">
|
| 204 |
+
<div class="bg-secondary-100 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 205 |
+
<i data-feather="heart" class="w-8 h-8 text-secondary-600"></i>
|
| 206 |
+
</div>
|
| 207 |
+
<h3 class="font-semibold mb-2">Planned Giving</h3>
|
| 208 |
+
<p class="text-sm text-gray-600 mb-4">Include us in your estate planning</p>
|
| 209 |
+
<a href="#" class="text-primary-600 font-medium text-sm hover:underline">Learn More →</a>
|
| 210 |
+
</div>
|
| 211 |
+
</div>
|
| 212 |
+
</div>
|
| 213 |
+
</section>
|
| 214 |
+
|
| 215 |
+
<!-- Impact Section -->
|
| 216 |
+
<section class="py-20 bg-gradient-to-br from-primary-600 to-secondary-600 text-white">
|
| 217 |
+
<div class="container mx-auto px-6">
|
| 218 |
+
<div class="max-w-4xl mx-auto text-center">
|
| 219 |
+
<h2 class="text-3xl font-bold mb-8">Your Impact in Action</h2>
|
| 220 |
+
<div class="grid md:grid-cols-3 gap-8">
|
| 221 |
+
<div>
|
| 222 |
+
<div class="text-4xl font-bold mb-2">5,000+</div>
|
| 223 |
+
<p class="text-primary-100">Lives Impacted Annually</p>
|
| 224 |
+
</div>
|
| 225 |
+
<div>
|
| 226 |
+
<div class="text-4xl font-bold mb-2">95%</div>
|
| 227 |
+
<p class="text-primary-100">Goes Directly to Programs</p>
|
| 228 |
+
</div>
|
| 229 |
+
<div>
|
| 230 |
+
<div class="text-4xl font-bold mb-2">4-Star</div>
|
| 231 |
+
<p class="text-primary-100">Charity Navigator Rating</p>
|
| 232 |
+
</div>
|
| 233 |
+
</div>
|
| 234 |
+
</div>
|
| 235 |
+
</div>
|
| 236 |
+
</section>
|
| 237 |
+
|
| 238 |
+
<!-- Footer Component -->
|
| 239 |
+
<custom-footer></custom-footer>
|
| 240 |
+
|
| 241 |
+
<!-- Scripts -->
|
| 242 |
+
<script src="components/navbar.js"></script>
|
| 243 |
+
<script src="components/footer.js"></script>
|
| 244 |
+
<script src="script.js"></script>
|
| 245 |
+
<script src="api.js"></script>
|
| 246 |
+
<script>
|
| 247 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 248 |
+
feather.replace();
|
| 249 |
+
|
| 250 |
+
let selectedAmount = 0;
|
| 251 |
+
let selectedMonthlyAmount = 0;
|
| 252 |
+
|
| 253 |
+
// One-time donation amount buttons
|
| 254 |
+
document.querySelectorAll('.amount-btn').forEach(btn => {
|
| 255 |
+
btn.addEventListener('click', (e) => {
|
| 256 |
+
document.querySelectorAll('.amount-btn').forEach(b => {
|
| 257 |
+
b.classList.remove('border-primary-500', 'bg-primary-50');
|
| 258 |
+
b.classList.add('border-gray-300');
|
| 259 |
+
});
|
| 260 |
+
e.target.classList.remove('border-gray-300');
|
| 261 |
+
e.target.classList.add('border-primary-500', 'bg-primary-50');
|
| 262 |
+
selectedAmount = parseInt(e.target.dataset.amount);
|
| 263 |
+
document.getElementById('custom-amount').value = '';
|
| 264 |
+
});
|
| 265 |
+
});
|
| 266 |
+
|
| 267 |
+
// Custom amount input
|
| 268 |
+
document.getElementById('custom-amount').addEventListener('input', (e) => {
|
| 269 |
+
document.querySelectorAll('.amount-btn').forEach(b => {
|
| 270 |
+
b.classList.remove('border-primary-500', 'bg-primary-50');
|
| 271 |
+
b.classList.add('border-gray-300');
|
| 272 |
+
});
|
| 273 |
+
selectedAmount = parseInt(e.target.value) || 0;
|
| 274 |
+
});
|
| 275 |
+
|
| 276 |
+
// Monthly donation amount buttons
|
| 277 |
+
document.querySelectorAll('.monthly-amount-btn').forEach(btn => {
|
| 278 |
+
btn.addEventListener('click', (e) => {
|
| 279 |
+
document.querySelectorAll('.monthly-amount-btn').forEach(b => {
|
| 280 |
+
b.classList.remove('border-secondary-500', 'bg-secondary-50');
|
| 281 |
+
b.classList.add('border-gray-300');
|
| 282 |
+
});
|
| 283 |
+
e.target.classList.remove('border-gray-300');
|
| 284 |
+
e.target.classList.add('border-secondary-500', 'bg-secondary-50');
|
| 285 |
+
selectedMonthlyAmount = parseInt(e.target.dataset.amount);
|
| 286 |
+
});
|
| 287 |
+
});
|
| 288 |
+
|
| 289 |
+
// Form submissions
|
| 290 |
+
document.getElementById('one-time-form').addEventListener('submit', async (e) => {
|
| 291 |
+
e.preventDefault();
|
| 292 |
+
|
| 293 |
+
if (!selectedAmount && !document.getElementById('custom-amount').value) {
|
| 294 |
+
alert('Please select or enter a donation amount');
|
| 295 |
+
return;
|
| 296 |
+
}
|
| 297 |
+
|
| 298 |
+
const amount = selectedAmount || parseInt(document.getElementById('custom-amount').value);
|
| 299 |
+
|
| 300 |
+
try {
|
| 301 |
+
// Simulate donation processing
|
| 302 |
+
await api.processDonation({
|
| 303 |
+
type: 'one-time',
|
| 304 |
+
amount: amount,
|
| 305 |
+
date: new Date().toISOString()
|
| 306 |
+
});
|
| 307 |
+
|
| 308 |
+
alert(`Thank you for your one-time donation of $${amount}!`);
|
| 309 |
+
e.target.reset();
|
| 310 |
+
selectedAmount = 0;
|
| 311 |
+
document.querySelectorAll('.amount-btn').forEach(b => {
|
| 312 |
+
b.classList.remove('border-primary-500', 'bg-primary-50');
|
| 313 |
+
b.classList.add('border-gray-300');
|
| 314 |
+
});
|
| 315 |
+
} catch (error) {
|
| 316 |
+
alert('Error processing donation. Please try again.');
|
| 317 |
+
}
|
| 318 |
+
});
|
| 319 |
+
|
| 320 |
+
document.getElementById('monthly-form').addEventListener('submit', async (e) => {
|
| 321 |
+
e.preventDefault();
|
| 322 |
+
|
| 323 |
+
if (!selectedMonthlyAmount) {
|
| 324 |
+
alert('Please select a monthly donation amount');
|
| 325 |
+
return;
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
try {
|
| 329 |
+
// Simulate monthly donation setup
|
| 330 |
+
await api.processDonation({
|
| 331 |
+
type: 'monthly',
|
| 332 |
+
amount: selectedMonthlyAmount,
|
| 333 |
+
date: new Date().toISOString()
|
| 334 |
+
});
|
| 335 |
+
|
| 336 |
+
alert(`Thank you for becoming a monthly donor with $${selectedMonthlyAmount}/month!`);
|
| 337 |
+
e.target.reset();
|
| 338 |
+
selectedMonthlyAmount = 0;
|
| 339 |
+
document.querySelectorAll('.monthly-amount-btn').forEach(b => {
|
| 340 |
+
b.classList.remove('border-secondary-500', 'bg-secondary-50');
|
| 341 |
+
b.classList.add('border-gray-300');
|
| 342 |
+
});
|
| 343 |
+
} catch (error) {
|
| 344 |
+
alert('Error setting up monthly donation. Please try again.');
|
| 345 |
+
}
|
| 346 |
+
});
|
| 347 |
+
});
|
| 348 |
+
</script>
|
| 349 |
+
</body>
|
| 350 |
+
</html>
|
events.html
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Events Calendar - CommunityConnect Hub</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌟</text></svg>">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
primary: {
|
| 18 |
+
50: '#eff6ff',
|
| 19 |
+
100: '#dbeafe',
|
| 20 |
+
200: '#bfdbfe',
|
| 21 |
+
300: '#93c5fd',
|
| 22 |
+
400: '#60a5fa',
|
| 23 |
+
500: '#3b82f6',
|
| 24 |
+
600: '#2563eb',
|
| 25 |
+
700: '#1d4ed8',
|
| 26 |
+
800: '#1e40af',
|
| 27 |
+
900: '#1e3a8a',
|
| 28 |
+
},
|
| 29 |
+
secondary: {
|
| 30 |
+
50: '#f0fdfa',
|
| 31 |
+
100: '#ccfbf1',
|
| 32 |
+
200: '#99f6e4',
|
| 33 |
+
300: '#5eead4',
|
| 34 |
+
400: '#2dd4bf',
|
| 35 |
+
500: '#14b8a6',
|
| 36 |
+
600: '#0d9488',
|
| 37 |
+
700: '#0f766e',
|
| 38 |
+
800: '#115e59',
|
| 39 |
+
900: '#134e4a',
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</script>
|
| 46 |
+
</head>
|
| 47 |
+
<body class="bg-gray-50">
|
| 48 |
+
<!-- Navigation Component -->
|
| 49 |
+
<custom-navbar></custom-navbar>
|
| 50 |
+
|
| 51 |
+
<!-- Hero Section -->
|
| 52 |
+
<section class="bg-gradient-to-r from-primary-600 to-secondary-600 text-white py-20">
|
| 53 |
+
<div class="container mx-auto px-6">
|
| 54 |
+
<h1 class="text-4xl lg:text-5xl font-bold mb-4">Events Calendar</h1>
|
| 55 |
+
<p class="text-xl text-primary-100">Join us for exciting community events and activities.</p>
|
| 56 |
+
</div>
|
| 57 |
+
</section>
|
| 58 |
+
|
| 59 |
+
<!-- Calendar View Toggle -->
|
| 60 |
+
<section class="py-8 bg-white border-b">
|
| 61 |
+
<div class="container mx-auto px-6">
|
| 62 |
+
<div class="flex flex-col sm:flex-row justify-between items-center gap-4">
|
| 63 |
+
<div class="flex space-x-4">
|
| 64 |
+
<button id="list-view-btn" class="px-6 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors">
|
| 65 |
+
List View
|
| 66 |
+
</button>
|
| 67 |
+
<button id="calendar-view-btn" class="px-6 py-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors">
|
| 68 |
+
Calendar View
|
| 69 |
+
</button>
|
| 70 |
+
</div>
|
| 71 |
+
<div class="flex items-center space-x-4">
|
| 72 |
+
<select id="month-filter" class="px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500">
|
| 73 |
+
<option value="">All Months</option>
|
| 74 |
+
<option value="1">January</option>
|
| 75 |
+
<option value="2">February</option>
|
| 76 |
+
<option value="3">March</option>
|
| 77 |
+
<option value="4">April</option>
|
| 78 |
+
<option value="5">May</option>
|
| 79 |
+
<option value="6">June</option>
|
| 80 |
+
<option value="7">July</option>
|
| 81 |
+
<option value="8">August</option>
|
| 82 |
+
<option value="9">September</option>
|
| 83 |
+
<option value="10">October</option>
|
| 84 |
+
<option value="11">November</option>
|
| 85 |
+
<option value="12">December</option>
|
| 86 |
+
</select>
|
| 87 |
+
<select id="category-filter" class="px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500">
|
| 88 |
+
<option value="">All Categories</option>
|
| 89 |
+
<option value="workshop">Workshop</option>
|
| 90 |
+
<option value="social">Social</option>
|
| 91 |
+
<option value="volunteer">Volunteer</option>
|
| 92 |
+
<option value="fundraiser">Fundraiser</option>
|
| 93 |
+
</select>
|
| 94 |
+
</div>
|
| 95 |
+
</div>
|
| 96 |
+
</div>
|
| 97 |
+
</section>
|
| 98 |
+
|
| 99 |
+
<!-- Events List -->
|
| 100 |
+
<section id="events-list" class="py-12">
|
| 101 |
+
<div class="container mx-auto px-6">
|
| 102 |
+
<div id="events-container" class="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
| 103 |
+
<!-- Events will be loaded here -->
|
| 104 |
+
</div>
|
| 105 |
+
</div>
|
| 106 |
+
</section>
|
| 107 |
+
|
| 108 |
+
<!-- Calendar View (Hidden by default) -->
|
| 109 |
+
<section id="events-calendar" class="py-12 hidden">
|
| 110 |
+
<div class="container mx-auto px-6">
|
| 111 |
+
<div class="bg-white rounded-xl shadow-lg p-6">
|
| 112 |
+
<div id="calendar-header" class="flex justify-between items-center mb-6">
|
| 113 |
+
<h2 class="text-2xl font-bold"></h2>
|
| 114 |
+
<div class="flex space-x-2">
|
| 115 |
+
<button id="prev-month" class="p-2 hover:bg-gray-100 rounded-lg">
|
| 116 |
+
<i data-feather="chevron-left" class="w-5 h-5"></i>
|
| 117 |
+
</button>
|
| 118 |
+
<button id="next-month" class="p-2 hover:bg-gray-100 rounded-lg">
|
| 119 |
+
<i data-feather="chevron-right" class="w-5 h-5"></i>
|
| 120 |
+
</button>
|
| 121 |
+
</div>
|
| 122 |
+
</div>
|
| 123 |
+
<div id="calendar-grid" class="grid grid-cols-7 gap-2">
|
| 124 |
+
<!-- Calendar will be generated here -->
|
| 125 |
+
</div>
|
| 126 |
+
</div>
|
| 127 |
+
</div>
|
| 128 |
+
</section>
|
| 129 |
+
|
| 130 |
+
<!-- Footer Component -->
|
| 131 |
+
<custom-footer></custom-footer>
|
| 132 |
+
|
| 133 |
+
<!-- Scripts -->
|
| 134 |
+
<script src="components/navbar.js"></script>
|
| 135 |
+
<script src="components/footer.js"></script>
|
| 136 |
+
<script src="script.js"></script>
|
| 137 |
+
<script src="api.js"></script>
|
| 138 |
+
<script>
|
| 139 |
+
document.addEventListener('DOMContentLoaded', async () => {
|
| 140 |
+
feather.replace();
|
| 141 |
+
|
| 142 |
+
let currentView = 'list';
|
| 143 |
+
let events = [];
|
| 144 |
+
|
| 145 |
+
// Load all events
|
| 146 |
+
try {
|
| 147 |
+
events = await api.getUpcomingEvents(20);
|
| 148 |
+
renderEventsList(events);
|
| 149 |
+
initializeCalendar(events);
|
| 150 |
+
} catch (error) {
|
| 151 |
+
document.getElementById('events-container').innerHTML = '<div class="col-span-full text-center text-gray-500">Unable to load events at this time.</div>';
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
// View toggle
|
| 155 |
+
document.getElementById('list-view-btn').addEventListener('click', () => {
|
| 156 |
+
currentView = 'list';
|
| 157 |
+
document.getElementById('events-list').classList.remove('hidden');
|
| 158 |
+
document.getElementById('events-calendar').classList.add('hidden');
|
| 159 |
+
document.getElementById('list-view-btn').className = 'px-6 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors';
|
| 160 |
+
document.getElementById('calendar-view-btn').className = 'px-6 py-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors';
|
| 161 |
+
});
|
| 162 |
+
|
| 163 |
+
document.getElementById('calendar-view-btn').addEventListener('click', () => {
|
| 164 |
+
currentView = 'calendar';
|
| 165 |
+
document.getElementById('events-list').classList.add('hidden');
|
| 166 |
+
document.getElementById('events-calendar').classList.remove('hidden');
|
| 167 |
+
document.getElementById('calendar-view-btn').className = 'px-6 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors';
|
| 168 |
+
document.getElementById('list-view-btn').className = 'px-6 py-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors';
|
| 169 |
+
});
|
| 170 |
+
|
| 171 |
+
// Filter events
|
| 172 |
+
function filterEvents() {
|
| 173 |
+
const monthFilter = document.getElementById('month-filter').value;
|
| 174 |
+
const categoryFilter = document.getElementById('category-filter').value;
|
| 175 |
+
|
| 176 |
+
let filtered = events;
|
| 177 |
+
|
| 178 |
+
if (monthFilter) {
|
| 179 |
+
filtered = filtered.filter(event => new Date(event.date).getMonth() + 1 == monthFilter);
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
if (categoryFilter) {
|
| 183 |
+
filtered = filtered.filter(event => event.category === categoryFilter);
|
| 184 |
+
}
|
| 185 |
+
|
| 186 |
+
renderEventsList(filtered);
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
document.getElementById('month-filter').addEventListener('change', filterEvents);
|
| 190 |
+
document.getElementById('category-filter').addEventListener('change', filterEvents);
|
| 191 |
+
|
| 192 |
+
function renderEventsList(eventsToRender) {
|
| 193 |
+
const container = document.getElementById('events-container');
|
| 194 |
+
|
| 195 |
+
if (eventsToRender.length === 0) {
|
| 196 |
+
container.innerHTML = '<div class="col-span-full text-center text-gray-500">No events found.</div>';
|
| 197 |
+
return;
|
| 198 |
+
}
|
| 199 |
+
|
| 200 |
+
container.innerHTML = eventsToRender.map(event => `
|
| 201 |
+
<div class="bg-white rounded-xl p-6 shadow-lg hover:shadow-xl transition-shadow">
|
| 202 |
+
<div class="flex items-start justify-between mb-4">
|
| 203 |
+
<div>
|
| 204 |
+
<span class="inline-block px-3 py-1 bg-${getEventColor(event.category)}-100 text-${getEventColor(event.category)}-700 text-sm rounded-full mb-2">
|
| 205 |
+
${event.category}
|
| 206 |
+
</span>
|
| 207 |
+
<h3 class="text-lg font-semibold">${event.title}</h3>
|
| 208 |
+
</div>
|
| 209 |
+
<button class="text-gray-400 hover:text-primary-600">
|
| 210 |
+
<i data-feather="bookmark" class="w-5 h-5"></i>
|
| 211 |
+
</button>
|
| 212 |
+
</div>
|
| 213 |
+
<div class="space-y-2 text-sm text-gray-600 mb-4">
|
| 214 |
+
<p class="flex items-center">
|
| 215 |
+
<i data-feather="calendar" class="w-4 h-4 mr-2"></i>
|
| 216 |
+
${new Date(event.date).toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}
|
| 217 |
+
</p>
|
| 218 |
+
<p class="flex items-center">
|
| 219 |
+
<i data-feather="clock" class="w-4 h-4 mr-2"></i>
|
| 220 |
+
${event.time}
|
| 221 |
+
</p>
|
| 222 |
+
<p class="flex items-center">
|
| 223 |
+
<i data-feather="map-pin" class="w-4 h-4 mr-2"></i>
|
| 224 |
+
${event.location}
|
| 225 |
+
</p>
|
| 226 |
+
<p class="flex items-center">
|
| 227 |
+
<i data-feather="users" class="w-4 h-4 mr-2"></i>
|
| 228 |
+
${event.attendees || 'Open to all'}
|
| 229 |
+
</p>
|
| 230 |
+
</div>
|
| 231 |
+
<p class="text-gray-600 mb-4">${event.description}</p>
|
| 232 |
+
<button class="w-full bg-primary-600 text-white py-2 rounded-lg hover:bg-primary-700 transition-colors">
|
| 233 |
+
Register Now
|
| 234 |
+
</button>
|
| 235 |
+
</div>
|
| 236 |
+
`).join('');
|
| 237 |
+
|
| 238 |
+
feather.replace();
|
| 239 |
+
}
|
| 240 |
+
|
| 241 |
+
function getEventColor(category) {
|
| 242 |
+
const colors = {
|
| 243 |
+
workshop: 'primary',
|
| 244 |
+
social: 'secondary',
|
| 245 |
+
volunteer: 'green',
|
| 246 |
+
fundraiser: 'yellow'
|
| 247 |
+
};
|
| 248 |
+
return colors[category] || 'gray';
|
| 249 |
+
}
|
| 250 |
+
|
| 251 |
+
function initializeCalendar(eventsData) {
|
| 252 |
+
const today = new Date();
|
| 253 |
+
const currentMonth = today.getMonth();
|
| 254 |
+
const currentYear = today.getFullYear();
|
| 255 |
+
|
| 256 |
+
function renderCalendar(month = currentMonth, year = currentYear) {
|
| 257 |
+
const firstDay = new Date(year, month, 1).getDay();
|
| 258 |
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
| 259 |
+
|
| 260 |
+
const monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
| 261 |
+
|
| 262 |
+
document.querySelector('#calendar-header h2').textContent = `${monthNames[month]} ${year}`;
|
| 263 |
+
|
| 264 |
+
let calendarHTML = '';
|
| 265 |
+
|
| 266 |
+
// Day headers
|
| 267 |
+
const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
|
| 268 |
+
dayNames.forEach(day => {
|
| 269 |
+
calendarHTML += `<div class="text-center font-semibold text-gray-600 p-2">${day}</div>`;
|
| 270 |
+
});
|
| 271 |
+
|
| 272 |
+
// Empty cells
|
| 273 |
+
for (let i = 0; i < firstDay; i++) {
|
| 274 |
+
calendarHTML += '<div></div>';
|
| 275 |
+
}
|
| 276 |
+
|
| 277 |
+
// Days
|
| 278 |
+
for (let day = 1; day <= daysInMonth; day++) {
|
| 279 |
+
const dateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
|
| 280 |
+
const dayEvents = eventsData.filter(e => e.date.startsWith(dateStr));
|
| 281 |
+
const hasEvents = dayEvents.length > 0;
|
| 282 |
+
const isToday = today.getDate() === day && today.getMonth() === month && today.getFullYear() === year;
|
| 283 |
+
|
| 284 |
+
calendarHTML += `
|
| 285 |
+
<div class="relative p-2 border rounded-lg ${hasEvents ? 'bg-primary-50 border-primary-200' : ''} ${isToday ? 'bg-primary-100 border-primary-400' : ''} hover:bg-gray-50 cursor-pointer">
|
| 286 |
+
<div class="font-semibold text-sm">${day}</div>
|
| 287 |
+
${hasEvents ? `
|
| 288 |
+
<div class="mt-1">
|
| 289 |
+
<span class="text-xs bg-primary-600 text-white px-1 py-0.5 rounded">${dayEvents.length} event${dayEvents.length > 1 ? 's' : ''}</span>
|
| 290 |
+
</div>
|
| 291 |
+
` : ''}
|
| 292 |
+
</div>
|
| 293 |
+
`;
|
| 294 |
+
}
|
| 295 |
+
|
| 296 |
+
document.getElementById('calendar-grid').innerHTML = calendarHTML;
|
| 297 |
+
}
|
| 298 |
+
|
| 299 |
+
document.getElementById('prev-month').addEventListener('click', () => {
|
| 300 |
+
const month = parseInt(document.querySelector('#calendar-header h2').textContent.split(' ')[0]) - 1;
|
| 301 |
+
const year = parseInt(document.querySelector('#calendar-header h2').textContent.split(' ')[1]);
|
| 302 |
+
renderCalendar(month - 1 < 0 ? 11 : month - 1, month - 1 < 0 ? year - 1 : year);
|
| 303 |
+
});
|
| 304 |
+
|
| 305 |
+
document.getElementById('next-month').addEventListener('click', () => {
|
| 306 |
+
const month = parseInt(document.querySelector('#calendar-header h2').textContent.split(' ')[0]) - 1;
|
| 307 |
+
const year = parseInt(document.querySelector('#calendar-header h2').textContent.split(' ')[1]);
|
| 308 |
+
renderCalendar(month + 1 > 11 ? 0 : month + 1, month + 1 > 11 ? year + 1 : year);
|
| 309 |
+
});
|
| 310 |
+
|
| 311 |
+
renderCalendar();
|
| 312 |
+
}
|
| 313 |
+
});
|
| 314 |
+
</script>
|
| 315 |
+
</body>
|
| 316 |
+
</html>
|
get-involved.html
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Get Involved - CommunityConnect Hub</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌟</text></svg>">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
primary: {
|
| 18 |
+
50: '#eff6ff',
|
| 19 |
+
100: '#dbeafe',
|
| 20 |
+
200: '#bfdbfe',
|
| 21 |
+
300: '#93c5fd',
|
| 22 |
+
400: '#60a5fa',
|
| 23 |
+
500: '#3b82f6',
|
| 24 |
+
600: '#2563eb',
|
| 25 |
+
700: '#1d4ed8',
|
| 26 |
+
800: '#1e40af',
|
| 27 |
+
900: '#1e3a8a',
|
| 28 |
+
},
|
| 29 |
+
secondary: {
|
| 30 |
+
50: '#f0fdfa',
|
| 31 |
+
100: '#ccfbf1',
|
| 32 |
+
200: '#99f6e4',
|
| 33 |
+
300: '#5eead4',
|
| 34 |
+
400: '#2dd4bf',
|
| 35 |
+
500: '#14b8a6',
|
| 36 |
+
600: '#0d9488',
|
| 37 |
+
700: '#0f766e',
|
| 38 |
+
800: '#115e59',
|
| 39 |
+
900: '#134e4a',
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</script>
|
| 46 |
+
</head>
|
| 47 |
+
<body class="bg-gray-50">
|
| 48 |
+
<!-- Navigation Component -->
|
| 49 |
+
<custom-navbar></custom-navbar>
|
| 50 |
+
|
| 51 |
+
<!-- Hero Section -->
|
| 52 |
+
<section class="bg-gradient-to-r from-primary-600 to-secondary-600 text-white py-20">
|
| 53 |
+
<div class="container mx-auto px-6">
|
| 54 |
+
<h1 class="text-4xl lg:text-5xl font-bold mb-4">Get Involved</h1>
|
| 55 |
+
<p class="text-xl text-primary-100">There are many ways to contribute to our community's success.</p>
|
| 56 |
+
</div>
|
| 57 |
+
</section>
|
| 58 |
+
|
| 59 |
+
<!-- Involvement Options -->
|
| 60 |
+
<section class="py-20">
|
| 61 |
+
<div class="container mx-auto px-6">
|
| 62 |
+
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
| 63 |
+
<div class="bg-white rounded-xl p-6 hover:shadow-xl transition-shadow text-center">
|
| 64 |
+
<div class="bg-primary-100 w-20 h-20 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 65 |
+
<i data-feather="users" class="w-10 h-10 text-primary-600"></i>
|
| 66 |
+
</div>
|
| 67 |
+
<h3 class="text-xl font-semibold mb-3">Volunteer</h3>
|
| 68 |
+
<p class="text-gray-600 mb-4">Give your time and skills to make a direct impact in the community.</p>
|
| 69 |
+
<button class="text-primary-600 font-medium hover:underline">Find Opportunities →</button>
|
| 70 |
+
</div>
|
| 71 |
+
|
| 72 |
+
<div class="bg-white rounded-xl p-6 hover:shadow-xl transition-shadow text-center">
|
| 73 |
+
<div class="bg-secondary-100 w-20 h-20 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 74 |
+
<i data-feather="briefcase" class="w-10 h-10 text-secondary-600"></i>
|
| 75 |
+
</div>
|
| 76 |
+
<h3 class="text-xl font-semibold mb-3">Partner With Us</h3>
|
| 77 |
+
<p class="text-gray-600 mb-4">Collaborate with us as a business or organization.</p>
|
| 78 |
+
<button class="text-primary-600 font-medium hover:underline">Learn More →</button>
|
| 79 |
+
</div>
|
| 80 |
+
|
| 81 |
+
<div class="bg-white rounded-xl p-6 hover:shadow-xl transition-shadow text-center">
|
| 82 |
+
<div class="bg-primary-100 w-20 h-20 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 83 |
+
<i data-feather="megaphone" class="w-10 h-10 text-primary-600"></i>
|
| 84 |
+
</div>
|
| 85 |
+
<h3 class="text-xl font-semibold mb-3">Spread the Word</h3>
|
| 86 |
+
<p class="text-gray-600 mb-4">Help raise awareness about our mission and programs.</p>
|
| 87 |
+
<button class="text-primary-600 font-medium hover:underline">Share Our Story →</button>
|
| 88 |
+
</div>
|
| 89 |
+
</div>
|
| 90 |
+
</div>
|
| 91 |
+
</section>
|
| 92 |
+
|
| 93 |
+
<!-- Get Involved Form -->
|
| 94 |
+
<section class="py-20 bg-white">
|
| 95 |
+
<div class="container mx-auto px-6">
|
| 96 |
+
<div class="max-w-3xl mx-auto">
|
| 97 |
+
<div class="text-center mb-12">
|
| 98 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Join Our Community</h2>
|
| 99 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 100 |
+
<p class="mt-4 text-gray-600">Fill out the form below and we'll be in touch with opportunities that match your interests.</p>
|
| 101 |
+
</div>
|
| 102 |
+
|
| 103 |
+
<form id="get-involved-form" class="space-y-6">
|
| 104 |
+
<div class="grid md:grid-cols-2 gap-6">
|
| 105 |
+
<div>
|
| 106 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">First Name *</label>
|
| 107 |
+
<input type="text" required class="w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" placeholder="John">
|
| 108 |
+
</div>
|
| 109 |
+
<div>
|
| 110 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Last Name *</label>
|
| 111 |
+
<input type="text" required class="w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" placeholder="Doe">
|
| 112 |
+
</div>
|
| 113 |
+
</div>
|
| 114 |
+
|
| 115 |
+
<div class="grid md:grid-cols-2 gap-6">
|
| 116 |
+
<div>
|
| 117 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Email *</label>
|
| 118 |
+
<input type="email" required class="w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" placeholder="john@example.com">
|
| 119 |
+
</div>
|
| 120 |
+
<div>
|
| 121 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Phone</label>
|
| 122 |
+
<input type="tel" class="w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" placeholder="(555) 123-4567">
|
| 123 |
+
</div>
|
| 124 |
+
</div>
|
| 125 |
+
|
| 126 |
+
<div>
|
| 127 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">I'm interested in: *</label>
|
| 128 |
+
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
|
| 129 |
+
<label class="flex items-center">
|
| 130 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 131 |
+
<span class="text-sm">Volunteering</span>
|
| 132 |
+
</label>
|
| 133 |
+
<label class="flex items-center">
|
| 134 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 135 |
+
<span class="text-sm">Youth Programs</span>
|
| 136 |
+
</label>
|
| 137 |
+
<label class="flex items-center">
|
| 138 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 139 |
+
<span class="text-sm">Events</span>
|
| 140 |
+
</label>
|
| 141 |
+
<label class="flex items-center">
|
| 142 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 143 |
+
<span class="text-sm">Fundraising</span>
|
| 144 |
+
</label>
|
| 145 |
+
<label class="flex items-center">
|
| 146 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 147 |
+
<span class="text-sm">Partnership</span>
|
| 148 |
+
</label>
|
| 149 |
+
<label class="flex items-center">
|
| 150 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 151 |
+
<span class="text-sm">Other</span>
|
| 152 |
+
</label>
|
| 153 |
+
</div>
|
| 154 |
+
</div>
|
| 155 |
+
|
| 156 |
+
<div>
|
| 157 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">How would you like to contribute?</label>
|
| 158 |
+
<select class="w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500">
|
| 159 |
+
<option>Select an option</option>
|
| 160 |
+
<option>Regular Volunteer</option>
|
| 161 |
+
<option>Occasional Volunteer</option>
|
| 162 |
+
<option>Skills-based Volunteer</option>
|
| 163 |
+
<option>Board Member</option>
|
| 164 |
+
<option>Community Ambassador</option>
|
| 165 |
+
<option>Corporate Partner</option>
|
| 166 |
+
</select>
|
| 167 |
+
</div>
|
| 168 |
+
|
| 169 |
+
<div>
|
| 170 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Skills & Expertise</label>
|
| 171 |
+
<textarea rows="3" class="w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" placeholder="Tell us about your skills and how you'd like to use them..."></textarea>
|
| 172 |
+
</div>
|
| 173 |
+
|
| 174 |
+
<div>
|
| 175 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Availability</label>
|
| 176 |
+
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
|
| 177 |
+
<label class="flex items-center">
|
| 178 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 179 |
+
<span class="text-sm">Weekdays</span>
|
| 180 |
+
</label>
|
| 181 |
+
<label class="flex items-center">
|
| 182 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 183 |
+
<span class="text-sm">Weekends</span>
|
| 184 |
+
</label>
|
| 185 |
+
<label class="flex items-center">
|
| 186 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 187 |
+
<span class="text-sm">Mornings</span>
|
| 188 |
+
</label>
|
| 189 |
+
<label class="flex items-center">
|
| 190 |
+
<input type="checkbox" class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 191 |
+
<span class="text-sm">Evenings</span>
|
| 192 |
+
</label>
|
| 193 |
+
</div>
|
| 194 |
+
</div>
|
| 195 |
+
|
| 196 |
+
<div>
|
| 197 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Tell us why you want to get involved</label>
|
| 198 |
+
<textarea rows="4" class="w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" placeholder="Share your motivation..."></textarea>
|
| 199 |
+
</div>
|
| 200 |
+
|
| 201 |
+
<div class="bg-gray-50 p-4 rounded-lg">
|
| 202 |
+
<label class="flex items-center">
|
| 203 |
+
<input type="checkbox" required class="mr-2 text-primary-600 focus:ring-primary-500">
|
| 204 |
+
<span class="text-sm text-gray-700">I agree to receive communications about volunteer opportunities and community updates.</span>
|
| 205 |
+
</label>
|
| 206 |
+
</div>
|
| 207 |
+
|
| 208 |
+
<div class="flex justify-center">
|
| 209 |
+
<button type="submit" class="bg-primary-600 text-white px-8 py-4 rounded-lg font-semibold hover:bg-primary-700 transition-colors text-lg">
|
| 210 |
+
Submit Application
|
| 211 |
+
</button>
|
| 212 |
+
</div>
|
| 213 |
+
</form>
|
| 214 |
+
</div>
|
| 215 |
+
</div>
|
| 216 |
+
</section>
|
| 217 |
+
|
| 218 |
+
<!-- FAQ Section -->
|
| 219 |
+
<section class="py-20 bg-gray-50">
|
| 220 |
+
<div class="container mx-auto px-6">
|
| 221 |
+
<div class="text-center mb-12">
|
| 222 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Frequently Asked Questions</h2>
|
| 223 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 224 |
+
</div>
|
| 225 |
+
|
| 226 |
+
<div class="max-w-3xl mx-auto space-y-4">
|
| 227 |
+
<details class="bg-white rounded-lg p-6 shadow-sm">
|
| 228 |
+
<summary class="font-semibold cursor-pointer">What kind of volunteer opportunities are available?</summary>
|
| 229 |
+
<p class="mt-3 text-gray-600">We offer a wide range of volunteer opportunities including event support, youth mentoring, administrative assistance, fundraising, and more. We match volunteers with roles based on their skills, interests, and availability.</p>
|
| 230 |
+
</details>
|
| 231 |
+
|
| 232 |
+
<details class="bg-white rounded-lg p-6 shadow-sm">
|
| 233 |
+
<summary class="font-semibold cursor-pointer">How much time do I need to commit?</summary>
|
| 234 |
+
<p class="mt-3 text-gray-600">We have opportunities ranging from one-time events to regular weekly commitments. You can choose what works best for your schedule - even a few hours a month can make a difference!</p>
|
| 235 |
+
</details>
|
| 236 |
+
|
| 237 |
+
<details class="bg-white rounded-lg p-6 shadow-sm">
|
| 238 |
+
<summary class="font-semibold cursor-pointer">Do I need specific skills to volunteer?</summary>
|
| 239 |
+
<p class="mt-3 text-gray-600">Not at all! We welcome volunteers with all skill levels. Whether you're great with people, organized, creative, or just willing to help, there's a place for you in our community.</p>
|
| 240 |
+
</details>
|
| 241 |
+
|
| 242 |
+
<details class="bg-white rounded-lg p-6 shadow-sm">
|
| 243 |
+
<summary class="font-semibold cursor-pointer">What happens after I submit the form?</summary>
|
| 244 |
+
<p class="mt-3 text-gray-600">Our volunteer coordinator will review your application and contact you within 3-5 business days to discuss your interests and next steps. We'll then match you with opportunities that align with your preferences.</p>
|
| 245 |
+
</details>
|
| 246 |
+
</div>
|
| 247 |
+
</div>
|
| 248 |
+
</section>
|
| 249 |
+
|
| 250 |
+
<!-- Contact CTA -->
|
| 251 |
+
<section class="py-20 bg-gradient-to-br from-primary-600 to-secondary-600 text-white">
|
| 252 |
+
<div class="container mx-auto px-6 text-center">
|
| 253 |
+
<h2 class="text-3xl font-bold mb-4">Still Have Questions?</h2>
|
| 254 |
+
<p class="text-xl mb-8 text-primary-100">We're here to help you find the perfect way to contribute.</p>
|
| 255 |
+
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
| 256 |
+
<a href="mailto:volunteer@communityconnect.org" class="bg-white text-primary-600 px-6 py-3 rounded-lg font-semibold hover:bg-gray-100 transition-colors inline-flex items-center">
|
| 257 |
+
<i data-feather="mail" class="w-5 h-5 mr-2"></i>
|
| 258 |
+
Email Us
|
| 259 |
+
</a>
|
| 260 |
+
<a href="tel:555-123-4567" class="border-2 border-white text-white px-6 py-3 rounded-lg font-semibold hover:bg-white hover:text-primary-600 transition-colors inline-flex items-center">
|
| 261 |
+
<i data-feather="phone" class="w-5 h-5 mr-2"></i>
|
| 262 |
+
Call Us
|
| 263 |
+
</a>
|
| 264 |
+
</div>
|
| 265 |
+
</div>
|
| 266 |
+
</section>
|
| 267 |
+
|
| 268 |
+
<!-- Footer Component -->
|
| 269 |
+
<custom-footer></custom-footer>
|
| 270 |
+
|
| 271 |
+
<!-- Scripts -->
|
| 272 |
+
<script src="components/navbar.js"></script>
|
| 273 |
+
<script src="components/footer.js"></script>
|
| 274 |
+
<script src="script.js"></script>
|
| 275 |
+
<script src="api.js"></script>
|
| 276 |
+
<script>
|
| 277 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 278 |
+
feather.replace();
|
| 279 |
+
|
| 280 |
+
document.getElementById('get-involved-form').addEventListener('submit', async (e) => {
|
| 281 |
+
e.preventDefault();
|
| 282 |
+
|
| 283 |
+
const formData = new FormData(e.target);
|
| 284 |
+
const data = Object.fromEntries(formData.entries());
|
| 285 |
+
|
| 286 |
+
try {
|
| 287 |
+
// Collect checked interests
|
| 288 |
+
const interests = [];
|
| 289 |
+
e.target.querySelectorAll('input[type="checkbox"]:checked').forEach(checkbox => {
|
| 290 |
+
if (checkbox.nextElementSibling) {
|
| 291 |
+
interests.push(checkbox.nextElementSibling.textContent);
|
| 292 |
+
}
|
| 293 |
+
});
|
| 294 |
+
|
| 295 |
+
const submissionData = {
|
| 296 |
+
...data,
|
| 297 |
+
interests: interests,
|
| 298 |
+
submittedAt: new Date().toISOString()
|
| 299 |
+
};
|
| 300 |
+
|
| 301 |
+
// Simulate form submission
|
| 302 |
+
await api.submitGetInvolvedForm(submissionData);
|
| 303 |
+
|
| 304 |
+
alert('Thank you for your interest! We\'ll be in touch soon with opportunities that match your preferences.');
|
| 305 |
+
e.target.reset();
|
| 306 |
+
} catch (error) {
|
| 307 |
+
alert('Error submitting form. Please try again.');
|
| 308 |
+
}
|
| 309 |
+
});
|
| 310 |
+
});
|
| 311 |
+
</script>
|
| 312 |
+
</body>
|
| 313 |
+
</html>
|
index.html
CHANGED
|
@@ -1,19 +1,274 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>CommunityConnect Hub - Building Stronger Communities Together</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌟</text></svg>">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
primary: {
|
| 18 |
+
50: '#eff6ff',
|
| 19 |
+
100: '#dbeafe',
|
| 20 |
+
200: '#bfdbfe',
|
| 21 |
+
300: '#93c5fd',
|
| 22 |
+
400: '#60a5fa',
|
| 23 |
+
500: '#3b82f6',
|
| 24 |
+
600: '#2563eb',
|
| 25 |
+
700: '#1d4ed8',
|
| 26 |
+
800: '#1e40af',
|
| 27 |
+
900: '#1e3a8a',
|
| 28 |
+
},
|
| 29 |
+
secondary: {
|
| 30 |
+
50: '#f0fdfa',
|
| 31 |
+
100: '#ccfbf1',
|
| 32 |
+
200: '#99f6e4',
|
| 33 |
+
300: '#5eead4',
|
| 34 |
+
400: '#2dd4bf',
|
| 35 |
+
500: '#14b8a6',
|
| 36 |
+
600: '#0d9488',
|
| 37 |
+
700: '#0f766e',
|
| 38 |
+
800: '#115e59',
|
| 39 |
+
900: '#134e4a',
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</script>
|
| 46 |
+
</head>
|
| 47 |
+
<body class="bg-gray-50">
|
| 48 |
+
<!-- Navigation Component -->
|
| 49 |
+
<custom-navbar></custom-navbar>
|
| 50 |
+
|
| 51 |
+
<!-- Hero Section -->
|
| 52 |
+
<section class="relative bg-gradient-to-br from-primary-600 to-secondary-600 text-white overflow-hidden">
|
| 53 |
+
<div class="absolute inset-0 bg-black opacity-20"></div>
|
| 54 |
+
<div class="relative container mx-auto px-6 py-24 lg:py-32">
|
| 55 |
+
<div class="grid lg:grid-cols-2 gap-12 items-center">
|
| 56 |
+
<div>
|
| 57 |
+
<h1 class="text-4xl lg:text-6xl font-bold mb-6 animate-fade-in">
|
| 58 |
+
Welcome to CommunityConnect Hub
|
| 59 |
+
</h1>
|
| 60 |
+
<p class="text-xl lg:text-2xl mb-8 text-primary-100">
|
| 61 |
+
Empowering communities through collaboration, education, and meaningful connections.
|
| 62 |
+
</p>
|
| 63 |
+
<div class="flex flex-col sm:flex-row gap-4">
|
| 64 |
+
<a href="#get-involved" class="bg-white text-primary-600 px-8 py-4 rounded-lg font-semibold hover:bg-gray-100 transition-colors">
|
| 65 |
+
Get Involved
|
| 66 |
+
</a>
|
| 67 |
+
<a href="programs.html" class="border-2 border-white text-white px-8 py-4 rounded-lg font-semibold hover:bg-white hover:text-primary-600 transition-colors">
|
| 68 |
+
Our Programs
|
| 69 |
+
</a>
|
| 70 |
+
</div>
|
| 71 |
+
</div>
|
| 72 |
+
<div class="hidden lg:block">
|
| 73 |
+
<img src="https://static.photos/people/640x360/42" alt="Community" class="rounded-2xl shadow-2xl">
|
| 74 |
+
</div>
|
| 75 |
+
</div>
|
| 76 |
+
</div>
|
| 77 |
+
</section>
|
| 78 |
+
|
| 79 |
+
<!-- Mission Section -->
|
| 80 |
+
<section class="py-20 bg-white">
|
| 81 |
+
<div class="container mx-auto px-6">
|
| 82 |
+
<div class="text-center mb-12">
|
| 83 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Our Mission</h2>
|
| 84 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 85 |
+
</div>
|
| 86 |
+
<div class="grid md:grid-cols-3 gap-8">
|
| 87 |
+
<div class="text-center p-6 rounded-xl hover:shadow-xl transition-shadow">
|
| 88 |
+
<div class="w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 89 |
+
<i data-feather="users" class="w-8 h-8 text-primary-600"></i>
|
| 90 |
+
</div>
|
| 91 |
+
<h3 class="text-xl font-semibold mb-3">Unite Communities</h3>
|
| 92 |
+
<p class="text-gray-600">Bringing people together regardless of background to build lasting relationships and support networks.</p>
|
| 93 |
+
</div>
|
| 94 |
+
<div class="text-center p-6 rounded-xl hover:shadow-xl transition-shadow">
|
| 95 |
+
<div class="w-16 h-16 bg-secondary-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 96 |
+
<i data-feather="book-open" class="w-8 h-8 text-secondary-600"></i>
|
| 97 |
+
</div>
|
| 98 |
+
<h3 class="text-xl font-semibold mb-3">Educate & Empower</h3>
|
| 99 |
+
<p class="text-gray-600">Providing resources and learning opportunities to help community members thrive and grow.</p>
|
| 100 |
+
</div>
|
| 101 |
+
<div class="text-center p-6 rounded-xl hover:shadow-xl transition-shadow">
|
| 102 |
+
<div class="w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 103 |
+
<i data-feather="heart" class="w-8 h-8 text-primary-600"></i>
|
| 104 |
+
</div>
|
| 105 |
+
<h3 class="text-xl font-semibold mb-3">Make Impact</h3>
|
| 106 |
+
<p class="text-gray-600">Creating positive change through targeted programs and collaborative community initiatives.</p>
|
| 107 |
+
</div>
|
| 108 |
+
</div>
|
| 109 |
+
</div>
|
| 110 |
+
</section>
|
| 111 |
+
|
| 112 |
+
<!-- Programs Preview -->
|
| 113 |
+
<section class="py-20 bg-gray-50">
|
| 114 |
+
<div class="container mx-auto px-6">
|
| 115 |
+
<div class="text-center mb-12">
|
| 116 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Our Programs & Services</h2>
|
| 117 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 118 |
+
</div>
|
| 119 |
+
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
| 120 |
+
<div class="bg-white rounded-xl p-6 hover:shadow-lg transition-all hover:-translate-y-1">
|
| 121 |
+
<i data-feather="award" class="w-12 h-12 text-primary-500 mb-4"></i>
|
| 122 |
+
<h3 class="text-lg font-semibold mb-2">Youth Programs</h3>
|
| 123 |
+
<p class="text-gray-600 text-sm mb-4">Mentorship and educational programs for young community members.</p>
|
| 124 |
+
<a href="programs.html" class="text-primary-600 font-medium text-sm hover:underline">Learn More →</a>
|
| 125 |
+
</div>
|
| 126 |
+
<div class="bg-white rounded-xl p-6 hover:shadow-lg transition-all hover:-translate-y-1">
|
| 127 |
+
<i data-feather="briefcase" class="w-12 h-12 text-secondary-500 mb-4"></i>
|
| 128 |
+
<h3 class="text-lg font-semibold mb-2">Career Development</h3>
|
| 129 |
+
<p class="text-gray-600 text-sm mb-4">Job training and career advancement opportunities.</p>
|
| 130 |
+
<a href="programs.html" class="text-primary-600 font-medium text-sm hover:underline">Learn More →</a>
|
| 131 |
+
</div>
|
| 132 |
+
<div class="bg-white rounded-xl p-6 hover:shadow-lg transition-all hover:-translate-y-1">
|
| 133 |
+
<i data-feather="activity" class="w-12 h-12 text-primary-500 mb-4"></i>
|
| 134 |
+
<h3 class="text-lg font-semibold mb-2">Health & Wellness</h3>
|
| 135 |
+
<p class="text-gray-600 text-sm mb-4">Health initiatives and wellness programs for all ages.</p>
|
| 136 |
+
<a href="programs.html" class="text-primary-600 font-medium text-sm hover:underline">Learn More →</a>
|
| 137 |
+
</div>
|
| 138 |
+
<div class="bg-white rounded-xl p-6 hover:shadow-lg transition-all hover:-translate-y-1">
|
| 139 |
+
<i data-feather="calendar" class="w-12 h-12 text-secondary-500 mb-4"></i>
|
| 140 |
+
<h3 class="text-lg font-semibold mb-2">Community Events</h3>
|
| 141 |
+
<p class="text-gray-600 text-sm mb-4">Regular events and gatherings to strengthen bonds.</p>
|
| 142 |
+
<a href="programs.html" class="text-primary-600 font-medium text-sm hover:underline">Learn More →</a>
|
| 143 |
+
</div>
|
| 144 |
+
</div>
|
| 145 |
+
</div>
|
| 146 |
+
</section>
|
| 147 |
+
|
| 148 |
+
<!-- Upcoming Events -->
|
| 149 |
+
<section class="py-20 bg-white">
|
| 150 |
+
<div class="container mx-auto px-6">
|
| 151 |
+
<div class="text-center mb-12">
|
| 152 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Upcoming Events</h2>
|
| 153 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 154 |
+
</div>
|
| 155 |
+
<div id="events-container" class="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
| 156 |
+
<!-- Events will be loaded here -->
|
| 157 |
+
</div>
|
| 158 |
+
<div class="text-center mt-8">
|
| 159 |
+
<a href="events.html" class="inline-flex items-center bg-primary-600 text-white px-6 py-3 rounded-lg hover:bg-primary-700 transition-colors">
|
| 160 |
+
View All Events
|
| 161 |
+
<i data-feather="arrow-right" class="w-5 h-5 ml-2"></i>
|
| 162 |
+
</a>
|
| 163 |
+
</div>
|
| 164 |
+
</div>
|
| 165 |
+
</section>
|
| 166 |
+
|
| 167 |
+
<!-- Member Spotlights -->
|
| 168 |
+
<section class="py-20 bg-gradient-to-br from-primary-50 to-secondary-50">
|
| 169 |
+
<div class="container mx-auto px-6">
|
| 170 |
+
<div class="text-center mb-12">
|
| 171 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Member Spotlights</h2>
|
| 172 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 173 |
+
</div>
|
| 174 |
+
<div id="spotlights-container" class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
| 175 |
+
<!-- Member spotlights will be loaded here -->
|
| 176 |
+
</div>
|
| 177 |
+
<div class="text-center mt-8">
|
| 178 |
+
<a href="members.html" class="inline-flex items-center bg-secondary-600 text-white px-6 py-3 rounded-lg hover:bg-secondary-700 transition-colors">
|
| 179 |
+
Meet All Members
|
| 180 |
+
<i data-feather="arrow-right" class="w-5 h-5 ml-2"></i>
|
| 181 |
+
</a>
|
| 182 |
+
</div>
|
| 183 |
+
</div>
|
| 184 |
+
</section>
|
| 185 |
+
|
| 186 |
+
<!-- CTA Section -->
|
| 187 |
+
<section id="get-involved" class="py-20 bg-primary-600 text-white">
|
| 188 |
+
<div class="container mx-auto px-6 text-center">
|
| 189 |
+
<h2 class="text-3xl lg:text-4xl font-bold mb-4">Ready to Make a Difference?</h2>
|
| 190 |
+
<p class="text-xl mb-8 text-primary-100">Join us in building a stronger, more connected community.</p>
|
| 191 |
+
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
| 192 |
+
<a href="get-involved.html" class="bg-white text-primary-600 px-8 py-4 rounded-lg font-semibold hover:bg-gray-100 transition-colors">
|
| 193 |
+
Get Involved Now
|
| 194 |
+
</a>
|
| 195 |
+
<a href="donate.html" class="border-2 border-white text-white px-8 py-4 rounded-lg font-semibold hover:bg-white hover:text-primary-600 transition-colors">
|
| 196 |
+
Support Our Mission
|
| 197 |
+
</a>
|
| 198 |
+
</div>
|
| 199 |
+
</div>
|
| 200 |
+
</section>
|
| 201 |
+
|
| 202 |
+
<!-- Footer Component -->
|
| 203 |
+
<custom-footer></custom-footer>
|
| 204 |
+
|
| 205 |
+
<!-- Scripts -->
|
| 206 |
+
<script src="components/navbar.js"></script>
|
| 207 |
+
<script src="components/footer.js"></script>
|
| 208 |
+
<script src="script.js"></script>
|
| 209 |
+
<script src="api.js"></script>
|
| 210 |
+
<script>
|
| 211 |
+
// Load events and spotlights
|
| 212 |
+
document.addEventListener('DOMContentLoaded', async () => {
|
| 213 |
+
feather.replace();
|
| 214 |
+
|
| 215 |
+
// Load upcoming events
|
| 216 |
+
const eventsContainer = document.getElementById('events-container');
|
| 217 |
+
eventsContainer.innerHTML = '<div class="col-span-full text-center py-8">Loading events...</div>';
|
| 218 |
+
|
| 219 |
+
try {
|
| 220 |
+
const events = await api.getUpcomingEvents(3);
|
| 221 |
+
eventsContainer.innerHTML = events.map(event => `
|
| 222 |
+
<div class="bg-white rounded-xl p-6 shadow-lg hover:shadow-xl transition-shadow">
|
| 223 |
+
<div class="flex items-center mb-4">
|
| 224 |
+
<div class="bg-primary-100 p-3 rounded-lg mr-4">
|
| 225 |
+
<i data-feather="calendar" class="w-6 h-6 text-primary-600"></i>
|
| 226 |
+
</div>
|
| 227 |
+
<div>
|
| 228 |
+
<p class="text-sm text-gray-500">${new Date(event.date).toLocaleDateString('en-US', { month: 'long', day: 'numeric' })}</p>
|
| 229 |
+
<p class="text-sm text-gray-500">${event.time}</p>
|
| 230 |
+
</div>
|
| 231 |
+
</div>
|
| 232 |
+
<h3 class="text-lg font-semibold mb-2">${event.title}</h3>
|
| 233 |
+
<p class="text-gray-600 text-sm mb-4">${event.description}</p>
|
| 234 |
+
<p class="text-sm text-gray-500 flex items-center">
|
| 235 |
+
<i data-feather="map-pin" class="w-4 h-4 mr-1"></i>
|
| 236 |
+
${event.location}
|
| 237 |
+
</p>
|
| 238 |
+
</div>
|
| 239 |
+
`).join('');
|
| 240 |
+
feather.replace();
|
| 241 |
+
} catch (error) {
|
| 242 |
+
eventsContainer.innerHTML = '<div class="col-span-full text-center text-gray-500">Unable to load events at this time.</div>';
|
| 243 |
+
}
|
| 244 |
+
|
| 245 |
+
// Load member spotlights
|
| 246 |
+
const spotlightsContainer = document.getElementById('spotlights-container');
|
| 247 |
+
spotlightsContainer.innerHTML = '<div class="col-span-full text-center py-8">Loading member spotlights...</div>';
|
| 248 |
+
|
| 249 |
+
try {
|
| 250 |
+
const members = await api.getMemberSpotlights(3);
|
| 251 |
+
spotlightsContainer.innerHTML = members.map(member => `
|
| 252 |
+
<div class="bg-white rounded-xl p-6 text-center hover:shadow-xl transition-shadow">
|
| 253 |
+
<img src="${member.avatar}" alt="${member.name}" class="w-24 h-24 rounded-full mx-auto mb-4 object-cover">
|
| 254 |
+
<h3 class="text-xl font-semibold mb-2">${member.name}</h3>
|
| 255 |
+
<p class="text-secondary-600 text-sm mb-3">${member.role}</p>
|
| 256 |
+
<p class="text-gray-600 text-sm mb-4">"${member.testimonial}"</p>
|
| 257 |
+
<div class="flex justify-center space-x-3">
|
| 258 |
+
${member.socialLinks ? member.socialLinks.map(link => `
|
| 259 |
+
<a href="${link.url}" class="text-gray-400 hover:text-primary-600 transition-colors">
|
| 260 |
+
<i data-feather="${link.icon}" class="w-5 h-5"></i>
|
| 261 |
+
</a>
|
| 262 |
+
`).join('') : ''}
|
| 263 |
+
</div>
|
| 264 |
+
</div>
|
| 265 |
+
`).join('');
|
| 266 |
+
feather.replace();
|
| 267 |
+
} catch (error) {
|
| 268 |
+
spotlightsContainer.innerHTML = '<div class="col-span-full text-center text-gray-500">Unable to load member spotlights at this time.</div>';
|
| 269 |
+
}
|
| 270 |
+
});
|
| 271 |
+
</script>
|
| 272 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 273 |
+
</body>
|
| 274 |
+
</html>
|
members.html
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Member Spotlights - CommunityConnect Hub</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌟</text></svg>">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
primary: {
|
| 18 |
+
50: '#eff6ff',
|
| 19 |
+
100: '#dbeafe',
|
| 20 |
+
200: '#bfdbfe',
|
| 21 |
+
300: '#93c5fd',
|
| 22 |
+
400: '#60a5fa',
|
| 23 |
+
500: '#3b82f6',
|
| 24 |
+
600: '#2563eb',
|
| 25 |
+
700: '#1d4ed8',
|
| 26 |
+
800: '#1e40af',
|
| 27 |
+
900: '#1e3a8a',
|
| 28 |
+
},
|
| 29 |
+
secondary: {
|
| 30 |
+
50: '#f0fdfa',
|
| 31 |
+
100: '#ccfbf1',
|
| 32 |
+
200: '#99f6e4',
|
| 33 |
+
300: '#5eead4',
|
| 34 |
+
400: '#2dd4bf',
|
| 35 |
+
500: '#14b8a6',
|
| 36 |
+
600: '#0d9488',
|
| 37 |
+
700: '#0f766e',
|
| 38 |
+
800: '#115e59',
|
| 39 |
+
900: '#134e4a',
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</script>
|
| 46 |
+
</head>
|
| 47 |
+
<body class="bg-gray-50">
|
| 48 |
+
<!-- Navigation Component -->
|
| 49 |
+
<custom-navbar></custom-navbar>
|
| 50 |
+
|
| 51 |
+
<!-- Hero Section -->
|
| 52 |
+
<section class="bg-gradient-to-r from-primary-600 to-secondary-600 text-white py-20">
|
| 53 |
+
<div class="container mx-auto px-6">
|
| 54 |
+
<h1 class="text-4xl lg:text-5xl font-bold mb-4">Member Spotlights</h1>
|
| 55 |
+
<p class="text-xl text-primary-100">Meet the amazing individuals who make our community special.</p>
|
| 56 |
+
</div>
|
| 57 |
+
</section>
|
| 58 |
+
|
| 59 |
+
<!-- Filter Section -->
|
| 60 |
+
<section class="py-8 bg-white border-b">
|
| 61 |
+
<div class="container mx-auto px-6">
|
| 62 |
+
<div class="flex flex-wrap gap-4 justify-center">
|
| 63 |
+
<button class="filter-btn px-6 py-2 bg-primary-600 text-white rounded-full hover:bg-primary-700 transition-colors" data-filter="all">
|
| 64 |
+
All Members
|
| 65 |
+
</button>
|
| 66 |
+
<button class="filter-btn px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition-colors" data-filter="volunteer">
|
| 67 |
+
Volunteers
|
| 68 |
+
</button>
|
| 69 |
+
<button class="filter-btn px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition-colors" data-filter="staff">
|
| 70 |
+
Staff
|
| 71 |
+
</button>
|
| 72 |
+
<button class="filter-btn px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition-colors" data-filter="leader">
|
| 73 |
+
Community Leaders
|
| 74 |
+
</button>
|
| 75 |
+
</div>
|
| 76 |
+
</div>
|
| 77 |
+
</section>
|
| 78 |
+
|
| 79 |
+
<!-- Members Grid -->
|
| 80 |
+
<section class="py-12">
|
| 81 |
+
<div class="container mx-auto px-6">
|
| 82 |
+
<div id="members-container" class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
| 83 |
+
<!-- Members will be loaded here -->
|
| 84 |
+
</div>
|
| 85 |
+
</div>
|
| 86 |
+
</section>
|
| 87 |
+
|
| 88 |
+
<!-- Success Stories -->
|
| 89 |
+
<section class="py-20 bg-white">
|
| 90 |
+
<div class="container mx-auto px-6">
|
| 91 |
+
<div class="text-center mb-12">
|
| 92 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Success Stories</h2>
|
| 93 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 94 |
+
</div>
|
| 95 |
+
<div id="stories-container" class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
| 96 |
+
<!-- Stories will be loaded here -->
|
| 97 |
+
</div>
|
| 98 |
+
</div>
|
| 99 |
+
</section>
|
| 100 |
+
|
| 101 |
+
<!-- Join Community CTA -->
|
| 102 |
+
<section class="py-20 bg-gradient-to-br from-primary-600 to-secondary-600 text-white">
|
| 103 |
+
<div class="container mx-auto px-6 text-center">
|
| 104 |
+
<h2 class="text-3xl font-bold mb-4">Become a Community Star</h2>
|
| 105 |
+
<p class="text-xl mb-8 text-primary-100">Join our community and make a difference in people's lives.</p>
|
| 106 |
+
<a href="get-involved.html" class="bg-white text-primary-600 px-8 py-4 rounded-lg font-semibold hover:bg-gray-100 transition-colors inline-block">
|
| 107 |
+
Join Our Community
|
| 108 |
+
</a>
|
| 109 |
+
</div>
|
| 110 |
+
</section>
|
| 111 |
+
|
| 112 |
+
<!-- Footer Component -->
|
| 113 |
+
<custom-footer></custom-footer>
|
| 114 |
+
|
| 115 |
+
<!-- Scripts -->
|
| 116 |
+
<script src="components/navbar.js"></script>
|
| 117 |
+
<script src="components/footer.js"></script>
|
| 118 |
+
<script src="script.js"></script>
|
| 119 |
+
<script src="api.js"></script>
|
| 120 |
+
<script>
|
| 121 |
+
document.addEventListener('DOMContentLoaded', async () => {
|
| 122 |
+
feather.replace();
|
| 123 |
+
|
| 124 |
+
let allMembers = [];
|
| 125 |
+
let currentFilter = 'all';
|
| 126 |
+
|
| 127 |
+
try {
|
| 128 |
+
allMembers = await api.getMemberSpotlights(12);
|
| 129 |
+
renderMembers(allMembers);
|
| 130 |
+
} catch (error) {
|
| 131 |
+
document.getElementById('members-container').innerHTML = '<div class="col-span-full text-center text-gray-500">Unable to load members at this time.</div>';
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
// Load success stories
|
| 135 |
+
try {
|
| 136 |
+
const stories = await api.getSuccessStories();
|
| 137 |
+
document.getElementById('stories-container').innerHTML = stories.map(story => `
|
| 138 |
+
<div class="bg-gray-50 rounded-xl p-6 hover:shadow-lg transition-shadow">
|
| 139 |
+
<div class="flex items-center mb-4">
|
| 140 |
+
<img src="${story.avatar}" alt="${story.name}" class="w-12 h-12 rounded-full mr-4">
|
| 141 |
+
<div>
|
| 142 |
+
<h4 class="font-semibold">${story.name}</h4>
|
| 143 |
+
<p class="text-sm text-gray-600">${story.role}</p>
|
| 144 |
+
</div>
|
| 145 |
+
</div>
|
| 146 |
+
<p class="text-gray-700 mb-4">"${story.story}"</p>
|
| 147 |
+
<div class="flex items-center text-secondary-600">
|
| 148 |
+
<i data-feather="award" class="w-5 h-5 mr-2"></i>
|
| 149 |
+
<span class="text-sm font-medium">${story.achievement}</span>
|
| 150 |
+
</div>
|
| 151 |
+
</div>
|
| 152 |
+
`).join('');
|
| 153 |
+
feather.replace();
|
| 154 |
+
} catch (error) {
|
| 155 |
+
document.getElementById('stories-container').innerHTML = '<div class="col-span-full text-center text-gray-500">Unable to load stories at this time.</div>';
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
// Filter functionality
|
| 159 |
+
document.querySelectorAll('.filter-btn').forEach(btn => {
|
| 160 |
+
btn.addEventListener('click', (e) => {
|
| 161 |
+
// Update button styles
|
| 162 |
+
document.querySelectorAll('.filter-btn').forEach(b => {
|
| 163 |
+
b.className = 'filter-btn px-6 py-2 bg-gray-200 text-gray-700 rounded-full hover:bg-gray-300 transition-colors';
|
| 164 |
+
});
|
| 165 |
+
e.target.className = 'filter-btn px-6 py-2 bg-primary-600 text-white rounded-full hover:bg-primary-700 transition-colors';
|
| 166 |
+
|
| 167 |
+
// Filter members
|
| 168 |
+
currentFilter = e.target.dataset.filter;
|
| 169 |
+
const filtered = currentFilter === 'all'
|
| 170 |
+
? allMembers
|
| 171 |
+
: allMembers.filter(m => m.category === currentFilter);
|
| 172 |
+
renderMembers(filtered);
|
| 173 |
+
});
|
| 174 |
+
});
|
| 175 |
+
|
| 176 |
+
function renderMembers(members) {
|
| 177 |
+
const container = document.getElementById('members-container');
|
| 178 |
+
|
| 179 |
+
if (members.length === 0) {
|
| 180 |
+
container.innerHTML = '<div class="col-span-full text-center text-gray-500">No members found for this category.</div>';
|
| 181 |
+
return;
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
container.innerHTML = members.map(member => `
|
| 185 |
+
<div class="bg-white rounded-xl p-6 shadow-lg hover:shadow-xl transition-all hover:-translate-y-1 text-center">
|
| 186 |
+
<div class="relative inline-block mb-4">
|
| 187 |
+
<img src="${member.avatar}" alt="${member.name}" class="w-32 h-32 rounded-full mx-auto object-cover border-4 border-white shadow-lg">
|
| 188 |
+
<span class="absolute bottom-0 right-0 bg-${getBadgeColor(member.category)}-500 text-white px-2 py-1 rounded-full text-xs">
|
| 189 |
+
${member.category}
|
| 190 |
+
</span>
|
| 191 |
+
</div>
|
| 192 |
+
<h3 class="text-xl font-semibold mb-2">${member.name}</h3>
|
| 193 |
+
<p class="text-secondary-600 text-sm mb-3">${member.role}</p>
|
| 194 |
+
<p class="text-gray-600 text-sm mb-4 italic">"${member.testimonial}"</p>
|
| 195 |
+
<div class="flex justify-center items-center mb-4">
|
| 196 |
+
${member.rating ? `
|
| 197 |
+
<div class="flex text-yellow-400">
|
| 198 |
+
${Array(5).fill().map((_, i) => `
|
| 199 |
+
<i data-feather="${i < member.rating ? 'star' : 'star'}" class="w-4 h-4 ${i >= member.rating ? 'text-gray-300' : ''}"></i>
|
| 200 |
+
`).join('')}
|
| 201 |
+
</div>
|
| 202 |
+
` : ''}
|
| 203 |
+
</div>
|
| 204 |
+
<div class="flex justify-center space-x-3">
|
| 205 |
+
${member.socialLinks ? member.socialLinks.map(link => `
|
| 206 |
+
<a href="${link.url}" class="text-gray-400 hover:text-primary-600 transition-colors">
|
| 207 |
+
<i data-feather="${link.icon}" class="w-5 h-5"></i>
|
| 208 |
+
</a>
|
| 209 |
+
`).join('') : ''}
|
| 210 |
+
</div>
|
| 211 |
+
</div>
|
| 212 |
+
`).join('');
|
| 213 |
+
|
| 214 |
+
feather.replace();
|
| 215 |
+
}
|
| 216 |
+
|
| 217 |
+
function getBadgeColor(category) {
|
| 218 |
+
const colors = {
|
| 219 |
+
volunteer: 'green',
|
| 220 |
+
staff: 'blue',
|
| 221 |
+
leader: 'purple'
|
| 222 |
+
};
|
| 223 |
+
return colors[category] || 'gray';
|
| 224 |
+
}
|
| 225 |
+
});
|
| 226 |
+
</script>
|
| 227 |
+
</body>
|
| 228 |
+
</html>
|
programs.html
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Programs & Services - CommunityConnect Hub</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌟</text></svg>">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
primary: {
|
| 18 |
+
50: '#eff6ff',
|
| 19 |
+
100: '#dbeafe',
|
| 20 |
+
200: '#bfdbfe',
|
| 21 |
+
300: '#93c5fd',
|
| 22 |
+
400: '#60a5fa',
|
| 23 |
+
500: '#3b82f6',
|
| 24 |
+
600: '#2563eb',
|
| 25 |
+
700: '#1d4ed8',
|
| 26 |
+
800: '#1e40af',
|
| 27 |
+
900: '#1e3a8a',
|
| 28 |
+
},
|
| 29 |
+
secondary: {
|
| 30 |
+
50: '#f0fdfa',
|
| 31 |
+
100: '#ccfbf1',
|
| 32 |
+
200: '#99f6e4',
|
| 33 |
+
300: '#5eead4',
|
| 34 |
+
400: '#2dd4bf',
|
| 35 |
+
500: '#14b8a6',
|
| 36 |
+
600: '#0d9488',
|
| 37 |
+
700: '#0f766e',
|
| 38 |
+
800: '#115e59',
|
| 39 |
+
900: '#134e4a',
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</script>
|
| 46 |
+
</head>
|
| 47 |
+
<body class="bg-gray-50">
|
| 48 |
+
<!-- Navigation Component -->
|
| 49 |
+
<custom-navbar></custom-navbar>
|
| 50 |
+
|
| 51 |
+
<!-- Hero Section -->
|
| 52 |
+
<section class="bg-gradient-to-r from-primary-600 to-secondary-600 text-white py-20">
|
| 53 |
+
<div class="container mx-auto px-6">
|
| 54 |
+
<h1 class="text-4xl lg:text-5xl font-bold mb-4">Our Programs & Services</h1>
|
| 55 |
+
<p class="text-xl text-primary-100">Discover the wide range of programs designed to support and empower our community.</p>
|
| 56 |
+
</div>
|
| 57 |
+
</section>
|
| 58 |
+
|
| 59 |
+
<!-- Programs Grid -->
|
| 60 |
+
<section class="py-20">
|
| 61 |
+
<div class="container mx-auto px-6">
|
| 62 |
+
<div id="programs-container" class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
| 63 |
+
<!-- Programs will be loaded here -->
|
| 64 |
+
</div>
|
| 65 |
+
</div>
|
| 66 |
+
</section>
|
| 67 |
+
|
| 68 |
+
<!-- Services Section -->
|
| 69 |
+
<section class="py-20 bg-white">
|
| 70 |
+
<div class="container mx-auto px-6">
|
| 71 |
+
<div class="text-center mb-12">
|
| 72 |
+
<h2 class="text-3xl lg:text-4xl font-bold text-gray-800 mb-4">Additional Services</h2>
|
| 73 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 74 |
+
</div>
|
| 75 |
+
<div id="services-container" class="grid md:grid-cols-2 gap-8">
|
| 76 |
+
<!-- Services will be loaded here -->
|
| 77 |
+
</div>
|
| 78 |
+
</div>
|
| 79 |
+
</section>
|
| 80 |
+
|
| 81 |
+
<!-- CTA Section -->
|
| 82 |
+
<section class="py-20 bg-primary-600 text-white">
|
| 83 |
+
<div class="container mx-auto px-6 text-center">
|
| 84 |
+
<h2 class="text-3xl font-bold mb-4">Ready to Join a Program?</h2>
|
| 85 |
+
<p class="text-xl mb-8 text-primary-100">Take the first step towards personal and community growth.</p>
|
| 86 |
+
<a href="get-involved.html" class="bg-white text-primary-600 px-8 py-4 rounded-lg font-semibold hover:bg-gray-100 transition-colors inline-block">
|
| 87 |
+
Get Started Today
|
| 88 |
+
</a>
|
| 89 |
+
</div>
|
| 90 |
+
</section>
|
| 91 |
+
|
| 92 |
+
<!-- Footer Component -->
|
| 93 |
+
<custom-footer></custom-footer>
|
| 94 |
+
|
| 95 |
+
<!-- Scripts -->
|
| 96 |
+
<script src="components/navbar.js"></script>
|
| 97 |
+
<script src="components/footer.js"></script>
|
| 98 |
+
<script src="script.js"></script>
|
| 99 |
+
<script src="api.js"></script>
|
| 100 |
+
<script>
|
| 101 |
+
document.addEventListener('DOMContentLoaded', async () => {
|
| 102 |
+
feather.replace();
|
| 103 |
+
|
| 104 |
+
// Load programs
|
| 105 |
+
const programsContainer = document.getElementById('programs-container');
|
| 106 |
+
programsContainer.innerHTML = '<div class="col-span-full text-center py-8">Loading programs...</div>';
|
| 107 |
+
|
| 108 |
+
try {
|
| 109 |
+
const programs = await api.getPrograms();
|
| 110 |
+
programsContainer.innerHTML = programs.map(program => `
|
| 111 |
+
<div class="bg-white rounded-xl p-6 shadow-lg hover:shadow-xl transition-all hover:-translate-y-1">
|
| 112 |
+
<div class="bg-${program.color}-100 w-16 h-16 rounded-lg flex items-center justify-center mb-4">
|
| 113 |
+
<i data-feather="${program.icon}" class="w-8 h-8 text-${program.color}-600"></i>
|
| 114 |
+
</div>
|
| 115 |
+
<h3 class="text-xl font-semibold mb-3">${program.title}</h3>
|
| 116 |
+
<p class="text-gray-600 mb-4">${program.description}</p>
|
| 117 |
+
<ul class="space-y-2 mb-4">
|
| 118 |
+
${program.features.map(feature => `
|
| 119 |
+
<li class="flex items-start">
|
| 120 |
+
<i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0"></i>
|
| 121 |
+
<span class="text-sm text-gray-600">${feature}</span>
|
| 122 |
+
</li>
|
| 123 |
+
`).join('')}
|
| 124 |
+
</ul>
|
| 125 |
+
<button class="w-full bg-${program.color}-600 text-white py-2 rounded-lg hover:bg-${program.color}-700 transition-colors">
|
| 126 |
+
Learn More
|
| 127 |
+
</button>
|
| 128 |
+
</div>
|
| 129 |
+
`).join('');
|
| 130 |
+
feather.replace();
|
| 131 |
+
} catch (error) {
|
| 132 |
+
programsContainer.innerHTML = '<div class="col-span-full text-center text-gray-500">Unable to load programs at this time.</div>';
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
// Load services
|
| 136 |
+
const servicesContainer = document.getElementById('services-container');
|
| 137 |
+
servicesContainer.innerHTML = '<div class="text-center py-8">Loading services...</div>';
|
| 138 |
+
|
| 139 |
+
try {
|
| 140 |
+
const services = await api.getServices();
|
| 141 |
+
servicesContainer.innerHTML = services.map(service => `
|
| 142 |
+
<div class="flex items-start space-x-4 p-6 bg-gray-50 rounded-xl hover:bg-gray-100 transition-colors">
|
| 143 |
+
<div class="bg-secondary-100 p-3 rounded-lg flex-shrink-0">
|
| 144 |
+
<i data-feather="${service.icon}" class="w-8 h-8 text-secondary-600"></i>
|
| 145 |
+
</div>
|
| 146 |
+
<div class="flex-1">
|
| 147 |
+
<h3 class="text-xl font-semibold mb-2">${service.title}</h3>
|
| 148 |
+
<p class="text-gray-600 mb-3">${service.description}</p>
|
| 149 |
+
<div class="flex flex-wrap gap-2">
|
| 150 |
+
${service.tags.map(tag => `
|
| 151 |
+
<span class="bg-secondary-100 text-secondary-700 px-3 py-1 rounded-full text-sm">${tag}</span>
|
| 152 |
+
`).join('')}
|
| 153 |
+
</div>
|
| 154 |
+
</div>
|
| 155 |
+
</div>
|
| 156 |
+
`).join('');
|
| 157 |
+
feather.replace();
|
| 158 |
+
} catch (error) {
|
| 159 |
+
servicesContainer.innerHTML = '<div class="text-center text-gray-500">Unable to load services at this time.</div>';
|
| 160 |
+
}
|
| 161 |
+
});
|
| 162 |
+
</script>
|
| 163 |
+
</body>
|
| 164 |
+
</html>
|
resources.html
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Resources Library - CommunityConnect Hub</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌟</text></svg>">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
primary: {
|
| 18 |
+
50: '#eff6ff',
|
| 19 |
+
100: '#dbeafe',
|
| 20 |
+
200: '#bfdbfe',
|
| 21 |
+
300: '#93c5fd',
|
| 22 |
+
400: '#60a5fa',
|
| 23 |
+
500: '#3b82f6',
|
| 24 |
+
600: '#2563eb',
|
| 25 |
+
700: '#1d4ed8',
|
| 26 |
+
800: '#1e40af',
|
| 27 |
+
900: '#1e3a8a',
|
| 28 |
+
},
|
| 29 |
+
secondary: {
|
| 30 |
+
50: '#f0fdfa',
|
| 31 |
+
100: '#ccfbf1',
|
| 32 |
+
200: '#99f6e4',
|
| 33 |
+
300: '#5eead4',
|
| 34 |
+
400: '#2dd4bf',
|
| 35 |
+
500: '#14b8a6',
|
| 36 |
+
600: '#0d9488',
|
| 37 |
+
700: '#0f766e',
|
| 38 |
+
800: '#115e59',
|
| 39 |
+
900: '#134e4a',
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</script>
|
| 46 |
+
</head>
|
| 47 |
+
<body class="bg-gray-50">
|
| 48 |
+
<!-- Navigation Component -->
|
| 49 |
+
<custom-navbar></custom-navbar>
|
| 50 |
+
|
| 51 |
+
<!-- Hero Section -->
|
| 52 |
+
<section class="bg-gradient-to-r from-primary-600 to-secondary-600 text-white py-20">
|
| 53 |
+
<div class="container mx-auto px-6">
|
| 54 |
+
<h1 class="text-4xl lg:text-5xl font-bold mb-4">Resources Library</h1>
|
| 55 |
+
<p class="text-xl text-primary-100">Access valuable resources, guides, and tools to support your journey.</p>
|
| 56 |
+
</div>
|
| 57 |
+
</section>
|
| 58 |
+
|
| 59 |
+
<!-- Search Bar -->
|
| 60 |
+
<section class="py-8 bg-white border-b">
|
| 61 |
+
<div class="container mx-auto px-6">
|
| 62 |
+
<div class="max-w-2xl mx-auto">
|
| 63 |
+
<div class="relative">
|
| 64 |
+
<input
|
| 65 |
+
type="text"
|
| 66 |
+
id="search-input"
|
| 67 |
+
placeholder="Search resources..."
|
| 68 |
+
class="w-full px-6 py-4 pr-12 border rounded-full focus:outline-none focus:ring-2 focus:ring-primary-500 text-lg"
|
| 69 |
+
>
|
| 70 |
+
<button class="absolute right-2 top-1/2 transform -translate-y-1/2 bg-primary-600 text-white p-3 rounded-full hover:bg-primary-700 transition-colors">
|
| 71 |
+
<i data-feather="search" class="w-5 h-5"></i>
|
| 72 |
+
</button>
|
| 73 |
+
</div>
|
| 74 |
+
<div class="flex flex-wrap gap-2 mt-4 justify-center">
|
| 75 |
+
<span class="text-sm text-gray-600">Popular searches:</span>
|
| 76 |
+
<button class="search-tag text-sm bg-gray-100 px-3 py-1 rounded-full hover:bg-gray-200 transition-colors">Job Training</button>
|
| 77 |
+
<button class="search-tag text-sm bg-gray-100 px-3 py-1 rounded-full hover:bg-gray-200 transition-colors">Health Guide</button>
|
| 78 |
+
<button class="search-tag text-sm bg-gray-100 px-3 py-1 rounded-full hover:bg-gray-200 transition-colors">Education</button>
|
| 79 |
+
<button class="search-tag text-sm bg-gray-100 px-3 py-1 rounded-full hover:bg-gray-200 transition-colors">Legal Help</button>
|
| 80 |
+
</div>
|
| 81 |
+
</div>
|
| 82 |
+
</div>
|
| 83 |
+
</section>
|
| 84 |
+
|
| 85 |
+
<!-- Categories -->
|
| 86 |
+
<section class="py-8">
|
| 87 |
+
<div class="container mx-auto px-6">
|
| 88 |
+
<div class="flex flex-wrap justify-center gap-4">
|
| 89 |
+
<button class="category-btn px-6 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors" data-category="all">
|
| 90 |
+
All Resources
|
| 91 |
+
</button>
|
| 92 |
+
<button class="category-btn px-6 py-2 bg-white border rounded-lg hover:bg-gray-50 transition-colors" data-category="guides">
|
| 93 |
+
Guides
|
| 94 |
+
</button>
|
| 95 |
+
<button class="category-btn px-6 py-2 bg-white border rounded-lg hover:bg-gray-50 transition-colors" data-category="templates">
|
| 96 |
+
Templates
|
| 97 |
+
</button>
|
| 98 |
+
<button class="category-btn px-6 py-2 bg-white border rounded-lg hover:bg-gray-50 transition-colors" data-category="videos">
|
| 99 |
+
Videos
|
| 100 |
+
</button>
|
| 101 |
+
<button class="category-btn px-6 py-2 bg-white border rounded-lg hover:bg-gray-50 transition-colors" data-category="documents">
|
| 102 |
+
Documents
|
| 103 |
+
</button>
|
| 104 |
+
</div>
|
| 105 |
+
</div>
|
| 106 |
+
</section>
|
| 107 |
+
|
| 108 |
+
<!-- Featured Resources -->
|
| 109 |
+
<section class="py-12 bg-white">
|
| 110 |
+
<div class="container mx-auto px-6">
|
| 111 |
+
<div class="text-center mb-8">
|
| 112 |
+
<h2 class="text-3xl font-bold text-gray-800 mb-4">Featured Resources</h2>
|
| 113 |
+
<div class="w-24 h-1 bg-secondary-500 mx-auto"></div>
|
| 114 |
+
</div>
|
| 115 |
+
<div id="featured-container" class="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
| 116 |
+
<!-- Featured resources will be loaded here -->
|
| 117 |
+
</div>
|
| 118 |
+
</div>
|
| 119 |
+
</section>
|
| 120 |
+
|
| 121 |
+
<!-- All Resources -->
|
| 122 |
+
<section class="py-12">
|
| 123 |
+
<div class="container mx-auto px-6">
|
| 124 |
+
<div class="flex justify-between items-center mb-8">
|
| 125 |
+
<h2 class="text-2xl font-bold text-gray-800">All Resources</h2>
|
| 126 |
+
<select id="sort-select" class="px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500">
|
| 127 |
+
<option value="recent">Most Recent</option>
|
| 128 |
+
<option value="popular">Most Popular</option>
|
| 129 |
+
<option value="name">Name (A-Z)</option>
|
| 130 |
+
</select>
|
| 131 |
+
</div>
|
| 132 |
+
<div id="resources-container" class="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
| 133 |
+
<!-- Resources will be loaded here -->
|
| 134 |
+
</div>
|
| 135 |
+
</div>
|
| 136 |
+
</section>
|
| 137 |
+
|
| 138 |
+
<!-- Newsletter Signup -->
|
| 139 |
+
<section class="py-20 bg-primary-600 text-white">
|
| 140 |
+
<div class="container mx-auto px-6">
|
| 141 |
+
<div class="max-w-2xl mx-auto text-center">
|
| 142 |
+
<h2 class="text-3xl font-bold mb-4">Stay Updated</h2>
|
| 143 |
+
<p class="text-xl mb-8 text-primary-100">Get the latest resources and community updates delivered to your inbox.</p>
|
| 144 |
+
<form class="flex flex-col sm:flex-row gap-4 max-w-md mx-auto">
|
| 145 |
+
<input type="email" placeholder="Enter your email" class="flex-1 px-4 py-3 rounded-lg text-gray-800 focus:outline-none focus:ring-2 focus:ring-white">
|
| 146 |
+
<button type="submit" class="bg-white text-primary-600 px-6 py-3 rounded-lg font-semibold hover:bg-gray-100 transition-colors">
|
| 147 |
+
Subscribe
|
| 148 |
+
</button>
|
| 149 |
+
</form>
|
| 150 |
+
</div>
|
| 151 |
+
</div>
|
| 152 |
+
</section>
|
| 153 |
+
|
| 154 |
+
<!-- Footer Component -->
|
| 155 |
+
<custom-footer></custom-footer>
|
| 156 |
+
|
| 157 |
+
<!-- Scripts -->
|
| 158 |
+
<script src="components/navbar.js"></script>
|
| 159 |
+
<script src="components/footer.js"></script>
|
| 160 |
+
<script src="script.js"></script>
|
| 161 |
+
<script src="api.js"></script>
|
| 162 |
+
<script>
|
| 163 |
+
document.addEventListener('DOMContentLoaded', async () => {
|
| 164 |
+
feather.replace();
|
| 165 |
+
|
| 166 |
+
let allResources = [];
|
| 167 |
+
let filteredResources = [];
|
| 168 |
+
let currentCategory = 'all';
|
| 169 |
+
|
| 170 |
+
try {
|
| 171 |
+
allResources = await api.getResources();
|
| 172 |
+
filteredResources = allResources;
|
| 173 |
+
renderFeaturedResources(allResources.filter(r => r.featured));
|
| 174 |
+
renderResources(filteredResources);
|
| 175 |
+
} catch (error) {
|
| 176 |
+
document.getElementById('resources-container').innerHTML = '<div class="col-span-full text-center text-gray-500">Unable to load resources at this time.</div>';
|
| 177 |
+
}
|
| 178 |
+
|
| 179 |
+
// Search functionality
|
| 180 |
+
document.getElementById('search-input').addEventListener('input', (e) => {
|
| 181 |
+
const searchTerm = e.target.value.toLowerCase();
|
| 182 |
+
filteredResources = allResources.filter(resource => {
|
| 183 |
+
const matchesSearch = resource.title.toLowerCase().includes(searchTerm) ||
|
| 184 |
+
resource.description.toLowerCase().includes(searchTerm) ||
|
| 185 |
+
resource.tags.some(tag => tag.toLowerCase().includes(searchTerm));
|
| 186 |
+
const matchesCategory = currentCategory === 'all' || resource.type === currentCategory;
|
| 187 |
+
return matchesSearch && matchesCategory;
|
| 188 |
+
});
|
| 189 |
+
renderResources(filteredResources);
|
| 190 |
+
});
|
| 191 |
+
|
| 192 |
+
// Category filter
|
| 193 |
+
document.querySelectorAll('.category-btn').forEach(btn => {
|
| 194 |
+
btn.addEventListener('click', (e) => {
|
| 195 |
+
// Update button styles
|
| 196 |
+
document.querySelectorAll('.category-btn').forEach(b => {
|
| 197 |
+
b.className = 'category-btn px-6 py-2 bg-white border rounded-lg hover:bg-gray-50 transition-colors';
|
| 198 |
+
});
|
| 199 |
+
e.target.className = 'category-btn px-6 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors';
|
| 200 |
+
|
| 201 |
+
currentCategory = e.target.dataset.category;
|
| 202 |
+
filterResources();
|
| 203 |
+
});
|
| 204 |
+
});
|
| 205 |
+
|
| 206 |
+
// Sort functionality
|
| 207 |
+
document.getElementById('sort-select').addEventListener('change', (e) => {
|
| 208 |
+
const sortBy = e.target.value;
|
| 209 |
+
let sorted = [...filteredResources];
|
| 210 |
+
|
| 211 |
+
switch(sortBy) {
|
| 212 |
+
case 'recent':
|
| 213 |
+
sorted.sort((a, b) => new Date(b.date) - new Date(a.date));
|
| 214 |
+
break;
|
| 215 |
+
case 'popular':
|
| 216 |
+
sorted.sort((a, b) => b.downloads - a.downloads);
|
| 217 |
+
break;
|
| 218 |
+
case 'name':
|
| 219 |
+
sorted.sort((a, b) => a.title.localeCompare(b.title));
|
| 220 |
+
break;
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
renderResources(sorted);
|
| 224 |
+
});
|
| 225 |
+
|
| 226 |
+
// Search tags
|
| 227 |
+
document.querySelectorAll('.search-tag').forEach(tag => {
|
| 228 |
+
tag.addEventListener('click', () => {
|
| 229 |
+
document.getElementById('search-input').value = tag.textContent;
|
| 230 |
+
document.getElementById('search-input').dispatchEvent(new Event('input'));
|
| 231 |
+
});
|
| 232 |
+
});
|
| 233 |
+
|
| 234 |
+
function filterResources() {
|
| 235 |
+
filteredResources = currentCategory === 'all'
|
| 236 |
+
? allResources
|
| 237 |
+
: allResources.filter(r => r.type === currentCategory);
|
| 238 |
+
renderResources(filteredResources);
|
| 239 |
+
}
|
| 240 |
+
|
| 241 |
+
function renderFeaturedResources(resources) {
|
| 242 |
+
const container = document.getElementById('featured-container');
|
| 243 |
+
container.innerHTML = resources.map(resource => `
|
| 244 |
+
<div class="bg-gradient-to-br from-primary-50 to-secondary-50 rounded-xl p-6 hover:shadow-lg transition-shadow">
|
| 245 |
+
<div class="bg-white w-12 h-12 rounded-lg flex items-center justify-center mb-4">
|
| 246 |
+
<i data-feather="${getResourceIcon(resource.type)}" class="w-6 h-6 text-primary-600"></i>
|
| 247 |
+
</div>
|
| 248 |
+
<h3 class="text-lg font-semibold mb-2">${resource.title}</h3>
|
| 249 |
+
<p class="text-gray-600 mb-4">${resource.description}</p>
|
| 250 |
+
<button class="bg-primary-600 text-white px-4 py-2 rounded-lg hover:bg-primary-700 transition-colors">
|
| 251 |
+
Download
|
| 252 |
+
</button>
|
| 253 |
+
</div>
|
| 254 |
+
`).join('');
|
| 255 |
+
feather.replace();
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
function renderResources(resources) {
|
| 259 |
+
const container = document.getElementById('resources-container');
|
| 260 |
+
|
| 261 |
+
if (resources.length === 0) {
|
| 262 |
+
container.innerHTML = '<div class="col-span-full text-center text-gray-500">No resources found.</div>';
|
| 263 |
+
return;
|
| 264 |
+
}
|
| 265 |
+
|
| 266 |
+
container.innerHTML = resources.map(resource => `
|
| 267 |
+
<div class="bg-white rounded-xl p-6 shadow hover:shadow-lg transition-shadow">
|
| 268 |
+
<div class="flex items-start justify-between mb-4">
|
| 269 |
+
<div class="bg-${getTypeColor(resource.type)}-100 p-2 rounded-lg">
|
| 270 |
+
<i data-feather="${getResourceIcon(resource.type)}" class="w-6 h-6 text-${getTypeColor(resource.type)}-600"></i>
|
| 271 |
+
</div>
|
| 272 |
+
<span class="text-xs text-gray-500">${resource.downloads || 0} downloads</span>
|
| 273 |
+
</div>
|
| 274 |
+
<h3 class="font-semibold mb-2 line-clamp-2">${resource.title}</h3>
|
| 275 |
+
<p class="text-sm text-gray-600 mb-4 line-clamp-3">${resource.description}</p>
|
| 276 |
+
<div class="flex flex-wrap gap-1 mb-4">
|
| 277 |
+
${resource.tags.slice(0, 3).map(tag => `
|
| 278 |
+
<span class="text-xs bg-gray-100 text-gray-600 px-2 py-1 rounded">${tag}</span>
|
| 279 |
+
`).join('')}
|
| 280 |
+
</div>
|
| 281 |
+
<button onclick="downloadResource('${resource.id}')" class="w-full bg-${getTypeColor(resource.type)}-600 text-white py-2 rounded-lg hover:bg-${getTypeColor(resource.type)}-700 transition-colors text-sm">
|
| 282 |
+
Download
|
| 283 |
+
</button>
|
| 284 |
+
</div>
|
| 285 |
+
`).join('');
|
| 286 |
+
|
| 287 |
+
feather.replace();
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
+
function getResourceIcon(type) {
|
| 291 |
+
const icons = {
|
| 292 |
+
guides: 'book-open',
|
| 293 |
+
templates: 'file-text',
|
| 294 |
+
videos: 'play-circle',
|
| 295 |
+
documents: 'folder'
|
| 296 |
+
};
|
| 297 |
+
return icons[type] || 'file';
|
| 298 |
+
}
|
| 299 |
+
|
| 300 |
+
function getTypeColor(type) {
|
| 301 |
+
const colors = {
|
| 302 |
+
guides: 'primary',
|
| 303 |
+
templates: 'secondary',
|
| 304 |
+
videos: 'purple',
|
| 305 |
+
documents: 'green'
|
| 306 |
+
};
|
| 307 |
+
return colors[type] || 'gray';
|
| 308 |
+
}
|
| 309 |
+
|
| 310 |
+
window.downloadResource = async (resourceId) => {
|
| 311 |
+
try {
|
| 312 |
+
// Simulate download
|
| 313 |
+
const resource = allResources.find(r => r.id === resourceId);
|
| 314 |
+
if (resource) {
|
| 315 |
+
// Increment download count
|
| 316 |
+
resource.downloads = (resource.downloads || 0) + 1;
|
| 317 |
+
renderResources(filteredResources);
|
| 318 |
+
|
| 319 |
+
// In a real app, this would trigger a file download
|
| 320 |
+
alert(`Downloading: ${resource.title}`);
|
| 321 |
+
}
|
| 322 |
+
} catch (error) {
|
| 323 |
+
alert('Error downloading resource');
|
| 324 |
+
}
|
| 325 |
+
};
|
| 326 |
+
});
|
| 327 |
+
</script>
|
| 328 |
+
</body>
|
| 329 |
+
</html>
|
script.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Global JavaScript functions and utilities
|
| 2 |
+
|
| 3 |
+
// Initialize Feather icons after page load
|
| 4 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 5 |
+
feather.replace();
|
| 6 |
+
});
|
| 7 |
+
|
| 8 |
+
// Mobile menu toggle
|
| 9 |
+
function toggleMobileMenu() {
|
| 10 |
+
const menu = document.querySelector('.mobile-menu');
|
| 11 |
+
if (menu) {
|
| 12 |
+
menu.classList.toggle('hidden');
|
| 13 |
+
}
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
// Smooth scroll for anchor links
|
| 17 |
+
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
| 18 |
+
anchor.addEventListener('click', function (e) {
|
| 19 |
+
e.preventDefault();
|
| 20 |
+
const target = document.querySelector(this.getAttribute('href'));
|
| 21 |
+
if (target) {
|
| 22 |
+
target.scrollIntoView({
|
| 23 |
+
behavior: 'smooth',
|
| 24 |
+
block: 'start'
|
| 25 |
+
});
|
| 26 |
+
}
|
| 27 |
+
});
|
| 28 |
+
});
|
| 29 |
+
|
| 30 |
+
// Add animation on scroll
|
| 31 |
+
const observerOptions = {
|
| 32 |
+
threshold: 0.1,
|
| 33 |
+
rootMargin: '0px 0px -50px 0px'
|
| 34 |
+
};
|
| 35 |
+
|
| 36 |
+
const observer = new IntersectionObserver((entries) => {
|
| 37 |
+
entries.forEach(entry => {
|
| 38 |
+
if (entry.isIntersecting) {
|
| 39 |
+
entry.target.classList.add('animate-fade-in');
|
| 40 |
+
}
|
| 41 |
+
});
|
| 42 |
+
}, observerOptions);
|
| 43 |
+
|
| 44 |
+
// Observe all sections
|
| 45 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 46 |
+
document.querySelectorAll('section').forEach(section => {
|
| 47 |
+
observer.observe(section);
|
| 48 |
+
});
|
| 49 |
+
});
|
| 50 |
+
|
| 51 |
+
// Form validation helper
|
| 52 |
+
function validateForm(formElement) {
|
| 53 |
+
let isValid = true;
|
| 54 |
+
const inputs = formElement.querySelectorAll('input[required], textarea[required], select[required]');
|
| 55 |
+
|
| 56 |
+
inputs.forEach(input => {
|
| 57 |
+
if (!input.value.trim()) {
|
| 58 |
+
isValid = false;
|
| 59 |
+
input.classList.add('border-red-500');
|
| 60 |
+
} else {
|
| 61 |
+
input.classList.remove('border-red-500');
|
| 62 |
+
}
|
| 63 |
+
});
|
| 64 |
+
|
| 65 |
+
return isValid;
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
// Show notification
|
| 69 |
+
function showNotification(message, type = 'success') {
|
| 70 |
+
const notification = document.createElement('div');
|
| 71 |
+
notification.className = `fixed top-4 right-4 px-6 py-4 rounded-lg shadow-lg z-50 ${
|
| 72 |
+
type === 'success' ? 'bg-green-500 text-white' : 'bg-red-500 text-white'
|
| 73 |
+
}`;
|
| 74 |
+
notification.innerHTML = `
|
| 75 |
+
<div class="flex items-center">
|
| 76 |
+
<i data-feather="${type === 'success' ? 'check-circle' : 'alert-circle'}" class="w-5 h-5 mr-2"></i>
|
| 77 |
+
<span>${message}</span>
|
| 78 |
+
</div>
|
| 79 |
+
`;
|
| 80 |
+
|
| 81 |
+
document.body.appendChild(notification);
|
| 82 |
+
feather.replace();
|
| 83 |
+
|
| 84 |
+
setTimeout(() => {
|
| 85 |
+
notification.remove();
|
| 86 |
+
}, 5000);
|
| 87 |
+
}
|
style.css
CHANGED
|
@@ -1,28 +1,72 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
margin-top: 0;
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
}
|
| 17 |
|
| 18 |
-
.
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
border-radius: 16px;
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
|
|
|
| 28 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* Custom animations and utilities */
|
| 2 |
+
@keyframes fade-in {
|
| 3 |
+
from { opacity: 0; transform: translateY(20px); }
|
| 4 |
+
to { opacity: 1; transform: translateY(0); }
|
| 5 |
}
|
| 6 |
|
| 7 |
+
.animate-fade-in {
|
| 8 |
+
animation: fade-in 0.8s ease-out;
|
|
|
|
| 9 |
}
|
| 10 |
|
| 11 |
+
.line-clamp-2 {
|
| 12 |
+
display: -webkit-box;
|
| 13 |
+
-webkit-line-clamp: 2;
|
| 14 |
+
-webkit-box-orient: vertical;
|
| 15 |
+
overflow: hidden;
|
| 16 |
}
|
| 17 |
|
| 18 |
+
.line-clamp-3 {
|
| 19 |
+
display: -webkit-box;
|
| 20 |
+
-webkit-line-clamp: 3;
|
| 21 |
+
-webkit-box-orient: vertical;
|
| 22 |
+
overflow: hidden;
|
|
|
|
| 23 |
}
|
| 24 |
|
| 25 |
+
/* Smooth scrolling */
|
| 26 |
+
html {
|
| 27 |
+
scroll-behavior: smooth;
|
| 28 |
}
|
| 29 |
+
|
| 30 |
+
/* Custom scrollbar */
|
| 31 |
+
::-webkit-scrollbar {
|
| 32 |
+
width: 8px;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
::-webkit-scrollbar-track {
|
| 36 |
+
background: #f1f1f1;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
::-webkit-scrollbar-thumb {
|
| 40 |
+
background: #3b82f6;
|
| 41 |
+
border-radius: 4px;
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
::-webkit-scrollbar-thumb:hover {
|
| 45 |
+
background: #2563eb;
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
/* Focus styles for accessibility */
|
| 49 |
+
button:focus,
|
| 50 |
+
a:focus,
|
| 51 |
+
input:focus,
|
| 52 |
+
select:focus,
|
| 53 |
+
textarea:focus {
|
| 54 |
+
outline: 2px solid #3b82f6;
|
| 55 |
+
outline-offset: 2px;
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
/* Loading animation */
|
| 59 |
+
.loading {
|
| 60 |
+
display: inline-block;
|
| 61 |
+
width: 20px;
|
| 62 |
+
height: 20px;
|
| 63 |
+
border: 3px solid #f3f3f3;
|
| 64 |
+
border-top: 3px solid #3b82f6;
|
| 65 |
+
border-radius: 50%;
|
| 66 |
+
animation: spin 1s linear infinite;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
@keyframes spin {
|
| 70 |
+
0% { transform: rotate(0deg); }
|
| 71 |
+
100% { transform: rotate(360deg); }
|
| 72 |
+
}
|