+ {/* Header */}
+
+
+
+
+ {tool.name}
+
+
+ v{tool.version}
+
+
+
+ by {tool.company}
+
+
+
+ {/* Sentiment Score */}
+
+
+
+
+ {tool.sentiment.score}%
+
+
+
+ {tool.sentiment.totalReviews.toLocaleString()} reviews
+
+
+
+
+ {/* TLDR */}
+
+
+ ๐ก {tool.tldr}
+
+
+
+ {/* Description */}
+
+ {tool.description}
+
+
+ {/* Pricing & Install */}
+
+
+
+ Pricing
+
+
+ {tool.pricing.freeTier && (
+
+ FREE
+
+ )}
+
+ {tool.pricing.startingPrice || 'Free'}
+
+
+
+ {tool.pricing.details}
+
+
+
+ {tool.install && (
+
+
+ Quick Install
+
+
+ {tool.install.command}
+
+
+ )}
+
+
+ {/* Trending Stats */}
+
+
+
+ {tool.trending.mentions} mentions{' '}
+
+ ({tool.trending.timeframe})
+
+
+ 0
+ ? 'text-theme-status-success'
+ : 'text-theme-status-error'
+ }`}
+ >
+ {tool.trending.change > 0 ? '+' : ''}
+ {tool.trending.change}%
+
+
+
+ {/* Top Users */}
+
+
+ Top contributors
+
+
+ {tool.topUsers.map((user) => (
+
+
+
+
+ @{user.username}
+
+
+ {user.contributions} posts
+
+
+
+ ))}
+
+
+
+ {/* Pros & Cons */}
+
+
+
+ Pros
+
+
+ {tool.pros.map((pro) => (
+
+ {pro}
+
+ ))}
+
+
+
+
+ Cons
+
+
+ {tool.cons.map((con) => (
+
+ {con}
+
+ ))}
+
+
+
+
+ {/* Alternatives */}
+ {alternatives.length > 0 && (
+
+
+ Similar tools
+
+
+ {alternatives.map((alt) => (
+
+ {alt.name}
+
+ ))}
+
+
+ )}
+
+ {/* Metadata & Links */}
+
+
+
+ Updated: {new Date(tool.metadata.lastUpdate).toLocaleDateString()}
+
+
+ Latest: v{tool.metadata.latestVersion}
+
+
+
+ {tool.links.docs && (
+ }
+ >
+ Docs
+
+ )}
+ }
+ >
+ Visit
+
+
+
+
+ );
+};
diff --git a/packages/webapp/components/ai-tools/TrendingSection.tsx b/packages/webapp/components/ai-tools/TrendingSection.tsx
new file mode 100644
index 0000000000..6745c6ba77
--- /dev/null
+++ b/packages/webapp/components/ai-tools/TrendingSection.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import type { ReactElement } from 'react';
+import {
+ Typography,
+ TypographyColor,
+ TypographyType,
+} from '@dailydotdev/shared/src/components/typography/Typography';
+import { FlexRow } from '@dailydotdev/shared/src/components/utilities';
+import type { TrendingInsight } from './types';
+
+interface TrendingSectionProps {
+ insights: TrendingInsight[];
+}
+
+export const TrendingSection = ({
+ insights,
+}: TrendingSectionProps): ReactElement => {
+ return (
+