dodey917 commited on
Commit
9d36be7
·
verified ·
1 Parent(s): 5260834

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
Files changed (13) hide show
  1. README.md +7 -4
  2. api.js +365 -0
  3. components/footer.js +222 -0
  4. components/navbar.js +172 -0
  5. donate.html +350 -0
  6. events.html +316 -0
  7. get-involved.html +313 -0
  8. index.html +274 -19
  9. members.html +228 -0
  10. programs.html +164 -0
  11. resources.html +329 -0
  12. script.js +87 -0
  13. style.css +63 -19
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Communityconnect Hub
3
- emoji: 👁
4
  colorFrom: blue
5
- colorTo: red
 
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
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
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
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
+ }