diff --git a/frontend/src/components/DiveSiteCard.jsx b/frontend/src/components/DiveSiteCard.jsx index c00fbe4..8f49d8e 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 && ( )}
)} diff --git a/frontend/src/components/PageHeader.jsx b/frontend/src/components/PageHeader.jsx index 845e4c7..fad1c7d 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,16 +8,29 @@ 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 +83,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 044c852..58ba6a4 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 2c2b44b..2a4c2bd 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,11 @@ const DiveRoutes = () => { return (
- {/* Breadcrumbs */} - - - {/* Page Header */} - + {/* Responsive Filter Bar */}
@@ -344,7 +343,7 @@ const DiveRoutes = () => { return (
{/* Header: Title & Type */}
diff --git a/frontend/src/pages/DiveSites.jsx b/frontend/src/pages/DiveSites.jsx index 112994d..19c77b7 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 482e60e..a80c0dc 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 => (