Improve user authentication and navigation flow

Introduce a loading state for authentication, refactor route handling to conditionally render authenticated vs. unauthenticated views, add an Auction Guide page, and update navigation links to use the Link component for client-side routing.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 069d4324-6c40-4355-955e-c714a50de1ea
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3df548ff-50ae-432f-9be4-25d34eccc983/069d4324-6c40-4355-955e-c714a50de1ea/u6Yn0uG
This commit is contained in:
kimjaehyeon0101
2025-09-29 15:55:11 +00:00
parent b332e8bc6f
commit 6de5cfd9e7
4 changed files with 537 additions and 20 deletions

View File

@ -0,0 +1,26 @@
그러니까 홈화면에 언론매체 리스트들이 카테고리별로 쭉 있고, 그 언론매체 클릭하면 그 언론매체 안의 기사들을 쭉 볼 수 있고 (리스트뷰, 그리드뷰 선택할 수 있음) 그리고 그 기사 선택하면 기사 화면으로 넘어가고, 그 기사 화면에서 쭉 내리면 그 기사 관련 예측시장 이벤트들이 3개가 기본으로 뜨고 더 있으면 '더보기' 눌러서 예측시장 리스트만 쭉 볼 수 있어.
그리고 아이디 admin 비밀번호 1234 으로 로그인하면 모든 언론매체들을 관리할 수 있게되는데, 어떤 걸 관리할수 있는지는 너가 한번 기획해서 알아서 상상해서 만들어봐. (내가 지금 생각할 수 있는건 그 관리자가 사설이나 칼럼 올리면 항상 최상단에 그 글이 보이고, 그 사람이 댓글 쓰면 그 댓글이 상단 고정되고, 그 사람이 지정한 예측시장 이벤트가 맨 위에 뜨고. 기사 밑에 있는 예측시장 이벤트 리스트는 간결하게 요약된 버전인데, 거기서 바로 거래할수도 있지만 뭐 거기서 'Nostra에서 보기' 같은 버튼 누르면 내가 만든 Nostra라는 완전한 예측시장 페이지로 넘어가. 나의 Nostra 예측시장은 아래 두 링크의 UI와 UX와 완전 동일해. https://polymarket.com/
https://kalshi.com/
그리고 프로필 옆에는 i주변에 동그라미 있는 아이콘이 있어서 그거 누르면 3줄 요약 프로필과 위키피디아 같이 그 사람에 대한 모든 것이 나와있는 프로필을 볼 수 있어. 프로필 사진 누르면 프로필 사진을 크게 볼 수도 있고.
그리고 사피엔스 홈에는 각 언론매체 관리자 계정 권한을 사고 팔수 있는 옥션 (다시말해 경매) 기능이 있어. 네이버에서 광고 입찰하는것 과 같지. 네이버에서 광고 경매 어떻게 하는지는 아래 내용을 참고하면 돼.
네이버 광고 경매
네이버 광고는 '경매(입찰)' 방식으로 운영되며, 광고주가 제시한 입찰가와 광고의 품질 지수를 종합적으로 고려해 노출 순위와 클릭당 과금액이 결정됩니다. 이는 사용자가 검색한 키워드와 관련성이 높은 광고를 상위에 노출하고, 광고주 간의 공정한 경쟁을 유도하기 위한 시스템입니다.
네이버 광고 경매의 주요 요소
네이버 광고 경매는 다음과 같은 주요 요소들로 이루어집니다.
입찰가: 광고주가 키워드 클릭 1회당 지불할 의사가 있는 최대 금액입니다. 일반적으로 입찰가가 높을수록 상위 노출에 유리하며, 광고 그룹 또는 키워드 단위로 설정할 수 있습니다.
품질 지수: 광고의 품질을 평가하는 점수입니다. 광고의 클릭률, 키워드와 광고의 연관성, 광고가 연결되는 페이지의 품질 등이 종합적으로 반영됩니다. 품질 지수가 높으면 낮은 입찰가로도 상위 노출이 가능하며, 클릭당 과금액도 줄어들 수 있습니다.
광고 노출 순위: 광고의 노출 순위는 '입찰가'와 '품질 지수'를 결합한 점수를 바탕으로 결정됩니다. 단순히 높은 입찰가를 제시한다고 해서 1위에 노출되는 것이 아니라, 광고의 품질이 좋으면 더 높은 순위를 얻을 수 있습니다.
광고 종류별 경매 방식
네이버는 광고 상품별로 조금씩 다른 경매 방식을 적용합니다.
파워링크 (사이트 검색광고): 사용자가 특정 키워드를 검색했을 때 통합검색 결과 상단에 노출되는 광고입니다. 클릭이 발생할 때만 비용이 부과되는 CPC(Cost Per Click) 방식으로, 입찰가와 품질 지수를 고려해 순위가 결정됩니다.
쇼핑검색광고: 네이버 쇼핑 영역에 노출되는 상품형 광고로, 파워링크와 마찬가지로 클릭당 과금(CPC) 경매 방식입니다. 입찰가와 품질 요인에 따라 순위가 결정됩니다.
플레이스 광고: 지역 기반 소상공인을 위한 광고로, 경매 방식을 통해 노출 순위가 정해집니다. 이 역시 입찰가와 광고 품질 점수가 중요한 요소입니다.
성과형 디스플레이 광고(GFA): 네이버의 다양한 플랫폼에 배너 형태로 노출되는 광고로, 실시간 경매 방식으로 운영됩니다. 연령, 지역, 관심사 등 상세한 타겟팅 설정을 통해 원하는 잠재 고객에게 광고를 노출합니다.
광고주가 고려해야 할 점
네이버 광고 경매를 성공적으로 운영하기 위해서는 다음과 같은 점을 고려해야 합니다.
키워드 선정: 경쟁이 치열한 키워드는 입찰가가 높아지므로, 상품 또는 서비스와 관련성이 높으면서도 경쟁이 비교적 덜한 키워드를 찾는 것이 중요합니다.
품질 개선: 광고 소재의 클릭률을 높이고, 연결되는 페이지의 콘텐츠를 최적화하여 품질 지수를 높이면 광고 효율을 개선할 수 있습니다.
입찰 전략: 예산과 목표에 따라 수동 입찰과 자동 입찰을 적절히 활용할 수 있습니다. 자동 입찰은 시스템이 최적화된 입찰가를 설정해주지만, 개별 키워드 입찰가를 직접 관리하여 더 세밀한 전략을 구사할 수도 있습니다.

View File

@ -11,29 +11,42 @@ import Article from "@/pages/Article";
import AdminDashboard from "@/pages/AdminDashboard";
import SuperAdminDashboard from "@/pages/SuperAdminDashboard";
import Auctions from "@/pages/Auctions";
import AuctionGuide from "@/pages/AuctionGuide";
import NotFound from "@/pages/not-found";
function Router() {
const { isAuthenticated, isLoading, user } = useAuth();
if (isLoading) {
return (
<div className="min-h-screen bg-background flex items-center justify-center">
<div className="text-center">
<div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary mx-auto mb-4"></div>
<p className="text-lg">Loading...</p>
</div>
</div>
);
}
// Debug logging
console.log('Router render - isAuthenticated:', isAuthenticated, 'user:', user);
return (
<Switch>
{isLoading || !isAuthenticated ? (
<Route path="/" component={Landing} />
) : (
<>
<Route path="/" component={Home} />
<Route path="/media/:slug" component={MediaOutlet} />
<Route path="/articles/:slug" component={Article} />
<Route path="/auctions" component={Auctions} />
{(user?.role === 'admin' || user?.role === 'superadmin') && (
<Route path="/admin" component={AdminDashboard} />
)}
{user?.role === 'superadmin' && (
<Route path="/superadmin" component={SuperAdminDashboard} />
)}
</>
<Route path="/" component={isAuthenticated ? Home : Landing} />
<Route path="/media/:slug" component={isAuthenticated ? MediaOutlet : Landing} />
<Route path="/articles/:slug" component={isAuthenticated ? Article : Landing} />
<Route path="/auctions" component={isAuthenticated ? Auctions : Landing} />
<Route path="/auction-guide" component={AuctionGuide} />
{/* Admin routes - only when authenticated */}
{isAuthenticated && (user?.role === 'admin' || user?.role === 'superadmin') && (
<Route path="/admin" component={AdminDashboard} />
)}
{isAuthenticated && user?.role === 'superadmin' && (
<Route path="/superadmin" component={SuperAdminDashboard} />
)}
<Route component={NotFound} />
</Switch>
);

View File

@ -0,0 +1,467 @@
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Link } from "wouter";
import {
Lightbulb,
Settings,
TrendingUp,
Award,
List,
Brain,
Gavel,
Home,
Calculator,
Users,
Hash,
Building,
DollarSign,
Star,
Target,
BookOpen
} from "lucide-react";
export default function AuctionGuide() {
return (
<div className="min-h-screen bg-background">
{/* Header */}
<header className="bg-card border-b border-border sticky top-0 z-50">
<div className="max-w-7xl mx-auto px-6 py-4">
<div className="flex items-center justify-between">
<div className="flex items-center space-x-3">
<div className="w-10 h-10 bg-primary rounded-lg flex items-center justify-center text-primary-foreground font-bold text-lg">
S
</div>
<span className="text-2xl font-bold tracking-tight">SAPIENS</span>
</div>
<div className="flex items-center space-x-4">
<nav className="hidden md:flex space-x-6">
<Link href="/" className="text-muted-foreground hover:text-foreground transition-colors" data-testid="link-home">Home</Link>
<Link href="/auctions" className="text-muted-foreground hover:text-foreground transition-colors" data-testid="link-auctions">Auctions</Link>
<Link href="/auction-guide" className="text-foreground font-medium" data-testid="link-auction-guide">Auction Guide</Link>
</nav>
<a href="/api/login">
<Button data-testid="button-login">Login</Button>
</a>
</div>
</div>
</div>
</header>
<main className="max-w-6xl mx-auto px-6 py-8">
{/* Header Section */}
<div className="mb-8">
<h1 className="text-4xl font-bold mb-4" data-testid="text-guide-title">SAPIENS </h1>
<p className="text-xl text-muted-foreground">
</p>
</div>
{/* Overview Card */}
<Card className="mb-8" data-testid="section-overview">
<CardHeader>
<CardTitle className="flex items-center space-x-2">
<Lightbulb className="h-5 w-5 text-primary" />
<span> </span>
</CardTitle>
</CardHeader>
<CardContent>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<h3 className="font-semibold text-lg mb-3">🎯 </h3>
<ul className="space-y-2 text-sm">
<li> <strong> </strong>: </li>
<li> <strong> </strong>: × </li>
<li> <strong> </strong>: 2 </li>
<li> <strong> </strong>: </li>
</ul>
</div>
<div>
<h3 className="font-semibold text-lg mb-3">📊 </h3>
<ul className="space-y-2 text-sm">
<li> <strong>People (24)</strong>: </li>
<li> <strong>Topics (20)</strong>: </li>
<li> <strong>Companies (27)</strong>: </li>
<li> <strong> </strong>: </li>
</ul>
</div>
</div>
</CardContent>
</Card>
{/* Core Mechanism */}
<Card className="mb-8" data-testid="section-mechanism">
<CardHeader>
<CardTitle className="flex items-center space-x-2">
<Settings className="h-5 w-5 text-chart-1" />
<span>1. </span>
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-6">
<div className="bg-primary/5 rounded-lg p-6">
<h3 className="font-semibold text-lg mb-4 flex items-center">
<Award className="h-5 w-5 text-primary mr-2" />
(Vickrey Auction)
</h3>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<div className="text-center">
<div className="w-12 h-12 bg-primary rounded-full flex items-center justify-center text-primary-foreground font-bold text-lg mx-auto mb-2">1</div>
<h4 className="font-medium mb-2"> </h4>
<p className="text-sm text-muted-foreground"> </p>
</div>
<div className="text-center">
<div className="w-12 h-12 bg-chart-2 rounded-full flex items-center justify-center text-white font-bold text-lg mx-auto mb-2">2</div>
<h4 className="font-medium mb-2">2 </h4>
<p className="text-sm text-muted-foreground"> 2 </p>
</div>
<div className="text-center">
<div className="w-12 h-12 bg-chart-3 rounded-full flex items-center justify-center text-white font-bold text-lg mx-auto mb-2">3</div>
<h4 className="font-medium mb-2"> </h4>
<p className="text-sm text-muted-foreground"> </p>
</div>
</div>
</div>
<div className="bg-chart-1/5 rounded-lg p-6">
<h4 className="font-semibold mb-3">📝 </h4>
<div className="space-y-2 text-sm">
<p><strong>A :</strong> $1,000 × 85 = 85,000 (1 )</p>
<p><strong>B :</strong> $800 × 90 = 72,000 (2)</p>
<p><strong>C :</strong> $1,200 × 60 = 72,000 (3)</p>
<p className="pt-2 font-medium text-primary">
A가 B의 $800
</p>
</div>
</div>
</div>
</CardContent>
</Card>
{/* Ranking System */}
<Card className="mb-8" data-testid="section-ranking">
<CardHeader>
<CardTitle className="flex items-center space-x-2">
<TrendingUp className="h-5 w-5 text-chart-2" />
<span>2. </span>
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-6">
<div className="text-center bg-gradient-to-r from-primary/10 to-chart-2/10 rounded-lg p-6">
<h3 className="text-2xl font-bold mb-4"> </h3>
<div className="text-3xl font-bold text-primary mb-2">
= × ( ÷ 100)
</div>
<p className="text-muted-foreground"> </p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<h4 className="font-semibold text-lg mb-3 flex items-center">
<DollarSign className="h-5 w-5 text-primary mr-2" />
(Bid Amount)
</h4>
<ul className="space-y-2 text-sm">
<li> 입찰가: $100</li>
<li> 입찰가: $100,000</li>
<li> </li>
<li> 기간: 기본 30</li>
</ul>
</div>
<div>
<h4 className="font-semibold text-lg mb-3 flex items-center">
<Star className="h-5 w-5 text-chart-2 mr-2" />
(Quality Score)
</h4>
<ul className="space-y-2 text-sm">
<li> 범위: 1-100</li>
<li> </li>
<li> </li>
<li> </li>
</ul>
</div>
</div>
</div>
</CardContent>
</Card>
{/* Quality Score System */}
<Card className="mb-8" data-testid="section-quality">
<CardHeader>
<CardTitle className="flex items-center space-x-2">
<Award className="h-5 w-5 text-chart-3" />
<span>3. </span>
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-6">
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<Card className="border-destructive/20">
<CardContent className="p-4 text-center">
<Badge variant="destructive" className="mb-2">1-40</Badge>
<h4 className="font-semibold mb-2"> </h4>
<ul className="text-xs space-y-1">
<li> </li>
<li> </li>
<li> </li>
</ul>
</CardContent>
</Card>
<Card className="border-chart-4/20">
<CardContent className="p-4 text-center">
<Badge variant="secondary" className="mb-2">41-70</Badge>
<h4 className="font-semibold mb-2"> </h4>
<ul className="text-xs space-y-1">
<li> </li>
<li> </li>
<li> </li>
</ul>
</CardContent>
</Card>
<Card className="border-chart-2/20">
<CardContent className="p-4 text-center">
<Badge variant="default" className="mb-2">71-100</Badge>
<h4 className="font-semibold mb-2"> </h4>
<ul className="text-xs space-y-1">
<li> </li>
<li> </li>
<li> </li>
</ul>
</CardContent>
</Card>
</div>
<div className="bg-chart-2/5 rounded-lg p-6">
<h4 className="font-semibold mb-3 flex items-center">
<Calculator className="h-5 w-5 text-chart-2 mr-2" />
</h4>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-sm">
<div>
<h5 className="font-medium mb-2">📈 </h5>
<p className="text-muted-foreground"> </p>
</div>
<div>
<h5 className="font-medium mb-2">💰 </h5>
<p className="text-muted-foreground"> </p>
</div>
<div>
<h5 className="font-medium mb-2">🎯 </h5>
<p className="text-muted-foreground"> </p>
</div>
</div>
</div>
</div>
</CardContent>
</Card>
{/* Auction Types */}
<Card className="mb-8" data-testid="section-types">
<CardHeader>
<CardTitle className="flex items-center space-x-2">
<List className="h-5 w-5 text-chart-4" />
<span>4. </span>
</CardTitle>
</CardHeader>
<CardContent>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<Card className="border-primary/20">
<CardContent className="p-4">
<h4 className="font-semibold text-lg mb-3 flex items-center">
<Users className="h-5 w-5 text-primary mr-2" />
People ()
</h4>
<ul className="space-y-2 text-sm">
<li> <strong>24 </strong></li>
<li> </li>
<li> </li>
<li> </li>
<li> 입찰: $500</li>
</ul>
</CardContent>
</Card>
<Card className="border-chart-1/20">
<CardContent className="p-4">
<h4 className="font-semibold text-lg mb-3 flex items-center">
<Hash className="h-5 w-5 text-chart-1 mr-2" />
Topics ()
</h4>
<ul className="space-y-2 text-sm">
<li> <strong>20 </strong></li>
<li> </li>
<li> </li>
<li> </li>
<li> 입찰: $300</li>
</ul>
</CardContent>
</Card>
<Card className="border-chart-2/20">
<CardContent className="p-4">
<h4 className="font-semibold text-lg mb-3 flex items-center">
<Building className="h-5 w-5 text-chart-2 mr-2" />
Companies ()
</h4>
<ul className="space-y-2 text-sm">
<li> <strong>27 </strong></li>
<li> </li>
<li> </li>
<li> </li>
<li> 입찰: $1,000</li>
</ul>
</CardContent>
</Card>
</div>
</CardContent>
</Card>
{/* Strategic Bidding */}
<Card className="mb-8" data-testid="section-strategy">
<CardHeader>
<CardTitle className="flex items-center space-x-2">
<Target className="h-5 w-5 text-chart-5" />
<span>5. </span>
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-6">
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<h4 className="font-semibold text-lg mb-3 text-primary">💡 </h4>
<ul className="space-y-2 text-sm">
<li> <strong> </strong>: ROI가 </li>
<li> <strong> </strong>: </li>
<li> <strong> </strong>: </li>
<li> <strong> </strong>: </li>
</ul>
</div>
<div>
<h4 className="font-semibold text-lg mb-3 text-destructive"> </h4>
<ul className="space-y-2 text-sm">
<li> <strong> </strong>: </li>
<li> <strong> </strong>: </li>
<li> <strong> </strong>: </li>
<li> <strong> </strong>: </li>
</ul>
</div>
</div>
<div className="bg-accent/10 rounded-lg p-6">
<h4 className="font-semibold mb-3 flex items-center">
<Lightbulb className="h-5 w-5 text-accent mr-2" />
</h4>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-sm">
<div>
<h5 className="font-medium mb-2">1단계: 준비</h5>
<ul className="space-y-1 text-muted-foreground">
<li> </li>
<li> </li>
<li> </li>
</ul>
</div>
<div>
<h5 className="font-medium mb-2">2단계: 분석</h5>
<ul className="space-y-1 text-muted-foreground">
<li> </li>
<li> </li>
<li> </li>
</ul>
</div>
<div>
<h5 className="font-medium mb-2">3단계: 실행</h5>
<ul className="space-y-1 text-muted-foreground">
<li> </li>
<li> </li>
<li> </li>
</ul>
</div>
</div>
</div>
</div>
</CardContent>
</Card>
{/* Technical Implementation */}
<Card className="mb-8" data-testid="section-technical">
<CardHeader>
<CardTitle className="flex items-center space-x-2">
<Brain className="h-5 w-5 text-primary" />
<span>6. </span>
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-6">
<div className="bg-primary/5 rounded-lg p-6">
<h4 className="font-semibold mb-3">🔧 </h4>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-sm">
<div>
<h5 className="font-medium mb-2"> </h5>
<ul className="space-y-1 text-muted-foreground">
<li> PostgreSQL </li>
<li> </li>
<li> </li>
</ul>
</div>
<div>
<h5 className="font-medium mb-2"> </h5>
<ul className="space-y-1 text-muted-foreground">
<li> </li>
<li> </li>
<li> </li>
</ul>
</div>
</div>
</div>
<div className="bg-chart-2/5 rounded-lg p-6">
<h4 className="font-semibold mb-3">📊 </h4>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-sm">
<div>
<h5 className="font-medium mb-2"> </h5>
<p className="text-muted-foreground"> </p>
</div>
<div>
<h5 className="font-medium mb-2"> </h5>
<p className="text-muted-foreground"> </p>
</div>
<div>
<h5 className="font-medium mb-2"> </h5>
<p className="text-muted-foreground"> ROI </p>
</div>
</div>
</div>
</div>
</CardContent>
</Card>
{/* Call to Action */}
<Card className="bg-gradient-to-r from-primary/10 to-chart-2/10">
<CardContent className="p-8 text-center">
<h3 className="text-2xl font-bold mb-4"> !</h3>
<p className="text-lg text-muted-foreground mb-6">
</p>
<div className="flex justify-center space-x-4">
<Link href="/auctions">
<Button size="lg" data-testid="button-view-auctions">
<Gavel className="mr-2 h-4 w-4" />
</Button>
</Link>
<Link href="/">
<Button variant="outline" size="lg" data-testid="button-back-home">
<Home className="mr-2 h-4 w-4" />
</Button>
</Link>
</div>
</CardContent>
</Card>
</main>
</div>
);
}

View File

@ -12,6 +12,8 @@ import { apiRequest } from "@/lib/queryClient";
import { isUnauthorizedError } from "@/lib/authUtils";
import AuctionCard from "@/components/AuctionCard";
import type { Auction, MediaOutlet } from "@shared/schema";
import { BookOpen } from "lucide-react";
import { Link } from "wouter";
export default function Auctions() {
const { user, isAuthenticated } = useAuth();
@ -169,13 +171,14 @@ export default function Auctions() {
</div>
<nav className="hidden md:flex space-x-6">
<a href="/" className="text-muted-foreground hover:text-foreground transition-colors">Home</a>
<a href="/auctions" className="text-foreground hover:text-primary transition-colors">Auctions</a>
<Link href="/" className="text-muted-foreground hover:text-foreground transition-colors">Home</Link>
<Link href="/auctions" className="text-foreground hover:text-primary transition-colors">Auctions</Link>
<Link href="/auction-guide" className="text-muted-foreground hover:text-foreground transition-colors">Auction Guide</Link>
<a href="#" className="text-muted-foreground hover:text-foreground transition-colors">Predictions</a>
{(user?.role === 'admin' || user?.role === 'superadmin') && (
<a href={user.role === 'admin' ? '/admin' : '/superadmin'} className="text-muted-foreground hover:text-foreground transition-colors">
<Link href={user.role === 'admin' ? '/admin' : '/superadmin'} className="text-muted-foreground hover:text-foreground transition-colors">
Dashboard
</a>
</Link>
)}
</nav>
</div>
@ -215,7 +218,15 @@ export default function Auctions() {
<main className="max-w-7xl mx-auto px-6 py-8">
{/* Page Header */}
<div className="mb-8">
<h1 className="text-3xl font-bold mb-4">Media Outlet Auctions</h1>
<div className="flex items-center justify-between mb-4">
<h1 className="text-3xl font-bold">Media Outlet Auctions</h1>
<Link href="/auction-guide">
<Button variant="outline" data-testid="button-auction-guide">
<BookOpen className="mr-2 h-4 w-4" />
Complete Auction Guide
</Button>
</Link>
</div>
<p className="text-lg text-muted-foreground mb-6">
Bid for exclusive editorial rights and content management privileges.
Based on competitive bidding similar to advertising platforms, combining bid amount with quality scores.