diff --git a/frontend/src/app/terminal/hunt/page.tsx b/frontend/src/app/terminal/hunt/page.tsx index 3ed150d..6e84dbf 100644 --- a/frontend/src/app/terminal/hunt/page.tsx +++ b/frontend/src/app/terminal/hunt/page.tsx @@ -46,10 +46,10 @@ type HuntTab = 'auctions' | 'drops' | 'search' | 'trends' | 'forge' // ============================================================================ const TABS: Array<{ key: HuntTab; label: string; shortLabel: string; icon: any; color: string }> = [ - { key: 'auctions', label: 'Auctions', shortLabel: 'Auctions', icon: Gavel, color: 'accent' }, + { key: 'search', label: 'Search', shortLabel: 'Search', icon: Search, color: 'accent' }, { key: 'drops', label: 'Drops', shortLabel: 'Drops', icon: Download, color: 'blue' }, - { key: 'search', label: 'Search', shortLabel: 'Search', icon: Search, color: 'white' }, - { key: 'trends', label: 'Trends', shortLabel: 'Trends', icon: Flame, color: 'orange' }, + { key: 'auctions', label: 'Auctions', shortLabel: 'Auctions', icon: Gavel, color: 'orange' }, + { key: 'trends', label: 'Trends', shortLabel: 'Trends', icon: Flame, color: 'rose' }, { key: 'forge', label: 'Forge', shortLabel: 'Forge', icon: Wand2, color: 'purple' }, ] @@ -60,7 +60,7 @@ const TABS: Array<{ key: HuntTab; label: string; shortLabel: string; icon: any; export default function HuntPage() { const { user, subscription, logout, checkAuth } = useStore() const { toast, showToast, hideToast } = useToast() - const [tab, setTab] = useState('auctions') + const [tab, setTab] = useState('search') // Mobile Menu State const [menuOpen, setMenuOpen] = useState(false) @@ -143,17 +143,19 @@ export default function HuntPage() { onClick={() => setTab(t.key)} className={clsx( 'flex items-center gap-1.5 px-3 py-2 border transition-all shrink-0', - isActive - ? t.color === 'accent' - ? 'border-accent/40 bg-accent/10 text-accent' - : t.color === 'blue' - ? 'border-blue-500/40 bg-blue-500/10 text-blue-400' - : t.color === 'orange' - ? 'border-orange-500/40 bg-orange-500/10 text-orange-400' - : t.color === 'purple' - ? 'border-purple-500/40 bg-purple-500/10 text-purple-400' - : 'border-white/40 bg-white/10 text-white' - : 'border-transparent text-white/40 active:bg-white/5' +isActive + ? t.color === 'accent' + ? 'border-accent/40 bg-accent/10 text-accent' + : t.color === 'blue' + ? 'border-blue-500/40 bg-blue-500/10 text-blue-400' + : t.color === 'orange' + ? 'border-orange-500/40 bg-orange-500/10 text-orange-400' + : t.color === 'rose' + ? 'border-rose-500/40 bg-rose-500/10 text-rose-400' + : t.color === 'purple' + ? 'border-purple-500/40 bg-purple-500/10 text-purple-400' + : 'border-white/40 bg-white/10 text-white' + : 'border-transparent text-white/40 active:bg-white/5' )} > @@ -192,6 +194,7 @@ export default function HuntPage() { blue: { active: 'border-blue-500 bg-blue-500/10 text-blue-400', inactive: 'border-white/[0.08] text-white/50 hover:text-white hover:bg-white/[0.02]' }, white: { active: 'border-white/40 bg-white/10 text-white', inactive: 'border-white/[0.08] text-white/50 hover:text-white hover:bg-white/[0.02]' }, orange: { active: 'border-orange-500 bg-orange-500/10 text-orange-400', inactive: 'border-white/[0.08] text-white/50 hover:text-white hover:bg-white/[0.02]' }, + rose: { active: 'border-rose-500 bg-rose-500/10 text-rose-400', inactive: 'border-white/[0.08] text-white/50 hover:text-white hover:bg-white/[0.02]' }, purple: { active: 'border-purple-500 bg-purple-500/10 text-purple-400', inactive: 'border-white/[0.08] text-white/50 hover:text-white hover:bg-white/[0.02]' }, } const classes = colorClasses[t.color] || colorClasses.white diff --git a/frontend/src/components/analyze/AnalyzePanel.tsx b/frontend/src/components/analyze/AnalyzePanel.tsx index ee4c0b8..8f0efe7 100644 --- a/frontend/src/components/analyze/AnalyzePanel.tsx +++ b/frontend/src/components/analyze/AnalyzePanel.tsx @@ -56,7 +56,8 @@ function getSectionConfig(key: string) { color: 'text-blue-400', bg: 'bg-blue-500/10', border: 'border-blue-500/20', - description: 'Age, backlinks, and trust signals' + description: 'Domain age, backlink profile, and trust signals', + tooltip: 'Authority measures how established and trusted the domain is. Older domains with quality backlinks rank better.' } case 'market': return { @@ -64,7 +65,8 @@ function getSectionConfig(key: string) { color: 'text-emerald-400', bg: 'bg-emerald-500/10', border: 'border-emerald-500/20', - description: 'Search volume, CPC, and TLD availability' + description: 'Search demand, ad value, and TLD availability', + tooltip: 'Market data shows commercial potential. High search volume + CPC = strong buyer intent.' } case 'risk': return { @@ -72,7 +74,8 @@ function getSectionConfig(key: string) { color: 'text-amber-400', bg: 'bg-amber-500/10', border: 'border-amber-500/20', - description: 'Trademark, blacklist, and archive checks' + description: 'Trademark conflicts, blacklists, and history', + tooltip: 'Risk checks help avoid legal issues and spam penalties. Always clear before buying.' } case 'value': return { @@ -80,7 +83,8 @@ function getSectionConfig(key: string) { color: 'text-violet-400', bg: 'bg-violet-500/10', border: 'border-violet-500/20', - description: 'Estimated value and comparable sales' + description: 'Estimated worth and recent comparable sales', + tooltip: 'Value estimation based on length, keywords, extension, and actual market sales.' } case 'vision': return { @@ -88,7 +92,8 @@ function getSectionConfig(key: string) { color: 'text-accent', bg: 'bg-accent/10', border: 'border-accent/20', - description: 'AI-powered business concept and buyer analysis' + description: 'AI business concepts and ideal buyer profiles', + tooltip: 'AI-powered analysis suggesting business uses and potential buyers for this domain.' } default: return { @@ -96,7 +101,8 @@ function getSectionConfig(key: string) { color: 'text-white/50', bg: 'bg-white/5', border: 'border-white/10', - description: '' + description: '', + tooltip: '' } } } @@ -125,18 +131,40 @@ function isMatrix(item: AnalyzeItem) { function getItemTooltip(key: string): string { const tooltips: Record = { - domain_age: 'How long the domain has been registered. Older = more authority.', - backlinks: 'Number of external websites linking to this domain.', - trust_flow: 'Quality score of backlinks (0-100). Higher = more trusted.', - radio_test: 'How easy is the domain to spell when heard verbally.', - search_volume: 'Monthly Google searches for the main keyword.', - cpc: 'Cost-per-click for ads on this keyword. Higher = more commercial value.', - tld_matrix: 'Availability of this name across popular TLDs.', - trademark: 'Potential trademark conflicts. Clear = safe to use.', - blacklist: 'Whether the domain appears on spam/malware lists.', - archive: 'Wayback Machine history. Shows previous usage.', - estimated_value: 'AI-estimated market value based on comparables.', - comps: 'Similar domains that have sold recently.', + // Authority + domain_age: 'Registration age of the domain. Older domains typically have more authority and trust in search engines. 5+ years is excellent.', + age: 'Registration age of the domain. Older domains typically have more authority and trust in search engines. 5+ years is excellent.', + backlinks: 'Number of external websites linking to this domain. More backlinks = higher authority. Quality matters more than quantity.', + trust_flow: 'Majestic Trust Flow score (0-100). Measures the quality of backlinks. Higher = more trusted by search engines.', + citation_flow: 'Majestic Citation Flow score (0-100). Measures the quantity of backlinks regardless of quality.', + radio_test: 'Pronounceability test. Can someone spell the domain correctly after hearing it once? Important for word-of-mouth.', + syllables: 'Number of syllables. Fewer is better - 2-3 syllables is ideal for brandability.', + + // Market + search_volume: 'Monthly Google searches for the main keyword. Higher = more organic traffic potential.', + cpc: 'Google Ads Cost-Per-Click. Higher CPC = more commercial intent. $5+ indicates strong buyer intent.', + tld_matrix: 'Availability across popular TLDs (.com, .net, .org etc). Green = available for registration.', + competition: 'SEO competition level. Lower = easier to rank. "Low" is ideal for new sites.', + + // Risk + trademark: 'USPTO trademark database check. "Clear" means no conflicts found. Always verify before buying.', + blacklist: 'Spam and malware blacklist check. "Clean" means domain is not flagged by security services.', + archive: 'Wayback Machine first capture date. Shows domain history and previous content.', + spam_score: 'Moz Spam Score (0-100). Lower = cleaner history. Above 30% is concerning.', + + // Value + estimated_value: 'AI-estimated market value based on comparable sales, length, keywords, and extension.', + comps: 'Recently sold domains with similar characteristics. Used to determine market value.', + price_range: 'Suggested listing price range based on market analysis.', + + // DNS + dns_records: 'Active DNS records. Shows if domain is currently configured.', + nameservers: 'Current nameservers. Indicates where domain is hosted.', + mx_records: 'Mail exchange records. Shows if email is configured.', + + // General + length: 'Character count. Shorter is generally more valuable. Under 8 characters is premium.', + extension: 'Top-level domain (.com, .io, etc). .com is most valuable, followed by ccTLDs and new gTLDs.', } return tooltips[key] || '' } @@ -329,66 +357,95 @@ export function AnalyzePanel() { {/* Score Bar */} {overallScore && !loading && (
-
-
= 70 ? "text-accent" : overallScore.score >= 40 ? "text-amber-400" : "text-rose-400" - )}> - {overallScore.score} -
-
-
Health Score
-
-
-
-
+
+
+
= 70 ? "border-accent bg-accent/10" : + overallScore.score >= 40 ? "border-amber-400 bg-amber-400/10" : "border-rose-500 bg-rose-500/10" + )} + title={`Health Score: ${overallScore.score}/100. ${overallScore.score >= 70 ? 'Excellent - safe to buy' : overallScore.score >= 40 ? 'Moderate - review warnings' : 'Poor - significant issues'}`} + > + = 70 ? "text-accent" : overallScore.score >= 40 ? "text-amber-400" : "text-rose-400" + )}> + {overallScore.score} + +
+
+
+
Health Score
+
+ {overallScore.score >= 70 ? '✓ Good to buy' : overallScore.score >= 40 ? '⚠ Review issues' : '⛔ High risk'} +
+
+
+
+
+
+
+
+ + {overallScore.pass} passed + + + {overallScore.warn} warnings + + + {overallScore.fail} failed + +
-
-
- - {overallScore.pass} - - - {overallScore.warn} - - - {overallScore.fail} -
)} - {/* Controls */} -
- + {data?.cached && ( + + + Cached Result + )} - title="Fast mode uses DNS-only checks for speed" - > - - Fast - - {data?.cached && ( - - - Cached - - )} + {fastMode && ( + + DNS-only, limited details + + )} +
@@ -431,29 +488,37 @@ export function AnalyzePanel() {