Skip to content

Conversation

@govargas
Copy link

@govargas govargas commented Nov 3, 2025

🎓 Web dev spring 2025 Final Project Submission

This is my final project for the Technigo Fullstack JavaScript Bootcamp. BADA is a web application that helps people in Sweden find safe beaches with real-time water quality data.

🎯 What I Built

A full-stack application featuring:

  • Frontend: React + TypeScript, MapLibre maps, i18next multi-language support
  • Backend: Express API with MongoDB, JWT authentication, caching layer
  • Features: Interactive beach map, geolocation, favorites with drag-drop sorting, dark mode
  • Lighthouse Scores: 100% Accessibility, SEO, and Best Practices

🚀 Key Achievements

  • Integrated official Swedish Agency for Marine and Water Management (Havs- och vatten­myndigheten) API with intelligent caching
  • Built custom React hooks for geolocation, dark mode, and outside-click detection
  • Implemented server-side caching to reduce API load and improve performance
  • Achieved full accessibility compliance (WCAG standards)
  • Created seamless UX with search autocomplete, toast notifications, and smooth animations
  • Deployed frontend (Netlify) and backend (Vercel) with CI/CD

💡 Technical Highlights

  • Type Safety: Full TypeScript implementation across frontend and backend
  • State Management: Zustand for global state, TanStack Query for server state
  • Performance: Optimized API calls with intelligent caching and query invalidation
  • Accessibility: Keyboard navigation, ARIA labels, screen reader support
  • UX Polish: Dark mode, i18n (Swedish/English), error boundaries, loading states

🎨 Design Decisions

  • Mobile-first responsive design with Tailwind CSS
  • Clean, minimal, easy to read and navigate UI
  • Consistent design tokens for colors, spacing, and typography
  • Dark mode that respects system preferences

📚 What I Learned

Building BADA taught me how to architect a real-world full-stack application, integrate external APIs, implement authentication, and focus on user experience and accessibility. I'm proud of the result and I'm looking forward to read your feedback!


Live Demo: https://badaweb.netlify.app/
Test Account: smoke@test.com / Test1234

See README.md for full documentation and setup instructions.

- Add navigation logic to search input handler
- Automatically route users to home page when typing search query
- Ensures beach list results are visible when filtering

Fixes issue where search bar was functional but results were not
displayed when searching from beach detail or other pages.
- Show dropdown with up to 10 filtered beaches while typing
- Click any result to navigate directly to beach detail page
- Add "View all results on map" link for full search view
- Implement outside-click detection to close dropdown
- Add translations for "viewAllResults" (EN/SV)

Allows users to search and navigate to beaches from any page
without leaving their current context, improving UX.
- Add translation keys for all classification states (inProgress, notClassified)
- Create getClassificationKey() utility to map API classification data to i18n keys
- Update BeachDetailPage and FavoritesPage to translate classification badges
- Remove NUTS code field from beach detail page for cleaner UI

Fixes issue where classification badges like "Klassificering pågår" displayed in Swedish even when using English language setting. All classification badges now properly translate based on user's selected language.
…luster click handler, update focus zoom limits
Copy link
Contributor

@HIPPIEKICK HIPPIEKICK left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great job finalising your final project, Talo!

Love that you implemented i18n and the outside-click-detection! Found a tiny styling bug though, I suppose you'd want the dropdown to be on top of the search field here:
Image

It would also be lovely if the hamburger menu closed when the user selects a page.

The only thing you need to "fix" however to be approved is the a11y:
Image

@HIPPIEKICK
Copy link
Contributor

Another thing I forgot to mention is that your dist folder doesn't need to be pushed to GitHub.

- Add z-index to dropdown menus to prevent overlap with search field
- Close hamburger menu automatically when navigation links are clicked
- Fix color contrast for unknown quality badge to meet WCAG AA standards (#374151)
- Standardize menu dropdown styling (width and icon size) for consistency
- Add dist to .gitignore to prevent build artifacts from being tracked
- Remove previously tracked dist files from both frontend and backend
- Build artifacts will be generated during deployment
…U motive translations

- Update header component to improve layout and styling for language display
- Refactor language switcher buttons for better accessibility and visual consistency
- Introduce new translation keys for algal status and EU motive in both English and Swedish
- Update BeachDetailPage to utilize new translations for algal status and EU motive display
- Add tooltips for water quality classifications in BeachDetailPage to provide users with more context.
- Introduce new translation keys for classification tooltips in both English and Swedish.
- Update CSS for dark mode quality colors to improve contrast.
- Minor formatting adjustments for better code readability.
@govargas
Copy link
Author

Hi Matilda and thanks for your comments! I think I now have adressed the issues you pointed out, let me know if there is something else I'm missing!

Copy link
Contributor

@HIPPIEKICK HIPPIEKICK left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks super! Approving ⭐

- Introduce ambient backgrounds for light and dark modes in the App component to improve visual appeal.
- Update CSS for glassmorphism effects in the header and card components, enhancing the overall aesthetic.
- Modify button styles in BeachesList and Header components for better user interaction and consistency.
- Adjust color variables for dark mode to improve contrast and readability.
- Add new CSS animations for sand and ocean wave effects to create a dynamic user experience.
… effects

- Change sand color to a lighter shade for a more natural appearance.
- Adjust water simulation parameters for slower movement and subtler ripples.
- Reduce intensity of caustics and sparkle effects for a more refined look.
- Minor formatting adjustments for better readability in shader code.
- Simplify water simulation by removing the "droppy" ripple effect and adjusting caustic intensity for a softer appearance.
- Update sand generation to include shadows and refraction effects, enhancing realism.
- Improve overall shader composition for better integration of sand and water visuals.
- Replace "Inter" and "Spectral" fonts with "Special Gothic Expanded One" for the header.
- Add new font variable for "Special Gothic Expanded One" in CSS.
- Introduce a new class for the title font in the CSS to enhance text styling.
…onent

- Added "Zalando Sans" font to the stylesheet for better typography.
- Adjusted spacing in BeachesList component for improved readability.
- Cleaned up formatting for consistency in JSX elements.
- Updated README to reflect new versions of React and Express, added Three.js and enhanced Tailwind CSS details.
- Improved accessibility across components with ARIA attributes and live announcements for loading states and filtered results.
- Implemented dynamic loading for 3D backgrounds to optimize performance and user experience.
- Added API documentation with Swagger UI in the backend for better developer usability.
…ponent

- Changed accent color in CSS from #0a5a82 to #002fa7 for better visual appeal.
- Improved code formatting in MapView component for enhanced readability, including consistent line breaks and indentation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants