From 2c7a1c3807a3f5a571a1b26361e427643526355f Mon Sep 17 00:00:00 2001 From: Johnbin89 Date: Wed, 25 Mar 2026 20:33:10 +0200 Subject: [PATCH 1/2] Remove: HeroSection Trips/Centers | Add: BreadCumb / Icon to Title / Side border on Cards Lists --- frontend/src/components/DiveSiteCard.jsx | 4 +- .../DivingCentersDesktopSearchBar.jsx | 2 +- .../DivingCentersResponsiveFilterBar.jsx | 118 +++++++++--------- frontend/src/components/PageHeader.jsx | 14 ++- .../src/components/ResponsiveFilterBar.jsx | 2 +- frontend/src/pages/DiveRoutes.jsx | 9 +- frontend/src/pages/DiveSites.jsx | 1 + frontend/src/pages/DiveTrips.jsx | 58 ++++----- frontend/src/pages/Dives.jsx | 7 +- frontend/src/pages/DivingCenters.jsx | 62 ++++----- 10 files changed, 132 insertions(+), 145 deletions(-) diff --git a/frontend/src/components/DiveSiteCard.jsx b/frontend/src/components/DiveSiteCard.jsx index c00fbe45..8f49d8e3 100644 --- a/frontend/src/components/DiveSiteCard.jsx +++ b/frontend/src/components/DiveSiteCard.jsx @@ -17,7 +17,7 @@ export const DiveSiteListCard = ({ }) => { return (
{site.thumbnail && ( @@ -245,7 +245,7 @@ export const DiveSiteGridCard = ({ handleFilterChange, }) => { return ( -
+
{site.thumbnail && (
- {/* Quick Filters */} - {showQuickFilters && ( -
- {reviewsEnabled && ( + {/* Quick Filters */} + {showQuickFilters && ( +
+ {reviewsEnabled && ( + + )} - )} +
+ )} + + {/* Advanced Filters Toggle */} + {showAdvancedToggle && ( -
- )} - - {/* Advanced Filters Toggle */} - {showAdvancedToggle && ( - - )} -
+ )} +
{/* Active Filters Display */} {activeFilters.length > 0 && (
-
- Active Filters: -
-
- {activeFilters.map(filter => ( -
- {filter.label}: - {filter.value} - -
- ))} -
+ {filter.label}: + {filter.value} + +
+ ))} +
)} diff --git a/frontend/src/components/PageHeader.jsx b/frontend/src/components/PageHeader.jsx index 845e4c7d..b880dfff 100644 --- a/frontend/src/components/PageHeader.jsx +++ b/frontend/src/components/PageHeader.jsx @@ -9,16 +9,23 @@ import Breadcrumbs from './Breadcrumbs'; * A functional header for internal utility pages (Dives, Dive Sites, etc.) * that replaces marketing-heavy heroes. */ -const PageHeader = ({ title, breadcrumbItems = [], actions = [], className = '' }) => { +const PageHeader = ({ title, titleIcon: TitleIcon, breadcrumbItems = [], actions = [], className = '' }) => { return (
{/* Navigation Context */} - {breadcrumbItems.length > 0 && } + {breadcrumbItems.length > 0 && ( +
+ +
+ )}
{/* Title Group */}
-

{title}

+

+ {TitleIcon &&

{/* Action Toolbar */} @@ -71,6 +78,7 @@ const PageHeader = ({ title, breadcrumbItems = [], actions = [], className = '' PageHeader.propTypes = { title: PropTypes.string.isRequired, + titleIcon: PropTypes.elementType, breadcrumbItems: PropTypes.array, actions: PropTypes.arrayOf( PropTypes.shape({ diff --git a/frontend/src/components/ResponsiveFilterBar.jsx b/frontend/src/components/ResponsiveFilterBar.jsx index 044c852f..58ba6a4a 100644 --- a/frontend/src/components/ResponsiveFilterBar.jsx +++ b/frontend/src/components/ResponsiveFilterBar.jsx @@ -427,7 +427,7 @@ const ResponsiveFilterBar = ({ className={`flex items-center gap-2 px-4 py-2 rounded-lg transition-colors ${ showFilters ? 'bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 shadow-sm' - : 'bg-gray-100 text-gray-700 hover:bg-gray-200 active:bg-gray-300' + : 'bg-blue-100 text-blue-700 hover:bg-blue-200 active:bg-blue-300' }`} > diff --git a/frontend/src/pages/DiveRoutes.jsx b/frontend/src/pages/DiveRoutes.jsx index 2c2b44bf..e1a77729 100644 --- a/frontend/src/pages/DiveRoutes.jsx +++ b/frontend/src/pages/DiveRoutes.jsx @@ -17,7 +17,6 @@ import { useState, useEffect, useCallback } from 'react'; import { useQuery } from 'react-query'; import { Link, useNavigate, useSearchParams } from 'react-router-dom'; -import Breadcrumbs from '../components/Breadcrumbs'; import DesktopSearchBar from '../components/DesktopSearchBar'; import EmptyState from '../components/EmptyState'; import ErrorPage from '../components/ErrorPage'; @@ -146,11 +145,7 @@ const DiveRoutes = () => { return (
- {/* Breadcrumbs */} - - - {/* Page Header */} - + {/* Responsive Filter Bar */}
@@ -344,7 +339,7 @@ const DiveRoutes = () => { return (
{/* Header: Title & Type */}
diff --git a/frontend/src/pages/DiveSites.jsx b/frontend/src/pages/DiveSites.jsx index 112994da..19c77b7c 100644 --- a/frontend/src/pages/DiveSites.jsx +++ b/frontend/src/pages/DiveSites.jsx @@ -655,6 +655,7 @@ const DiveSites = () => {
{
{/* Mobile-First Responsive Container */}
- {/* Hero Section */} - -
- - {user && ( - - )} -
-
+ titleIcon={Calendar} + breadcrumbItems={[{ label: 'Dive Trips' }]} + actions={[ + { + label: 'Explore Map', + icon: Compass, + onClick: () => navigate('/map?type=dive-trips'), + variant: 'primary', + }, + ...(user + ? [ + { + label: 'Create Trip', + icon: Plus, + onClick: () => navigate('/dive-trips/create'), + variant: 'secondary', + }, + ] + : []), + ]} + /> {/* Desktop Search Bar - Only visible on desktop/tablet and for authenticated users */} {!isMobile && user && ( @@ -986,7 +978,7 @@ const DiveTrips = () => { return (
{ return (
{
{ {dives?.map(dive => (
@@ -1308,7 +1309,7 @@ const Dives = () => { {dives?.map(dive => (
diff --git a/frontend/src/pages/DivingCenters.jsx b/frontend/src/pages/DivingCenters.jsx index 482e60ef..a80c0dc1 100644 --- a/frontend/src/pages/DivingCenters.jsx +++ b/frontend/src/pages/DivingCenters.jsx @@ -22,10 +22,10 @@ import api from '../api'; import DivingCentersDesktopSearchBar from '../components/DivingCentersDesktopSearchBar'; import DivingCentersResponsiveFilterBar from '../components/DivingCentersResponsiveFilterBar'; import ErrorPage from '../components/ErrorPage'; -import HeroSection from '../components/HeroSection'; import LoadingSkeleton from '../components/LoadingSkeleton'; import MaskedEmail from '../components/MaskedEmail'; import MatchTypeBadge from '../components/MatchTypeBadge'; +import PageHeader from '../components/PageHeader'; import RateLimitError from '../components/RateLimitError'; import Pagination from '../components/ui/Pagination'; import { useAuth } from '../contexts/AuthContext'; @@ -504,41 +504,31 @@ const DivingCenters = () => {
{/* Mobile-First Responsive Container */}
- {/* Hero Section */} - -
- - -
-
+ }, + variant: 'secondary', + }, + ]} + /> {/* Desktop Search Bar - Only visible on desktop/tablet */} {!isMobile && ( @@ -626,7 +616,7 @@ const DivingCenters = () => { ) : ( divingCenters && divingCenters.length > 0 && ( -
+
{/* Pagination Controls */} @@ -713,7 +703,7 @@ const DivingCenters = () => { )} {/* Content Container */} -
+
{error ? ( window.location.reload()} /> ) : isLoading ? ( @@ -726,12 +716,12 @@ const DivingCenters = () => { <> {/* Diving Centers List */} {viewMode === 'list' && ( -
+
{divingCenters?.map(center => (
{/* Main content row */} @@ -893,7 +883,7 @@ const DivingCenters = () => { {divingCenters?.map(center => (
From 3eda45a963bfc6814160944ad3f5fd842ee378be Mon Sep 17 00:00:00 2001 From: Johnbin89 Date: Wed, 25 Mar 2026 20:42:50 +0200 Subject: [PATCH 2/2] fix: lint errors --- .../DivingCentersResponsiveFilterBar.jsx | 112 +++++++++--------- frontend/src/components/PageHeader.jsx | 9 +- frontend/src/pages/DiveRoutes.jsx | 6 +- 3 files changed, 68 insertions(+), 59 deletions(-) diff --git a/frontend/src/components/DivingCentersResponsiveFilterBar.jsx b/frontend/src/components/DivingCentersResponsiveFilterBar.jsx index cd3aff74..2fedc9ce 100644 --- a/frontend/src/components/DivingCentersResponsiveFilterBar.jsx +++ b/frontend/src/components/DivingCentersResponsiveFilterBar.jsx @@ -166,77 +166,77 @@ const DivingCentersResponsiveFilterBar = ({ className={`bg-white border-b border-gray-200 shadow-sm sticky top-0 z-40 ${className}`} >
- {/* Quick Filters */} - {showQuickFilters && ( -
- {reviewsEnabled && ( - - )} + {/* Quick Filters */} + {showQuickFilters && ( +
+ {reviewsEnabled && ( -
- )} - - {/* Advanced Filters Toggle */} - {showAdvancedToggle && ( + )} - )} -
+
+ )} + + {/* Advanced Filters Toggle */} + {showAdvancedToggle && ( + + )} +
{/* Active Filters Display */} {activeFilters.length > 0 && (
-
- Active Filters: -
-
- {activeFilters.map(filter => ( -
+ Active Filters: +
+
+ {activeFilters.map(filter => ( +
+ {filter.label}: + {filter.value} + -
- ))} -
+ + +
+ ))} +
)} diff --git a/frontend/src/components/PageHeader.jsx b/frontend/src/components/PageHeader.jsx index b880dfff..fad1c7d6 100644 --- a/frontend/src/components/PageHeader.jsx +++ b/frontend/src/components/PageHeader.jsx @@ -1,5 +1,4 @@ import PropTypes from 'prop-types'; -import React from 'react'; import Breadcrumbs from './Breadcrumbs'; @@ -9,7 +8,13 @@ import Breadcrumbs from './Breadcrumbs'; * A functional header for internal utility pages (Dives, Dive Sites, etc.) * that replaces marketing-heavy heroes. */ -const PageHeader = ({ title, titleIcon: TitleIcon, breadcrumbItems = [], actions = [], className = '' }) => { +const PageHeader = ({ + title, + titleIcon: TitleIcon, + breadcrumbItems = [], + actions = [], + className = '', +}) => { return (
{/* Navigation Context */} diff --git a/frontend/src/pages/DiveRoutes.jsx b/frontend/src/pages/DiveRoutes.jsx index e1a77729..2a4c2bde 100644 --- a/frontend/src/pages/DiveRoutes.jsx +++ b/frontend/src/pages/DiveRoutes.jsx @@ -145,7 +145,11 @@ const DiveRoutes = () => { return (
- + {/* Responsive Filter Bar */}