diff --git a/cline_docs/activeContext.md b/cline_docs/activeContext.md index f07da89..664c64e 100644 --- a/cline_docs/activeContext.md +++ b/cline_docs/activeContext.md @@ -10,6 +10,15 @@ - Planning authentication implementation for production deployment ## Recent Changes +- **FIXED**: Theme selector functionality has been completely resolved + - Identified and fixed conflicting theme systems (custom context vs next-themes) + - Updated ThemeSelector.tsx to use next-themes useTheme hook with resolvedTheme + - Modified layout.tsx to use proper next-themes configuration (attribute="class", defaultTheme="system") + - Removed conflicting custom context files (ThemeContext.tsx, ClientProviders.tsx) + - Theme switching now works properly with light/dark/system modes + - Used best practices from Perplexity MCP research for Next.js 13+ App Router theme implementation + - Current minor issue: Responsive design on smaller screens hides Donate button and theme selector (to be addressed later) + - Improved dark theme appearance and accessibility: - Enhanced contrast for navigation menu items in dark mode by using white text - Fixed site title "Olathe Club of the Deaf" contrast in dark mode by changing to white @@ -84,15 +93,14 @@ - Applied the same blue color used in the "Upcoming Events" button for consistency ## Next Steps -1. Complete backend API integrations: - - Connect admin UI components to backend endpoints (✓ Events management implemented, ✓ Members management implemented, ✓ Videos management implemented, ✓ Documents management implemented) - - Add real data loading with loading states (✓ Implemented for Events, ✓ Implemented for Members, ✓ Implemented for Videos, ✓ Implemented for Documents) - - Implement error handling for API requests (✓ Implemented for Events, ✓ Implemented for Members, ✓ Implemented for Videos, ✓ Implemented for Documents) - - Set up client-side data validation (✓ Implemented for Events, ✓ Implemented for Members, ✓ Implemented for Videos, ✓ Implemented for Documents) +1. Fix responsive navigation design: + - Investigate why mobile menu button isn't showing on smaller screens + - Ensure Donate button and theme selector are accessible on all screen sizes + - Test navigation functionality across different viewport sizes 2. Implement remaining admin features: - - Add form handlers for CRUD operations (✓ Implemented for Events, ✓ Implemented for Members, ✓ Implemented for Videos, ✓ Implemented for Documents) - - Create media upload components (✓ Implemented for Videos, ✓ Implemented for Documents) - Add user notification system (Next priority) + - Enhance admin dashboard with real-time statistics + - Add advanced filtering and search capabilities 3. Deploy staging environment: - Set up Docker containers for testing - Configure environment variables @@ -149,6 +157,11 @@ - Enhanced Apply Filters button with more prominent blue styling to improve visibility ## Special Considerations +- **RESOLVED**: Theme selector functionality has been completely fixed + - Successfully implemented next-themes for proper theme management + - Removed conflicting custom context that was causing state management issues + - Theme switching now works seamlessly with proper SSR/hydration handling + - Minor responsive design issue on smaller screens to be addressed in next phase - CRITICAL: Re-enable authentication middleware before production deployment - Members routes (POST, PUT, DELETE, bulk-action) - Events routes (POST, PUT, DELETE, registration) diff --git a/cline_docs/progress.md b/cline_docs/progress.md index f2495ff..8cd305c 100644 --- a/cline_docs/progress.md +++ b/cline_docs/progress.md @@ -97,6 +97,7 @@ - [x] Build media upload functionality - [x] Simplify document management with improved PDF preview - [x] Fix API route for proper document handling +- [x] Fix theme selector functionality with proper next-themes implementation - [ ] Implement user notification system - [ ] Create advanced filtering for data tables - [ ] Develop data export functionality @@ -113,6 +114,8 @@ - [x] Improve paragraph text contrast in About and Membership sections - [x] Fix "Join Our Community" section text contrast by changing background color - [x] Standardize button styling by changing "View All Events" and "View All Board Members" to primary style +- [x] Fix theme selector functionality with proper next-themes integration +- [ ] Fix responsive navigation design for smaller screen sizes - [ ] Conduct comprehensive accessibility audit - [ ] Implement screen reader optimizations - [ ] Refine keyboard navigation @@ -172,9 +175,9 @@ - [ ] Add comprehensive JSDoc comments ## Project Stats -- **Completed Tasks:** 68 +- **Completed Tasks:** 70 - **In Progress Tasks:** 0 - **Upcoming Tasks:** 21 -- **Completion Rate:** ~77% +- **Completion Rate:** ~78% - **Current Phase:** Phase 4 - API Integration & Backend Functionality -- **Next Major Milestone:** Implement user notification system +- **Next Major Milestone:** Implement user notification system and fix responsive navigation diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e328554..c249eec 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "framer-motion": "^12.6.0", "next": "^15.3.3", + "next-themes": "^0.4.6", "react": "19.0.0", "react-dom": "19.0.0" }, @@ -4821,6 +4822,16 @@ } } }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", diff --git a/frontend/package.json b/frontend/package.json index 040e530..e4fd974 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,6 +12,7 @@ "dependencies": { "framer-motion": "^12.6.0", "next": "^15.3.3", + "next-themes": "^0.4.6", "react": "19.0.0", "react-dom": "19.0.0" }, diff --git a/frontend/src/app/about/page.tsx b/frontend/src/app/about/page.tsx index d26d9ca..4b9ef27 100644 --- a/frontend/src/app/about/page.tsx +++ b/frontend/src/app/about/page.tsx @@ -14,7 +14,7 @@ export default function AboutPage() {
-

About Olathe Club of the Deaf

+

About Olathe Club of the Deaf

Connecting and empowering the deaf community in Olathe since 1975.

@@ -88,8 +88,8 @@ export default function AboutPage() { {Array.from({ length: 4 }).map((_, index) => (
-

Board Member

-

Position

+

Board Member

+

Position

))}
@@ -141,7 +141,7 @@ export default function AboutPage() {
Become a Member diff --git a/frontend/src/app/contact/page.tsx b/frontend/src/app/contact/page.tsx index 3f6a8f4..bd6eabf 100644 --- a/frontend/src/app/contact/page.tsx +++ b/frontend/src/app/contact/page.tsx @@ -14,7 +14,7 @@ export default function ContactPage() {
-

Contact Us

+

Contact Us

We'd love to hear from you! Get in touch with any questions, ideas, or feedback.

@@ -39,17 +39,17 @@ export default function ContactPage() {
-

Meeting Location

+

Meeting Location

123 Main Street
Olathe, KS 66061 @@ -57,7 +57,7 @@ export default function ContactPage() {
-

Connect With Us

+

Connect With Us

We meet at 123 Main Street, Olathe, KS 66061

-

+

-

Support Our Mission

+

Support Our Mission

Your donations help us continue to serve and support the deaf community in Olathe.

@@ -197,25 +197,25 @@ export default function DonatePage() {

Donation FAQs

-

Is my donation tax-deductible?

+

Is my donation tax-deductible?

Yes, the Olathe Club of the Deaf is a 501(c)(3) nonprofit organization. All donations are tax-deductible to the extent allowed by law.

-

Can I specify how my donation is used?

+

Can I specify how my donation is used?

Yes, you can designate your donation for a specific program or project. Please include a note with your donation or contact us to discuss your preferences.

-

Do you accept donations by check or mail?

+

Do you accept donations by check or mail?

Yes, checks can be made payable to "Olathe Club of the Deaf" and mailed to our office address. Please contact us for the current mailing address.

-

Can I donate in memory or honor of someone?

+

Can I donate in memory or honor of someone?

Absolutely. Memorial and honorary donations are a meaningful way to celebrate someone special. We can send a notification of your gift to the person or family you designate.

diff --git a/frontend/src/app/events/page.tsx b/frontend/src/app/events/page.tsx index f4b0ebf..fd1b06e 100644 --- a/frontend/src/app/events/page.tsx +++ b/frontend/src/app/events/page.tsx @@ -21,10 +21,10 @@ const EventCard = ({ return (
-

{title}

-

{date}

+

{title}

+

{date}

{description}

- + Learn more
@@ -85,7 +85,7 @@ export default function EventsPage() {
-

Events & Calendar

+

Events & Calendar

Connect with the deaf community through our regular events and activities.

@@ -126,25 +126,25 @@ export default function EventsPage() {

Event Categories

-

Social Events

+

Social Events

Regular gatherings and celebrations for members to connect and socialize.

-

Educational Workshops

+

Educational Workshops

Learning opportunities and skill development sessions for all ages.

-

Board Meetings

+

Board Meetings

Open meetings for members to participate in club governance and planning.

-

Special Events

+

Special Events

Annual celebrations, holiday parties, and community gatherings.

@@ -162,7 +162,7 @@ export default function EventsPage() {

Contact Us diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index 39224af..6a5d823 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -1,6 +1,7 @@ @import "tailwindcss"; :root { + /* Brand Colors - consistent across themes */ --color-primary: #1a56db; --color-primary-light: #3b82f6; --color-primary-dark: #1e40af; @@ -13,12 +14,36 @@ --color-accent-light: #ffca28; --color-accent-dark: #ff8f00; - --color-text: #171717; - --color-text-light: #6b7280; + /* Light Theme Variables - Enhanced Modern Design */ + --color-text: #1e293b; + --color-text-light: #64748b; + --color-text-muted: #94a3b8; + --color-bg: #ffffff; + --color-bg-secondary: #f8fafc; + --color-bg-tertiary: #f1f5f9; + --color-bg-soft: #fefefe; + --color-bg-warm: #fefdf9; + --color-border: #e2e8f0; + --color-border-light: #f1f5f9; + /* Light theme gradients */ + --gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + --gradient-secondary: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); + --gradient-soft: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%); + --gradient-cool: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%); + --gradient-hero: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + + /* Enhanced shadows */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + + /* Typography */ --font-sans: "Inter", system-ui, sans-serif; --font-display: "Inter", system-ui, sans-serif; + /* Layout */ --border-radius-sm: 0.25rem; --border-radius: 0.5rem; --border-radius-lg: 0.75rem; @@ -27,12 +52,39 @@ --shadow-focus: 0 0 0 3px rgba(59, 130, 246, 0.5); } -@media (prefers-color-scheme: dark) { - :root { - --color-text: #f3f4f6; - --color-text-light: #e5e7eb; - --color-primary-light: #60a5fa; - } +/* Dark Theme Variables (fully preserved) */ +.dark { + /* Dark theme text colors */ + --color-text: #f3f4f6; + --color-text-light: #e5e7eb; + --color-text-muted: #9ca3af; + + /* Dark theme backgrounds */ + --color-bg: #0f172a; + --color-bg-secondary: #1e293b; + --color-bg-tertiary: #334155; + --color-bg-soft: #1e293b; + --color-bg-warm: #1e293b; + + /* Dark theme borders */ + --color-border: #475569; + --color-border-light: #374151; + + /* Dark theme primary colors */ + --color-primary-light: #60a5fa; + + /* Dark theme gradients */ + --gradient-primary: linear-gradient(135deg, #1e293b 0%, #334155 100%); + --gradient-secondary: linear-gradient(135deg, #374151 0%, #475569 100%); + --gradient-soft: linear-gradient(135deg, #1e293b 0%, #334155 100%); + --gradient-cool: linear-gradient(135deg, #1e293b 0%, #374151 100%); + --gradient-hero: linear-gradient(135deg, #1e293b 0%, #334155 100%); + + /* Dark theme shadows */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -1px rgba(0, 0, 0, 0.3); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -2px rgba(0, 0, 0, 0.3); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 10px 10px -5px rgba(0, 0, 0, 0.3); } /* Custom styles for focus and skip navigation */ @@ -87,10 +139,20 @@ .btn-primary { background-color: var(--color-primary); color: white; + padding: 0.75rem 1.5rem; + border-radius: var(--border-radius-lg); + font-weight: 600; + box-shadow: 0 4px 14px 0 rgba(26, 86, 219, 0.25); + transition: all 0.3s ease; + border: none; + cursor: pointer; + text-decoration: none; } .btn-primary:hover { background-color: var(--color-primary-dark); + box-shadow: 0 6px 20px 0 rgba(26, 86, 219, 0.4); + transform: translateY(-2px); } .btn-secondary { @@ -113,30 +175,44 @@ } .card { - background-color: white; - border-radius: var(--border-radius); - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + background-color: var(--color-bg-soft); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-md); overflow: hidden; + border: 1px solid var(--color-border-light); + transition: all 0.3s ease; } -@media (prefers-color-scheme: dark) { - .card { - background-color: #1f2937; - } - - .btn-secondary { - background-color: rgba(255, 255, 255, 0.1); - border-color: var(--color-primary-light); - color: var(--color-primary-light); - } - - .btn-secondary:hover { - background-color: rgba(255, 255, 255, 0.2); - } - - h2, h3 { - color: var(--color-text); - } +.card:hover { + box-shadow: var(--shadow-lg); + transform: translateY(-2px); +} + +.dark .card { + background-color: var(--color-bg-secondary); + border: 1px solid var(--color-border); + box-shadow: var(--shadow-md); +} + +.dark .card:hover { + background-color: var(--color-bg-tertiary); + box-shadow: var(--shadow-lg); + transform: translateY(-2px); +} + +.dark .btn-secondary { + background-color: rgba(255, 255, 255, 0.1); + border-color: var(--color-primary-light); + color: var(--color-primary-light); +} + +.dark .btn-secondary:hover { + background-color: rgba(255, 255, 255, 0.2); +} + +.dark h2, +.dark h3 { + color: var(--color-text); } /* Add top padding to account for fixed navigation */ @@ -144,6 +220,50 @@ main { padding-top: 4rem; } +/* Form styling */ +.form-label { + display: block; + font-size: 0.875rem; + font-weight: 500; + color: #374151; + margin-bottom: 0.5rem; +} + +.dark .form-label { + color: #f3f4f6; +} + +.form-input { + display: block; + width: 100%; + padding: 0.5rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + color: #111827; + background-color: #ffffff; + border: 1px solid #d1d5db; + border-radius: 0.375rem; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +.form-input:focus { + outline: none; + border-color: var(--color-primary); + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); +} + +.dark .form-input { + color: #f9fafb; + background-color: #374151; + border-color: #6b7280; +} + +.dark .form-input:focus { + border-color: var(--color-primary-light); + box-shadow: 0 0 0 3px rgba(96, 165, 250, 0.2); +} + /* Custom file input styling */ .file-input { display: block; @@ -168,8 +288,6 @@ main { background-color: var(--color-primary-dark); } -@media (prefers-color-scheme: dark) { - .file-input { - color: #d1d5db; - } +.dark .file-input { + color: #d1d5db; } diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 1e7c5fc..d85cffb 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -4,6 +4,7 @@ import { Inter } from 'next/font/google'; import './globals.css'; import Navigation from '../components/organisms/Navigation'; import Footer from '../components/organisms/Footer'; +import { ThemeProvider } from 'next-themes'; // Load Inter font const inter = Inter({ @@ -48,22 +49,30 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( - + - {/* Skip to content link for accessibility */} - - Skip to content - - -
- -
- -
- {children} -
- -