Initial commit from gitea_uploader script

This commit is contained in:
bizzle
2025-08-23 20:11:56 -04:00
parent d8da7beb52
commit a85fa0d211
24 changed files with 2380 additions and 996 deletions
+131 -33
View File
@@ -1,33 +1,131 @@
import React from 'react';
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
interface DonationPanelProps {
id: string;
}
const DonationPanel: React.FC<DonationPanelProps> = ({ id }) => {
return (
<Card className="bg-black/30 border-accent/50 backdrop-blur-sm">
<CardHeader>
<CardTitle className="text-accent neon-glow">Support Wildlife</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-4">
<p className="text-foreground/80">Your donation helps protect and preserve the habitats of these amazing creatures.</p>
<div className="flex items-center justify-center p-4 bg-accent/10 rounded-md">
<svg xmlns="http://www.w3.org/2000/svg" className="h-12 w-12 text-accent" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08 .402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
</div>
<Input type="number" placeholder="Amount in USD" className="bg-black/50 border-accent/30 text-foreground" />
<Button className="w-full bg-accent text-accent-foreground hover:bg-accent/80">Donate Now</Button>
</div>
</CardContent>
</Card>
);
};
export default DonationPanel;
"use client";
import React, { useState } from 'react';
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
interface DonationPanelProps {
id: string;
}
const DonationPanel: React.FC<DonationPanelProps> = ({ id }) => {
const [amount, setAmount] = useState<number>(25);
const [donated, setDonated] = useState<boolean>(false);
const [donationInProgress, setDonationInProgress] = useState<boolean>(false);
const handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = parseInt(e.target.value);
if (!isNaN(value)) {
setAmount(value);
} else {
setAmount(0);
}
};
const handleDonate = () => {
if (amount > 0) {
setDonationInProgress(true);
// Simulate API call
setTimeout(() => {
setDonated(true);
setDonationInProgress(false);
}, 1500);
}
};
const predefinedAmounts = [10, 25, 50, 100];
return (
<Card className="border-ccfw-teal/30 bg-gradient-to-b from-ccfw-beige/20 to-ccfw-beige/5 backdrop-blur-sm">
<CardHeader className="border-b border-ccfw-teal/20 bg-ccfw-beige/10">
<CardTitle className="text-ccfw-teal">Support Wildlife</CardTitle>
<CardDescription className="text-ccfw-maroon font-medium">
Help protect the wildlife featured in Livestream {id}
</CardDescription>
</CardHeader>
<CardContent className="pt-4">
{!donated ? (
<div className="space-y-4">
<p className="text-ccfw-maroon font-medium">Your donation helps protect and preserve the habitats of these amazing creatures.</p>
<div className="grid grid-cols-4 gap-2 my-4">
{predefinedAmounts.map((presetAmount) => (
<Button
key={presetAmount}
variant={amount === presetAmount ? "default" : "outline"}
className={amount === presetAmount ? "bg-ccfw-teal text-white" : "border-ccfw-teal/30 text-foreground hover:bg-ccfw-teal/10"}
onClick={() => setAmount(presetAmount)}
>
${presetAmount}
</Button>
))}
</div>
<div className="relative">
<div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<span className="text-ccfw-maroon font-medium">$</span>
</div>
<Input
type="number"
value={amount}
onChange={handleAmountChange}
className="bg-ccfw-beige/20 border-ccfw-teal/30 text-foreground pl-7"
placeholder="Custom amount"
/>
</div>
<div className="flex items-center space-x-2 pt-2">
<div className="h-10 w-10 rounded-full bg-ccfw-gold/20 flex items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6 text-ccfw-gold" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
</div>
<p className="text-sm text-ccfw-maroon font-medium">100% of donations go directly to CCFW conservation efforts</p>
</div>
<Button
onClick={handleDonate}
disabled={amount <= 0 || donationInProgress}
className="w-full bg-ccfw-teal text-white hover:bg-ccfw-teal/80 relative overflow-hidden"
>
{donationInProgress ? (
<>
<span className="opacity-0">Donate Now</span>
<span className="absolute inset-0 flex items-center justify-center">
<svg className="animate-spin h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
</span>
</>
) : (
`Donate $${amount}`
)}
</Button>
</div>
) : (
<div className="space-y-4 text-center">
<div className="mx-auto w-16 h-16 rounded-full bg-ccfw-gold/20 flex items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" className="h-8 w-8 text-ccfw-gold" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
</svg>
</div>
<h3 className="text-xl font-bold text-ccfw-teal">Thank You!</h3>
<p className="text-ccfw-maroon font-medium">Your donation of ${amount} will help protect Florida wildlife.</p>
<div className="text-sm text-ccfw-maroon font-medium mt-2">
Cape Coral Friends of Wildlife is a 501(c)(3) non-profit organization.
All donations are tax-deductible.
</div>
<Button onClick={() => setDonated(false)} variant="outline" className="border-ccfw-teal/30 text-ccfw-teal mt-4 hover:bg-ccfw-teal/10">
Make Another Donation
</Button>
</div>
)}
</CardContent>
</Card>
);
};
export default DonationPanel;
+193 -23
View File
@@ -1,23 +1,193 @@
import React from 'react';
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
interface LiveStreamProps {
id: string;
}
const LiveStream: React.FC<LiveStreamProps> = ({ id }) => {
return (
<Card className="bg-black/30 border-accent/50 backdrop-blur-sm">
<CardHeader>
<CardTitle className="text-accent neon-glow">Live Cam {id}</CardTitle>
</CardHeader>
<CardContent>
<div className="bg-black aspect-video flex items-center justify-center rounded-md border border-accent/30">
<p className="text-accent">Livestream {id} placeholder</p>
</div>
</CardContent>
</Card>
);
};
export default LiveStream;
"use client";
import React from 'react';
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
interface LiveStreamProps {
id: string;
}
// Define burrowing owl info based on stream ID
const getStreamInfo = (id: string) => {
switch (id) {
case "1":
return {
title: "Cape Coral Burrowing Owl",
location: "Cape Coral, FL",
fact: "The burrowing owl is the official city bird of Cape Coral. These unique owls nest underground and are active during the day."
};
case "2":
return {
title: "Burrowing Owl Habitat",
location: "Cape Coral, FL",
fact: "Burrowing owls prefer open areas with low vegetation and create underground burrows that provide shelter for many wildlife species."
};
case "3":
return {
title: "Owl Burrow Monitoring",
location: "Cape Coral, FL",
fact: "CCFW volunteers maintain over 2,500 burrows throughout Cape Coral to protect these threatened ground-dwelling owls."
};
default:
return {
title: `Burrowing Owl Cam ${id}`,
location: "Cape Coral, FL",
fact: "Burrowing owls are Florida's smallest owl species and are known for their distinctive long legs and daytime activity."
};
}
};
// Client-side component for dynamic time to avoid hydration errors
const ClientTimeDisplay: React.FC = () => {
const [currentTime, setCurrentTime] = React.useState<string>('');
React.useEffect(() => {
setCurrentTime(new Date().toLocaleDateString() + ' • ' + new Date().toLocaleTimeString());
}, []);
return <span className="bg-ccfw-beige/50 py-1 px-2 rounded">{currentTime}</span>;
};
const LiveStream: React.FC<LiveStreamProps> = ({ id }) => {
// This would be determined by your backend in a real app
const isLive = id !== "3"; // Let's assume stream #3 is offline for testing
const streamInfo = getStreamInfo(id);
// Use a fixed viewer count to avoid hydration errors
const viewerCount = isLive ? (id === "1" ? 128 : id === "2" ? 86 : 75) : 0;
return (
<Card className="border-ccfw-teal/30 bg-gradient-to-b from-ccfw-beige/20 to-ccfw-beige/5 backdrop-blur-sm">
<CardHeader className="pb-2 border-b border-ccfw-teal/20">
<div className="flex justify-between items-center">
<CardTitle className="text-ccfw-teal">{streamInfo.title}</CardTitle>
<div className="flex items-center gap-2">
<div className={`h-3 w-3 rounded-full ${isLive ? 'bg-ccfw-coral animate-pulse' : 'bg-gray-500'}`}></div>
<span className="text-sm font-medium text-ccfw-maroon font-semibold">{isLive ? 'LIVE' : 'OFFLINE'}</span>
</div>
</div>
</CardHeader>
<CardContent className="pt-4">
<div className="bg-black aspect-video flex flex-col items-center justify-center rounded-md border border-ccfw-teal/30 relative overflow-hidden">
{isLive ? (
<>
<div className="absolute inset-0 bg-gradient-to-b from-ccfw-teal/5 to-transparent"></div>
{/* Overlay for wildlife stream info */}
<div className="absolute top-0 left-0 w-full bg-black/50 p-2 flex justify-between items-center">
<div className="flex items-center">
<div className="h-2 w-2 rounded-full bg-ccfw-coral animate-pulse mr-2"></div>
<span className="text-xs text-white">CCFW Wildlife Stream</span>
</div>
<div className="text-xs text-white bg-ccfw-teal/80 px-2 py-1 rounded">
HD
</div>
</div>
<div className="z-10 flex flex-col items-center">
<div className="bg-black/60 px-4 py-2 rounded-lg border border-ccfw-teal/30">
<p className="text-white font-medium">{streamInfo.location} Cape Coral Friends of Wildlife</p>
<p className="text-xs text-white mt-2">HD Video Live from Florida</p>
</div>
</div>
<div className="absolute bottom-4 right-4 bg-black/70 text-white text-xs px-2 py-1 rounded flex items-center">
<svg xmlns="http://www.w3.org/2000/svg" className="h-3 w-3 mr-1 text-ccfw-coral" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
</svg>
{viewerCount}
</div>
{/* Stream controls overlay */}
<div className="absolute bottom-0 left-0 w-full bg-gradient-to-t from-black to-transparent pt-8 pb-2 px-4">
<div className="flex justify-between items-center">
<div className="flex space-x-3">
<button className="text-white hover:text-ccfw-coral transition-colors">
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15.536a5 5 0 001.414-7.071m-2.829 9.9a9 9 0 010-12.728" />
</svg>
</button>
<button className="text-white hover:text-ccfw-coral transition-colors">
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z" />
</svg>
</button>
</div>
<div className="text-xs text-white">
Powered by CCFW
</div>
</div>
</div>
</>
) : (
<div className="flex flex-col items-center">
<div className="bg-black/60 p-4 rounded-lg border border-ccfw-teal/30">
<div className="flex items-center mb-3">
<svg xmlns="http://www.w3.org/2000/svg" className="h-10 w-10 text-gray-600 mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<div>
<p className="text-white font-medium">Stream currently offline</p>
<p className="text-xs text-white/80">Will return soon. Check back later.</p>
</div>
</div>
<div className="text-xs text-white text-center">
<a
href="https://ccfriendsofwildlife.org/events-and-programs/"
target="_blank"
rel="noopener noreferrer"
className="hover:text-ccfw-coral transition-colors"
>
View upcoming livestream schedule
</a>
</div>
</div>
</div>
)}
</div>
<div className="mt-4 flex justify-between items-center">
<div className="text-xs text-ccfw-maroon/70">
<ClientTimeDisplay />
</div>
<div className="flex gap-3">
<button className="text-ccfw-teal hover:text-ccfw-coral transition-colors">
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z" />
</svg>
</button>
<button className="text-ccfw-teal hover:text-ccfw-coral transition-colors">
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" />
</svg>
</button>
<a
href="https://ccfriendsofwildlife.org/events-and-programs/"
target="_blank"
className="text-ccfw-teal hover:text-ccfw-coral transition-colors"
>
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
</a>
</div>
</div>
{/* Wildlife fact */}
<div className="mt-3 bg-ccfw-beige/10 p-3 rounded-md border border-ccfw-teal/20">
<div className="flex items-start gap-2">
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5 text-ccfw-gold flex-shrink-0 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
<p className="text-sm text-ccfw-maroon font-medium leading-relaxed">
<span className="font-semibold text-ccfw-teal">Wildlife Fact:</span> {streamInfo.fact}
</p>
</div>
</div>
</CardContent>
</Card>
);
};
export default LiveStream;
+182 -24
View File
@@ -1,24 +1,182 @@
import React from 'react';
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
interface OwlInfoProps {
id: string;
}
const OwlInfo: React.FC<OwlInfoProps> = ({ id }) => {
return (
<Card className="bg-black/30 border-accent/50 backdrop-blur-sm">
<CardHeader>
<CardTitle className="text-accent neon-glow">About This Livestream</CardTitle>
</CardHeader>
<CardContent>
<p className="text-sm text-foreground/80">
This livestream (ID: {id}) showcases the natural habitat and behavior of wildlife in Florida.
By observing these animals in their natural environment, we can learn more about their needs and how to protect them.
</p>
</CardContent>
</Card>
);
};
export default OwlInfo;
"use client";
import React, { useState } from 'react';
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
interface OwlInfoProps {
id: string;
}
const OwlInfo: React.FC<OwlInfoProps> = ({ id }) => {
const [activeTab, setActiveTab] = useState<'facts' | 'habitat' | 'conservation'>('facts');
// Get burrowing owl data based on stream ID
const getWildlifeData = () => {
switch (id) {
case "1":
return {
species: "Burrowing Owl",
scientificName: "Athene cunicularia",
location: "Cape Coral, FL",
facts: [
"Burrowing owls are small, long-legged owls that nest underground in burrows",
"Unlike most owls, they are active during the day (diurnal)",
"They stand about 9 inches tall and have bright yellow eyes",
"The City of Cape Coral has designated the burrowing owl as its official city bird"
],
habitat: "Cape Coral has the largest population of burrowing owls in Florida. They prefer open areas with low vegetation such as prairies, grasslands, and open areas of urban development. CCFW volunteers maintain over 2,500 burrows throughout Cape Coral.",
conservation: "Burrowing owls are listed as a state-threatened species in Florida. Development of their habitats is the biggest threat to their survival. CCFW works to protect and maintain burrows, educate the public, and collaborate with local authorities to ensure these birds have safe places to nest.",
ccfwLink: "https://ccfriendsofwildlife.org/burrowing-owls/"
};
case "2":
return {
species: "Burrowing Owl",
scientificName: "Athene cunicularia",
location: "Cape Coral, FL",
facts: [
"Burrowing owls create underground burrows that can be up to 30 feet long",
"They often use burrows created by other animals like prairie dogs or armadillos",
"These owls are known for their distinctive 'bobblehead' behavior when curious",
"They can live up to 9 years in the wild with proper habitat protection"
],
habitat: "Burrowing owls prefer open, grassy areas with sparse vegetation. They are commonly found in prairies, agricultural fields, and urban areas with suitable open spaces. The owls dig their own burrows or modify existing ones.",
conservation: "Habitat loss from urban development is the primary threat to burrowing owls. CCFW's burrow maintenance program helps protect existing burrows and creates artificial burrows to support the owl population in Cape Coral.",
ccfwLink: "https://ccfriendsofwildlife.org/burrowing-owls/"
};
case "3":
return {
species: "Burrowing Owl",
scientificName: "Athene cunicularia",
location: "Cape Coral, FL",
facts: [
"Burrowing owls are Florida's smallest owl species",
"They have long legs adapted for walking and running on the ground",
"Their diet consists mainly of insects, small mammals, and reptiles",
"They are the only owl species that nests exclusively underground"
],
habitat: "These unique owls inhabit open grasslands, pastures, and urban areas with low vegetation. They are particularly well-adapted to the Florida landscape and have thrived in areas where other wildlife has declined.",
conservation: "CCFW volunteers monitor and maintain over 2,500 burrows in Cape Coral. The organization's educational programs help the community understand the importance of protecting these threatened birds and their habitats.",
ccfwLink: "https://ccfriendsofwildlife.org/burrowing-owls/"
};
default:
return {
species: "Burrowing Owl",
scientificName: "Athene cunicularia",
location: "Cape Coral, FL",
facts: [
"Burrowing owls are the official city bird of Cape Coral",
"They are diurnal, meaning they are active during the day",
"These owls have distinctive long legs and bright yellow eyes",
"CCFW maintains over 2,500 burrows to protect this threatened species"
],
habitat: "Cape Coral provides ideal habitat for burrowing owls with its mix of urban development and open spaces. The city has the largest population of burrowing owls in Florida due to successful conservation efforts.",
conservation: "Cape Coral Friends of Wildlife works tirelessly to protect burrowing owls through habitat preservation, burrow maintenance, public education, and collaboration with local authorities.",
ccfwLink: "https://ccfriendsofwildlife.org/burrowing-owls/"
};
}
};
const wildlifeData = getWildlifeData();
return (
<Card className="border-ccfw-teal/30 bg-gradient-to-b from-ccfw-beige/20 to-ccfw-beige/5 backdrop-blur-sm">
<CardHeader className="border-b border-ccfw-teal/20 bg-ccfw-beige/10">
<CardTitle className="text-ccfw-teal">About {wildlifeData.species}</CardTitle>
<CardDescription className="text-ccfw-maroon font-medium italic">
{wildlifeData.scientificName && (
<>{wildlifeData.scientificName} </>
)}
{wildlifeData.location}
</CardDescription>
</CardHeader>
<CardContent className="space-y-4 pt-4">
<div className="flex space-x-1 bg-ccfw-beige/10 p-1 rounded-md">
<Button
variant="ghost"
className={`flex-1 text-xs h-8 ${activeTab === 'facts' ? 'bg-ccfw-teal/20 text-ccfw-teal' : 'text-ccfw-maroon hover:text-ccfw-teal hover:bg-ccfw-teal/10'}`}
onClick={() => setActiveTab('facts')}
>
Facts
</Button>
<Button
variant="ghost"
className={`flex-1 text-xs h-8 ${activeTab === 'habitat' ? 'bg-ccfw-teal/20 text-ccfw-teal' : 'text-ccfw-maroon hover:text-ccfw-teal hover:bg-ccfw-teal/10'}`}
onClick={() => setActiveTab('habitat')}
>
Habitat
</Button>
<Button
variant="ghost"
className={`flex-1 text-xs h-8 ${activeTab === 'conservation' ? 'bg-ccfw-teal/20 text-ccfw-teal' : 'text-ccfw-maroon hover:text-ccfw-teal hover:bg-ccfw-teal/10'}`}
onClick={() => setActiveTab('conservation')}
>
Conservation
</Button>
</div>
<div className="min-h-[180px]">
{activeTab === 'facts' && (
<div className="space-y-2">
<ul className="list-disc list-inside space-y-2 text-sm text-ccfw-maroon font-medium">
{wildlifeData.facts.map((fact, index) => (
<li key={index}>{fact}</li>
))}
</ul>
</div>
)}
{activeTab === 'habitat' && (
<div className="space-y-2">
<p className="text-sm text-ccfw-maroon font-medium">{wildlifeData.habitat}</p>
</div>
)}
{activeTab === 'conservation' && (
<div className="space-y-3">
<p className="text-sm text-ccfw-maroon font-medium">{wildlifeData.conservation}</p>
<div className="bg-ccfw-beige/10 p-3 rounded-md border border-ccfw-teal/20 flex flex-col sm:flex-row items-center gap-3">
<div className="bg-ccfw-gold/20 p-2 rounded-full">
<svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6 text-ccfw-gold" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
</svg>
</div>
<div className="text-center sm:text-left">
<p className="text-sm text-ccfw-maroon font-medium">
<span className="font-medium text-ccfw-teal">How you can help:</span> Join the Cape Coral Friends of Wildlife in their mission to preserve and protect these incredible creatures.
</p>
<a
href="https://ccfriendsofwildlife.org/volunteer/"
target="_blank"
rel="noopener noreferrer"
className="text-xs text-ccfw-teal hover:text-ccfw-coral transition-colors"
>
Learn about volunteer opportunities
</a>
</div>
</div>
</div>
)}
</div>
<div className="pt-3 border-t border-ccfw-teal/20 flex justify-between items-center">
<span className="text-xs text-ccfw-maroon font-medium">Updated daily</span>
<a
href={wildlifeData.ccfwLink}
target="_blank"
rel="noopener noreferrer"
className="text-ccfw-teal text-xs hover:text-ccfw-coral transition-colors flex items-center gap-1"
>
Learn More
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>
</a>
</div>
</CardContent>
</Card>
);
};
export default OwlInfo;