mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 08:31:12 -05:00
Refactor: Standardize card and grid layouts
This commit is contained in:
@@ -26,7 +26,7 @@ export function DesignerCard({ company }: DesignerCardProps) {
|
|||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
>
|
>
|
||||||
{/* Header Image/Logo Section */}
|
{/* Header Image/Logo Section */}
|
||||||
<div className="relative aspect-video bg-gradient-to-br from-background to-muted/50 flex items-center justify-center border-b border-border">
|
<div className="relative aspect-[4/3] bg-gradient-to-br from-background to-muted/50 flex items-center justify-center border-b border-border">
|
||||||
{/* Background Gradient Overlay */}
|
{/* Background Gradient Overlay */}
|
||||||
<div className="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-accent/5" />
|
<div className="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-accent/5" />
|
||||||
|
|
||||||
@@ -54,9 +54,9 @@ export function DesignerCard({ company }: DesignerCardProps) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<CardContent className="p-6 space-y-4">
|
<CardContent className="p-4 space-y-3">
|
||||||
{/* Company Name */}
|
{/* Company Name */}
|
||||||
<h3 className="font-semibold text-lg mb-2 group-hover:text-primary transition-colors line-clamp-1">
|
<h3 className="font-semibold text-lg mb-2 group-hover:text-primary transition-colors line-clamp-2 min-h-[3.5rem]">
|
||||||
{company.name}
|
{company.name}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export function ManufacturerCard({ company }: ManufacturerCardProps) {
|
|||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
>
|
>
|
||||||
{/* Logo/Image Section */}
|
{/* Logo/Image Section */}
|
||||||
<div className="aspect-video relative bg-gradient-to-br from-primary/20 via-primary/10 to-transparent overflow-hidden">
|
<div className="aspect-[4/3] relative bg-gradient-to-br from-primary/20 via-primary/10 to-transparent overflow-hidden">
|
||||||
{(company.card_image_url || company.card_image_id) ? (
|
{(company.card_image_url || company.card_image_id) ? (
|
||||||
<img
|
<img
|
||||||
src={company.card_image_url || getCloudflareImageUrl(company.card_image_id, 'card')}
|
src={company.card_image_url || getCloudflareImageUrl(company.card_image_id, 'card')}
|
||||||
@@ -85,9 +85,9 @@ export function ManufacturerCard({ company }: ManufacturerCardProps) {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<CardContent className="p-3 md:p-4 space-y-2 md:space-y-3">
|
<CardContent className="p-4 space-y-3">
|
||||||
{/* Company Name */}
|
{/* Company Name */}
|
||||||
<h3 className="text-base md:text-lg font-semibold group-hover:text-primary transition-colors line-clamp-2 min-h-[2.5rem] md:min-h-[3rem]">
|
<h3 className="text-lg font-semibold group-hover:text-primary transition-colors line-clamp-2 min-h-[3.5rem]">
|
||||||
{company.name}
|
{company.name}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ const OperatorCard = ({ company }: OperatorCardProps) => {
|
|||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
>
|
>
|
||||||
{/* Logo/Image Section */}
|
{/* Logo/Image Section */}
|
||||||
<div className="aspect-video relative bg-gradient-to-br from-primary/20 via-primary/10 to-transparent overflow-hidden">
|
<div className="aspect-[4/3] relative bg-gradient-to-br from-primary/20 via-primary/10 to-transparent overflow-hidden">
|
||||||
{(company.card_image_url || company.card_image_id) ? (
|
{(company.card_image_url || company.card_image_id) ? (
|
||||||
<img
|
<img
|
||||||
src={company.card_image_url || getCloudflareImageUrl(company.card_image_id, 'card')}
|
src={company.card_image_url || getCloudflareImageUrl(company.card_image_id, 'card')}
|
||||||
@@ -74,7 +74,7 @@ const OperatorCard = ({ company }: OperatorCardProps) => {
|
|||||||
|
|
||||||
<CardContent className="p-4 space-y-3">
|
<CardContent className="p-4 space-y-3">
|
||||||
{/* Company Name */}
|
{/* Company Name */}
|
||||||
<h3 className="text-lg font-semibold group-hover:text-primary transition-colors line-clamp-2">
|
<h3 className="text-lg font-semibold group-hover:text-primary transition-colors line-clamp-2 min-h-[3.5rem]">
|
||||||
{company.name}
|
{company.name}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ const ParkOwnerCard = ({ company }: ParkOwnerCardProps) => {
|
|||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
>
|
>
|
||||||
{/* Logo/Image Section */}
|
{/* Logo/Image Section */}
|
||||||
<div className="aspect-video relative bg-gradient-to-br from-primary/20 via-primary/10 to-transparent overflow-hidden">
|
<div className="aspect-[4/3] relative bg-gradient-to-br from-primary/20 via-primary/10 to-transparent overflow-hidden">
|
||||||
{(company.card_image_url || company.card_image_id) ? (
|
{(company.card_image_url || company.card_image_id) ? (
|
||||||
<img
|
<img
|
||||||
src={company.card_image_url || getCloudflareImageUrl(company.card_image_id, 'card')}
|
src={company.card_image_url || getCloudflareImageUrl(company.card_image_id, 'card')}
|
||||||
@@ -74,7 +74,7 @@ const ParkOwnerCard = ({ company }: ParkOwnerCardProps) => {
|
|||||||
|
|
||||||
<CardContent className="p-4 space-y-3">
|
<CardContent className="p-4 space-y-3">
|
||||||
{/* Company Name */}
|
{/* Company Name */}
|
||||||
<h3 className="text-lg font-semibold group-hover:text-primary transition-colors line-clamp-2">
|
<h3 className="text-lg font-semibold group-hover:text-primary transition-colors line-clamp-2 min-h-[3.5rem]">
|
||||||
{company.name}
|
{company.name}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|||||||
@@ -74,10 +74,10 @@ export function ParkCard({ park }: ParkCardProps) {
|
|||||||
</Badge>
|
</Badge>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<CardContent className="p-3 lg:p-3 xl:p-3.5 2xl:p-3 space-y-2 lg:space-y-2 xl:space-y-2.5">
|
<CardContent className="p-4 space-y-3">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<h3 className="font-bold text-lg group-hover:text-primary transition-colors line-clamp-1">
|
<h3 className="font-bold text-lg group-hover:text-primary transition-colors line-clamp-2 min-h-[3.5rem]">
|
||||||
{park.name}
|
{park.name}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|||||||
@@ -85,10 +85,10 @@ export function RideCard({ ride, showParkName = true, className, parkSlug }: Rid
|
|||||||
</Badge>
|
</Badge>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<CardContent className="p-3 lg:p-3 xl:p-3.5 2xl:p-3 space-y-2 lg:space-y-2 xl:space-y-2.5">
|
<CardContent className="p-4 space-y-3">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<h3 className="font-bold text-lg group-hover:text-primary transition-colors line-clamp-1">
|
<h3 className="font-bold text-lg group-hover:text-primary transition-colors line-clamp-2 min-h-[3.5rem]">
|
||||||
{ride.name}
|
{ride.name}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export function RideModelCard({ model, manufacturerSlug }: RideModelCardProps) {
|
|||||||
return (
|
return (
|
||||||
<Card className="overflow-hidden hover:shadow-lg transition-shadow cursor-pointer group">
|
<Card className="overflow-hidden hover:shadow-lg transition-shadow cursor-pointer group">
|
||||||
<div
|
<div
|
||||||
className="aspect-video bg-gradient-to-br from-primary/10 via-secondary/10 to-accent/10 relative overflow-hidden"
|
className="aspect-[4/3] bg-gradient-to-br from-primary/10 via-secondary/10 to-accent/10 relative overflow-hidden"
|
||||||
>
|
>
|
||||||
{(cardImageUrl || cardImageId) ? (
|
{(cardImageUrl || cardImageId) ? (
|
||||||
<img
|
<img
|
||||||
@@ -64,7 +64,7 @@ export function RideModelCard({ model, manufacturerSlug }: RideModelCardProps) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<CardContent className="p-4 space-y-3">
|
<CardContent className="p-4 space-y-3">
|
||||||
<h3 className="font-semibold text-lg line-clamp-1 group-hover:text-primary transition-colors">
|
<h3 className="font-semibold text-lg line-clamp-2 min-h-[3.5rem] group-hover:text-primary transition-colors">
|
||||||
{model.name}
|
{model.name}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ const ParkOwners = () => {
|
|||||||
|
|
||||||
{/* Property Owners Grid */}
|
{/* Property Owners Grid */}
|
||||||
{!isLoading && filteredAndSortedOwners && (
|
{!isLoading && filteredAndSortedOwners && (
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6">
|
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7 3xl:grid-cols-8 gap-4 lg:gap-5 xl:gap-4 2xl:gap-5">
|
||||||
{filteredAndSortedOwners.map((owner) => (
|
{filteredAndSortedOwners.map((owner) => (
|
||||||
<ParkOwnerCard key={owner.id} company={owner} />
|
<ParkOwnerCard key={owner.id} company={owner} />
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -271,7 +271,7 @@ export default function RideModelRides() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{filteredRides.length > 0 ? (
|
{filteredRides.length > 0 ? (
|
||||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 gap-6">
|
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-7 3xl:grid-cols-8 gap-4 lg:gap-5 xl:gap-4 2xl:gap-5">
|
||||||
{filteredRides.map((ride) => (
|
{filteredRides.map((ride) => (
|
||||||
<RideCard key={ride.id} ride={ride} showParkName={true} />
|
<RideCard key={ride.id} ride={ride} showParkName={true} />
|
||||||
))}
|
))}
|
||||||
|
|||||||
Reference in New Issue
Block a user