Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# Fireplexity v2
# Skeedo Stream

AI search engine with web, news, and images.

<img src="https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjBxbWFxamZycWRkMmVhMGFiZnNuZjMxc3lpNHpuamR4OWlwa3F4NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QbfaTCB1OmkRmIQwzJ/giphy.gif" width="100%" alt="Fireplexity Demo" />
<img src="https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNjBxbWFxamZycWRkMmVhMGFiZnNuZjMxc3lpNHpuamR4OWlwa3F4NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QbfaTCB1OmkRmIQwzJ/giphy.gif" width="100%" alt="Skeedo Stream Demo" />

## Setup

```bash
git clone https://github.com/mendableai/fireplexity.git
cd fireplexity
git clone https://github.com/skeedo-sys/skeedostream.git
cd skeedostream
npm install
```

Expand All @@ -34,7 +34,7 @@ Open http://localhost:3000

## Deploy

[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/mendableai/fireplexity)
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/mendableai/skeedostream)

## Get API Keys

Expand Down
24 changes: 12 additions & 12 deletions app/chat-interface.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ export function ChatInterface({ messages, sources, newsResults, imageResults, fo
href={result.url}
target="_blank"
rel="noopener noreferrer"
className="group relative overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 hover:border-orange-300 dark:hover:border-orange-600 hover:shadow-md h-28"
className="group relative overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 hover:border-accent hover:shadow-md h-28"
>
{/* Background image */}
{result.image && (
Expand Down Expand Up @@ -277,7 +277,7 @@ export function ChatInterface({ messages, sources, newsResults, imageResults, fo
</div>

{/* Title */}
<h3 className="font-medium text-xs text-gray-900 dark:text-white line-clamp-2 group-hover:text-orange-600 dark:group-hover:text-orange-400 leading-tight">
<h3 className="font-medium text-xs text-gray-900 dark:text-white line-clamp-2 group-hover:text-citation-green-dark leading-tight">
{result.title}
</h3>

Expand Down Expand Up @@ -344,11 +344,11 @@ export function ChatInterface({ messages, sources, newsResults, imageResults, fo
<button
key={qIndex}
onClick={() => handleFollowUpClick(question)}
className="w-full text-left p-2 bg-white dark:bg-zinc-800 rounded-xl border border-gray-200 dark:border-gray-700 hover:border-orange-300 dark:hover:border-orange-600 hover:shadow-md group"
className="w-full text-left p-2 bg-white dark:bg-zinc-800 rounded-xl border border-gray-200 dark:border-gray-700 hover:border-citation-green-dark hover:text-citation-green-dark hover:shadow-md group related-question-btn"
>
<div className="flex items-start gap-2">
<Plus className="h-4 w-4 text-gray-400 group-hover:text-orange-500 flex-shrink-0 mt-0.5" />
<span className="text-sm text-gray-700 dark:text-gray-300 group-hover:text-orange-600 dark:group-hover:text-orange-400 break-words">
<Plus className="h-4 w-4 text-gray-400 group-hover:text-citation-green-dark flex-shrink-0 mt-0.5" />
<span className="text-sm text-gray-700 dark:text-gray-300 group-hover:text-citation-green-dark break-words">
{question}
</span>
</div>
Expand Down Expand Up @@ -430,7 +430,7 @@ export function ChatInterface({ messages, sources, newsResults, imageResults, fo
href={result.url}
target="_blank"
rel="noopener noreferrer"
className="group relative overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 hover:border-orange-300 dark:hover:border-orange-600 hover:shadow-md h-28"
className="group relative overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 hover:border-accent hover:shadow-md h-28"
>
{/* Background image */}
{result.image && (
Expand Down Expand Up @@ -481,7 +481,7 @@ export function ChatInterface({ messages, sources, newsResults, imageResults, fo
</div>

{/* Title */}
<h3 className="font-medium text-xs text-gray-900 dark:text-white line-clamp-2 group-hover:text-orange-600 dark:group-hover:text-orange-400 leading-tight">
<h3 className="font-medium text-xs text-gray-900 dark:text-white line-clamp-2 group-hover:text-accent leading-tight">
{result.title}
</h3>

Expand Down Expand Up @@ -593,11 +593,11 @@ export function ChatInterface({ messages, sources, newsResults, imageResults, fo
<button
key={index}
onClick={() => handleFollowUpClick(question)}
className="w-full text-left p-2 bg-white dark:bg-zinc-800 rounded-xl border border-gray-200 dark:border-gray-700 hover:border-orange-300 dark:hover:border-orange-600 hover:shadow-md group"
className="w-full text-left p-2 bg-white dark:bg-zinc-800 rounded-xl border border-gray-200 dark:border-gray-700 hover:border-accent hover:shadow-md group"
>
<div className="flex items-center gap-2">
<Plus className="h-4 w-4 text-gray-400 group-hover:text-orange-500 flex-shrink-0" />
<span className="text-sm text-gray-700 dark:text-gray-300 group-hover:text-orange-600 dark:group-hover:text-orange-400">
<Plus className="h-4 w-4 text-gray-400 group-hover:text-accent flex-shrink-0" />
<span className="text-sm text-gray-700 dark:text-gray-300 group-hover:text-accent">
{question}
</span>
</div>
Expand All @@ -615,7 +615,7 @@ export function ChatInterface({ messages, sources, newsResults, imageResults, fo
{/* Fixed input at bottom */}
<div className="fixed lg:absolute bottom-0 left-0 right-0 bg-gradient-to-t from-white via-white dark:from-zinc-900 dark:via-zinc-900 to-transparent pt-4 pb-4 sm:pt-6 sm:pb-6 z-30">
<div className="max-w-2xl mx-auto px-3 sm:px-4 lg:px-8">
<form onSubmit={handleFormSubmit} ref={formRef}>
<form onSubmit={handleFormSubmit} ref={formRef} className="form-focus-within">
<div className="bg-white dark:bg-zinc-800 rounded-2xl shadow-xl border border-gray-200 dark:border-gray-700 p-3 focus-within:border-gray-900 dark:focus-within:border-gray-100 transition-colors">
<div className="flex items-end gap-2">
<Textarea
Expand All @@ -640,7 +640,7 @@ export function ChatInterface({ messages, sources, newsResults, imageResults, fo
<button
type="submit"
disabled={!input.trim() || isLoading}
className="p-0 flex items-center justify-center rounded-lg bg-[#ff4d00] hover:bg-[#e64400] disabled:bg-gray-300 disabled:cursor-not-allowed active:scale-95 group"
className="submit-btn p-0 flex items-center justify-center rounded-lg bg-accent hover:bg-accent/80 disabled:bg-gray-300 disabled:cursor-not-allowed active:scale-95 group"
>
<div className="w-[48px] h-[32px] flex items-center justify-center">
{isLoading ? (
Expand Down
2 changes: 1 addition & 1 deletion app/citation-tooltip-portal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export function CitationTooltip({ sources }: CitationTooltipProps) {
}}
>
<div
className="bg-white dark:bg-zinc-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-2xl p-3 max-w-xs cursor-pointer hover:border-orange-400 dark:hover:border-orange-500 transition-colors relative"
className="bg-white dark:bg-zinc-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-2xl p-3 max-w-xs cursor-pointer hover:border-accent transition-colors relative"
onClick={() => {
if (content?.url) {
window.open(content.url, '_blank', 'noopener,noreferrer')
Expand Down
14 changes: 14 additions & 0 deletions app/garet-font.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/* Garet Medium font-face import */
@font-face {
font-family: 'Garet';
src: url('/fonts/Garet-Book.woff2') format('woff2'),
url('/fonts/Garet-Book.woff') format('woff');
font-weight: 500;
font-style: normal;
font-display: swap;
}

h1, h2, h3, h4, h5, h6 {
font-family: 'Garet', 'Inter', ui-sans-serif, system-ui, sans-serif;
font-weight: 500;
}
133 changes: 107 additions & 26 deletions app/globals.css
Original file line number Diff line number Diff line change
@@ -1,35 +1,116 @@
/* Sources section link hover color */
.source-result-link:hover .group-hover\:text-citation-green-dark,
.source-result-link:focus .group-hover\:text-citation-green-dark {
color: hsl(71, 58%, 36%) !important;
}
/* News result link hover color */
.news-result-link:hover .group-hover\:text-citation-green,
.news-result-link:focus .group-hover\:text-citation-green {
color: hsl(71, 83%, 59%) !important;
}
.news-result-link:hover .hover\:border-citation-green,
.news-result-link:focus .hover\:border-citation-green {
border-color: hsl(71, 83%, 59%) !important;
}
/* Related questions button hover color */
.related-question-btn:hover,
.related-question-btn:focus {
color: hsl(71, 83%, 59%) !important;
border-color: hsl(71, 83%, 59%) !important;
}
.related-question-btn:hover .group-hover\:text-citation-green,
.related-question-btn:focus .group-hover\:text-citation-green {
color: hsl(71, 83%, 59%) !important;
}
/* Citation link color */
.text-citation-green {
color: hsl(71, 83%, 59%) !important;
}
.text-citation-green-dark {
color: hsl(71, 58%, 36%) !important;
}
.hover\:text-citation-green-dark:hover,
.hover\:text-citation-green-dark:focus {
color: hsl(71, 58%, 36%) !important;
}
/* Related questions button hover color */
.related-question-btn:hover,
.related-question-btn:focus {
color: hsl(71, 58%, 36%) !important;
border-color: hsl(71, 58%, 36%) !important;
}
.related-question-btn:hover .group-hover\:text-citation-green-dark,
.related-question-btn:focus .group-hover\:text-citation-green-dark {
color: hsl(71, 58%, 36%) !important;
}
/* News result link hover color */
.news-result-link:hover .group-hover\:text-citation-green-dark,
.news-result-link:focus .group-hover\:text-citation-green-dark {
color: hsl(71, 58%, 36%) !important;
}
.news-result-link:hover .hover\:border-citation-green-dark,
.news-result-link:focus .hover\:border-citation-green-dark {
border-color: hsl(71, 58%, 36%) !important;
}
/* Search result link hover color */
.search-result-link:hover .group-hover\:text-citation-green-dark,
.search-result-link:focus .group-hover\:text-citation-green-dark {
color: hsl(71, 58%, 36%) !important;
}
.search-result-link:hover .hover\:border-citation-green-dark,
.search-result-link:focus .hover\:border-citation-green-dark {
border-color: hsl(71, 58%, 36%) !important;
}
/* Improve search result link hover for contrast on light bg */
.search-result-link:hover .group-hover\:text-\[\#A2C800\],
.search-result-link:focus .group-hover\:text-\[\#A2C800\] {
color: #A2C800 !important;
}
.search-result-link:hover .hover\:border-\[\#A2C800\],
.search-result-link:focus .hover\:border-\[\#A2C800\] {
border-color: #A2C800 !important;
}
/* Highlight submit button when input or textarea is focused */
.form-focus-within:focus-within button,
.form-focus-within:focus-within .submit-btn {
background: hsl(71, 83%, 59%) !important;
color: #fff !important;
box-shadow: 0 0 0 2px hsl(71, 83%, 59%, 0.2);
transition: background 0.2s, color 0.2s, box-shadow 0.2s;
}
@import "tailwindcss";
@import "tw-animate-css";
@import "./garet-font.css";

@custom-variant dark (&:is(.dark *));

@layer base {
:root {
--background: 0 0% 100%;
--foreground: 240 10% 3.9%;
--card: 0 0% 100%;
--card-foreground: 240 10% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
--primary: 240 5.9% 10%;
--primary-foreground: 0 0% 98%;
--secondary: 240 4.8% 95.9%;
--secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%;
--muted-foreground: 240 3.8% 46.1%;
--accent: 240 4.8% 95.9%;
--accent-foreground: 240 5.9% 10%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 240 5.9% 90%;
--input: 240 5.9% 90%;
--ring: 240 10% 3.9%;
--radius: 0.5rem;
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;
--chart-4: 43 74% 66%;
--chart-5: 27 87% 67%;
--background: 72 60% 98%;
--foreground: 240 10% 3.9%;
--card: 0 0% 100%;
--card-foreground: 240 10% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
--primary: 72 60% 52%; /* #BBDD31 */
--primary-foreground: 0 0% 100%;
--secondary: 72 60% 90%;
--secondary-foreground: 72 60% 30%;
--muted: 72 30% 92%;
--muted-foreground: 72 10% 40%;
--accent: 71, 83%, 59%;
--accent-foreground: 0 0% 100%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 72 30% 80%;
--input: 72 30% 80%;
--ring: 72 60% 52%;
--radius: 0.5rem;
--chart-1: 72 60% 52%;
--chart-2: 72 60% 40%;
--chart-3: 72 60% 30%;
--chart-4: 72 60% 70%;
--chart-5: 72 60% 60%;
}

.dark {
Expand All @@ -45,7 +126,7 @@
--secondary-foreground: 0 0% 98%;
--muted: 240 3.7% 15.9%;
--muted-foreground: 240 5% 64.9%;
--accent: 240 3.7% 15.9%;
--accent: 71, 83%, 59%;
--accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 0 0% 98%;
Expand Down
2 changes: 1 addition & 1 deletion app/image-results.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export function ImageResults({ results, isLoading }: ImageResultsProps) {
className="group block flex-shrink-0 w-[200px] sm:w-auto cursor-pointer"
onClick={() => setSelectedImage({ url: result.thumbnail || '', title: result.title })}
>
<Card className="relative aspect-square overflow-hidden bg-gray-100 dark:bg-zinc-800 border-gray-200 dark:border-gray-700 hover:border-orange-400 dark:hover:border-orange-500 hover:shadow-md h-full">
<Card className="relative aspect-square overflow-hidden bg-gray-100 dark:bg-zinc-800 border-gray-200 dark:border-gray-700 hover:border-accent hover:shadow-md h-full">
{result.thumbnail && isValidImageUrl(result.thumbnail) ? (
<Image
src={result.thumbnail}
Expand Down
5 changes: 4 additions & 1 deletion app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import "./globals.css";
import { Toaster } from 'sonner'

export const metadata: Metadata = {
title: "Fireplexity v2 - AI-Powered Multi-Source Search",
title: "Skeedo Stream - AI-Powered Multi-Source Search",
description: "Advanced search with AI-powered insights, news, images, and real-time information",
};

Expand All @@ -14,6 +14,9 @@ export default function RootLayout({
}>) {
return (
<html lang="en">
<head>
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
</head>
<body className="font-sans antialiased">
{children}
<Toaster position="bottom-right" />
Expand Down
2 changes: 1 addition & 1 deletion app/markdown-renderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export function MarkdownRenderer({ content, sources }: MarkdownRendererProps) {
return (
<sup
key={`citation-${match[1]}-${index}`}
className="citation text-orange-600 cursor-pointer hover:text-orange-700 text-[0.65rem] ml-0.5"
className="citation text-citation-green cursor-pointer hover:text-citation-green-dark text-[0.65rem] ml-0.5"
data-citation={match[1]}
>
[{match[1]}]
Expand Down
6 changes: 3 additions & 3 deletions app/news-results.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ export function NewsResults({ results, isLoading }: NewsResultsProps) {
href={result.url}
target="_blank"
rel="noopener noreferrer"
className="group block flex-shrink-0 w-[280px] sm:w-auto"
className="group block flex-shrink-0 w-[280px] sm:w-auto news-result-link"
>
<Card className="p-3 bg-white dark:bg-zinc-800 border-gray-200 dark:border-gray-700 hover:border-orange-400 dark:hover:border-orange-500 transition-all duration-200 hover:shadow-md h-full">
<Card className="p-3 bg-white dark:bg-zinc-800 border-gray-200 dark:border-gray-700 hover:border-citation-green-dark transition-all duration-200 hover:shadow-md h-full">
<div className="flex gap-3">
{result.image && isValidImageUrl(result.image) && (
<div className="relative w-16 h-16 flex-shrink-0 rounded overflow-hidden bg-gray-100 dark:bg-zinc-700">
Expand All @@ -67,7 +67,7 @@ export function NewsResults({ results, isLoading }: NewsResultsProps) {
</div>
)}
<div className="flex-1 min-w-0">
<h4 className="text-sm font-medium line-clamp-2 text-gray-900 dark:text-gray-100 group-hover:text-orange-600 dark:group-hover:text-orange-400 mb-1">
<h4 className="text-sm font-medium line-clamp-2 text-gray-900 dark:text-gray-100 group-hover:text-citation-green-dark mb-1">
{result.title}
</h4>
<div className="flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400">
Expand Down
Loading