diff --git a/backend/celerybeat-schedule b/backend/celerybeat-schedule index 9c9ad4b9..af639538 100644 Binary files a/backend/celerybeat-schedule and b/backend/celerybeat-schedule differ diff --git a/frontend/src/components/dashboard/EnhancedMetricCard.tsx b/frontend/src/components/dashboard/EnhancedMetricCard.tsx index f2a84fa1..9d5891fe 100644 --- a/frontend/src/components/dashboard/EnhancedMetricCard.tsx +++ b/frontend/src/components/dashboard/EnhancedMetricCard.tsx @@ -62,7 +62,7 @@ export default function EnhancedMetricCard({ subtitle, trend, icon, - accentColor, + accentColor = "blue", // Default to blue if not provided href, onClick, tooltip, @@ -70,7 +70,7 @@ export default function EnhancedMetricCard({ className = "", }: MetricCardProps) { const [isHovered, setIsHovered] = useState(false); - const colors = accentColors[accentColor]; + const colors = accentColors[accentColor] || accentColors.blue; // Fallback to blue if invalid const formatValue = (val: string | number): string => { if (typeof val === "number") { diff --git a/frontend/src/components/linker/LinkResults.tsx b/frontend/src/components/linker/LinkResults.tsx index 9f3c3876..9f18c231 100644 --- a/frontend/src/components/linker/LinkResults.tsx +++ b/frontend/src/components/linker/LinkResults.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Link2, CheckCircle, XCircle } from 'lucide-react'; +import { PlugInIcon, CheckCircleIcon, XCircleIcon } from '../../icons'; interface Link { anchor_text: string; @@ -25,7 +25,7 @@ export const LinkResults: React.FC = ({

Linking Results

- + Version {linkerVersion}
@@ -33,7 +33,7 @@ export const LinkResults: React.FC = ({ {linksAdded > 0 ? (
- + {linksAdded} link{linksAdded !== 1 ? 's' : ''} added
@@ -54,7 +54,7 @@ export const LinkResults: React.FC = ({
) : (
- + No links were added to this content.
)} diff --git a/frontend/src/components/optimizer/OptimizationScores.tsx b/frontend/src/components/optimizer/OptimizationScores.tsx index 5b57cfc7..1829ca97 100644 --- a/frontend/src/components/optimizer/OptimizationScores.tsx +++ b/frontend/src/components/optimizer/OptimizationScores.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { TrendingUp, TrendingDown, Minus } from 'lucide-react'; +import { ArrowUpIcon, ArrowDownIcon } from '../../icons'; interface ScoreData { seo_score: number; @@ -39,9 +39,9 @@ export const OptimizationScores: React.FC = ({ const getChangeIcon = (current: number, previous?: number) => { if (!previous) return null; const diff = current - previous; - if (diff > 0) return ; - if (diff < 0) return ; - return ; + if (diff > 0) return ; + if (diff < 0) return ; + return ; }; const getChangeText = (current: number, previous?: number) => { diff --git a/frontend/src/pages/Automation/Rules.tsx b/frontend/src/pages/Automation/Rules.tsx index 90f176c0..56cd9516 100644 --- a/frontend/src/pages/Automation/Rules.tsx +++ b/frontend/src/pages/Automation/Rules.tsx @@ -5,7 +5,7 @@ import PageHeader from '../../components/common/PageHeader'; import ComponentCard from '../../components/common/ComponentCard'; import { automationApi, AutomationRule } from '../../api/automation.api'; import { useToast } from '../../components/ui/toast/ToastContainer'; -import { BoltIcon, PlusIcon, PlayIcon, PauseIcon, TrashIcon, EditIcon } from '../../icons'; +import { BoltIcon, PlusIcon, TrashBinIcon, PencilIcon, PaperPlaneIcon, CloseIcon } from '../../icons'; import { useSiteStore } from '../../store/siteStore'; import { useSectorStore } from '../../store/sectorStore'; @@ -191,33 +191,33 @@ export default function AutomationRules() {
{rule.trigger === 'manual' && ( )}
diff --git a/frontend/src/pages/Automation/Tasks.tsx b/frontend/src/pages/Automation/Tasks.tsx index b094b0b5..55a6f621 100644 --- a/frontend/src/pages/Automation/Tasks.tsx +++ b/frontend/src/pages/Automation/Tasks.tsx @@ -4,7 +4,7 @@ import PageHeader from '../../components/common/PageHeader'; import ComponentCard from '../../components/common/ComponentCard'; import { automationApi, ScheduledTask } from '../../api/automation.api'; import { useToast } from '../../components/ui/toast/ToastContainer'; -import { ClockIcon, CheckCircleIcon, XCircleIcon, RefreshCwIcon } from '../../icons'; +import { ClockIcon, CheckCircleIcon, XCircleIcon, ArrowRightIcon } from '../../icons'; import { useSiteStore } from '../../store/siteStore'; import { useSectorStore } from '../../store/sectorStore'; @@ -233,7 +233,7 @@ export default function AutomationTasks() { onClick={() => handleRetry(task.id)} className="flex items-center gap-2 px-4 py-2 text-sm bg-brand-500 text-white rounded-lg hover:bg-brand-600 transition-colors" > - + Retry Task diff --git a/frontend/src/pages/Linker/ContentList.tsx b/frontend/src/pages/Linker/ContentList.tsx index 7bf80a0e..5c515b6a 100644 --- a/frontend/src/pages/Linker/ContentList.tsx +++ b/frontend/src/pages/Linker/ContentList.tsx @@ -7,7 +7,7 @@ import { fetchContent, Content as ContentType } from '../../services/api'; import { useToast } from '../../components/ui/toast/ToastContainer'; import { SourceBadge, ContentSource } from '../../components/content/SourceBadge'; import { LinkResults } from '../../components/linker/LinkResults'; -import { Link2, Loader2 } from 'lucide-react'; +import { PlugInIcon } from '../../icons'; import { useSectorStore } from '../../store/sectorStore'; import { usePageSizeStore } from '../../store/pageSizeStore'; @@ -161,12 +161,12 @@ export default function LinkerContentList() { > {isProcessing ? ( <> - +
Processing... ) : ( <> - + Add Links )} diff --git a/frontend/src/pages/Linker/Dashboard.tsx b/frontend/src/pages/Linker/Dashboard.tsx index 35e08935..4d5800b8 100644 --- a/frontend/src/pages/Linker/Dashboard.tsx +++ b/frontend/src/pages/Linker/Dashboard.tsx @@ -4,7 +4,7 @@ import PageMeta from '../../components/common/PageMeta'; import ComponentCard from '../../components/common/ComponentCard'; import EnhancedMetricCard from '../../components/dashboard/EnhancedMetricCard'; import PageHeader from '../../components/common/PageHeader'; -import { Link2, FileText, TrendingUp, ArrowRight } from 'lucide-react'; +import { FileTextIcon, ArrowRightIcon, PlugInIcon, ArrowUpIcon } from '../../icons'; import { fetchContent } from '../../services/api'; import { useSiteStore } from '../../store/siteStore'; import { useSectorStore } from '../../store/sectorStore'; @@ -67,19 +67,26 @@ export default function LinkerDashboard() {
- - - View Content - - } - /> +
+ , + color: 'blue', + }} + /> + + + View Content + +
+

+ Manage internal linking for your content +

{loading ? (
@@ -94,8 +101,8 @@ export default function LinkerDashboard() { title="Total Linked" value={stats.totalLinked.toString()} subtitle={`${stats.contentWithoutLinks} without links`} - icon={} - trend={null} + icon={} + accentColor="blue" onClick={() => navigate('/linker/content')} /> @@ -103,8 +110,8 @@ export default function LinkerDashboard() { title="Total Links" value={stats.totalLinks.toString()} subtitle="Internal links created" - icon={} - trend={null} + icon={} + accentColor="purple" onClick={() => navigate('/linker/content')} /> @@ -112,8 +119,8 @@ export default function LinkerDashboard() { title="Avg Links/Content" value={stats.averageLinksPerContent.toString()} subtitle="Average per linked content" - icon={} - trend={null} + icon={} + accentColor="green" onClick={() => navigate('/linker/content')} />
@@ -126,13 +133,13 @@ export default function LinkerDashboard() { className="flex items-center justify-between p-4 border border-gray-200 dark:border-gray-700 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors" >
- +

Link Content

Process content for internal linking

- +
- +

View Content

Browse all content items

- +
diff --git a/frontend/src/pages/Optimizer/AnalysisPreview.tsx b/frontend/src/pages/Optimizer/AnalysisPreview.tsx index 28125c91..22b063aa 100644 --- a/frontend/src/pages/Optimizer/AnalysisPreview.tsx +++ b/frontend/src/pages/Optimizer/AnalysisPreview.tsx @@ -6,7 +6,7 @@ import { optimizerApi } from '../../api/optimizer.api'; import { fetchContent, Content as ContentType } from '../../services/api'; import { useToast } from '../../components/ui/toast/ToastContainer'; import { OptimizationScores } from '../../components/optimizer/OptimizationScores'; -import { Loader2, ArrowLeft } from 'lucide-react'; +import { ArrowLeftIcon, BoltIcon } from '../../icons'; export default function AnalysisPreview() { const { id } = useParams<{ id: string }>(); @@ -63,19 +63,26 @@ export default function AnalysisPreview() {
- navigate(-1)} - className="inline-flex items-center gap-2 px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors" - > - - Back - - } - /> +
+ , + color: 'orange', + }} + /> + +
+

+ Preview optimization scores without optimizing +

{loading || analyzing ? (
diff --git a/frontend/src/pages/Optimizer/ContentSelector.tsx b/frontend/src/pages/Optimizer/ContentSelector.tsx index 8274b29a..2834dcdb 100644 --- a/frontend/src/pages/Optimizer/ContentSelector.tsx +++ b/frontend/src/pages/Optimizer/ContentSelector.tsx @@ -9,7 +9,7 @@ import { SourceBadge, ContentSource } from '../../components/content/SourceBadge import { SyncStatusBadge, SyncStatus } from '../../components/content/SyncStatusBadge'; import { ContentFilter, FilterState } from '../../components/content/ContentFilter'; import { OptimizationScores } from '../../components/optimizer/OptimizationScores'; -import { Zap, Loader2, CheckCircle2 } from 'lucide-react'; +import { BoltIcon, CheckCircleIcon } from '../../icons'; import { useSectorStore } from '../../store/sectorStore'; import { usePageSizeStore } from '../../store/pageSizeStore'; @@ -146,42 +146,49 @@ export default function OptimizerContentSelector() {
- - - -
- } - /> +
+ , + color: 'orange', + }} + /> +
+ + +
+
+

+ Select content to optimize for SEO, readability, and engagement +

{/* Filters */} @@ -275,12 +282,12 @@ export default function OptimizerContentSelector() { > {isProcessing ? ( <> - +
Optimizing... ) : ( <> - + Optimize )} diff --git a/frontend/src/pages/Optimizer/Dashboard.tsx b/frontend/src/pages/Optimizer/Dashboard.tsx index 22745924..d2b34f87 100644 --- a/frontend/src/pages/Optimizer/Dashboard.tsx +++ b/frontend/src/pages/Optimizer/Dashboard.tsx @@ -4,7 +4,7 @@ import PageMeta from '../../components/common/PageMeta'; import ComponentCard from '../../components/common/ComponentCard'; import EnhancedMetricCard from '../../components/dashboard/EnhancedMetricCard'; import PageHeader from '../../components/common/PageHeader'; -import { Zap, FileText, TrendingUp, ArrowRight } from 'lucide-react'; +import { BoltIcon, FileTextIcon, ArrowUpIcon, ArrowRightIcon } from '../../icons'; import { fetchContent } from '../../services/api'; import { useSiteStore } from '../../store/siteStore'; import { useSectorStore } from '../../store/sectorStore'; @@ -69,19 +69,26 @@ export default function OptimizerDashboard() {
- - - Optimize Content - - } - /> +
+ , + color: 'orange', + }} + /> + + + Optimize Content + +
+

+ Optimize your content for SEO, readability, and engagement +

{loading ? (
@@ -96,8 +103,8 @@ export default function OptimizerDashboard() { title="Total Optimized" value={stats.totalOptimized.toString()} subtitle={`${stats.contentWithoutScores} not optimized`} - icon={} - trend={null} + icon={} + accentColor="blue" onClick={() => navigate('/optimizer/content')} /> @@ -105,8 +112,8 @@ export default function OptimizerDashboard() { title="Avg Score Improvement" value={`+${stats.averageScoreImprovement}%`} subtitle="Average improvement per optimization" - icon={} - trend={null} + icon={} + accentColor="green" onClick={() => navigate('/optimizer/content')} /> @@ -114,8 +121,8 @@ export default function OptimizerDashboard() { title="Credits Used" value={stats.totalCreditsUsed.toString()} subtitle="Total credits for optimization" - icon={} - trend={null} + icon={} + accentColor="orange" onClick={() => navigate('/optimizer/content')} />
@@ -128,13 +135,13 @@ export default function OptimizerDashboard() { className="flex items-center justify-between p-4 border border-gray-200 dark:border-gray-700 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors" >
- +

Optimize Content

Select and optimize content items

- +
- +

View Content

Browse all content items

- +