Add core UI components and layout for media platform

Initializes the client-side application with fundamental UI components, including navigation, cards for articles and auctions, and various elements for user interaction and display.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 069d4324-6c40-4355-955e-c714a50de1ea
Replit-Commit-Checkpoint-Type: intermediate_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3df548ff-50ae-432f-9be4-25d34eccc983/069d4324-6c40-4355-955e-c714a50de1ea/bVdKIaU
This commit is contained in:
kimjaehyeon0101
2025-09-29 14:35:50 +00:00
parent 4d252ca7a6
commit 2cbad88faa
89 changed files with 17584 additions and 0 deletions

View File

@ -0,0 +1,142 @@
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
import { Button } from "@/components/ui/button";
import type { MediaOutlet } from "@shared/schema";
interface ProfileModalProps {
outlet: MediaOutlet;
isOpen: boolean;
onClose: () => void;
}
export default function ProfileModal({ outlet, isOpen, onClose }: ProfileModalProps) {
const getProfileContent = () => {
// Sample profile content - in a real app this would come from the database
const profiles: Record<string, any> = {
"alex-karp": {
summary: [
"Co-founder and CEO of Palantir Technologies, a leading data analytics company",
"Known for his outspoken views on artificial intelligence and data privacy",
"Advocate for Western democratic values in technology and business practices"
],
background: "Alexander Karp is an American billionaire businessman who co-founded Palantir Technologies in 2003. He earned a PhD in philosophy from Stanford University and a JD from Stanford Law School. Before Palantir, he worked as an investor and consultant.",
highlights: [
"Co-founded Palantir Technologies (2003)",
"Led company through IPO in 2020",
"Built partnerships with government agencies and enterprises",
"Advocate for responsible AI development"
],
achievements: [
"Built Palantir into a multi-billion dollar company",
"Recognized leader in big data and AI ethics",
"Frequent speaker on technology and society"
]
}
};
return profiles[outlet.slug] || {
summary: [
`Leading figure in the ${outlet.category} category`,
`Influential voice in their respective field`,
`Key contributor to industry developments`
],
background: `${outlet.name} is a prominent entity in the ${outlet.category} space. ${outlet.description}`,
highlights: [
"Industry leadership",
"Innovative contributions",
"Market influence",
"Thought leadership"
],
achievements: [
"Recognized expertise in their field",
"Significant market impact",
"Influential industry voice"
]
};
};
const profile = getProfileContent();
const getProfileImage = () => {
if (outlet.imageUrl) return outlet.imageUrl;
// Default professional images
if (outlet.category === "people") {
return "https://images.unsplash.com/photo-1560250097-0b93528c311a?ixlib=rb-4.0.3&w=120&h=120&fit=crop&crop=face";
}
return null;
};
return (
<Dialog open={isOpen} onOpenChange={onClose}>
<DialogContent className="max-w-2xl max-h-[90vh] overflow-y-auto" data-testid="modal-profile">
<DialogHeader>
<DialogTitle>Profile Information</DialogTitle>
</DialogHeader>
<div className="p-6">
<div className="text-center mb-6">
{getProfileImage() ? (
<img
src={getProfileImage()!}
alt={`${outlet.name} Profile`}
className="w-24 h-24 rounded-full mx-auto mb-4 object-cover cursor-pointer hover:scale-105 transition-transform"
onClick={() => window.open(getProfileImage()!, '_blank')}
data-testid="img-profile-large"
/>
) : (
<div className="w-24 h-24 bg-primary/20 rounded-full mx-auto mb-4 flex items-center justify-center">
<span className="text-primary font-bold text-2xl">
{outlet.name.charAt(0)}
</span>
</div>
)}
<h3 className="text-xl font-bold">{outlet.name}</h3>
<p className="text-muted-foreground">{outlet.description}</p>
</div>
<div className="bg-muted rounded-lg p-4 mb-6">
<h4 className="font-semibold mb-2">3-Line Summary</h4>
<ul className="text-sm space-y-1">
{profile.summary.map((line: string, index: number) => (
<li key={index}> {line}</li>
))}
</ul>
</div>
<div className="space-y-4">
<div>
<h4 className="font-semibold mb-2">Background</h4>
<p className="text-sm text-muted-foreground">
{profile.background}
</p>
</div>
<div>
<h4 className="font-semibold mb-2">Key Highlights</h4>
<ul className="text-sm text-muted-foreground space-y-1">
{profile.highlights.map((highlight: string, index: number) => (
<li key={index}> {highlight}</li>
))}
</ul>
</div>
<div>
<h4 className="font-semibold mb-2">Achievements</h4>
<ul className="text-sm text-muted-foreground space-y-1">
{profile.achievements.map((achievement: string, index: number) => (
<li key={index}> {achievement}</li>
))}
</ul>
</div>
</div>
<div className="mt-6 flex justify-center">
<Button onClick={onClose} data-testid="button-close-profile">
Close
</Button>
</div>
</div>
</DialogContent>
</Dialog>
);
}