diff --git a/frontend/src/app/terminal/watchlist/page.tsx b/frontend/src/app/terminal/watchlist/page.tsx index ed93b86..d6e4362 100755 --- a/frontend/src/app/terminal/watchlist/page.tsx +++ b/frontend/src/app/terminal/watchlist/page.tsx @@ -552,35 +552,40 @@ export default function WatchlistPage() { {/* ═══════════════════════════════════════════════════════════════════════ */}
{!filteredDomains.length ? ( -
- -

No domains in your watchlist

-

Add a domain above to start monitoring

+
+ +

No domains in watchlist

+

+ Add a domain to start monitoring availability and expiry +

) : ( -
+
{/* Desktop Table Header */} -
- - - -
Alert
Actions
+ {/* Table Body */} +
+ {filteredDomains.map((domain) => { const health = healthReports[domain.id] const healthStatus = health?.status || 'unknown' @@ -593,61 +598,35 @@ export default function WatchlistPage() { className="bg-[#020202] hover:bg-white/[0.02] transition-all" > {/* Mobile Row */} -
-
-
-
- -
- {domain.registrar || 'Unknown registrar'} -
+
+
+
+ +
+ {domain.registrar || 'Unknown'} + {days !== null && days <= 30 && days > 0 && ( + {days}d left + )}
- +
- {domain.is_available ? '✓ AVAIL' : 'TAKEN'} + {domain.is_available ? 'AVAIL' : 'TAKEN'}
-
- {/* Expiry Info */} - {days !== null && days <= 30 && days > 0 && !domain.is_available && ( -
- - Expires in {days} days -
- )} - {/* Actions */}
{domain.is_available ? ( @@ -655,58 +634,48 @@ export default function WatchlistPage() { href={`https://www.namecheap.com/domains/registration/results/?domain=${domain.name}`} target="_blank" rel="noopener noreferrer" - className="flex-1 py-3 bg-accent text-black text-[11px] font-bold uppercase tracking-wider flex items-center justify-center gap-2" + className="flex-1 h-12 text-xs font-black uppercase tracking-widest flex items-center justify-center gap-2 bg-accent text-black hover:bg-white transition-all" > - - Buy Now + Buy ) : ( )} - -
@@ -714,39 +683,32 @@ export default function WatchlistPage() { {/* Desktop Row */}
{/* Domain */} -
-
- -
- {domain.registrar || 'Unknown registrar'} -
+
+ +
+ {domain.registrar || 'Unknown'}
- - -
{/* Status */}
- {domain.is_available ? '✓ AVAIL' : 'TAKEN'} + {domain.is_available ? 'AVAIL' : 'TAKEN'}
@@ -755,10 +717,8 @@ export default function WatchlistPage() {
{/* Expires */} -
+
{days !== null && days <= 30 && days > 0 ? ( - {days}d left + {days}d ) : ( {formatExpiryDate(domain.expiration_date)} )} @@ -787,7 +747,7 @@ export default function WatchlistPage() { onClick={() => handleToggleNotify(domain.id, domain.notify_on_available)} disabled={togglingNotifyId === domain.id} className={clsx( - "w-9 h-9 flex items-center justify-center border transition-colors", + "w-10 h-10 flex items-center justify-center border transition-all", domain.notify_on_available ? "text-accent border-accent/30 bg-accent/10" : "text-white/20 border-white/10 hover:text-white/40 hover:bg-white/5" @@ -804,16 +764,16 @@ export default function WatchlistPage() {
{/* Actions */} -
+
{domain.is_available ? ( - - Buy Now + + Buy ) : ( <> @@ -821,16 +781,16 @@ export default function WatchlistPage() { onClick={() => handleRefresh(domain.id)} disabled={refreshingId === domain.id} title="Refresh" - className="w-8 h-8 flex items-center justify-center text-white/30 hover:text-white border border-white/10 hover:bg-white/5 transition-all" + className="w-10 h-10 flex items-center justify-center text-white/40 hover:text-white border border-white/10 hover:bg-white/5 transition-all" > - + )} @@ -838,12 +798,12 @@ export default function WatchlistPage() { onClick={() => handleDelete(domain.id, domain.name)} disabled={deletingId === domain.id} title="Remove" - className="w-8 h-8 flex items-center justify-center text-white/30 hover:text-rose-400 border border-white/10 hover:border-rose-400/20 hover:bg-rose-500/10 transition-all" + className="w-10 h-10 flex items-center justify-center text-white/40 hover:text-rose-400 border border-white/10 hover:border-rose-400/20 hover:bg-rose-500/10 transition-all" > {deletingId === domain.id ? ( - + ) : ( - + )}
@@ -851,6 +811,7 @@ export default function WatchlistPage() {
) })} +
)}
diff --git a/frontend/src/components/analyze/AnalyzePanel.tsx b/frontend/src/components/analyze/AnalyzePanel.tsx index 9a46b88..54d8b53 100644 --- a/frontend/src/components/analyze/AnalyzePanel.tsx +++ b/frontend/src/components/analyze/AnalyzePanel.tsx @@ -106,10 +106,17 @@ async function copyToClipboard(text: string) { } } -function formatValue(value: unknown): string { +function formatValue(value: unknown, key?: string): string { if (value === null || value === undefined) return '—' if (typeof value === 'string') return value - if (typeof value === 'number') return String(value) + if (typeof value === 'number') { + // Format USD values with currency symbol + const usdKeys = ['cheapest_registration', 'cheapest_renewal', 'cheapest_transfer', 'renewal_burn', 'estimated_value', 'cpc'] + if (key && usdKeys.some(k => key.toLowerCase().includes(k.replace('_', '')))) { + return `$${value.toFixed(2)}` + } + return String(value) + } if (typeof value === 'boolean') return value ? 'Yes' : 'No' if (Array.isArray(value)) return `${value.length} items` return 'Details' @@ -521,7 +528,7 @@ export function AnalyzePanel() { item.status === 'warn' ? "text-amber-400" : item.status === 'fail' ? "text-rose-400" : "text-white/70" )}> - {formatValue(item.value)} + {formatValue(item.value, item.key)} )}