feat: Mobile-optimized landing page + Header drawer + Footer improvements
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled

This commit is contained in:
2025-12-13 17:33:08 +01:00
parent ce961aa03d
commit 4a1ebf0024
6 changed files with 1388 additions and 744 deletions

View File

@ -273,7 +273,7 @@ async def get_yield_domain(
@router.post("/activate", response_model=ActivateYieldResponse) @router.post("/activate", response_model=ActivateYieldResponse)
async def activate_domain_for_yield( async def activate_domain_for_yield(
request: ActivateYieldRequest, request: ActivateYieldRequest,
db: Session = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user), current_user: User = Depends(get_current_user),
): ):
""" """
@ -284,7 +284,10 @@ async def activate_domain_for_yield(
domain = request.domain.lower().strip() domain = request.domain.lower().strip()
# Check if domain already exists # Check if domain already exists
existing = db.query(YieldDomain).filter(YieldDomain.domain == domain).first() existing_result = await db.execute(
select(YieldDomain).where(YieldDomain.domain == domain)
)
existing = existing_result.scalar_one_or_none()
if existing: if existing:
if existing.user_id == current_user.id: if existing.user_id == current_user.id:
raise HTTPException( raise HTTPException(
@ -313,17 +316,20 @@ async def activate_domain_for_yield(
# Find best matching partner # Find best matching partner
if intent_result.suggested_partners: if intent_result.suggested_partners:
partner = db.query(AffiliatePartner).filter( partner_result = await db.execute(
AffiliatePartner.slug == intent_result.suggested_partners[0], select(AffiliatePartner).where(
AffiliatePartner.is_active == True, AffiliatePartner.slug == intent_result.suggested_partners[0],
).first() AffiliatePartner.is_active == True,
)
)
partner = partner_result.scalar_one_or_none()
if partner: if partner:
yield_domain.partner_id = partner.id yield_domain.partner_id = partner.id
yield_domain.active_route = partner.slug yield_domain.active_route = partner.slug
db.add(yield_domain) db.add(yield_domain)
db.commit() await db.commit()
db.refresh(yield_domain) await db.refresh(yield_domain)
# Create DNS instructions # Create DNS instructions
dns_instructions = DNSSetupInstructions( dns_instructions = DNSSetupInstructions(
@ -362,16 +368,19 @@ async def activate_domain_for_yield(
@router.post("/domains/{domain_id}/verify", response_model=DNSVerificationResult) @router.post("/domains/{domain_id}/verify", response_model=DNSVerificationResult)
async def verify_domain_dns( async def verify_domain_dns(
domain_id: int, domain_id: int,
db: Session = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user), current_user: User = Depends(get_current_user),
): ):
""" """
Verify DNS configuration for a yield domain. Verify DNS configuration for a yield domain.
""" """
domain = db.query(YieldDomain).filter( result = await db.execute(
YieldDomain.id == domain_id, select(YieldDomain).where(
YieldDomain.user_id == current_user.id, YieldDomain.id == domain_id,
).first() YieldDomain.user_id == current_user.id,
)
)
domain = result.scalar_one_or_none()
if not domain: if not domain:
raise HTTPException(status_code=404, detail="Yield domain not found") raise HTTPException(status_code=404, detail="Yield domain not found")
@ -421,7 +430,7 @@ async def verify_domain_dns(
domain.dns_verified_at = datetime.utcnow() domain.dns_verified_at = datetime.utcnow()
domain.status = "active" domain.status = "active"
domain.activated_at = datetime.utcnow() domain.activated_at = datetime.utcnow()
db.commit() await db.commit()
return DNSVerificationResult( return DNSVerificationResult(
domain=domain.domain, domain=domain.domain,
@ -438,16 +447,19 @@ async def verify_domain_dns(
async def update_yield_domain( async def update_yield_domain(
domain_id: int, domain_id: int,
update: YieldDomainUpdate, update: YieldDomainUpdate,
db: Session = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user), current_user: User = Depends(get_current_user),
): ):
""" """
Update yield domain settings. Update yield domain settings.
""" """
domain = db.query(YieldDomain).filter( result = await db.execute(
YieldDomain.id == domain_id, select(YieldDomain).where(
YieldDomain.user_id == current_user.id, YieldDomain.id == domain_id,
).first() YieldDomain.user_id == current_user.id,
)
)
domain = result.scalar_one_or_none()
if not domain: if not domain:
raise HTTPException(status_code=404, detail="Yield domain not found") raise HTTPException(status_code=404, detail="Yield domain not found")
@ -455,10 +467,13 @@ async def update_yield_domain(
# Apply updates # Apply updates
if update.active_route is not None: if update.active_route is not None:
# Validate partner exists # Validate partner exists
partner = db.query(AffiliatePartner).filter( partner_result = await db.execute(
AffiliatePartner.slug == update.active_route, select(AffiliatePartner).where(
AffiliatePartner.is_active == True, AffiliatePartner.slug == update.active_route,
).first() AffiliatePartner.is_active == True,
)
)
partner = partner_result.scalar_one_or_none()
if not partner: if not partner:
raise HTTPException(status_code=400, detail="Invalid partner route") raise HTTPException(status_code=400, detail="Invalid partner route")
domain.active_route = update.active_route domain.active_route = update.active_route
@ -475,8 +490,8 @@ async def update_yield_domain(
domain.status = "active" domain.status = "active"
domain.paused_at = None domain.paused_at = None
db.commit() await db.commit()
db.refresh(domain) await db.refresh(domain)
return _domain_to_response(domain) return _domain_to_response(domain)
@ -484,22 +499,25 @@ async def update_yield_domain(
@router.delete("/domains/{domain_id}") @router.delete("/domains/{domain_id}")
async def delete_yield_domain( async def delete_yield_domain(
domain_id: int, domain_id: int,
db: Session = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user), current_user: User = Depends(get_current_user),
): ):
""" """
Remove a domain from yield program. Remove a domain from yield program.
""" """
domain = db.query(YieldDomain).filter( result = await db.execute(
YieldDomain.id == domain_id, select(YieldDomain).where(
YieldDomain.user_id == current_user.id, YieldDomain.id == domain_id,
).first() YieldDomain.user_id == current_user.id,
)
)
domain = result.scalar_one_or_none()
if not domain: if not domain:
raise HTTPException(status_code=404, detail="Yield domain not found") raise HTTPException(status_code=404, detail="Yield domain not found")
db.delete(domain) await db.delete(domain)
db.commit() await db.commit()
return {"message": "Yield domain removed"} return {"message": "Yield domain removed"}
@ -514,29 +532,53 @@ async def list_transactions(
status: Optional[str] = Query(None), status: Optional[str] = Query(None),
limit: int = Query(50, le=100), limit: int = Query(50, le=100),
offset: int = Query(0, ge=0), offset: int = Query(0, ge=0),
db: Session = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user), current_user: User = Depends(get_current_user),
): ):
""" """
List yield transactions for user's domains. List yield transactions for user's domains.
""" """
# Get user's domain IDs # Get user's domain IDs
domain_ids = db.query(YieldDomain.id).filter( domain_ids_result = await db.execute(
YieldDomain.user_id == current_user.id select(YieldDomain.id).where(YieldDomain.user_id == current_user.id)
).subquery() )
domain_ids = [row[0] for row in domain_ids_result.all()]
query = db.query(YieldTransaction).filter( if not domain_ids:
return YieldTransactionListResponse(
transactions=[],
total=0,
total_gross=Decimal("0"),
total_net=Decimal("0"),
)
query = select(YieldTransaction).where(
YieldTransaction.yield_domain_id.in_(domain_ids) YieldTransaction.yield_domain_id.in_(domain_ids)
) )
if domain_id: if domain_id:
query = query.filter(YieldTransaction.yield_domain_id == domain_id) query = query.where(YieldTransaction.yield_domain_id == domain_id)
if status: if status:
query = query.filter(YieldTransaction.status == status) query = query.where(YieldTransaction.status == status)
total = query.count() # Get count
transactions = query.order_by(YieldTransaction.created_at.desc()).offset(offset).limit(limit).all() count_query = select(func.count(YieldTransaction.id)).where(
YieldTransaction.yield_domain_id.in_(domain_ids)
)
if domain_id:
count_query = count_query.where(YieldTransaction.yield_domain_id == domain_id)
if status:
count_query = count_query.where(YieldTransaction.status == status)
count_result = await db.execute(count_query)
total = count_result.scalar() or 0
# Get transactions
result = await db.execute(
query.order_by(YieldTransaction.created_at.desc()).offset(offset).limit(limit)
)
transactions = list(result.scalars().all())
# Aggregates # Aggregates
total_gross = sum(tx.gross_amount for tx in transactions) total_gross = sum(tx.gross_amount for tx in transactions)
@ -559,19 +601,28 @@ async def list_payouts(
status: Optional[str] = Query(None), status: Optional[str] = Query(None),
limit: int = Query(20, le=50), limit: int = Query(20, le=50),
offset: int = Query(0, ge=0), offset: int = Query(0, ge=0),
db: Session = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user), current_user: User = Depends(get_current_user),
): ):
""" """
List user's yield payouts. List user's yield payouts.
""" """
query = db.query(YieldPayout).filter(YieldPayout.user_id == current_user.id) query = select(YieldPayout).where(YieldPayout.user_id == current_user.id)
if status: if status:
query = query.filter(YieldPayout.status == status) query = query.where(YieldPayout.status == status)
total = query.count() # Get count
payouts = query.order_by(YieldPayout.created_at.desc()).offset(offset).limit(limit).all() count_result = await db.execute(
select(func.count(YieldPayout.id)).where(YieldPayout.user_id == current_user.id)
)
total = count_result.scalar() or 0
# Get payouts
result = await db.execute(
query.order_by(YieldPayout.created_at.desc()).offset(offset).limit(limit)
)
payouts = list(result.scalars().all())
# Aggregates # Aggregates
total_paid = sum(p.amount for p in payouts if p.status == "completed") total_paid = sum(p.amount for p in payouts if p.status == "completed")
@ -592,14 +643,17 @@ async def list_payouts(
@router.get("/partners", response_model=list[AffiliatePartnerResponse]) @router.get("/partners", response_model=list[AffiliatePartnerResponse])
async def list_partners( async def list_partners(
category: Optional[str] = Query(None, description="Filter by intent category"), category: Optional[str] = Query(None, description="Filter by intent category"),
db: Session = Depends(get_db), db: AsyncSession = Depends(get_db),
): ):
""" """
List available affiliate partners. List available affiliate partners.
""" """
query = db.query(AffiliatePartner).filter(AffiliatePartner.is_active == True) result = await db.execute(
select(AffiliatePartner)
partners = query.order_by(AffiliatePartner.priority.desc()).all() .where(AffiliatePartner.is_active == True)
.order_by(AffiliatePartner.priority.desc())
)
partners = list(result.scalars().all())
# Filter by category if specified # Filter by category if specified
if category: if category:
@ -678,6 +732,4 @@ def _payout_to_response(payout: YieldPayout) -> YieldPayoutResponse:
) )
# Missing import
from sqlalchemy import Integer

View File

@ -30,7 +30,9 @@ import {
Radar, Radar,
Scan, Scan,
Radio, Radio,
Cpu Cpu,
Clock,
ExternalLink
} from 'lucide-react' } from 'lucide-react'
import Link from 'next/link' import Link from 'next/link'
import clsx from 'clsx' import clsx from 'clsx'
@ -42,21 +44,20 @@ interface HotAuction {
platform: string platform: string
} }
// High-end Live Market Ticker - Monochrome & Technical // Compact Ticker for Mobile
function MarketTicker({ auctions }: { auctions: HotAuction[] }) { function MarketTicker({ auctions }: { auctions: HotAuction[] }) {
const tickerRef = useRef<HTMLDivElement>(null) const tickerRef = useRef<HTMLDivElement>(null)
if (auctions.length === 0) return null if (auctions.length === 0) return null
// Create enough duplicates to fill even large screens
const items = [...auctions, ...auctions, ...auctions] const items = [...auctions, ...auctions, ...auctions]
return ( return (
<div className="relative z-20 border-y border-white/[0.08] bg-[#020202] overflow-hidden"> <div className="relative z-20 border-y border-white/[0.08] bg-[#020202] overflow-hidden">
<div className="absolute left-0 top-0 bottom-0 w-32 bg-gradient-to-r from-[#020202] to-transparent z-10" /> <div className="absolute left-0 top-0 bottom-0 w-16 sm:w-32 bg-gradient-to-r from-[#020202] to-transparent z-10" />
<div className="absolute right-0 top-0 bottom-0 w-32 bg-gradient-to-l from-[#020202] to-transparent z-10" /> <div className="absolute right-0 top-0 bottom-0 w-16 sm:w-32 bg-gradient-to-l from-[#020202] to-transparent z-10" />
<div className="py-3"> <div className="py-2 sm:py-3">
<div <div
ref={tickerRef} ref={tickerRef}
className="flex animate-[ticker_60s_linear_infinite] hover:[animation-play-state:paused]" className="flex animate-[ticker_60s_linear_infinite] hover:[animation-play-state:paused]"
@ -65,17 +66,17 @@ function MarketTicker({ auctions }: { auctions: HotAuction[] }) {
{items.map((auction, i) => ( {items.map((auction, i) => (
<div <div
key={`${auction.domain}-${i}`} key={`${auction.domain}-${i}`}
className="flex items-center gap-6 px-8 border-r border-white/[0.08] group cursor-default transition-colors hover:bg-white/[0.02]" className="flex items-center gap-3 sm:gap-6 px-4 sm:px-8 border-r border-white/[0.08] group cursor-default transition-colors hover:bg-white/[0.02]"
> >
<div className="flex items-center gap-3"> <div className="flex items-center gap-2 sm:gap-3">
<div className="w-1.5 h-1.5 rounded-none bg-accent opacity-50 group-hover:opacity-100 transition-opacity" /> <div className="w-1 h-1 sm:w-1.5 sm:h-1.5 bg-accent opacity-50 group-hover:opacity-100 transition-opacity" />
<span className="font-mono text-xs text-white/70 font-medium group-hover:text-white transition-colors tracking-wide"> <span className="font-mono text-[10px] sm:text-xs text-white/70 font-medium group-hover:text-white transition-colors tracking-wide">
{auction.domain} {auction.domain}
</span> </span>
</div> </div>
<div className="flex items-center gap-4"> <div className="flex items-center gap-2 sm:gap-4">
<span className="text-xs text-white font-medium tracking-tight">${auction.current_bid.toLocaleString()}</span> <span className="text-[10px] sm:text-xs text-white font-medium">${auction.current_bid.toLocaleString()}</span>
<span className="text-[10px] text-white/30 font-mono uppercase tracking-wider">{auction.time_remaining}</span> <span className="hidden sm:inline text-[10px] text-white/30 font-mono uppercase tracking-wider">{auction.time_remaining}</span>
</div> </div>
</div> </div>
))} ))}
@ -110,7 +111,7 @@ export default function HomePage() {
return ( return (
<div className="min-h-screen flex items-center justify-center bg-[#020202]"> <div className="min-h-screen flex items-center justify-center bg-[#020202]">
<div className="relative"> <div className="relative">
<div className="w-12 h-12 border-[0.5px] border-white/10 border-t-accent animate-spin rounded-full" /> <div className="w-10 h-10 sm:w-12 sm:h-12 border-[0.5px] border-white/10 border-t-accent animate-spin rounded-full" />
</div> </div>
</div> </div>
) )
@ -118,120 +119,117 @@ export default function HomePage() {
return ( return (
<div className="min-h-screen bg-[#020202] text-white relative overflow-x-hidden selection:bg-accent/30 selection:text-white"> <div className="min-h-screen bg-[#020202] text-white relative overflow-x-hidden selection:bg-accent/30 selection:text-white">
{/* Cinematic Background - Architectural & Fine */} {/* Background */}
<div className="fixed inset-0 pointer-events-none z-0"> <div className="fixed inset-0 pointer-events-none z-0">
<div className="absolute inset-0 bg-[url('/noise.png')] opacity-[0.03] mix-blend-overlay" /> <div className="absolute inset-0 bg-[url('/noise.png')] opacity-[0.03] mix-blend-overlay" />
<div <div
className="absolute inset-0 opacity-[0.03]" className="absolute inset-0 opacity-[0.02] sm:opacity-[0.03]"
style={{ style={{
backgroundImage: `linear-gradient(rgba(255,255,255,0.3) 0.5px, transparent 0.5px), linear-gradient(90deg, rgba(255,255,255,0.3) 0.5px, transparent 0.5px)`, backgroundImage: `linear-gradient(rgba(255,255,255,0.3) 0.5px, transparent 0.5px), linear-gradient(90deg, rgba(255,255,255,0.3) 0.5px, transparent 0.5px)`,
backgroundSize: '160px 160px', backgroundSize: '80px 80px',
}} }}
/> />
<div className="absolute top-[-30%] left-1/2 -translate-x-1/2 w-[1200px] h-[800px] bg-accent/[0.02] rounded-full blur-[200px]" /> <div className="absolute top-[-30%] left-1/2 -translate-x-1/2 w-[800px] sm:w-[1200px] h-[600px] sm:h-[800px] bg-accent/[0.02] rounded-full blur-[150px] sm:blur-[200px]" />
</div> </div>
<Header /> <Header />
{/* HERO SECTION: Brutally Catchy & Noble */} {/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative min-h-[90vh] flex flex-col justify-center pt-32 pb-24 px-4 sm:px-6 z-10"> {/* HERO SECTION */}
{/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative min-h-[85vh] sm:min-h-[90vh] flex flex-col justify-center pt-20 sm:pt-32 pb-12 sm:pb-24 px-4 sm:px-6 z-10">
<div className="max-w-[1400px] mx-auto w-full"> <div className="max-w-[1400px] mx-auto w-full">
<div className="grid lg:grid-cols-12 gap-16 lg:gap-24 items-center"> <div className="grid lg:grid-cols-12 gap-8 lg:gap-24 items-center">
{/* Left: Typography & Brand */} {/* Left: Typography & Brand */}
<div className="lg:col-span-7 relative z-20 text-center lg:text-left"> <div className="lg:col-span-7 relative z-20 text-center lg:text-left">
{/* Brand Seal */} {/* Brand Seal - Mobile */}
<div className="inline-flex items-center gap-4 mb-10 animate-fade-in opacity-0" style={{ animationDelay: '0.1s', animationFillMode: 'forwards' }}> <div className="inline-flex items-center gap-3 mb-6 sm:mb-10 animate-fade-in opacity-0" style={{ animationDelay: '0.1s', animationFillMode: 'forwards' }}>
<div className="relative w-16 h-16"> <div className="relative w-10 h-10 sm:w-16 sm:h-16">
<div className="absolute inset-0 bg-accent/20 blur-xl rounded-full animate-pulse" /> <div className="absolute inset-0 bg-accent/20 blur-xl rounded-full animate-pulse" />
<Image <Image
src="/pounce-puma.png" src="/pounce-puma.png"
alt="Pounce Seal" alt="Pounce"
fill fill
className="object-contain drop-shadow-[0_0_20px_rgba(16,185,129,0.2)]" className="object-contain drop-shadow-[0_0_20px_rgba(16,185,129,0.2)]"
priority priority
/> />
</div> </div>
<div className="h-px w-12 bg-white/10" /> <div className="h-px w-6 sm:w-12 bg-white/10" />
<span className="text-[10px] font-mono uppercase tracking-[0.3em] text-accent">Est. 2025 // Global Operations</span> <span className="text-[8px] sm:text-[10px] font-mono uppercase tracking-[0.2em] sm:tracking-[0.3em] text-accent">Est. 2025</span>
</div> </div>
{/* Headline */} {/* Headline - Responsive */}
<h1 className="font-display text-[3.5rem] sm:text-[5rem] md:text-[6rem] lg:text-[7rem] leading-[0.9] tracking-[-0.04em] text-white mb-8"> <h1 className="font-display text-[2.5rem] sm:text-[4rem] md:text-[5rem] lg:text-[6rem] leading-[0.95] tracking-[-0.03em] text-white mb-6 sm:mb-8">
<span className="block animate-slide-up opacity-0" style={{ animationDelay: '0.2s', animationFillMode: 'forwards' }}> <span className="block animate-slide-up opacity-0" style={{ animationDelay: '0.2s', animationFillMode: 'forwards' }}>
The market The market
</span> </span>
<span className="block text-white animate-slide-up opacity-0" style={{ animationDelay: '0.4s', animationFillMode: 'forwards' }}> <span className="block text-white animate-slide-up opacity-0" style={{ animationDelay: '0.4s', animationFillMode: 'forwards' }}>
never sleeps. never sleeps.
</span> </span>
<span className="block mt-4 lg:mt-6 text-white/40 animate-slide-up opacity-0" style={{ animationDelay: '0.6s', animationFillMode: 'forwards' }}> <span className="block mt-2 sm:mt-4 text-white/40 animate-slide-up opacity-0" style={{ animationDelay: '0.6s', animationFillMode: 'forwards' }}>
You should. You should.
</span> </span>
</h1> </h1>
{/* Subline & Stats */} {/* Subline */}
<div className="animate-slide-up opacity-0" style={{ animationDelay: '0.8s', animationFillMode: 'forwards' }}> <div className="animate-slide-up opacity-0" style={{ animationDelay: '0.8s', animationFillMode: 'forwards' }}>
<p className="text-lg lg:text-xl text-white/60 max-w-xl font-light leading-relaxed mb-12 lg:mx-0 mx-auto"> <p className="text-sm sm:text-lg lg:text-xl text-white/60 max-w-xl font-light leading-relaxed mb-8 sm:mb-12 lg:mx-0 mx-auto">
Transforming domains from static addresses into yield-bearing financial assets. Transforming domains from static addresses into yield-bearing financial assets.
<span className="text-white block mt-1 font-medium">Scan. Acquire. Route. Profit.</span> <span className="text-white block mt-1 font-medium">Scan. Acquire. Route. Profit.</span>
</p> </p>
{/* Stats Grid */} {/* Stats Grid - Mobile 2x2 */}
<div className="grid grid-cols-2 sm:grid-cols-4 gap-x-8 gap-y-4 pt-8 border-t border-white/[0.08]"> <div className="grid grid-cols-2 sm:grid-cols-4 gap-4 sm:gap-x-8 sm:gap-y-4 pt-6 sm:pt-8 border-t border-white/[0.08]">
<div> {[
<div className="text-2xl font-display text-white mb-1">886+</div> { value: '886+', label: 'TLDs Scanned' },
<div className="text-[10px] uppercase tracking-widest text-white/40 font-mono">TLDs Scanned</div> { value: '24/7', label: 'Live Recon' },
</div> { value: '10s', label: 'Latency' },
<div> { value: '$1B+', label: 'Assets Tracked' },
<div className="text-2xl font-display text-white mb-1">24/7</div> ].map((stat, i) => (
<div className="text-[10px] uppercase tracking-widest text-white/40 font-mono">Live Recon</div> <div key={i} className="text-center sm:text-left">
</div> <div className="text-xl sm:text-2xl font-display text-white mb-1">{stat.value}</div>
<div> <div className="text-[9px] sm:text-[10px] uppercase tracking-widest text-white/40 font-mono">{stat.label}</div>
<div className="text-2xl font-display text-white mb-1">10s</div> </div>
<div className="text-[10px] uppercase tracking-widest text-white/40 font-mono">Latency</div> ))}
</div>
<div>
<div className="text-2xl font-display text-white mb-1">$1B+</div>
<div className="text-[10px] uppercase tracking-widest text-white/40 font-mono">Assets Tracked</div>
</div>
</div> </div>
</div> </div>
</div> </div>
{/* Right: The Artifact (Domain Checker) */} {/* Right: Domain Checker */}
<div className="lg:col-span-5 relative animate-scale-in opacity-0 mt-8 lg:mt-0" style={{ animationDelay: '1s', animationFillMode: 'forwards' }}> <div className="lg:col-span-5 relative animate-scale-in opacity-0 mt-4 lg:mt-0" style={{ animationDelay: '1s', animationFillMode: 'forwards' }}>
<div className="absolute -inset-1 bg-gradient-to-tr from-accent/20 via-white/10 to-accent/20 blur-2xl opacity-40" /> <div className="absolute -inset-1 bg-gradient-to-tr from-accent/20 via-white/10 to-accent/20 blur-2xl opacity-40" />
<div className="relative z-10 bg-[#0A0A0A] border border-white/20 p-2 shadow-2xl"> <div className="relative z-10 bg-[#0A0A0A] border border-white/20 p-1.5 sm:p-2 shadow-2xl">
{/* Tech Corners */} {/* Tech Corners */}
<div className="absolute -top-px -left-px w-4 h-4 border-t border-l border-white/40" /> <div className="absolute -top-px -left-px w-3 h-3 sm:w-4 sm:h-4 border-t border-l border-white/40" />
<div className="absolute -top-px -right-px w-4 h-4 border-t border-r border-white/40" /> <div className="absolute -top-px -right-px w-3 h-3 sm:w-4 sm:h-4 border-t border-r border-white/40" />
<div className="absolute -bottom-px -left-px w-4 h-4 border-b border-l border-white/40" /> <div className="absolute -bottom-px -left-px w-3 h-3 sm:w-4 sm:h-4 border-b border-l border-white/40" />
<div className="absolute -bottom-px -right-px w-4 h-4 border-b border-r border-white/40" /> <div className="absolute -bottom-px -right-px w-3 h-3 sm:w-4 sm:h-4 border-b border-r border-white/40" />
<div className="bg-[#050505] p-8 lg:p-10 border border-white/5 relative overflow-hidden"> <div className="bg-[#050505] p-5 sm:p-8 lg:p-10 border border-white/5 relative overflow-hidden">
<div className="absolute inset-0 bg-white/[0.02]" /> <div className="absolute inset-0 bg-white/[0.02]" />
<div className="relative z-10"> <div className="relative z-10">
<div className="flex items-center justify-between mb-8"> <div className="flex items-center justify-between mb-5 sm:mb-8">
<span className="text-[10px] font-mono uppercase tracking-[0.2em] text-accent flex items-center gap-2"> <span className="text-[9px] sm:text-[10px] font-mono uppercase tracking-[0.15em] sm:tracking-[0.2em] text-accent flex items-center gap-2">
<span className="w-1.5 h-1.5 bg-accent animate-pulse" /> <span className="w-1.5 h-1.5 bg-accent animate-pulse" />
Terminal Access Terminal Access
</span> </span>
<div className="flex gap-1.5"> <div className="flex gap-1">
<div className="w-1 h-1 bg-white/20" /> <div className="w-1 h-1 bg-white/20" />
<div className="w-1 h-1 bg-white/20" /> <div className="w-1 h-1 bg-white/20" />
<div className="w-1 h-1 bg-white/20" /> <div className="w-1 h-1 bg-white/20" />
</div> </div>
</div> </div>
<div className="bg-[#0A0A0A] border-[0.5px] border-white/10 p-2 shadow-inner"> <div className="bg-[#0A0A0A] border-[0.5px] border-white/10 p-1.5 sm:p-2 shadow-inner">
<DomainChecker /> <DomainChecker />
</div> </div>
<div className="mt-8 pt-8 border-t border-white/[0.05] flex justify-between items-center text-[10px] text-white/30 font-mono"> <div className="mt-5 sm:mt-8 pt-5 sm:pt-8 border-t border-white/[0.05] flex justify-between items-center text-[9px] sm:text-[10px] text-white/30 font-mono">
<span>SECURE CONNECTION</span> <span>SECURE CONNECTION</span>
<span>V2.0.4 [STABLE]</span> <span>V2.0.4</span>
</div> </div>
</div> </div>
</div> </div>
@ -241,54 +239,52 @@ export default function HomePage() {
</div> </div>
</section> </section>
{/* Ticker - Minimalist */} {/* Ticker */}
{!loadingAuctions && hotAuctions.length > 0 && ( {!loadingAuctions && hotAuctions.length > 0 && (
<MarketTicker auctions={hotAuctions} /> <MarketTicker auctions={hotAuctions} />
)} )}
{/* THE PARADIGM SHIFT - Problem / Solution */} {/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-32 px-4 sm:px-6 border-b border-white/[0.05]"> {/* PARADIGM SHIFT */}
{/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-16 sm:py-32 px-4 sm:px-6 border-b border-white/[0.05]">
<div className="max-w-[1200px] mx-auto"> <div className="max-w-[1200px] mx-auto">
<div className="grid lg:grid-cols-2 gap-16 lg:gap-24 items-center"> <div className="grid lg:grid-cols-2 gap-10 lg:gap-24 items-center">
<div> <div>
<span className="text-accent font-mono text-xs uppercase tracking-[0.2em] mb-4 block">The Broken Model</span> <span className="text-accent font-mono text-[10px] sm:text-xs uppercase tracking-[0.2em] mb-3 sm:mb-4 block">The Broken Model</span>
<h2 className="font-display text-4xl sm:text-5xl text-white leading-tight mb-8"> <h2 className="font-display text-2xl sm:text-4xl lg:text-5xl text-white leading-tight mb-6 sm:mb-8">
99% of portfolios are <br/><span className="text-white/30">bleeding cash.</span> 99% of portfolios are <br className="hidden sm:block"/><span className="text-white/30">bleeding cash.</span>
</h2> </h2>
<div className="space-y-6 text-white/60 leading-relaxed text-lg font-light"> <div className="space-y-4 sm:space-y-6 text-white/60 leading-relaxed text-sm sm:text-lg font-light">
<p> <p>Investors pay renewal fees for years, hoping for a "Unicorn" sale that never happens.</p>
Investors pay renewal fees for years, hoping for a "Unicorn" sale that never happens. It's gambling, not investing. <p>Traditional parking pays pennies. Marketplaces charge 20% fees. The system drains your capital.</p>
</p>
<p>
Traditional parking pays pennies. Marketplaces charge 20% fees. The system is designed to drain your capital.
</p>
</div> </div>
</div> </div>
<div className="relative"> <div className="relative">
<div className="absolute -inset-4 bg-accent/5 blur-3xl" /> <div className="absolute -inset-4 bg-accent/5 blur-3xl" />
<div className="relative bg-[#050505] border border-white/10 p-8 lg:p-12"> <div className="relative bg-[#050505] border border-white/10 p-6 sm:p-8 lg:p-12">
<span className="text-accent font-mono text-xs uppercase tracking-[0.2em] mb-4 block">The Pounce Protocol</span> <span className="text-accent font-mono text-[10px] sm:text-xs uppercase tracking-[0.2em] mb-3 sm:mb-4 block">The Pounce Protocol</span>
<h3 className="font-display text-3xl text-white mb-8">Asset Class V2.0</h3> <h3 className="font-display text-xl sm:text-3xl text-white mb-6 sm:mb-8">Asset Class V2.0</h3>
<ul className="space-y-6 font-mono text-sm text-white/80"> <ul className="space-y-5 sm:space-y-6 font-mono text-xs sm:text-sm text-white/80">
<li className="flex items-start gap-4"> <li className="flex items-start gap-3 sm:gap-4">
<Radar className="w-5 h-5 text-accent mt-px shrink-0" /> <Radar className="w-4 h-4 sm:w-5 sm:h-5 text-accent mt-px shrink-0" />
<div> <div>
<span className="text-white font-bold block mb-1">Deep Recon</span> <span className="text-white font-bold block mb-1">Deep Recon</span>
<span className="text-white/50">Zone file analysis reveals what's truly valuable. Don't guess. Know.</span> <span className="text-white/50 text-[11px] sm:text-sm">Zone file analysis reveals what's truly valuable.</span>
</div> </div>
</li> </li>
<li className="flex items-start gap-4"> <li className="flex items-start gap-3 sm:gap-4">
<Zap className="w-5 h-5 text-accent mt-px shrink-0" /> <Zap className="w-4 h-4 sm:w-5 sm:h-5 text-accent mt-px shrink-0" />
<div> <div>
<span className="text-white font-bold block mb-1">Frictionless Liquidity</span> <span className="text-white font-bold block mb-1">Frictionless Liquidity</span>
<span className="text-white/50">Instant settlement. Verified owners. 0% Commission.</span> <span className="text-white/50 text-[11px] sm:text-sm">Instant settlement. 0% Commission.</span>
</div> </div>
</li> </li>
<li className="flex items-start gap-4"> <li className="flex items-start gap-3 sm:gap-4">
<Coins className="w-5 h-5 text-accent mt-px shrink-0" /> <Coins className="w-4 h-4 sm:w-5 sm:h-5 text-accent mt-px shrink-0" />
<div> <div>
<span className="text-white font-bold block mb-1">Automated Yield</span> <span className="text-white font-bold block mb-1">Automated Yield</span>
<span className="text-white/50">Domains pay for their own renewals via Intent Routing™.</span> <span className="text-white/50 text-[11px] sm:text-sm">Domains pay for their own renewals.</span>
</div> </div>
</li> </li>
</ul> </ul>
@ -298,320 +294,281 @@ export default function HomePage() {
</div> </div>
</section> </section>
{/* ═══════════════════════════════════════════════════════════════════════ */}
{/* CORE ARCHITECTURE - 3 Pillars */} {/* CORE ARCHITECTURE - 3 Pillars */}
<section className="relative py-40 px-4 sm:px-6 bg-[#020202]"> {/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-20 sm:py-40 px-4 sm:px-6 bg-[#020202]">
<div className="max-w-[1400px] mx-auto"> <div className="max-w-[1400px] mx-auto">
{/* Section Header */} {/* Section Header */}
<div className="flex flex-col lg:flex-row justify-between items-end mb-24 border-b border-white/[0.08] pb-12"> <div className="flex flex-col lg:flex-row justify-between items-start lg:items-end mb-12 sm:mb-24 border-b border-white/[0.08] pb-8 sm:pb-12">
<div> <div>
<span className="text-accent font-mono text-xs uppercase tracking-[0.2em] mb-4 block">Core Architecture</span> <span className="text-accent font-mono text-[10px] sm:text-xs uppercase tracking-[0.2em] mb-3 sm:mb-4 block">Core Architecture</span>
<h2 className="font-display text-4xl sm:text-5xl lg:text-6xl text-white leading-none"> <h2 className="font-display text-3xl sm:text-4xl lg:text-6xl text-white leading-none">
The Lifecycle <br /> The Lifecycle <br />
<span className="text-white/30">Engine.</span> <span className="text-white/30">Engine.</span>
</h2> </h2>
</div> </div>
<p className="text-white/50 max-w-md text-sm font-mono mt-8 lg:mt-0 leading-relaxed text-right"> <p className="hidden lg:block text-white/50 max-w-md text-sm font-mono mt-8 lg:mt-0 leading-relaxed text-right">
// INTELLIGENCE_LAYER_ACTIVE<br /> // INTELLIGENCE_LAYER_ACTIVE<br />
// MARKET_PROTOCOL_READY<br /> // MARKET_PROTOCOL_READY<br />
// YIELD_GENERATION_STANDBY // YIELD_GENERATION_STANDBY
</p> </p>
</div> </div>
<div className="grid grid-cols-1 lg:grid-cols-3 gap-px bg-white/[0.08] border border-white/[0.08]"> {/* Pillars - Stacked on Mobile */}
<div className="grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-px bg-transparent lg:bg-white/[0.08] lg:border lg:border-white/[0.08]">
{/* 1. INTELLIGENCE */} {[
<div className="group relative bg-[#030303] p-10 lg:p-14 hover:bg-[#050505] transition-colors duration-500"> {
<div className="absolute top-0 right-0 p-6 opacity-0 group-hover:opacity-100 transition-opacity duration-500"> module: '01',
<ArrowUpRight className="w-6 h-6 text-white/20" /> title: 'Intelligence',
</div> desc: '"Identify Targets." We scan 886+ TLDs in real-time to uncover hidden opportunities.',
features: [
<div className="h-full flex flex-col justify-between"> { icon: Scan, title: 'Global Scan', desc: 'Zone file analysis' },
<div> { icon: Target, title: 'Valuation AI', desc: 'Instant fair-market value' },
<div className="mb-8 font-mono text-xs text-accent uppercase tracking-widest border border-accent/20 inline-block px-3 py-1 bg-accent/5 rounded-none"> ],
Module 01 },
</div> {
<h3 className="text-3xl text-white font-display mb-6">Intelligence</h3> module: '02',
<p className="text-white/50 leading-relaxed text-lg font-light mb-12"> title: 'Market',
"Identify Targets." We scan 886+ TLDs in real-time to uncover hidden opportunities before the market reacts. desc: '"Secure the Asset." Direct access to liquidity with verified owners and 0% commission.',
</p> features: [
{ icon: ShieldCheck, title: 'Verified Owners', desc: 'Mandatory DNS check' },
{ icon: Gavel, title: 'Direct Execution', desc: 'P2P transfers' },
],
},
{
module: '03',
title: 'Yield',
desc: '"Deploy the Asset." Transform idle domains into automated revenue generators.',
features: [
{ icon: Layers, title: 'Intent Routing', desc: 'Traffic to partners' },
{ icon: Coins, title: 'Passive Income', desc: 'Monthly payouts' },
],
},
].map((pillar, i) => (
<div key={i} className="group relative bg-[#030303] p-6 sm:p-10 lg:p-14 hover:bg-[#050505] transition-colors duration-500 border border-white/[0.08] lg:border-0">
<div className="absolute top-0 right-0 p-4 sm:p-6 opacity-0 group-hover:opacity-100 transition-opacity duration-500">
<ArrowUpRight className="w-5 h-5 sm:w-6 sm:h-6 text-white/20" />
</div> </div>
<div className="space-y-6 pt-12 border-t border-white/[0.05]"> <div className="h-full flex flex-col justify-between">
<div className="flex items-start gap-4"> <div>
<Scan className="w-5 h-5 text-accent mt-1" /> <div className="mb-5 sm:mb-8 font-mono text-[10px] sm:text-xs text-accent uppercase tracking-widest border border-accent/20 inline-block px-2 sm:px-3 py-1 bg-accent/5">
<div> Module {pillar.module}
<div className="text-white font-medium mb-1">Global Scan</div>
<div className="text-white/30 text-sm">Zone file analysis & expiration monitoring.</div>
</div> </div>
<h3 className="text-2xl sm:text-3xl text-white font-display mb-4 sm:mb-6">{pillar.title}</h3>
<p className="text-white/50 leading-relaxed text-sm sm:text-lg font-light mb-8 sm:mb-12">
{pillar.desc}
</p>
</div> </div>
<div className="flex items-start gap-4">
<Target className="w-5 h-5 text-accent mt-1" /> <div className="space-y-4 sm:space-y-6 pt-6 sm:pt-12 border-t border-white/[0.05]">
<div> {pillar.features.map((f, j) => (
<div className="text-white font-medium mb-1">Valuation AI</div> <div key={j} className="flex items-start gap-3 sm:gap-4">
<div className="text-white/30 text-sm">Instant fair-market value estimation.</div> <f.icon className="w-4 h-4 sm:w-5 sm:h-5 text-accent mt-1" />
</div> <div>
<div className="text-white font-medium mb-0.5 sm:mb-1 text-sm sm:text-base">{f.title}</div>
<div className="text-white/30 text-[11px] sm:text-sm">{f.desc}</div>
</div>
</div>
))}
</div> </div>
</div> </div>
</div> </div>
</div> ))}
{/* 2. MARKET */}
<div className="group relative bg-[#030303] p-10 lg:p-14 hover:bg-[#050505] transition-colors duration-500">
<div className="absolute top-0 right-0 p-6 opacity-0 group-hover:opacity-100 transition-opacity duration-500">
<ArrowUpRight className="w-6 h-6 text-white/20" />
</div>
<div className="h-full flex flex-col justify-between">
<div>
<div className="mb-8 font-mono text-xs text-accent uppercase tracking-widest border border-accent/20 inline-block px-3 py-1 bg-accent/5 rounded-none">
Module 02
</div>
<h3 className="text-3xl text-white font-display mb-6">Market</h3>
<p className="text-white/50 leading-relaxed text-lg font-light mb-12">
"Secure the Asset." Direct access to liquidity. A verified exchange where assets move instantly, securely, and with 0% commission fees.
</p>
</div>
<div className="space-y-6 pt-12 border-t border-white/[0.05]">
<div className="flex items-start gap-4">
<ShieldCheck className="w-5 h-5 text-accent mt-1" />
<div>
<div className="text-white font-medium mb-1">Verified Owners</div>
<div className="text-white/30 text-sm">Mandatory DNS verification. No fakes.</div>
</div>
</div>
<div className="flex items-start gap-4">
<Gavel className="w-5 h-5 text-accent mt-1" />
<div>
<div className="text-white font-medium mb-1">Direct Execution</div>
<div className="text-white/30 text-sm">P2P transfers without middlemen.</div>
</div>
</div>
</div>
</div>
</div>
{/* 3. YIELD */}
<div className="group relative bg-[#030303] p-10 lg:p-14 hover:bg-[#050505] transition-colors duration-500">
<div className="absolute top-0 right-0 p-6 opacity-0 group-hover:opacity-100 transition-opacity duration-500">
<ArrowUpRight className="w-6 h-6 text-white/20" />
</div>
<div className="h-full flex flex-col justify-between">
<div>
<div className="mb-8 font-mono text-xs text-accent uppercase tracking-widest border border-accent/20 bg-accent/5 inline-block px-3 py-1 rounded-none">
Module 03
</div>
<h3 className="text-3xl text-white font-display mb-6">Yield</h3>
<p className="text-white/50 leading-relaxed text-lg font-light mb-12">
"Deploy the Asset." Our "Intent Routing" engine transforms idle domains into active revenue generators via automated traffic monetization.
</p>
</div>
<div className="space-y-6 pt-12 border-t border-white/[0.05]">
<div className="flex items-start gap-4">
<Layers className="w-5 h-5 text-accent mt-1" />
<div>
<div className="text-white font-medium mb-1">Intent Routing</div>
<div className="text-white/30 text-sm">Traffic directed to high-value partners.</div>
</div>
</div>
<div className="flex items-start gap-4">
<Coins className="w-5 h-5 text-accent mt-1" />
<div>
<div className="text-white font-medium mb-1">Passive Income</div>
<div className="text-white/30 text-sm">Monthly payouts from your portfolio.</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</section> </section>
{/* DEEP DIVE: YIELD */} {/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-32 px-4 sm:px-6 border-b border-white/[0.05] bg-[#050505] overflow-hidden"> {/* INTENT ROUTING */}
{/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-16 sm:py-32 px-4 sm:px-6 border-b border-white/[0.05] bg-[#050505] overflow-hidden">
<div className="absolute inset-0 bg-accent/[0.02]" /> <div className="absolute inset-0 bg-accent/[0.02]" />
<div className="max-w-[1200px] mx-auto relative z-10"> <div className="max-w-[1200px] mx-auto relative z-10">
<div className="mb-20 text-center"> <div className="mb-12 sm:mb-20 text-center">
<span className="text-accent font-mono text-xs uppercase tracking-[0.2em] mb-4 block">The Endgame</span> <span className="text-accent font-mono text-[10px] sm:text-xs uppercase tracking-[0.2em] mb-3 sm:mb-4 block">The Endgame</span>
<h2 className="font-display text-4xl sm:text-5xl text-white mb-6">Intent Routing™</h2> <h2 className="font-display text-2xl sm:text-4xl lg:text-5xl text-white mb-4 sm:mb-6">Intent Routing™</h2>
<p className="text-white/50 max-w-2xl mx-auto text-lg font-light leading-relaxed"> <p className="text-white/50 max-w-2xl mx-auto text-sm sm:text-lg font-light leading-relaxed px-2">
We don't build websites. We build signposts. <br/> Our engine detects user intent and routes traffic directly to high-paying partners.
Our engine detects user intent (e.g. "kredit.ch" = Loan Search) and routes traffic directly to high-paying partners.
</p> </p>
</div> </div>
<div className="grid md:grid-cols-3 gap-8"> <div className="grid grid-cols-1 md:grid-cols-3 gap-4 sm:gap-8">
{/* Step 1 */} {[
<div className="bg-[#020202] border border-white/10 p-10 relative group hover:border-accent/30 transition-colors"> { icon: Network, step: '1', title: 'Connect', desc: 'Point nameservers to ns.pounce.io' },
<div className="w-14 h-14 bg-white/5 flex items-center justify-center mb-8 text-white group-hover:text-accent group-hover:bg-accent/10 transition-all"> { icon: Cpu, step: '2', title: 'Analyze', desc: 'We scan the semantic intent of your domain' },
<Network className="w-7 h-7" /> { icon: Share2, step: '3', title: 'Route', desc: 'Traffic is routed to vertical partners' },
</div> ].map((item, i) => (
<h3 className="text-white font-bold text-xl mb-3">1. Connect</h3> <div key={i} className="bg-[#020202] border border-white/10 p-6 sm:p-10 relative group hover:border-accent/30 transition-colors">
<p className="text-white/40 text-sm font-mono leading-relaxed">Point your nameservers to `ns.pounce.io`. The system takes over instantly.</p> <div className="w-10 h-10 sm:w-14 sm:h-14 bg-white/5 flex items-center justify-center mb-5 sm:mb-8 text-white group-hover:text-accent group-hover:bg-accent/10 transition-all">
</div> <item.icon className="w-5 h-5 sm:w-7 sm:h-7" />
</div>
{/* Step 2 */} <h3 className="text-white font-bold text-base sm:text-xl mb-2 sm:mb-3">{item.step}. {item.title}</h3>
<div className="bg-[#020202] border border-white/10 p-10 relative group hover:border-accent/30 transition-colors"> <p className="text-white/40 text-xs sm:text-sm font-mono leading-relaxed">{item.desc}</p>
<div className="w-14 h-14 bg-white/5 flex items-center justify-center mb-8 text-white group-hover:text-accent group-hover:bg-accent/10 transition-all"> </div>
<Cpu className="w-7 h-7" /> ))}
</div>
<h3 className="text-white font-bold text-xl mb-3">2. Analyze</h3>
<p className="text-white/40 text-sm font-mono leading-relaxed">We scan the semantic intent. `zahnarzt-zh.ch` is identified as "Medical Booking Lead".</p>
</div>
{/* Step 3 */}
<div className="bg-[#020202] border border-white/10 p-10 relative group hover:border-accent/30 transition-colors">
<div className="w-14 h-14 bg-white/5 flex items-center justify-center mb-8 text-white group-hover:text-accent group-hover:bg-accent/10 transition-all">
<Share2 className="w-7 h-7" />
</div>
<h3 className="text-white font-bold text-xl mb-3">3. Route</h3>
<p className="text-white/40 text-sm font-mono leading-relaxed">Traffic is routed to vertical partners (e.g. Doctolib, Comparis). You earn per qualified lead.</p>
</div>
</div> </div>
</div> </div>
</section> </section>
{/* DEEP DIVE: MARKET */} {/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-32 px-4 sm:px-6 bg-[#020202]"> {/* MARKET DEEP DIVE */}
<div className="max-w-[1200px] mx-auto grid lg:grid-cols-2 gap-20 items-center"> {/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-16 sm:py-32 px-4 sm:px-6 bg-[#020202]">
<div className="max-w-[1200px] mx-auto grid lg:grid-cols-2 gap-10 lg:gap-20 items-center">
{/* Demo Card */}
<div className="order-2 lg:order-1 relative"> <div className="order-2 lg:order-1 relative">
<div className="border border-white/10 bg-[#050505] p-2 shadow-2xl rotate-1 hover:rotate-0 transition-transform duration-500"> <div className="border border-white/10 bg-[#050505] p-1.5 sm:p-2 shadow-2xl lg:rotate-1 hover:rotate-0 transition-transform duration-500">
<div className="bg-[#020202] p-8"> <div className="bg-[#020202] p-5 sm:p-8">
<div className="flex items-center gap-4 border-b border-white/10 pb-6 mb-6"> <div className="flex items-center gap-3 sm:gap-4 border-b border-white/10 pb-4 sm:pb-6 mb-4 sm:mb-6">
<div className="w-2 h-2 rounded-full bg-accent animate-pulse" /> <div className="w-1.5 h-1.5 sm:w-2 sm:h-2 bg-accent animate-pulse" />
<span className="font-mono text-base text-white">zurich-immo.ch</span> <span className="font-mono text-sm sm:text-base text-white">zurich-immo.ch</span>
<span className="ml-auto text-accent font-bold text-lg">$950</span> <span className="ml-auto text-accent font-bold text-base sm:text-lg">$950</span>
</div> </div>
<div className="space-y-4 font-mono text-xs text-white/50"> <div className="space-y-3 sm:space-y-4 font-mono text-[10px] sm:text-xs text-white/50">
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
<span>Source</span> <span>Source</span>
<span className="text-white flex items-center gap-2"><div className="w-1.5 h-1.5 bg-accent rounded-full"/> Pounce Direct</span> <span className="text-white flex items-center gap-2"><div className="w-1 h-1 sm:w-1.5 sm:h-1.5 bg-accent"/> Pounce Direct</span>
</div> </div>
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
<span>Seller Verified</span> <span>Verified</span>
<span className="text-accent flex items-center gap-2"><Check className="w-3 h-3" /> DNS Check Passed</span> <span className="text-accent flex items-center gap-1.5 sm:gap-2"><Check className="w-2.5 h-2.5 sm:w-3 sm:h-3" /> DNS Passed</span>
</div> </div>
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
<span>Commission</span> <span>Commission</span>
<span className="text-white bg-white/10 px-2 py-0.5 rounded-none">0%</span> <span className="text-white bg-white/10 px-1.5 sm:px-2 py-0.5">0%</span>
</div> </div>
</div> </div>
<div className="mt-8 pt-6 border-t border-white/10"> <div className="mt-5 sm:mt-8 pt-4 sm:pt-6 border-t border-white/10">
<button className="w-full py-4 bg-white/5 text-white uppercase font-bold text-xs tracking-[0.2em] hover:bg-white hover:text-black transition-colors flex items-center justify-center gap-2"> <button className="w-full py-3 sm:py-4 bg-white/5 text-white uppercase font-bold text-[10px] sm:text-xs tracking-[0.2em] hover:bg-white hover:text-black transition-colors flex items-center justify-center gap-2">
Contact Seller Contact Seller
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{/* Content */}
<div className="order-1 lg:order-2"> <div className="order-1 lg:order-2">
<span className="text-accent font-mono text-xs uppercase tracking-[0.2em] mb-4 block">Exclusive Exchange</span> <span className="text-accent font-mono text-[10px] sm:text-xs uppercase tracking-[0.2em] mb-3 sm:mb-4 block">Exclusive Exchange</span>
<h2 className="font-display text-4xl text-white mb-6">The Velvet Rope Strategy.</h2> <h2 className="font-display text-2xl sm:text-4xl text-white mb-4 sm:mb-6">The Velvet Rope.</h2>
<p className="text-white/50 text-lg leading-relaxed mb-10"> <p className="text-white/50 text-sm sm:text-lg leading-relaxed mb-6 sm:mb-10">
We don't run an open flea market. We run an exclusive club. Buying is open to everyone, selling is reserved for verified members.
Buying is open to everyone, but selling is reserved for verified members.
</p> </p>
<ul className="space-y-6"> <ul className="space-y-5 sm:space-y-6">
<li className="flex gap-5"> {[
<Shield className="w-6 h-6 text-accent shrink-0" /> { icon: Shield, title: 'Zero Noise', desc: 'Gatekeeper tech filters 99% of junk' },
<div> { icon: Key, title: 'Verified Owners', desc: 'DNS verification required before listing' },
<h4 className="text-white font-bold mb-1">Zero Noise</h4> { icon: Zap, title: '0% Commission', desc: 'Keep 100% of the sale price' },
<p className="text-white/40 text-sm leading-relaxed">Gatekeeper technology filters 99% of junk domains automatically.</p> ].map((item, i) => (
</div> <li key={i} className="flex gap-4 sm:gap-5">
</li> <item.icon className="w-5 h-5 sm:w-6 sm:h-6 text-accent shrink-0" />
<li className="flex gap-5"> <div>
<Key className="w-6 h-6 text-accent shrink-0" /> <h4 className="text-white font-bold mb-0.5 sm:mb-1 text-sm sm:text-base">{item.title}</h4>
<div> <p className="text-white/40 text-xs sm:text-sm leading-relaxed">{item.desc}</p>
<h4 className="text-white font-bold mb-1">Verified Owners</h4> </div>
<p className="text-white/40 text-sm leading-relaxed">Sellers must verify ownership via DNS before listing. No fakes.</p> </li>
</div> ))}
</li>
<li className="flex gap-5">
<Zap className="w-6 h-6 text-accent shrink-0" />
<div>
<h4 className="text-white font-bold mb-1">0% Commission</h4>
<p className="text-white/40 text-sm leading-relaxed">Members keep 100% of the sale price. Direct settlement.</p>
</div>
</li>
</ul> </ul>
</div> </div>
</div> </div>
</section> </section>
{/* PRICING TEASER - "Access Levels" */} {/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-32 px-4 sm:px-6 border-y border-white/[0.08] bg-[#030303]"> {/* PRICING */}
{/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-16 sm:py-32 px-4 sm:px-6 border-y border-white/[0.08] bg-[#030303]">
<div className="max-w-[1200px] mx-auto text-center"> <div className="max-w-[1200px] mx-auto text-center">
<h2 className="font-display text-4xl text-white mb-16">Clearance Levels</h2> <h2 className="font-display text-2xl sm:text-4xl text-white mb-10 sm:mb-16">Clearance Levels</h2>
<div className="grid md:grid-cols-3 gap-8 text-left"> <div className="grid grid-cols-1 md:grid-cols-3 gap-4 sm:gap-8 text-left">
{/* Scout */} {/* Scout */}
<div className="p-10 border border-white/10 bg-[#020202] opacity-60 hover:opacity-100 transition-opacity flex flex-col"> <div className="p-6 sm:p-10 border border-white/10 bg-[#020202] opacity-70 hover:opacity-100 transition-opacity flex flex-col">
<h3 className="text-xl font-display text-white mb-2">Scout</h3> <h3 className="text-lg sm:text-xl font-display text-white mb-1 sm:mb-2">Scout</h3>
<div className="text-4xl font-mono text-white mb-8">$0<span className="text-sm text-white/30">/mo</span></div> <div className="text-2xl sm:text-4xl font-mono text-white mb-5 sm:mb-8">$0<span className="text-xs sm:text-sm text-white/30">/mo</span></div>
<ul className="space-y-4 text-sm text-white/50 font-mono mb-10 flex-1"> <ul className="space-y-3 sm:space-y-4 text-xs sm:text-sm text-white/50 font-mono mb-6 sm:mb-10 flex-1">
<li className="flex gap-3"><span>•</span> Recon Overview</li> <li className="flex gap-2 sm:gap-3"><span>•</span> Recon Overview</li>
<li className="flex gap-3"><span>•</span> Basic Scan</li> <li className="flex gap-2 sm:gap-3"><span>•</span> Basic Scan</li>
<li className="flex gap-3"><span>•</span> 5 Targets</li> <li className="flex gap-2 sm:gap-3"><span>•</span> 5 Targets</li>
</ul> </ul>
<Link href="/register" className="block w-full py-4 text-center border border-white/20 text-white uppercase text-xs font-bold tracking-widest hover:bg-white hover:text-black transition-colors"> <Link href="/register" className="block w-full py-3 sm:py-4 text-center border border-white/20 text-white uppercase text-[10px] sm:text-xs font-bold tracking-widest hover:bg-white hover:text-black transition-colors">
Join the Hunt Join the Hunt
</Link> </Link>
</div> </div>
{/* Trader - Highlight */} {/* Trader */}
<div className="p-10 border border-accent bg-[#050505] relative transform md:-translate-y-4 flex flex-col shadow-[0_0_50px_-20px_rgba(16,185,129,0.2)]"> <div className="p-6 sm:p-10 border-2 border-accent bg-[#050505] relative md:-translate-y-0 lg:-translate-y-4 flex flex-col shadow-[0_0_50px_-20px_rgba(16,185,129,0.2)]">
<div className="absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-accent text-black px-4 py-1.5 text-[10px] font-bold uppercase tracking-widest">Recommended</div> <div className="absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-accent text-black px-3 sm:px-4 py-1 sm:py-1.5 text-[9px] sm:text-[10px] font-bold uppercase tracking-widest">Recommended</div>
<h3 className="text-xl font-display text-white mb-2">Trader</h3> <h3 className="text-lg sm:text-xl font-display text-white mb-1 sm:mb-2 mt-2 sm:mt-0">Trader</h3>
<div className="text-4xl font-mono text-accent mb-8">$9<span className="text-sm text-white/30">/mo</span></div> <div className="text-2xl sm:text-4xl font-mono text-accent mb-5 sm:mb-8">$9<span className="text-xs sm:text-sm text-white/30">/mo</span></div>
<ul className="space-y-4 text-sm text-white/80 font-mono mb-10 flex-1"> <ul className="space-y-3 sm:space-y-4 text-xs sm:text-sm text-white/80 font-mono mb-6 sm:mb-10 flex-1">
<li className="flex gap-3"><Check className="w-4 h-4 text-accent"/> Clean Feed (No Noise)</li> <li className="flex gap-2 sm:gap-3"><Check className="w-3 h-3 sm:w-4 sm:h-4 text-accent shrink-0"/> Clean Feed</li>
<li className="flex gap-3"><Check className="w-4 h-4 text-accent"/> Renewal Intel</li> <li className="flex gap-2 sm:gap-3"><Check className="w-3 h-3 sm:w-4 sm:h-4 text-accent shrink-0"/> Renewal Intel</li>
<li className="flex gap-3"><Check className="w-4 h-4 text-accent"/> Liquidate (0% Fee)</li> <li className="flex gap-2 sm:gap-3"><Check className="w-3 h-3 sm:w-4 sm:h-4 text-accent shrink-0"/> 0% Commission</li>
<li className="flex gap-3"><Check className="w-4 h-4 text-accent"/> 50 Targets</li> <li className="flex gap-2 sm:gap-3"><Check className="w-3 h-3 sm:w-4 sm:h-4 text-accent shrink-0"/> 50 Targets</li>
</ul> </ul>
<Link href="/pricing" className="block w-full py-4 text-center bg-accent text-black uppercase text-xs font-bold tracking-widest hover:bg-white transition-colors"> <Link href="/pricing" className="block w-full py-3 sm:py-4 text-center bg-accent text-black uppercase text-[10px] sm:text-xs font-bold tracking-widest hover:bg-white transition-colors">
Gear Up Gear Up
</Link> </Link>
</div> </div>
{/* Tycoon */} {/* Tycoon */}
<div className="p-10 border border-white/10 bg-[#020202] hover:border-white/30 transition-colors flex flex-col"> <div className="p-6 sm:p-10 border border-white/10 bg-[#020202] hover:border-white/30 transition-colors flex flex-col">
<h3 className="text-xl font-display text-white mb-2">Tycoon</h3> <h3 className="text-lg sm:text-xl font-display text-white mb-1 sm:mb-2">Tycoon</h3>
<div className="text-4xl font-mono text-white mb-8">$29<span className="text-sm text-white/30">/mo</span></div> <div className="text-2xl sm:text-4xl font-mono text-white mb-5 sm:mb-8">$29<span className="text-xs sm:text-sm text-white/30">/mo</span></div>
<ul className="space-y-4 text-sm text-white/50 font-mono mb-10 flex-1"> <ul className="space-y-3 sm:space-y-4 text-xs sm:text-sm text-white/50 font-mono mb-6 sm:mb-10 flex-1">
<li className="flex gap-3"><Check className="w-4 h-4 text-white"/> Full Portfolio Monitor</li> <li className="flex gap-2 sm:gap-3"><Check className="w-3 h-3 sm:w-4 sm:h-4 text-white shrink-0"/> Full Monitor</li>
<li className="flex gap-3"><Check className="w-4 h-4 text-white"/> First Strike Alerts (10m)</li> <li className="flex gap-2 sm:gap-3"><Check className="w-3 h-3 sm:w-4 sm:h-4 text-white shrink-0"/> 10m Alerts</li>
<li className="flex gap-3"><Check className="w-4 h-4 text-white"/> 500 Targets</li> <li className="flex gap-2 sm:gap-3"><Check className="w-3 h-3 sm:w-4 sm:h-4 text-white shrink-0"/> 500 Targets</li>
<li className="flex gap-3"><Check className="w-4 h-4 text-white"/> Featured Listings</li> <li className="flex gap-2 sm:gap-3"><Check className="w-3 h-3 sm:w-4 sm:h-4 text-white shrink-0"/> Featured</li>
</ul> </ul>
<Link href="/pricing" className="block w-full py-4 text-center border border-white/20 text-white uppercase text-xs font-bold tracking-widest hover:bg-white hover:text-black transition-colors"> <Link href="/pricing" className="block w-full py-3 sm:py-4 text-center border border-white/20 text-white uppercase text-[10px] sm:text-xs font-bold tracking-widest hover:bg-white hover:text-black transition-colors">
Go Professional Go Pro
</Link> </Link>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
{/* LIVE FEED TEASER - The "Terminal" Look */} {/* ═══════════════════════════════════════════════════════════════════════ */}
{/* LIVE OPS */}
{/* ═══════════════════════════════════════════════════════════════════════ */}
{!isAuthenticated && !loadingAuctions && hotAuctions.length > 0 && ( {!isAuthenticated && !loadingAuctions && hotAuctions.length > 0 && (
<section className="relative py-32 px-4 sm:px-6 bg-[#050505] border-t border-white/[0.05]"> <section className="relative py-16 sm:py-32 px-4 sm:px-6 bg-[#050505] border-t border-white/[0.05]">
<div className="max-w-[1200px] mx-auto"> <div className="max-w-[1200px] mx-auto">
<div className="flex justify-between items-end mb-12"> <div className="flex flex-col sm:flex-row justify-between items-start sm:items-end mb-8 sm:mb-12 gap-4">
<div> <div>
<h2 className="font-display text-3xl text-white mb-2">Live Ops</h2> <h2 className="font-display text-2xl sm:text-3xl text-white mb-1 sm:mb-2">Live Ops</h2>
<p className="text-accent/60 font-mono text-sm">FEED_V2.0 // ENCRYPTED</p> <p className="text-accent/60 font-mono text-[10px] sm:text-sm">FEED_V2.0 // ENCRYPTED</p>
</div> </div>
<Link href="/acquire" className="text-xs font-mono uppercase tracking-widest text-white/40 hover:text-white transition-colors flex items-center gap-2"> <Link href="/acquire" className="text-[10px] sm:text-xs font-mono uppercase tracking-widest text-white/40 hover:text-white transition-colors flex items-center gap-2">
Recon All Markets <ArrowRight className="w-3 h-3" /> Recon All <ArrowRight className="w-3 h-3" />
</Link> </Link>
</div> </div>
<div className="relative border border-white/[0.08] bg-[#020202]"> {/* MOBILE: Card Layout */}
<div className="sm:hidden space-y-2">
{hotAuctions.slice(0, 4).map((auction, idx) => (
<div key={idx} className="p-4 bg-[#020202] border border-white/[0.08] group">
<div className="flex items-center justify-between mb-3">
<div className="flex items-center gap-2">
<div className="w-1 h-1 bg-white/20 group-hover:bg-accent transition-colors" />
<span className="font-mono text-sm text-white/90">{auction.domain}</span>
</div>
<span className="text-accent font-bold font-mono">${auction.current_bid.toLocaleString()}</span>
</div>
<div className="flex items-center justify-between text-[10px] font-mono text-white/40">
<span className="flex items-center gap-1"><Clock className="w-3 h-3" /> {auction.time_remaining}</span>
<span className="uppercase">{auction.platform}</span>
</div>
</div>
))}
</div>
{/* DESKTOP: Table Layout */}
<div className="hidden sm:block relative border border-white/[0.08] bg-[#020202]">
<div className="absolute top-0 left-0 w-full h-[1px] bg-gradient-to-r from-transparent via-accent/20 to-transparent" /> <div className="absolute top-0 left-0 w-full h-[1px] bg-gradient-to-r from-transparent via-accent/20 to-transparent" />
{/* Table Header */} {/* Table Header */}
@ -627,7 +584,7 @@ export default function HomePage() {
{hotAuctions.slice(0, 5).map((auction, idx) => ( {hotAuctions.slice(0, 5).map((auction, idx) => (
<div key={idx} className="grid grid-cols-12 gap-4 px-6 py-5 border-b border-white/[0.03] hover:bg-white/[0.02] transition-colors group cursor-default"> <div key={idx} className="grid grid-cols-12 gap-4 px-6 py-5 border-b border-white/[0.03] hover:bg-white/[0.02] transition-colors group cursor-default">
<div className="col-span-5 text-white/90 group-hover:text-white transition-colors flex items-center gap-3"> <div className="col-span-5 text-white/90 group-hover:text-white transition-colors flex items-center gap-3">
<div className="w-1 h-1 bg-white/20 rounded-full group-hover:bg-accent transition-colors" /> <div className="w-1 h-1 bg-white/20 group-hover:bg-accent transition-colors" />
{auction.domain} {auction.domain}
</div> </div>
<div className="col-span-2 text-right text-white/30 line-through decoration-white/10">${(auction.current_bid * 1.5).toFixed(0)}</div> <div className="col-span-2 text-right text-white/30 line-through decoration-white/10">${(auction.current_bid * 1.5).toFixed(0)}</div>
@ -635,63 +592,61 @@ export default function HomePage() {
<div className="col-span-3 text-right text-white/40">{auction.time_remaining}</div> <div className="col-span-3 text-right text-white/40">{auction.time_remaining}</div>
</div> </div>
))} ))}
</div>
{/* Gatekeeper Overlay */} </div>
<div className="relative h-40 overflow-hidden border-t border-white/[0.03]">
<div className="absolute inset-0 bg-[#020202]/80 backdrop-blur-[2px] z-10 flex items-center justify-center"> {/* Gatekeeper */}
<Link <div className="relative h-32 sm:h-40 overflow-hidden border border-white/[0.08] border-t-0 bg-[#020202]">
href="/register" <div className="absolute inset-0 bg-[#020202]/80 backdrop-blur-[2px] z-10 flex items-center justify-center">
className="group flex items-center gap-4 px-8 py-4 border border-accent/20 bg-accent/10 hover:bg-accent hover:border-accent hover:text-black text-white transition-all duration-500 backdrop-blur-md" <Link
style={{ clipPath: 'polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px)' }} href="/register"
> className="group flex items-center gap-3 sm:gap-4 px-6 sm:px-8 py-3 sm:py-4 border border-accent/20 bg-accent/10 hover:bg-accent hover:border-accent hover:text-black text-white transition-all duration-500 backdrop-blur-md"
<Lock className="w-3 h-3" /> >
<span className="text-xs font-bold uppercase tracking-[0.2em]">Enter HQ</span> <Lock className="w-3 h-3" />
<ArrowRight className="w-3 h-3 group-hover:translate-x-1 transition-transform" /> <span className="text-[10px] sm:text-xs font-bold uppercase tracking-[0.15em] sm:tracking-[0.2em]">Enter HQ</span>
</Link> <ArrowRight className="w-3 h-3 group-hover:translate-x-1 transition-transform" />
</div> </Link>
{/* Blurred Data */} </div>
<div className="opacity-30 pointer-events-none p-6 space-y-6 font-mono text-sm select-none"> <div className="opacity-30 pointer-events-none p-4 sm:p-6 space-y-4 sm:space-y-6 font-mono text-xs sm:text-sm select-none">
<div className="flex justify-between"><span>premium-crypto.ai</span><span>$12,500</span></div> <div className="flex justify-between"><span>premium-crypto.ai</span><span>$12,500</span></div>
<div className="flex justify-between"><span>defi-bank.io</span><span>$8,200</span></div> <div className="flex justify-between"><span>defi-bank.io</span><span>$8,200</span></div>
<div className="flex justify-between"><span>cloud-systems.net</span><span>$4,150</span></div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
)} )}
{/* FINAL CTA - Minimalist & Authoritative */} {/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-40 px-4 sm:px-6 bg-[#020202] border-t border-white/[0.05] overflow-hidden"> {/* FINAL CTA */}
{/* ═══════════════════════════════════════════════════════════════════════ */}
<section className="relative py-24 sm:py-40 px-4 sm:px-6 bg-[#020202] border-t border-white/[0.05] overflow-hidden">
<div className="absolute inset-0 bg-[url('/noise.png')] opacity-[0.03]" /> <div className="absolute inset-0 bg-[url('/noise.png')] opacity-[0.03]" />
<div className="max-w-4xl mx-auto text-center relative z-10"> <div className="max-w-4xl mx-auto text-center relative z-10">
<h2 className="font-display text-5xl sm:text-6xl md:text-7xl text-white mb-12 tracking-tight"> <h2 className="font-display text-3xl sm:text-5xl md:text-6xl lg:text-7xl text-white mb-8 sm:mb-12 tracking-tight">
Stop guessing. <br /> Stop guessing. <br />
<span className="text-white/30">Start knowing.</span> <span className="text-white/30">Start knowing.</span>
</h2> </h2>
<div className="flex flex-col sm:flex-row items-center justify-center gap-8"> <div className="flex flex-col sm:flex-row items-center justify-center gap-4 sm:gap-8">
<Link <Link
href={isAuthenticated ? "/terminal/radar" : "/register"} href={isAuthenticated ? "/terminal/radar" : "/register"}
className="group relative px-10 py-5 bg-accent text-black text-sm font-bold uppercase tracking-[0.2em] hover:bg-white hover:text-black transition-colors duration-500 rounded-none" className="w-full sm:w-auto group relative px-8 sm:px-10 py-4 sm:py-5 bg-accent text-black text-xs sm:text-sm font-bold uppercase tracking-[0.15em] sm:tracking-[0.2em] hover:bg-white transition-colors duration-500"
style={{ clipPath: 'polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px)' }}
> >
<span className="relative z-10 flex items-center gap-3"> <span className="relative z-10 flex items-center justify-center gap-3">
Initialize <ArrowRight className="w-4 h-4 group-hover:translate-x-1 transition-transform" /> Initialize <ArrowRight className="w-4 h-4 group-hover:translate-x-1 transition-transform" />
</span> </span>
</Link> </Link>
<Link <Link
href="/pricing" href="/pricing"
className="text-sm text-white/40 uppercase tracking-[0.2em] hover:text-white transition-colors" className="text-xs sm:text-sm text-white/40 uppercase tracking-[0.15em] sm:tracking-[0.2em] hover:text-white transition-colors"
> >
View Pricing View Pricing
</Link> </Link>
</div> </div>
<div className="mt-24 pt-8 border-t border-white/[0.05] flex flex-wrap justify-center gap-12 text-[10px] text-white/20 font-mono uppercase tracking-[0.2em]"> <div className="mt-16 sm:mt-24 pt-6 sm:pt-8 border-t border-white/[0.05] flex flex-wrap justify-center gap-6 sm:gap-12 text-[9px] sm:text-[10px] text-white/20 font-mono uppercase tracking-[0.15em] sm:tracking-[0.2em]">
<span className="flex items-center gap-2"><ShieldCheck className="w-3 h-3 text-accent" /> Encrypted</span> <span className="flex items-center gap-2"><ShieldCheck className="w-3 h-3 text-accent" /> Encrypted</span>
<span className="flex items-center gap-2"><Globe className="w-3 h-3 text-accent" /> Global</span> <span className="flex items-center gap-2"><Globe className="w-3 h-3 text-accent" /> Global</span>
<span className="flex items-center gap-2"><Check className="w-3 h-3 text-accent" /> Verified</span> <span className="flex items-center gap-2"><Check className="w-3 h-3 text-accent" /> Verified</span>

File diff suppressed because it is too large Load Diff

View File

@ -10,46 +10,41 @@ export function Footer() {
return ( return (
<footer className="relative border-t border-white/10 bg-[#020202] mt-auto overflow-hidden"> <footer className="relative border-t border-white/10 bg-[#020202] mt-auto overflow-hidden">
{/* Background Noise */}
<div className="absolute inset-0 bg-[url('/noise.png')] opacity-[0.03] mix-blend-overlay pointer-events-none" /> <div className="absolute inset-0 bg-[url('/noise.png')] opacity-[0.03] mix-blend-overlay pointer-events-none" />
<div className="max-w-[1400px] mx-auto px-4 sm:px-6 py-16 sm:py-20 relative z-10"> <div className="max-w-[1400px] mx-auto px-4 sm:px-6 py-12 sm:py-20 relative z-10">
<div className="grid grid-cols-1 md:grid-cols-4 lg:grid-cols-5 gap-12 lg:gap-8 mb-16"> <div className="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-8 lg:gap-8 mb-10 sm:mb-16">
{/* Brand Column */} {/* Brand Column */}
<div className="md:col-span-2 lg:col-span-2"> <div className="col-span-2 md:col-span-2 lg:col-span-2">
<div className="mb-6"> <div className="mb-4 sm:mb-6">
<Link href="/" className="inline-block group"> <Link href="/" className="inline-block group">
<div className="flex items-center gap-3"> <div className="flex items-center gap-2 sm:gap-3">
<Image <Image
src="/pounce-puma.png" src="/pounce-puma.png"
alt="POUNCE" alt="POUNCE"
width={40} width={32}
height={40} height={32}
className="object-contain opacity-80 group-hover:opacity-100 transition-opacity" className="object-contain opacity-80 group-hover:opacity-100 transition-opacity sm:w-10 sm:h-10"
/> />
<span <span className="text-lg sm:text-xl font-black tracking-[0.1em] text-white group-hover:text-accent transition-colors font-display">
className="text-xl font-black tracking-[0.1em] text-white group-hover:text-accent transition-colors"
style={{ fontFamily: 'var(--font-display), sans-serif' }}
>
POUNCE POUNCE
</span> </span>
</div> </div>
</Link> </Link>
</div> </div>
<p className="text-sm font-mono text-white/50 mb-8 max-w-sm leading-relaxed"> <p className="text-xs sm:text-sm font-mono text-white/50 mb-6 sm:mb-8 max-w-sm leading-relaxed">
Global domain intelligence for serious investors. <br/> Global domain intelligence for serious investors. Scan. Acquire. Route. Yield.
Scan. Acquire. Route. Yield.
</p> </p>
{/* Newsletter Input - Tech Style */} {/* Newsletter - Hidden on Mobile */}
<div className="mb-8 max-w-sm"> <div className="hidden sm:block mb-8 max-w-sm">
<label className="text-[10px] font-mono uppercase tracking-widest text-white/30 mb-2 block">Mission Briefings</label> <label className="text-[10px] font-mono uppercase tracking-widest text-white/30 mb-2 block">Mission Briefings</label>
<div className="flex"> <div className="flex">
<input <input
type="email" type="email"
placeholder="ENTER_EMAIL" placeholder="ENTER_EMAIL"
className="w-full bg-[#0A0A0A] border border-white/10 px-4 py-3 text-white font-mono text-xs placeholder:text-white/20 focus:outline-none focus:border-accent transition-all rounded-none" className="w-full bg-[#0A0A0A] border border-white/10 px-4 py-3 text-white font-mono text-xs placeholder:text-white/20 focus:outline-none focus:border-accent transition-all"
/> />
<button className="px-4 bg-white text-black hover:bg-accent transition-colors border-l border-white/10"> <button className="px-4 bg-white text-black hover:bg-accent transition-colors border-l border-white/10">
<ArrowRight className="w-4 h-4" /> <ArrowRight className="w-4 h-4" />
@ -57,90 +52,84 @@ export function Footer() {
</div> </div>
</div> </div>
<div className="flex items-center gap-4"> <div className="flex items-center gap-3 sm:gap-4">
<a <a
href="https://twitter.com/pounce_domains" href="https://twitter.com/pounce_domains"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="w-10 h-10 flex items-center justify-center border border-white/5 hover:border-white/20 hover:bg-white/5 transition-all group" className="w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center border border-white/5 hover:border-white/20 hover:bg-white/5 transition-all group"
aria-label="Twitter" aria-label="Twitter"
> >
<Twitter className="w-4 h-4 text-white/40 group-hover:text-white transition-colors" /> <Twitter className="w-3.5 h-3.5 sm:w-4 sm:h-4 text-white/40 group-hover:text-white transition-colors" />
</a> </a>
<a <a
href="https://linkedin.com" href="https://linkedin.com"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="w-10 h-10 flex items-center justify-center border border-white/5 hover:border-white/20 hover:bg-white/5 transition-all group" className="w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center border border-white/5 hover:border-white/20 hover:bg-white/5 transition-all group"
aria-label="LinkedIn" aria-label="LinkedIn"
> >
<Linkedin className="w-4 h-4 text-white/40 group-hover:text-white transition-colors" /> <Linkedin className="w-3.5 h-3.5 sm:w-4 sm:h-4 text-white/40 group-hover:text-white transition-colors" />
</a> </a>
<a <a
href="mailto:hello@pounce.ch" href="mailto:hello@pounce.ch"
className="w-10 h-10 flex items-center justify-center border border-white/5 hover:border-white/20 hover:bg-white/5 transition-all group" className="w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center border border-white/5 hover:border-white/20 hover:bg-white/5 transition-all group"
aria-label="Email" aria-label="Email"
> >
<Mail className="w-4 h-4 text-white/40 group-hover:text-white transition-colors" /> <Mail className="w-3.5 h-3.5 sm:w-4 sm:h-4 text-white/40 group-hover:text-white transition-colors" />
</a> </a>
</div> </div>
</div> </div>
{/* Links Columns */} {/* Protocol Links */}
<div className="lg:col-span-1"> <div className="col-span-1">
<h3 className="text-xs font-bold uppercase tracking-[0.2em] text-white mb-6">Protocol</h3> <h3 className="text-[10px] sm:text-xs font-bold uppercase tracking-[0.15em] sm:tracking-[0.2em] text-white mb-4 sm:mb-6">Protocol</h3>
<ul className="space-y-4"> <ul className="space-y-3 sm:space-y-4">
<li> {[
<Link href="/acquire" className="text-sm font-mono text-white/40 hover:text-accent transition-colors flex items-center gap-2 group"> { href: '/acquire', label: 'Acquire' },
<span className="w-1 h-1 bg-white/20 group-hover:bg-accent rounded-full transition-colors" /> Acquire { href: '/discover', label: 'Discover' },
</Link> { href: '/yield', label: 'Yield' },
</li> { href: '/pricing', label: 'Pricing' },
<li> ].map((link) => (
<Link href="/discover" className="text-sm font-mono text-white/40 hover:text-accent transition-colors flex items-center gap-2 group"> <li key={link.href}>
<span className="w-1 h-1 bg-white/20 group-hover:bg-accent rounded-full transition-colors" /> Discover <Link href={link.href} className="text-xs sm:text-sm font-mono text-white/40 hover:text-accent transition-colors flex items-center gap-1.5 sm:gap-2 group">
</Link> <span className="w-1 h-1 bg-white/20 group-hover:bg-accent transition-colors" /> {link.label}
</li> </Link>
<li> </li>
<Link href="/yield" className="text-sm font-mono text-white/40 hover:text-accent transition-colors flex items-center gap-2 group"> ))}
<span className="w-1 h-1 bg-white/20 group-hover:bg-accent rounded-full transition-colors" /> Yield
</Link>
</li>
<li>
<Link href="/pricing" className="text-sm font-mono text-white/40 hover:text-accent transition-colors flex items-center gap-2 group">
<span className="w-1 h-1 bg-white/20 group-hover:bg-accent rounded-full transition-colors" /> Pricing
</Link>
</li>
</ul> </ul>
</div> </div>
<div className="lg:col-span-1"> {/* Info Links */}
<h3 className="text-xs font-bold uppercase tracking-[0.2em] text-white mb-6">Intel</h3> <div className="col-span-1">
<ul className="space-y-4"> <h3 className="text-[10px] sm:text-xs font-bold uppercase tracking-[0.15em] sm:tracking-[0.2em] text-white mb-4 sm:mb-6">Intel</h3>
<ul className="space-y-3 sm:space-y-4">
<li> <li>
<Link href="/briefings" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Briefings</Link> <Link href="/briefings" className="text-xs sm:text-sm font-mono text-white/40 hover:text-white transition-colors">Briefings</Link>
</li> </li>
<li> <li>
<Link href="/about" className="text-sm font-mono text-white/40 hover:text-white transition-colors">About Us</Link> <Link href="/about" className="text-xs sm:text-sm font-mono text-white/40 hover:text-white transition-colors">About</Link>
</li> </li>
<li> <li>
<Link href="/contact" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Contact HQ</Link> <Link href="/contact" className="text-xs sm:text-sm font-mono text-white/40 hover:text-white transition-colors">Contact</Link>
</li> </li>
{!isAuthenticated && ( {!isAuthenticated && (
<li> <li>
<Link href="/login" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Login</Link> <Link href="/login" className="text-xs sm:text-sm font-mono text-white/40 hover:text-white transition-colors">Login</Link>
</li> </li>
)} )}
</ul> </ul>
</div> </div>
<div className="lg:col-span-1"> {/* Legal - Hidden on Small Mobile, Merged into Intel on Mobile */}
<div className="hidden lg:block lg:col-span-1">
<h3 className="text-xs font-bold uppercase tracking-[0.2em] text-white mb-6">Legal</h3> <h3 className="text-xs font-bold uppercase tracking-[0.2em] text-white mb-6">Legal</h3>
<ul className="space-y-4"> <ul className="space-y-4">
<li> <li>
<Link href="/legal/privacy" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Privacy Policy</Link> <Link href="/legal/privacy" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Privacy</Link>
</li> </li>
<li> <li>
<Link href="/legal/terms" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Terms of Service</Link> <Link href="/legal/terms" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Terms</Link>
</li> </li>
<li> <li>
<Link href="/legal/imprint" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Imprint</Link> <Link href="/legal/imprint" className="text-sm font-mono text-white/40 hover:text-white transition-colors">Imprint</Link>
@ -149,16 +138,27 @@ export function Footer() {
</div> </div>
</div> </div>
{/* Mobile Legal Links */}
<div className="lg:hidden flex flex-wrap gap-4 mb-8 text-[10px] font-mono text-white/30">
<Link href="/legal/privacy" className="hover:text-white transition-colors">Privacy</Link>
<span className="text-white/10">|</span>
<Link href="/legal/terms" className="hover:text-white transition-colors">Terms</Link>
<span className="text-white/10">|</span>
<Link href="/legal/imprint" className="hover:text-white transition-colors">Imprint</Link>
</div>
{/* Bottom Bar */} {/* Bottom Bar */}
<div className="pt-8 border-t border-white/10 flex flex-col sm:flex-row justify-between items-center gap-4 text-[10px] font-mono text-white/20 uppercase tracking-widest"> <div className="pt-6 sm:pt-8 border-t border-white/10 flex flex-col sm:flex-row justify-between items-center gap-3 sm:gap-4 text-[9px] sm:text-[10px] font-mono text-white/20 uppercase tracking-widest">
<p>© {new Date().getFullYear()} POUNCE AG ZURICH</p> <p>© {new Date().getFullYear()} POUNCE AG ZURICH</p>
<div className="flex items-center gap-6"> <div className="flex items-center gap-4 sm:gap-6">
<span>System Status: Online</span> <span className="flex items-center gap-1.5">
<span>v2.0.4 [Stable]</span> <span className="w-1.5 h-1.5 bg-accent animate-pulse" />
Online
</span>
<span>v2.0.4</span>
</div> </div>
</div> </div>
</div> </div>
</footer> </footer>
) )
} }

View File

@ -11,33 +11,27 @@ import {
CreditCard, CreditCard,
LayoutDashboard, LayoutDashboard,
Coins, Coins,
ArrowRight,
Sparkles,
Target,
LogOut,
User,
} from 'lucide-react' } from 'lucide-react'
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import Image from 'next/image'
import clsx from 'clsx' import clsx from 'clsx'
/**
* Public Header Component
*
* Used for:
* - Landing page (/)
* - Public pages (pricing, about, contact, blog, etc.)
* - Auth pages (login, register)
*
* For logged-in users in the Command Center, use TerminalLayout instead.
*/
export function Header() { export function Header() {
const pathname = usePathname() const pathname = usePathname()
const { isAuthenticated, user, logout, subscription } = useStore() const { isAuthenticated, user, logout, subscription } = useStore()
const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const [menuOpen, setMenuOpen] = useState(false)
// Close mobile menu on route change
useEffect(() => { useEffect(() => {
setMobileMenuOpen(false) setMenuOpen(false)
}, [pathname]) }, [pathname])
const tierName = subscription?.tier_name || subscription?.tier || 'Scout' const tierName = subscription?.tier_name || subscription?.tier || 'Scout'
// Navigation: Discover | Acquire | Yield | Pricing
const publicNavItems = [ const publicNavItems = [
{ href: '/discover', label: 'Discover', icon: TrendingUp }, { href: '/discover', label: 'Discover', icon: TrendingUp },
{ href: '/acquire', label: 'Acquire', icon: Gavel }, { href: '/acquire', label: 'Acquire', icon: Gavel },
@ -50,151 +44,212 @@ export function Header() {
return pathname.startsWith(href) return pathname.startsWith(href)
} }
// Check if we're on a Command Center page (should use Sidebar instead)
const isCommandCenterPage = pathname.startsWith('/terminal') || pathname.startsWith('/admin') const isCommandCenterPage = pathname.startsWith('/terminal') || pathname.startsWith('/admin')
// If logged in and on Command Center page, don't render this header
if (isAuthenticated && isCommandCenterPage) { if (isAuthenticated && isCommandCenterPage) {
return null return null
} }
return ( return (
<header className="fixed top-0 left-0 right-0 z-50 bg-background/80 backdrop-blur-xl border-b border-border-subtle"> <>
<div className="w-full px-4 sm:px-6 lg:px-8 h-16 sm:h-20 flex items-center justify-between"> <header className="fixed top-0 left-0 right-0 z-50 bg-[#020202]/95 backdrop-blur-md border-b border-white/[0.08]">
{/* Left side: Logo + Nav Links */} <div className="w-full px-4 sm:px-6 lg:px-8 h-14 sm:h-16 flex items-center justify-between">
<div className="flex items-center gap-6 sm:gap-8 h-full">
{/* Logo */} {/* Logo */}
<Link <Link href="/" className="flex items-center gap-3 h-full hover:opacity-80 transition-opacity">
href="/" <div className="relative w-7 h-7 sm:w-8 sm:h-8">
className="flex items-center h-full hover:opacity-80 transition-opacity duration-300" <Image src="/pounce-puma.png" alt="Pounce" fill className="object-contain" />
> </div>
<span <span className="text-base sm:text-lg font-black tracking-[0.1em] text-white font-display">
className="text-[1.25rem] sm:text-[1.5rem] font-black tracking-[0.1em] text-foreground"
style={{ fontFamily: 'var(--font-display), Playfair Display, Georgia, serif' }}
>
POUNCE POUNCE
</span> </span>
</Link> </Link>
{/* Main Nav Links (Desktop) */} {/* Desktop Nav */}
<nav className="hidden md:flex items-center h-full gap-1"> <nav className="hidden lg:flex items-center h-full gap-1">
{publicNavItems.map((item) => ( {publicNavItems.map((item) => (
<Link <Link
key={item.href} key={item.href}
href={item.href} href={item.href}
className={clsx( className={clsx(
"flex items-center h-9 px-3 text-[0.8125rem] transition-all duration-200 uppercase tracking-wide", "flex items-center h-9 px-4 text-xs font-mono uppercase tracking-wider transition-all",
isActive(item.href) isActive(item.href)
? "text-foreground font-bold border-b-2 border-accent" ? "text-white border-b-2 border-accent"
: "text-foreground-muted hover:text-foreground hover:bg-foreground/5" : "text-white/50 hover:text-white"
)} )}
> >
{item.label} {item.label}
</Link> </Link>
))} ))}
</nav> </nav>
</div>
{/* Right side */} {/* Desktop Auth */}
<nav className="hidden sm:flex items-center h-full gap-2"> <nav className="hidden sm:flex items-center h-full gap-3">
{isAuthenticated ? ( {isAuthenticated ? (
<>
{/* Go to Command Center */}
<Link <Link
href="/terminal/radar" href="/terminal/radar"
className="flex items-center gap-2 h-9 px-4 text-[0.8125rem] bg-accent text-background className="flex items-center gap-2 h-9 px-5 text-xs bg-accent text-black font-bold uppercase tracking-wider hover:bg-white transition-colors"
font-bold uppercase tracking-wider hover:bg-accent-hover transition-all duration-200 rounded-none clip-path-slant-sm"
style={{ clipPath: 'polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px)' }}
> >
<LayoutDashboard className="w-4 h-4" /> <Target className="w-4 h-4" />
Command Center Terminal
</Link> </Link>
</>
) : (
<>
<Link
href="/login"
className="flex items-center h-9 px-4 text-[0.8125rem] text-foreground-muted hover:text-foreground
hover:bg-foreground/5 transition-all duration-200 uppercase tracking-wide rounded-none"
>
Sign In
</Link>
<Link
href="/register"
className="flex items-center h-9 ml-1 px-5 text-[0.8125rem] bg-accent text-background rounded-none
font-bold uppercase tracking-wider hover:bg-accent-hover transition-all duration-200 shadow-[0_0_20px_rgba(16,185,129,0.2)]"
style={{ clipPath: 'polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px)' }}
>
Start Hunting
</Link>
</>
)}
</nav>
{/* Mobile Menu Button */}
<button
className="sm:hidden p-2 text-foreground-muted hover:text-foreground transition-colors"
onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
>
{mobileMenuOpen ? <X className="w-5 h-5" /> : <Menu className="w-5 h-5" />}
</button>
</div>
{/* Mobile Menu */}
{mobileMenuOpen && (
<div className="sm:hidden border-t border-border bg-background/95 backdrop-blur-xl">
<nav className="px-4 py-4 space-y-1">
{/* Main Nav */}
{publicNavItems.map((item) => (
<Link
key={item.href}
href={item.href}
className={clsx(
"flex items-center gap-3 px-4 py-3 text-body-sm rounded-xl transition-all duration-200",
isActive(item.href)
? "bg-foreground/10 text-foreground font-medium"
: "text-foreground-muted hover:text-foreground hover:bg-foreground/5"
)}
>
<item.icon className="w-5 h-5" />
<span>{item.label}</span>
</Link>
))}
<div className="my-3 border-t border-border" />
{isAuthenticated ? (
<>
<Link
href="/terminal/radar"
className="flex items-center gap-3 px-4 py-3 text-body-sm text-center bg-accent text-background
font-bold uppercase tracking-wider hover:bg-accent-hover transition-all duration-200 rounded-none"
>
<LayoutDashboard className="w-5 h-5" />
<span>Command Center</span>
</Link>
</>
) : ( ) : (
<> <>
<Link <Link
href="/login" href="/login"
className="block px-4 py-3 text-body-sm text-foreground-muted className="flex items-center h-9 px-4 text-xs text-white/50 hover:text-white font-mono uppercase tracking-wider transition-colors"
hover:text-foreground hover:bg-foreground/5 transition-all duration-200 uppercase tracking-wide rounded-none"
> >
Sign In Sign In
</Link> </Link>
<Link <Link
href="/register" href="/register"
className="block px-4 py-3 text-body-sm text-center bg-accent text-background className="flex items-center h-9 px-5 text-xs bg-accent text-black font-bold uppercase tracking-wider hover:bg-white transition-colors"
font-bold uppercase tracking-wider hover:bg-accent-hover transition-all duration-200 shadow-[0_0_20px_rgba(16,185,129,0.2)] rounded-none"
> >
Start Hunting Start Free
</Link> </Link>
</> </>
)} )}
</nav> </nav>
{/* Mobile Menu Button */}
<button
className="sm:hidden w-10 h-10 flex items-center justify-center text-white/60 hover:text-white transition-colors"
onClick={() => setMenuOpen(!menuOpen)}
>
{menuOpen ? <X className="w-5 h-5" /> : <Menu className="w-5 h-5" />}
</button>
</div>
</header>
{/* Mobile Drawer */}
{menuOpen && (
<div className="sm:hidden fixed inset-0 z-[100]">
<div
className="absolute inset-0 bg-black/80 animate-in fade-in duration-200"
onClick={() => setMenuOpen(false)}
/>
<div
className="absolute top-0 right-0 bottom-0 w-[85%] max-w-[320px] bg-[#0A0A0A] border-l border-white/[0.08] animate-in slide-in-from-right duration-300 flex flex-col"
style={{ paddingTop: 'env(safe-area-inset-top)', paddingBottom: 'env(safe-area-inset-bottom)' }}
>
{/* Header */}
<div className="flex items-center justify-between p-4 border-b border-white/[0.08]">
<div className="flex items-center gap-3">
<Image src="/pounce-puma.png" alt="Pounce" width={28} height={28} className="object-contain" />
<div>
<p className="text-sm font-bold text-white">Pounce</p>
<p className="text-[9px] text-white/40 font-mono uppercase tracking-widest">Domain Intelligence</p>
</div>
</div>
<button
onClick={() => setMenuOpen(false)}
className="w-8 h-8 flex items-center justify-center border border-white/10 text-white/60 hover:text-white transition-all"
>
<X className="w-4 h-4" />
</button>
</div>
{/* Navigation */}
<div className="flex-1 overflow-y-auto py-4">
<div className="mb-4">
<div className="flex items-center gap-2 px-4 mb-2">
<div className="w-1 h-3 bg-accent" />
<span className="text-[9px] font-bold text-white/30 uppercase tracking-[0.2em]">Explore</span>
</div>
{publicNavItems.map((item) => (
<Link
key={item.href}
href={item.href}
onClick={() => setMenuOpen(false)}
className={clsx(
"flex items-center gap-3 px-4 py-3 transition-colors border-l-2",
isActive(item.href)
? "border-accent text-white bg-white/[0.03]"
: "border-transparent text-white/60 active:text-white active:bg-white/[0.03]"
)}
>
<item.icon className="w-4 h-4 text-white/30" />
<span className="text-sm font-medium">{item.label}</span>
</Link>
))}
</div>
{isAuthenticated && (
<div className="mb-4">
<div className="flex items-center gap-2 px-4 mb-2">
<div className="w-1 h-3 bg-accent" />
<span className="text-[9px] font-bold text-white/30 uppercase tracking-[0.2em]">Terminal</span>
</div>
<Link
href="/terminal/radar"
onClick={() => setMenuOpen(false)}
className="flex items-center gap-3 px-4 py-3 text-accent active:bg-white/[0.03] transition-colors border-l-2 border-transparent active:border-accent"
>
<Target className="w-4 h-4" />
<span className="text-sm font-medium">Command Center</span>
</Link>
</div>
)}
</div>
{/* Footer */}
<div className="p-4 bg-white/[0.02] border-t border-white/[0.08]">
{isAuthenticated ? (
<>
<div className="flex items-center gap-3 mb-3">
<div className="w-8 h-8 bg-accent/10 border border-accent/20 flex items-center justify-center">
<User className="w-4 h-4 text-accent" />
</div>
<div className="flex-1 min-w-0">
<p className="text-sm font-bold text-white truncate">
{user?.name || user?.email?.split('@')[0] || 'User'}
</p>
<p className="text-[9px] font-mono text-white/40 uppercase tracking-wider">{tierName}</p>
</div>
</div>
<Link
href="/terminal/radar"
onClick={() => setMenuOpen(false)}
className="flex items-center justify-center gap-2 w-full py-3 bg-accent text-black text-xs font-bold uppercase tracking-wider active:scale-[0.98] transition-all mb-2"
>
<Target className="w-3 h-3" />
Open Terminal
</Link>
<button
onClick={() => { logout(); setMenuOpen(false) }}
className="flex items-center justify-center gap-2 w-full py-2 border border-white/10 text-white/40 text-[10px] font-mono uppercase tracking-wider active:bg-white/5 transition-all"
>
<LogOut className="w-3 h-3" />
Sign out
</button>
</>
) : (
<>
<Link
href="/register"
onClick={() => setMenuOpen(false)}
className="flex items-center justify-center gap-2 w-full py-3 bg-accent text-black text-xs font-bold uppercase tracking-wider active:scale-[0.98] transition-all mb-2"
>
<Sparkles className="w-3 h-3" />
Start Free
</Link>
<Link
href="/login"
onClick={() => setMenuOpen(false)}
className="flex items-center justify-center gap-2 w-full py-2 border border-white/10 text-white/50 text-[10px] font-mono uppercase tracking-wider active:bg-white/5 transition-all"
>
Sign In
<ArrowRight className="w-3 h-3" />
</Link>
</>
)}
</div>
</div>
</div> </div>
)} )}
</header> </>
) )
} }

View File

@ -354,6 +354,33 @@ class ApiClient {
return this.request<void>(`/listings/${id}`, { method: 'DELETE' }) return this.request<void>(`/listings/${id}`, { method: 'DELETE' })
} }
async updateListing(id: number, data: { status?: string; title?: string; description?: string; asking_price?: number }) {
return this.request<any>(`/listings/${id}`, { method: 'PUT', body: JSON.stringify(data) })
}
async startDnsVerification(id: number) {
return this.request<{
verification_code: string
dns_record_type: string
dns_record_name: string
dns_record_value: string
instructions: string
status: string
}>(`/listings/${id}/verify-dns`, { method: 'POST' })
}
async checkDnsVerification(id: number) {
return this.request<{
verified: boolean
status: string
message: string
}>(`/listings/${id}/verify-dns/check`)
}
async getListingInquiries(id: number) {
return this.request<any[]>(`/listings/${id}/inquiries`)
}
// Subscription // Subscription
async getSubscription() { async getSubscription() {
return this.request<{ return this.request<{