From 9df3e44fd01eea4d8cf17eea09c207a45d7b8a51 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 20 Mar 2026 06:34:08 +0000 Subject: [PATCH] V0.1 --- frontend/app/ai-log/page.tsx | 86 ++-- frontend/app/dashboard/page.tsx | 198 ++++++--- frontend/app/globals.css | 206 ++++----- frontend/app/keywords/page.tsx | 95 ++-- frontend/app/layout.tsx | 31 +- frontend/app/listings/page.tsx | 130 ++++-- frontend/app/page.tsx | 249 +++++++---- frontend/app/settings/page.tsx | 201 ++++++--- frontend/app/sites/page.tsx | 107 +++-- frontend/components/GlitchText.tsx | 16 - frontend/components/Hero3D.tsx | 106 +++++ frontend/components/Navbar.tsx | 57 ++- frontend/components/PageTransition.tsx | 22 + frontend/components/theme-provider.tsx | 11 + frontend/components/theme-toggle.tsx | 20 + frontend/package-lock.json | 587 ++++++++++++++++++++++++- frontend/package.json | 6 + 17 files changed, 1609 insertions(+), 519 deletions(-) delete mode 100644 frontend/components/GlitchText.tsx create mode 100644 frontend/components/Hero3D.tsx create mode 100644 frontend/components/PageTransition.tsx create mode 100644 frontend/components/theme-provider.tsx create mode 100644 frontend/components/theme-toggle.tsx diff --git a/frontend/app/ai-log/page.tsx b/frontend/app/ai-log/page.tsx index f0369db..2d888a1 100644 --- a/frontend/app/ai-log/page.tsx +++ b/frontend/app/ai-log/page.tsx @@ -1,77 +1,95 @@ "use client"; import { motion } from 'framer-motion'; -import { TerminalSquare, Filter, RefreshCw } from 'lucide-react'; +import { TerminalSquare, Filter, RefreshCw, Cpu, Brain, Zap } from 'lucide-react'; const mockLogs = [ { id: 1, time: '10:41:30', agent: 'Analyst', type: 'REJECT', cost: '$0.0012', prompt: 'Evaluate lot: "RTX 4090 Box Only" against criteria...', response: '{"verdict": "REJECT", "reason": "Listing explicitly states \'Box Only\', violating target criteria."}' }, { id: 2, time: '10:40:12', agent: 'Analyst', type: 'APPROVE', cost: '$0.0025', prompt: 'Evaluate lot: "ThinkPad T14 Gen 3" against criteria...', response: '{"verdict": "APPROVE", "reason": "Matches specs, good condition, price $450 is significantly below $800 avg."}' }, { id: 3, time: '10:39:45', agent: 'Strategist', type: 'OPTIMIZE', cost: '$0.0050', prompt: 'Analyze last 24h win rates on ShopGoodwill...', response: '{"action": "UPDATE_SCHEDULE", "target": "ShopGoodwill", "new_cron": "0 * * * *"}' }, + { id: 4, time: '10:35:10', agent: 'Scout', type: 'INFO', cost: '$0.0005', prompt: 'Parse unstructured layout changes on eBay UK...', response: '{"action": "SELECTORS_UPDATED", "confidence": 0.98 }' }, ]; export default function AILogPage() { return ( -
-
+
+
-

NEURAL_TELEMETRY

-

Raw input/output logs from all connected LLMs.

+

+ Neural Telemetry +

+

Raw input/output logs from all connected LLM agents.

-
- -
-
-
-
TIMESTAMP / AGENT
-
TYPE
-
PROMPT_PREVIEW
-
RESPONSE_PREVIEW
-
COST
+
+
+
Time / Agent
+
Action
+
Prompt Context
+
JSON Response
+
Est. Cost
-
+
{mockLogs.map((log, i) => ( -
- {log.time} - {log.agent} +
+ {log.time} + + {log.agent === 'Analyst' ? : log.agent === 'Strategist' ? : } + {log.agent} +
-
- +
+ {log.type}
-
+
{log.prompt}
-
+
{log.response}
-
+
{log.cost}
))} -
- - End of stream. Waiting for new inferences... -
+ +
+ +
+ End of stream. Awaiting new neural inferences... +
); -} +} \ No newline at end of file diff --git a/frontend/app/dashboard/page.tsx b/frontend/app/dashboard/page.tsx index 929d66c..179042c 100644 --- a/frontend/app/dashboard/page.tsx +++ b/frontend/app/dashboard/page.tsx @@ -1,83 +1,169 @@ "use client"; import { motion } from 'framer-motion'; -import { Activity, Zap, ShieldAlert, Cpu } from 'lucide-react'; +import { Activity, Zap, ShieldAlert, Cpu, TrendingUp, CheckCircle2, Clock } from 'lucide-react'; + +const stats = [ + { title: 'Lots Scanned', value: '142,893', icon: Activity, color: 'text-blue-500', bg: 'bg-blue-500/10', border: 'border-blue-500/20' }, + { title: 'Active Targets', value: '84', icon: Zap, color: 'text-amber-500', bg: 'bg-amber-500/10', border: 'border-amber-500/20' }, + { title: 'Alerts Fired', value: '1,204', icon: TrendingUp, color: 'text-purple-500', bg: 'bg-purple-500/10', border: 'border-purple-500/20' }, + { title: 'AI Decisions', value: '89,430', icon: Cpu, color: 'text-green-500', bg: 'bg-green-500/10', border: 'border-green-500/20' }, +]; + +const containerVariants = { + hidden: { opacity: 0 }, + show: { + opacity: 1, + transition: { + staggerChildren: 0.1, + } + } +}; + +const itemVariants = { + hidden: { opacity: 0, y: 20, scale: 0.9 }, + show: { opacity: 1, y: 0, scale: 1, transition: { type: "spring" as const, stiffness: 300, damping: 24 } } +}; export default function DashboardPage() { return ( -
-
-
-

SYSTEM_OVERVIEW

-

Real-time status of all autonomous agents.

-
-
- Status: RUNNING -
-
+
+
-
- {[ - { title: 'Lots Scanned', value: '142,893', icon: Activity, color: 'text-primary' }, - { title: 'Active Targets', value: '84', icon: Zap, color: 'text-accent' }, - { title: 'Alerts Fired', value: '1,204', icon: ShieldAlert, color: 'text-destructive' }, - { title: 'AI Decisions', value: '89,430', icon: Cpu, color: 'text-primary' }, - ].map((stat, i) => ( + +
+

+ System Overview 🚀 +

+

Real-time status of all your autonomous AI agents.

+
+ + + + + + All Systems Go + +
+ + + {stats.map((stat, i) => ( -
-
{stat.title}
- +
+
+
{stat.title}
+
+ +
-
{stat.value}
+
{stat.value}
))} -
+
-

LIVE_ACTIVITY_LOG

-
-
[10:42:01] Scout Agent detected new items on eBay_UK...
-
[10:41:55] Analyst Agent processing 14 lots for "RTX 4090"...
-
[10:41:30] MATCH FOUND: "RTX 4090 Box Only" - Rejected by AI (Reason: Scam)
-
[10:40:12] HIGH VALUE MATCH: "ThinkPad T14 Gen 3" - $450 (Est: $800). Alert Sent.
-
[10:39:45] Strategist Agent optimizing scrape timings for ShopGoodwill...
+
+
+ +

Live Activity Log

+
+
+ {[ + { time: '10:42:01 AM', msg: 'Scout Agent detected new items on eBay_UK...', type: 'normal' }, + { time: '10:41:55 AM', msg: 'Analyst Agent processing 14 lots for "RTX 4090"...', type: 'normal' }, + { time: '10:41:30 AM', msg: 'MATCH FOUND: "RTX 4090 Box Only" - Rejected by AI (Reason: Scam)', type: 'warning' }, + { time: '10:40:12 AM', msg: 'HIGH VALUE MATCH: "ThinkPad T14 Gen 3" - $450 (Est: $800). Alert Sent.', type: 'success' }, + { time: '10:39:45 AM', msg: 'Strategist Agent optimizing scrape timings for ShopGoodwill...', type: 'normal' }, + ].map((log, j) => ( + + {log.time} + + {log.type === 'success' && } + {log.msg} + + + ))}
-

NODE_HEALTH

-
-
-
eBay US 100%
-
-
-
-
eBay UK 98%
-
-
-
-
HiBid 85%
-
-
-
-
ShopGoodwill 99%
-
-
+
+
+ +

Node Health

+
+
+ {[ + { name: 'eBay US', health: 100, color: 'bg-green-500', shadow: 'shadow-[0_0_15px_rgba(34,197,94,0.5)]' }, + { name: 'eBay UK', health: 98, color: 'bg-blue-500', shadow: 'shadow-[0_0_15px_rgba(59,130,246,0.5)]' }, + { name: 'HiBid', health: 85, color: 'bg-amber-500', shadow: 'shadow-[0_0_15px_rgba(245,158,11,0.5)]' }, + { name: 'ShopGoodwill', health: 99, color: 'bg-purple-500', shadow: 'shadow-[0_0_15px_rgba(168,85,247,0.5)]' } + ].map((node, i) => ( +
+
+ {node.name} + {node.health}% +
+
+ +
+ +
+
+ ))}
diff --git a/frontend/app/globals.css b/frontend/app/globals.css index 9110754..94939ac 100644 --- a/frontend/app/globals.css +++ b/frontend/app/globals.css @@ -1,133 +1,113 @@ @import "tailwindcss"; @theme { - --color-background: oklch(0.145 0 0); - --color-foreground: oklch(0.985 0 0); - --color-card: oklch(0.145 0 0); - --color-card-foreground: oklch(0.985 0 0); - --color-popover: oklch(0.145 0 0); - --color-popover-foreground: oklch(0.985 0 0); - --color-primary: oklch(0.835 0.28 152); /* Neon green #00ff88 equivalent */ - --color-primary-foreground: oklch(0.145 0 0); - --color-secondary: oklch(0.269 0 0); - --color-secondary-foreground: oklch(0.985 0 0); - --color-muted: oklch(0.269 0 0); - --color-muted-foreground: oklch(0.708 0 0); - --color-accent: oklch(0.85 0.17 95); /* Neon gold #fbbf24 */ - --color-accent-foreground: oklch(0.145 0 0); - --color-destructive: oklch(0.637 0.237 25.331); /* Neon red #ef4444 */ - --color-destructive-foreground: oklch(0.985 0 0); - --color-border: oklch(0.269 0 0); - --color-input: oklch(0.269 0 0); - --color-ring: oklch(0.835 0.28 152); - --radius: 0.5rem; + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --radius: 0.75rem; } @layer base { :root { - --background: 222 47% 6%; - --foreground: 210 40% 98%; - --border: 217 32% 17%; + --background: oklch(0.985 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(0.985 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(0.985 0 0); + --popover-foreground: oklch(0.145 0 0); + + /* Vibrant tech blue/purple for fun tech style */ + --primary: oklch(0.55 0.25 260); + --primary-foreground: oklch(0.985 0 0); + + --secondary: oklch(0.95 0.05 250); + --secondary-foreground: oklch(0.2 0.1 260); + + --muted: oklch(0.96 0 0); + --muted-foreground: oklch(0.5 0 0); + + /* Fun energetic orange accent */ + --accent: oklch(0.7 0.2 40); + --accent-foreground: oklch(0.985 0 0); + + --destructive: oklch(0.6 0.2 20); + --destructive-foreground: oklch(0.985 0 0); + + --border: oklch(0.9 0 0); + --input: oklch(0.9 0 0); + --ring: oklch(0.55 0.25 260); + } + + .dark { + --background: oklch(0.15 0.02 260); + --foreground: oklch(0.985 0 0); + --card: oklch(0.18 0.03 260); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.15 0.02 260); + --popover-foreground: oklch(0.985 0 0); + + --primary: oklch(0.65 0.25 260); /* Brighter in dark mode */ + --primary-foreground: oklch(0.1 0.1 260); + + --secondary: oklch(0.25 0.05 260); + --secondary-foreground: oklch(0.985 0 0); + + --muted: oklch(0.25 0.05 260); + --muted-foreground: oklch(0.7 0 0); + + --accent: oklch(0.75 0.2 40); + --accent-foreground: oklch(0.1 0.1 40); + + --destructive: oklch(0.5 0.2 20); + --destructive-foreground: oklch(0.985 0 0); + + --border: oklch(0.25 0.05 260); + --input: oklch(0.25 0.05 260); + --ring: oklch(0.65 0.25 260); } body { - background-color: #0a0e17; - color: #f8fafc; - border-color: #1e293b; - background-image: - radial-gradient(circle at 15% 50%, rgba(0, 255, 136, 0.04) 0%, transparent 25%), - radial-gradient(circle at 85% 30%, rgba(251, 191, 36, 0.04) 0%, transparent 25%); + background-color: var(--background); + color: var(--foreground); + border-color: var(--border); + transition: background-color 0.3s ease, color 0.3s ease; } } -/* Custom Cyberpunk Styles */ -.neon-text-primary { - text-shadow: 0 0 10px rgba(0, 255, 136, 0.5), 0 0 20px rgba(0, 255, 136, 0.3); +/* Base Fun Tech Styles */ +.bg-gradient-tech { + background-image: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%); } -.neon-text-accent { - text-shadow: 0 0 10px rgba(251, 191, 36, 0.5), 0 0 20px rgba(251, 191, 36, 0.3); +.text-gradient-tech { + background-image: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; } -.neon-box-primary { - box-shadow: 0 0 15px rgba(0, 255, 136, 0.2), inset 0 0 10px rgba(0, 255, 136, 0.1); - border: 1px solid rgba(0, 255, 136, 0.4); -} - -.neon-box-accent { - box-shadow: 0 0 15px rgba(251, 191, 36, 0.2), inset 0 0 10px rgba(251, 191, 36, 0.1); - border: 1px solid rgba(251, 191, 36, 0.4); -} - -.cyber-grid { +/* Animated Grid Background */ +.tech-grid { background-size: 40px 40px; background-image: - linear-gradient(to right, rgba(255, 255, 255, 0.03) 1px, transparent 1px), - linear-gradient(to bottom, rgba(255, 255, 255, 0.03) 1px, transparent 1px); - mask-image: linear-gradient(to bottom, black 40%, transparent 100%); - -webkit-mask-image: linear-gradient(to bottom, black 40%, transparent 100%); + linear-gradient(to right, oklch(0.5 0 0 / 0.05) 1px, transparent 1px), + linear-gradient(to bottom, oklch(0.5 0 0 / 0.05) 1px, transparent 1px); + mask-image: radial-gradient(circle at center, black 40%, transparent 100%); + -webkit-mask-image: radial-gradient(circle at center, black 40%, transparent 100%); } - -.glitch-wrapper { - position: relative; -} - -.glitch-text::before, -.glitch-text::after { - content: attr(data-text); - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - opacity: 0.8; -} - -.glitch-text::before { - color: #0ff; - z-index: -1; - animation: glitch-anim-1 2s infinite linear alternate-reverse; -} - -.glitch-text::after { - color: #f0f; - z-index: -2; - animation: glitch-anim-2 3s infinite linear alternate-reverse; -} - -@keyframes glitch-anim-1 { - 0% { clip-path: inset(20% 0 80% 0); transform: translate(-2px, 1px); } - 20% { clip-path: inset(60% 0 10% 0); transform: translate(2px, -1px); } - 40% { clip-path: inset(40% 0 50% 0); transform: translate(-2px, 2px); } - 60% { clip-path: inset(80% 0 5% 0); transform: translate(2px, -2px); } - 80% { clip-path: inset(10% 0 70% 0); transform: translate(-1px, 1px); } - 100% { clip-path: inset(30% 0 50% 0); transform: translate(1px, -1px); } -} - -@keyframes glitch-anim-2 { - 0% { clip-path: inset(10% 0 60% 0); transform: translate(2px, -1px); } - 20% { clip-path: inset(30% 0 20% 0); transform: translate(-2px, 1px); } - 40% { clip-path: inset(70% 0 10% 0); transform: translate(2px, -2px); } - 60% { clip-path: inset(20% 0 50% 0); transform: translate(-2px, 2px); } - 80% { clip-path: inset(50% 0 30% 0); transform: translate(1px, -1px); } - 100% { clip-path: inset(5% 0 80% 0); transform: translate(-1px, 1px); } -} - -/* CRT Scanline effect */ -.scanlines::before { - content: " "; - display: block; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - background: linear-gradient( - to bottom, - rgba(18, 16, 16, 0) 50%, - rgba(0, 0, 0, 0.25) 50% - ); - background-size: 100% 4px; - z-index: 50; - pointer-events: none; -} \ No newline at end of file diff --git a/frontend/app/keywords/page.tsx b/frontend/app/keywords/page.tsx index 3351cdf..0fea100 100644 --- a/frontend/app/keywords/page.tsx +++ b/frontend/app/keywords/page.tsx @@ -1,7 +1,7 @@ "use client"; import { motion } from 'framer-motion'; -import { Plus, Search, GripVertical, Settings2, Trash2 } from 'lucide-react'; +import { Plus, Search, GripVertical, Settings2, Trash2, Target } from 'lucide-react'; const mockTargets = [ { id: 1, term: 'ThinkPad T14 Gen 3', maxPrice: 600, weight: 1.5, status: 'active' }, @@ -11,59 +11,63 @@ const mockTargets = [ export default function KeywordsPage() { return ( -
-
+
+
-

TARGET_VECTORS

-

Define what the AI agents should hunt for.

+

+ Target Vectors +

+

Define the precise assets your AI agents should hunt for.

-
-
-
-
ORDER
-
SEARCH_TERM
-
MAX_PRICE
-
PRIORITY
-
ACTIONS
+
+
+
Sort
+
Search Query
+
Max Price
+
Priority
+
Actions
-
+
{mockTargets.map((target, i) => ( -
- +
+
-
- +
+
+ +
{target.term}
-
+
${target.maxPrice}
-
-
-
+
+
+
- {target.weight}x + {target.weight}x
-
- -
@@ -71,13 +75,24 @@ export default function KeywordsPage() {
-
-

AI_FILTERING_TEMPLATE

-

You can define a natural language description for the LLM to verify against. e.g. "Item must not be broken. Must include power cable. Ignore 'box only' listings."

-
- // Enter custom instructions for the Analyst Agent here... + +
+
+ +
+

Global AI Filtering Template

-
+

Define a natural language description for the LLM to verify against globally. For example: "Item must not be broken. Must include power cable. Ignore 'box only' listings."

+