-
-
-
- setSearchTerm(e.target.value)}
- />
-
-
+
{/* Adjust based on your nav height */}
+
+
+ {/* Left Sidebar */}
+ setIsCollapsed(true)}
+ onResize={() => setIsCollapsed(false)}
+ className={cn(isCollapsed && "min-w-[50px] transition-all duration-300")}
+ >
+
+
+
+
+
+ {/* Middle File List */}
+
+
+
+
{currentItem?.name || 'My Drive'}
+
+ All
+ Starred
+
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Right File Details */}
-
-
-
-
-
+
+
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Right File Details */}
+
+
+
+
+
+
+ {/* Footer with Status Bar */}
+
+
);
}
\ No newline at end of file
diff --git a/app/footer.tsx b/app/footer.tsx
new file mode 100644
index 0000000..d447f56
--- /dev/null
+++ b/app/footer.tsx
@@ -0,0 +1,132 @@
+"use client";
+import React, { useState, useMemo } from 'react';
+import {
+ Search, Plus, Upload, Download, Trash2, Share, Star,
+ Grid, List, MoreVertical, Home, ChevronRight,
+ Folder, File, Image, Video, Music, FileText, Code, Database,
+ Package, Archive, Clock, Users, Eye, Edit3, Copy, Scissors,
+ FolderPlus, FilePlus, RefreshCw, Info, Lock, Unlock,
+ ArrowRight, ExternalLink, History, Settings,
+ MessageCircle, Send, X, Minimize2, Maximize2, Sparkles
+} from 'lucide-react';
+import { cn } from "@/lib/utils";
+import { Badge } from "@/components/ui/badge";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Separator } from "@/components/ui/separator";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { ScrollArea } from "@/components/ui/scroll-area";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "@/components/ui/resizable";
+import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider } from "@/components/ui/tooltip";// General Bots-style Footer Component
+const Footer = ({ className, shortcuts }) => {
+ const [isChatOpen, setIsChatOpen] = useState(false);
+ const [isChatMinimized, setIsChatMinimized] = useState(false);
+
+ // Expecting shortcuts as an array of two arrays: [ [row1], [row2] ]
+ const shortcutGroups = shortcuts || [[], []];
+
+ return (
+
+ {/* XTreeGold-style two-row footer */}
+
+ {/* First row - F1-F10 keys */}
+
+
+ {shortcutGroups[0].map((shortcut, index) => (
+
+ {shortcut.key}
+ {shortcut.label}
+
+ ))}
+
+
+
+ {/* Second row - Other keys */}
+
+
+ {shortcutGroups[1].map((shortcut, index) => (
+
+ {shortcut.key}
+ {shortcut.label}
+
+ ))}
+
+
+ {/* Right side - Status/AI Assistant */}
+
+
+ ● Ready
+
+
+
+
+
+
+
+ {/* Chat Window (optional) */}
+ {isChatOpen && !isChatMinimized && (
+
+
+
+
+
+
General Bots Assistant
+
+
+
+
+
+
+
+
+ General Bots Assistant is ready to help with file operations.
+
+
+
+
+
+
+
+
+ )}
+
+ );
+};
+
+export default Footer;
\ No newline at end of file
diff --git a/app/layout.tsx b/app/layout.tsx
index 86f79b1..6e4b490 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -11,12 +11,15 @@ import { ThemeProvider } from './theme-provider';
export default function RootLayout({ children }: { children: ReactNode }) {
return (
-
-
-
- {children}
-
-
+
+
)
diff --git a/app/mail/page.tsx b/app/mail/page.tsx
index 42c25a8..443f08a 100644
--- a/app/mail/page.tsx
+++ b/app/mail/page.tsx
@@ -28,6 +28,8 @@
ResizablePanel,
ResizablePanelGroup,
} from "@/components/ui/resizable"
+ import Footer from '../footer';
+
import { ScrollArea } from "@/components/ui/scroll-area"
import {
Select,
@@ -509,6 +511,40 @@
const defaultCollapsed = collapsed //? JSON.parse(collapsed.value) : undefined
+ // Drive-specific keyboard shortcuts
+ // XTreeGold classic shortcut layout - two rows
+ // XTree/NC-style: only unique, non-browser, non-reserved keys for file ops
+ // No F1-F12, Ctrl+F, Ctrl+T, Ctrl+W, Ctrl+N, Ctrl+R, Ctrl+P, etc.
+ // Use Q, W, E, R, T, Y, U, I, O, P, A, S, D, G, H, J, K, L, Z, X, C, V, B, M with Ctrl/Shift if needed
+ const shortcuts = [
+ // File operations row (unique qkeys)
+ [
+ { key: 'Q', label: 'Rename', action: () => console.log('Rename') },
+ { key: 'W', label: 'View', action: () => console.log('View') },
+ { key: 'E', label: 'Edit', action: () => console.log('Edit') },
+ { key: 'R', label: 'Move', action: () => console.log('Move') },
+ { key: 'T', label: 'MkDir', action: () => console.log('Make Directory') },
+ { key: 'Y', label: 'Delete', action: () => console.log('Delete') },
+ { key: 'U', label: 'Copy', action: () => console.log('Copy') },
+ { key: 'I', label: 'Cut', action: () => console.log('Cut') },
+ { key: 'O', label: 'Paste', action: () => console.log('Paste') },
+ { key: 'P', label: 'Duplicate', action: () => console.log('Duplicate') },
+ ],
+ // Navigation/info row (unique qkeys)
+ [
+ { key: 'A', label: 'Select', action: () => console.log('Select') },
+ { key: 'S', label: 'Select All', action: () => console.log('Select All') },
+ { key: 'D', label: 'Deselect', action: () => console.log('Deselect') },
+ { key: 'G', label: 'Details', action: () => console.log('Details') },
+ { key: 'H', label: 'History', action: () => console.log('History') },
+ { key: 'J', label: 'Share', action: () => console.log('Share') },
+ { key: 'K', label: 'Star', action: () => console.log('Star') },
+ { key: 'L', label: 'Download', action: () => console.log('Download') },
+ { key: 'Z', label: 'Upload', action: () => console.log('Upload') },
+ { key: 'X', label: 'Refresh', action: () => console.log('Refresh') },
+ ]
+ ];
+
return (
<>
@@ -519,7 +555,11 @@
defaultCollapsed={defaultCollapsed}
navCollapsedSize={4}
/>
+
+ {/* Footer with Status Bar */}
+
+
>
)
}
diff --git a/app/media/page.tsx b/app/media/page.tsx
index 0489688..3fcb9ca 100644
--- a/app/media/page.tsx
+++ b/app/media/page.tsx
@@ -1,8 +1,692 @@
-'use client'
+"use client";
+import React, { useState, useRef, useEffect } from 'react';
+import {
+ Search, Filter, Grid, List, Play, Pause, Volume2, VolumeX,
+ Eye, Bookmark, Share, Download, Clock, TrendingUp,
+ Globe, Calendar, Tag, ExternalLink, MoreHorizontal,
+ ChevronLeft, ChevronRight, Heart, MessageCircle,
+ Video, Image, Music, FileText, Rss, Archive,
+ Star, ThumbsUp, Settings, RefreshCw, Maximize,
+ User, MapPin, Zap, Briefcase, Gamepad2, Palette,
+ Users, Award, ShoppingBag, Plane, DollarSign,
+ Newspaper, AlertTriangle, Target, Mic, Camera
+} from 'lucide-react';
+import { cn } from "@/lib/utils";
-export default function MainPage() {
- return (
-
-
- )
+// Mock news data - realistic news structure
+const mockNews = [
+ {
+ id: 1,
+ headline: "Major Climate Summit Reaches Breakthrough Agreement on Carbon Reduction",
+ summary: "World leaders agree to unprecedented measures targeting 50% reduction in emissions by 2030, with binding commitments from major economies.",
+ content: "In a historic development at the Global Climate Summit, representatives from 195 countries have agreed to a comprehensive framework...",
+ author: "Sarah Chen",
+ publication: "Global Times",
+ publishedAt: "2025-01-15T14:30:00Z",
+ category: "Environment",
+ subcategory: "Climate Change",
+ readTime: "8 min read",
+ mediaType: "article",
+ imageUrl: "/api/placeholder/800/400",
+ videoUrl: null,
+ audioUrl: null,
+ tags: ["climate", "politics", "international", "environment"],
+ location: "Geneva, Switzerland",
+ breaking: true,
+ featured: true,
+ viewCount: 45670,
+ shareCount: 1240,
+ commentCount: 892,
+ bookmarkCount: 2130,
+ sentiment: "positive",
+ credibilityScore: 0.94
+ },
+ {
+ id: 2,
+ headline: "Tech Giant Announces Revolutionary AI Chip Architecture",
+ summary: "New quantum-enhanced processing unit promises 1000x performance improvement for AI workloads, reshaping the semiconductor industry.",
+ content: "Silicon Valley's leading tech company unveiled its latest innovation today, a groundbreaking AI chip that combines...",
+ author: "Marcus Rodriguez",
+ publication: "Tech Weekly",
+ publishedAt: "2025-01-15T12:45:00Z",
+ category: "Technology",
+ subcategory: "AI & Computing",
+ readTime: "6 min read",
+ mediaType: "video",
+ imageUrl: "/api/placeholder/800/400",
+ videoUrl: "/api/placeholder/video",
+ audioUrl: null,
+ videoDuration: "15:32",
+ tags: ["ai", "technology", "semiconductors", "innovation"],
+ location: "San Francisco, CA",
+ breaking: false,
+ featured: true,
+ viewCount: 78234,
+ shareCount: 2156,
+ commentCount: 445,
+ bookmarkCount: 3421,
+ sentiment: "positive",
+ credibilityScore: 0.91
+ },
+ {
+ id: 3,
+ headline: "Global Markets React to Federal Reserve Interest Rate Decision",
+ summary: "Stock markets surge as Fed maintains current rates, signaling confidence in economic recovery and inflation control measures.",
+ content: "Financial markets around the world responded positively to the Federal Reserve's decision to maintain...",
+ author: "Elena Vasquez",
+ publication: "Financial Herald",
+ publishedAt: "2025-01-15T11:20:00Z",
+ category: "Business",
+ subcategory: "Markets",
+ readTime: "5 min read",
+ mediaType: "article",
+ imageUrl: "/api/placeholder/800/400",
+ videoUrl: null,
+ audioUrl: null,
+ tags: ["finance", "fed", "markets", "economy"],
+ location: "New York, NY",
+ breaking: false,
+ featured: false,
+ viewCount: 34567,
+ shareCount: 876,
+ commentCount: 234,
+ bookmarkCount: 1456,
+ sentiment: "neutral",
+ credibilityScore: 0.96
+ },
+ {
+ id: 4,
+ headline: "Space Mission Discovers Evidence of Ancient Water on Mars",
+ summary: "NASA's latest rover findings reveal extensive underground water systems, raising new questions about potential for past life.",
+ content: "The Mars exploration mission has yielded its most significant discovery yet, with clear evidence of...",
+ author: "Dr. James Mitchell",
+ publication: "Science Today",
+ publishedAt: "2025-01-15T09:15:00Z",
+ category: "Science",
+ subcategory: "Space",
+ readTime: "10 min read",
+ mediaType: "multimedia",
+ imageUrl: "/api/placeholder/800/400",
+ videoUrl: "/api/placeholder/video",
+ audioUrl: "/api/placeholder/audio",
+ videoDuration: "8:45",
+ audioDuration: "12:30",
+ tags: ["space", "mars", "nasa", "discovery"],
+ location: "Pasadena, CA",
+ breaking: false,
+ featured: true,
+ viewCount: 92341,
+ shareCount: 4567,
+ commentCount: 1234,
+ bookmarkCount: 5678,
+ sentiment: "positive",
+ credibilityScore: 0.98
+ },
+ {
+ id: 5,
+ headline: "Championship Final Breaks Viewership Records Worldwide",
+ summary: "Historic match draws over 2 billion viewers globally, showcasing the growing international appeal of the sport.",
+ content: "Last night's championship final has set a new benchmark for global sports viewership...",
+ author: "Alex Thompson",
+ publication: "Sports Central",
+ publishedAt: "2025-01-15T08:30:00Z",
+ category: "Sports",
+ subcategory: "Football",
+ readTime: "4 min read",
+ mediaType: "video",
+ imageUrl: "/api/placeholder/800/400",
+ videoUrl: "/api/placeholder/video",
+ audioUrl: null,
+ videoDuration: "22:15",
+ tags: ["sports", "football", "championship", "records"],
+ location: "London, UK",
+ breaking: false,
+ featured: false,
+ viewCount: 156789,
+ shareCount: 8901,
+ commentCount: 3456,
+ bookmarkCount: 2345,
+ sentiment: "positive",
+ credibilityScore: 0.89
+ }
+];
+
+const categories = [
+ { id: 'all', name: 'All News', icon: Newspaper, color: 'text-gray-600' },
+ { id: 'breaking', name: 'Breaking', icon: AlertTriangle, color: 'text-red-600' },
+ { id: 'politics', name: 'Politics', icon: Users, color: 'text-blue-600' },
+ { id: 'technology', name: 'Technology', icon: Zap, color: 'text-purple-600' },
+ { id: 'business', name: 'Business', icon: Briefcase, color: 'text-green-600' },
+ { id: 'science', name: 'Science', icon: Target, color: 'text-indigo-600' },
+ { id: 'sports', name: 'Sports', icon: Award, color: 'text-orange-600' },
+ { id: 'entertainment', name: 'Entertainment', icon: Palette, color: 'text-pink-600' },
+ { id: 'health', name: 'Health', icon: Heart, color: 'text-emerald-600' },
+ { id: 'world', name: 'World', icon: Globe, color: 'text-cyan-600' }
+];
+
+const formatDate = (dateString) => {
+ const date = new Date(dateString);
+ const now = new Date();
+ const diffMs = now - date;
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
+
+ if (diffHours < 1) return 'Just now';
+ if (diffHours < 24) return `${diffHours}h ago`;
+ if (diffDays < 7) return `${diffDays}d ago`;
+ return date.toLocaleDateString();
+};
+
+const formatNumber = (num) => {
+ if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;
+ if (num >= 1000) return `${(num / 1000).toFixed(1)}K`;
+ return num.toString();
+};
+
+const MediaPlayer = ({ article, onClose }) => {
+ const [isPlaying, setIsPlaying] = useState(false);
+ const [isMuted, setIsMuted] = useState(false);
+ const [currentTime, setCurrentTime] = useState(0);
+ const [duration, setDuration] = useState(0);
+ const videoRef = useRef(null);
+ const audioRef = useRef(null);
+
+ const togglePlay = () => {
+ if (article.mediaType === 'video' && videoRef.current) {
+ if (isPlaying) {
+ videoRef.current.pause();
+ } else {
+ videoRef.current.play();
+ }
+ setIsPlaying(!isPlaying);
+ }
+ };
+
+ const toggleMute = () => {
+ if (videoRef.current) {
+ videoRef.current.muted = !isMuted;
+ setIsMuted(!isMuted);
+ }
+ };
+
+ return (
+
+
+
+
{article.headline}
+
+
+
+
+ {article.mediaType === 'video' && (
+
+
+
+
+
+
+
+ {article.videoDuration}
+
+
+
+ )}
+
+ {article.mediaType === 'audio' && (
+
+ )}
+
+
+
+
+ {article.author} • {article.publication} • {formatDate(article.publishedAt)}
+
+
{article.summary}
+
+
+
+ );
+};
+
+const NewsCard = ({ article, layout = 'grid', onPlay, onBookmark, onShare }) => {
+ const getMediaIcon = () => {
+ switch (article.mediaType) {
+ case 'video': return
;
+ case 'audio': return
;
+ case 'multimedia': return
;
+ default: return
;
+ }
+ };
+
+ const getSentimentColor = () => {
+ switch (article.sentiment) {
+ case 'positive': return 'text-green-600';
+ case 'negative': return 'text-red-600';
+ default: return 'text-gray-600';
+ }
+ };
+
+ if (layout === 'list') {
+ return (
+
+
+

+ {(article.mediaType === 'video' || article.mediaType === 'multimedia') && (
+
+
+
+ )}
+
+
+
+
+
+
+ {article.breaking && (
+
+ BREAKING
+
+ )}
+
+ {article.category}
+
+
+ {getMediaIcon()}
+
+ {article.videoDuration || article.audioDuration || article.readTime}
+
+
+
+
+
+ {article.headline}
+
+
+
+ {article.summary}
+
+
+
+ {article.author}
+ •
+ {article.publication}
+ •
+ {formatDate(article.publishedAt)}
+ •
+
+
+ {formatNumber(article.viewCount)}
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+

+
+ {(article.mediaType === 'video' || article.mediaType === 'multimedia') && (
+
+
+
+ )}
+
+
+ {article.breaking && (
+
+ BREAKING
+
+ )}
+
+ {article.category}
+
+
+
+
+ {getMediaIcon()}
+
+ {article.videoDuration || article.audioDuration || article.readTime}
+
+
+
+
+
+
+ {article.headline}
+
+
+
+ {article.summary}
+
+
+
+
+ {article.author}
+ •
+ {formatDate(article.publishedAt)}
+
+
+
+ {formatNumber(article.viewCount)}
+
+
+
+
+
+
+
+ {formatNumber(article.shareCount)}
+
+
+
+ {formatNumber(article.commentCount)}
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default function NewsMediaBrowser() {
+ const [selectedCategory, setSelectedCategory] = useState('all');
+ const [searchTerm, setSearchTerm] = useState('');
+ const [layout, setLayout] = useState('grid');
+ const [sortBy, setSortBy] = useState('latest');
+ const [articles, setArticles] = useState(mockNews);
+ const [selectedArticle, setSelectedArticle] = useState(null);
+ const [showPlayer, setShowPlayer] = useState(false);
+ const [bookmarkedArticles, setBookmarkedArticles] = useState(new Set());
+
+ const filteredArticles = articles.filter(article => {
+ const matchesCategory = selectedCategory === 'all' ||
+ article.category.toLowerCase() === selectedCategory ||
+ (selectedCategory === 'breaking' && article.breaking);
+
+ const matchesSearch = searchTerm === '' ||
+ article.headline.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ article.summary.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ article.tags.some(tag => tag.toLowerCase().includes(searchTerm.toLowerCase()));
+
+ return matchesCategory && matchesSearch;
+ });
+
+ const sortedArticles = [...filteredArticles].sort((a, b) => {
+ switch (sortBy) {
+ case 'latest':
+ return new Date(b.publishedAt) - new Date(a.publishedAt);
+ case 'popular':
+ return b.viewCount - a.viewCount;
+ case 'trending':
+ return b.shareCount - a.shareCount;
+ default:
+ return 0;
+ }
+ });
+
+ const handlePlay = (article) => {
+ setSelectedArticle(article);
+ setShowPlayer(true);
+ };
+
+ const handleBookmark = (article) => {
+ const newBookmarked = new Set(bookmarkedArticles);
+ if (newBookmarked.has(article.id)) {
+ newBookmarked.delete(article.id);
+ } else {
+ newBookmarked.add(article.id);
+ }
+ setBookmarkedArticles(newBookmarked);
+ };
+
+ const handleShare = (article) => {
+ navigator.share?.({
+ title: article.headline,
+ text: article.summary,
+ url: window.location.href + '/' + article.id
+ });
+ };
+
+ return (
+
+ {/* Header */}
+
+
+
+
+ News Center
+
+
+
+
+
+
+
+ {/* Search and Filters */}
+
+
+
+ setSearchTerm(e.target.value)}
+ className="w-full pl-10 pr-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
+ />
+
+
+
+
+
+
+
+
+
+
+ {/* Categories */}
+
+ {categories.map((category) => (
+
+ ))}
+
+
+
+
+ {/* Content */}
+
+
+ {/* Featured Articles */}
+ {selectedCategory === 'all' && (
+
+
Featured Stories
+
+ {sortedArticles.filter(article => article.featured).slice(0, 2).map((article) => (
+
+ ))}
+
+
+ )}
+
+ {/* Article Grid/List */}
+
+
+ {selectedCategory === 'all' ? 'All News' : categories.find(c => c.id === selectedCategory)?.name}
+
+
+ {sortedArticles.length} articles
+
+
+
+ {layout === 'grid' ? (
+
+ {sortedArticles.map((article) => (
+
+ ))}
+
+ ) : (
+
+ {sortedArticles.map((article) => (
+
+ ))}
+
+ )}
+
+
+
+ {/* Media Player Modal */}
+ {showPlayer && selectedArticle && (
+
setShowPlayer(false)}
+ />
+ )}
+
+ );
}
\ No newline at end of file
diff --git a/app/paper/page.tsx b/app/paper/page.tsx
index 0489688..f6e32bb 100644
--- a/app/paper/page.tsx
+++ b/app/paper/page.tsx
@@ -1,8 +1,333 @@
-'use client'
+"use client";
+import { useState, useRef, useEffect } from 'react';
+import { useEditor, EditorContent, BubbleMenu } from '@tiptap/react';
+import StarterKit from '@tiptap/starter-kit';
+import TextStyle from '@tiptap/extension-text-style';
+import Color from '@tiptap/extension-color';
+import Highlight from '@tiptap/extension-highlight';
+import TextAlign from '@tiptap/extension-text-align';
+import Footer from '../footer'
-export default function MainPage() {
- return (
-
-
- )
-}
\ No newline at end of file
+import {
+ Bold, Italic, Underline, AlignLeft, AlignCenter, AlignRight,
+ Link, Highlighter, Type, Palette, Sparkles
+} from 'lucide-react';
+
+const SimplePaperNote = () => {
+ const [title, setTitle] = useState('Untitled');
+ const [isEditingTitle, setIsEditingTitle] = useState(false);
+ const titleInputRef = useRef(null);
+
+ const editor = useEditor({
+ extensions: [
+ StarterKit,
+ TextStyle,
+ Color,
+ Highlight.configure({ multicolor: true }),
+ TextAlign.configure({
+ types: ['heading', 'paragraph'],
+ }),
+
+ ],
+ content: `
+
Start writing your thoughts here...
+ `,
+ editorProps: {
+ attributes: {
+ class: 'prose prose-invert max-w-none focus:outline-none min-h-[calc(100vh-8rem)] p-8 text-foreground',
+ },
+ },
+ });
+
+ const addLink = () => {
+ const previousUrl = editor?.getAttributes('link').href;
+ const url = window.prompt('Enter URL:', previousUrl);
+ if (url === null) return;
+ if (url === '') {
+ editor?.chain().focus().extendMarkRange('link').unsetLink().run();
+ return;
+ }
+ editor?.chain().focus().extendMarkRange('link').setLink({ href: url }).run();
+ };
+
+ useEffect(() => {
+ if (isEditingTitle && titleInputRef.current) {
+ titleInputRef.current.focus();
+ }
+ }, [isEditingTitle]);
+
+ if (!editor) {
+ return null;
+ }
+
+
+ // OneNote-like keyboard shortcuts (note editing & navigation)
+ // Two rows, unique qkeys, avoid browser/reserved keys
+ // File/Note operations row
+ const shortcuts = [
+ [
+ { key: 'Q', label: 'Resume', action: () => {/* Implement resume logic here */ } },
+ { key: 'W', label: 'Write', action: () => {/* Implement write logic here */ } },
+ { key: 'E', label: 'Expand', action: () => {/* Implement expand logic here */ } },
+ { key: 'R', label: 'One Word', action: () => {/* Implement one word logic here */ } },
+ { key: 'T', label: 'As List', action: () => editor?.chain().focus().toggleBulletList().run() },
+ { key: 'Y', label: 'As Mail', action: () => {/* Implement as mail logic here */ } },
+ { key: 'U', label: 'Copy', action: () => document.execCommand('copy') },
+ { key: 'I', label: 'Paste', action: () => document.execCommand('paste') },
+ { key: 'O', label: 'Undo', action: () => editor?.chain().focus().undo().run() },
+ { key: 'P', label: 'Redo', action: () => editor?.chain().focus().redo().run() },
+ ],
+ [
+ { key: 'A', label: 'Select', action: () => {/* Implement select logic here */ } },
+ { key: 'S', label: 'Select All', action: () => editor?.chain().focus().selectAll().run() },
+ { key: 'D', label: 'Deselect', action: () => {/* Implement deselect logic here */ } },
+ { key: 'G', label: 'Random', action: () => {/* Implement insert image logic here */ } },
+ { key: 'H', label: 'Idea', action: () => {/* Implement insert table logic here */ } },
+ { key: 'J', label: 'Insert Link', action: addLink },
+ { key: 'K', label: 'Highlight', action: () => editor?.chain().focus().toggleHighlight({ color: '#ffff00' }).run() },
+ { key: 'L', label: 'To-Do', action: () => editor?.chain().focus().toggleTaskList?.().run?.() },
+ { key: 'Z', label: 'Zoom In', action: () => {/* Implement zoom in logic here */ } },
+ { key: 'X', label: 'Zoom Out', action: () => {/* Implement zoom out logic here */ } },
+ ]
+ ];
+
+ return (
+
+
+
+ {/* Paper Shadow Effect */}
+
+
+
+
+
+ {/* Floating Selection Toolbar */}
+ {editor && (
+
+
+ {/* Text Formatting */}
+
+
+
+
+
+
+
+
+ {/* Text Alignment */}
+
+
+
+
+
+
+
+
+ {/* Highlight */}
+
+
+ {/* Link */}
+
+
+
+
+ {/* Heading */}
+
+
+
+ )}
+
+
+ {/* Custom Styles */}
+
+
+
+
+
+ );
+};
+
+export default SimplePaperNote;
\ No newline at end of file
diff --git a/app/templates/README.md b/app/sources/README.md
similarity index 100%
rename from app/templates/README.md
rename to app/sources/README.md
diff --git a/app/sources/page.tsx b/app/sources/page.tsx
new file mode 100644
index 0000000..d0edd61
--- /dev/null
+++ b/app/sources/page.tsx
@@ -0,0 +1,897 @@
+"use client";
+import React, { useState } from 'react';
+import {
+ Search, FileText, Newspaper, Presentation, Table,
+ File, Lightbulb, TrendingUp, Users, Code, Briefcase,
+ Shield, Heart, Gamepad2, Palette, Book, Calculator,
+ Globe, Zap, Clock, Star, ArrowRight, ExternalLink,
+ Copy, Download, Play, Server, Cpu, Cloud, Sun, ShoppingCart, UserPlus
+} from 'lucide-react';
+
+// Mock data for prompts
+const promptCategories = [
+ { name: "AI Development", count: 4, color: "--primary", icon: Code },
+ { name: "Security", count: 8, color: "--destructive", icon: Shield },
+ { name: "Programming", count: 6, color: "--secondary", icon: Code },
+ { name: "Career & Employment", count: 3, color: "--accent", icon: Briefcase },
+ { name: "Health & Therapy", count: 4, color: "--chart-1", icon: Heart },
+ { name: "Games & Entertainment", count: 5, color: "--chart-2", icon: Gamepad2 },
+ { name: "Art & Design", count: 4, color: "--chart-3", icon: Palette },
+ { name: "Education", count: 6, color: "--chart-4", icon: Book },
+ { name: "Business & Finance", count: 4, color: "--chart-5", icon: Calculator },
+ { name: "Technology", count: 3, color: "--primary", icon: Globe }
+];
+
+const featuredPrompts = [
+ { name: "Job Scout Pro", category: "Career & Employment", description: "AI-powered job hunting assistant", rating: 4.8 },
+ { name: "Cyber Security Sentinel", category: "Security", description: "Advanced security analysis tool", rating: 4.9 },
+ { name: "Code Copilot Pro", category: "Programming", description: "Intelligent coding companion", rating: 4.7 },
+ { name: "Digital Synthia Companion", category: "AI & Chatbots", description: "Advanced AI conversation partner", rating: 4.6 }
+];
+
+// Mock data for templates
+const templateCategories = [
+ { name: "Documents", icon: FileText, count: 12, color: "--primary" },
+ { name: "Presentations", icon: Presentation, count: 8, color: "--destructive" },
+ { name: "Spreadsheets", icon: Table, count: 6, color: "--secondary" }
+];
+
+const featuredTemplates = [
+ { name: "Business Proposal", type: "Document", description: "Professional business proposal template" },
+ { name: "Pitch Deck", type: "Presentation", description: "Startup pitch presentation template" },
+ { name: "Budget Tracker", type: "Spreadsheet", description: "Personal finance tracking spreadsheet" },
+ { name: "Project Report", type: "Document", description: "Comprehensive project report template" }
+];
+
+// Mock data for news
+const newsCategories = [
+ { name: "Technology", count: 45, color: "--primary" },
+ { name: "AI & ML", count: 38, color: "--chart-2" },
+ { name: "Business", count: 52, color: "--secondary" },
+ { name: "Science", count: 29, color: "--destructive" },
+ { name: "Startups", count: 34, color: "--accent" }
+];
+
+const featuredNews = [
+ {
+ title: "OpenAI Announces GPT-5 with Revolutionary Capabilities",
+ source: "TechCrunch",
+ time: "2 hours ago",
+ category: "AI & ML",
+ summary: "The latest AI model shows unprecedented reasoning abilities..."
+ },
+ {
+ title: "Quantum Computing Breakthrough Achieves New Milestone",
+ source: "Nature",
+ time: "4 hours ago",
+ category: "Science",
+ summary: "Researchers demonstrate error-corrected quantum computation..."
+ },
+ {
+ title: "Tech Giants Report Q4 Earnings Exceed Expectations",
+ source: "Bloomberg",
+ time: "6 hours ago",
+ category: "Business",
+ summary: "Major technology companies show strong growth despite market concerns..."
+ }
+];
+
+// MCP Servers data
+const mcpServers = [
+ {
+ name: "ModelScope MCP Playground",
+ description: "Exploring the Free Combination and Interaction of Open Source Models and MCP Server",
+ type: "Hosted",
+ category: "developer-tools",
+ usage: "1203",
+ icon: Server
+ },
+ {
+ name: "ModelScope MCP Tutorial",
+ description: "Learn about MCP, observe and discuss best practices",
+ type: "Hosted",
+ category: "knowledge-and-memory",
+ usage: "264",
+ icon: Book
+ },
+ {
+ name: "TONGYI Lingma Programming Agent",
+ description: "Supports the use of MCP tools",
+ type: "Hosted",
+ category: "developer-tools",
+ usage: "1203",
+ icon: Code
+ },
+ {
+ name: "Cherry Studio Integration",
+ description: "Integrate ModelScope-hosted MCP server in Cherry Studio",
+ type: "Hosted",
+ category: "developer-tools",
+ usage: "1203",
+ icon: Cpu
+ },
+ {
+ name: "fetch",
+ description: "Retrieve and process content from web pages, converting HTML to markdown",
+ type: "Hosted",
+ category: "search",
+ usage: "609",
+ icon: Cloud
+ },
+ {
+ name: "amap-maps",
+ description: "Location-based services using Amap Maps MCP server",
+ type: "Hosted",
+ category: "location-services",
+ usage: "71",
+ icon: Globe
+ },
+ {
+ name: "bing-cn-mcp-server",
+ description: "Bing search Chinese version",
+ type: "Hosted",
+ category: "search",
+ usage: "609",
+ icon: Search
+ },
+ {
+ name: "AllVoiceLab",
+ description: "Text-to-speech and video translation APIs",
+ type: "Local",
+ category: "entertainment-and-media",
+ usage: "106",
+ icon: Heart
+ },
+ {
+ name: "12306-mcp",
+ description: "Search for 12306 train tickets",
+ type: "Hosted",
+ category: "other",
+ usage: "294",
+ icon: Clock
+ },
+ {
+ name: "Jina-AI-MCP-Tools",
+ description: "Integrates with Jina AI Search Foundation APIs",
+ type: "Hosted",
+ category: "search",
+ usage: "609",
+ icon: TrendingUp
+ }
+];
+
+// LLM Tools data
+const llmTools = [
+ {
+ name: "Enroll",
+ description: "User registration and account creation tool",
+ category: "User Management",
+ icon: UserPlus,
+ color: "--primary"
+ },
+ {
+ name: "How is the weather",
+ description: "Real-time weather information lookup",
+ category: "Location Services",
+ icon: Sun,
+ color: "--accent"
+ },
+ {
+ name: "Price of Product",
+ description: "Product price lookup and comparison",
+ category: "E-commerce",
+ icon: ShoppingCart,
+ color: "--secondary"
+ },
+ {
+ name: "Document Analyzer",
+ description: "Extract and analyze document content",
+ category: "Knowledge",
+ icon: FileText,
+ color: "--chart-2"
+ },
+ {
+ name: "Code Generator",
+ description: "Generate code snippets from descriptions",
+ category: "Development",
+ icon: Code,
+ color: "--primary"
+ },
+ {
+ name: "Data Visualizer",
+ description: "Create charts and visualizations from data",
+ category: "Analytics",
+ icon: TrendingUp,
+ color: "--chart-1"
+ }
+];
+
+export default function LabComponent() {
+ const [activeTab, setActiveTab] = useState('prompts');
+ const [selectedCategory, setSelectedCategory] = useState(null);
+
+ const renderPrompts = () => (
+
+ {/* Header */}
+
+
+
+
+ Prompt Library
+
+
+
+
+
+
+ {/* Search */}
+
+
+
+
+
+
+
+ {/* Categories Sidebar */}
+
+
Categories
+
+ {promptCategories.map((category, index) => {
+ const IconComponent = category.icon;
+ return (
+
+ );
+ })}
+
+
+ {/* Featured Section */}
+
+
+
+ Featured Prompts
+
+
+ {featuredPrompts.map((prompt, index) => (
+
+
{prompt.name}
+
{prompt.description}
+
+
+ {prompt.category}
+
+
+
+ {prompt.rating}
+
+
+
+ ))}
+
+
+
+
+ {/* Content Area */}
+
+
+ {[...Array(8)].map((_, index) => (
+
+
+
Advanced Code Review Assistant
+
+
+
+
+
+
+ AI assistant specialized in code review, security analysis, and optimization suggestions.
+
+
+
Programming
+
+
+
+ ))}
+
+
+
+
+ );
+
+ const renderTemplates = () => (
+
+ {/* Header */}
+
+
+
+
+ Document Templates
+
+
+
+
+ {/* Search */}
+
+
+
+
+
+
+
+ {/* Template Types */}
+
+
Template Types
+
+ {templateCategories.map((category, index) => {
+ const IconComponent = category.icon;
+ return (
+
+ );
+ })}
+
+
+ {/* Quick Actions */}
+
+
Quick Start
+
+
+
+
+
+
+
+
+ {/* Templates Grid */}
+
+
+ {[...Array(9)].map((_, index) => (
+
+ {/* Template Preview */}
+
+
+
+
+
+
Business Proposal Template
+
+ Professional template for business proposals and project pitches.
+
+
+
Document
+
+
+
+
+ ))}
+
+
+
+
+ );
+
+ const renderNews = () => (
+
+ {/* Header */}
+
+
+
+
+ News & Insights
+
+
+
+
+
+
+
+ {/* Search & Filters */}
+
+
+
+
+
+
+
+
+
+
+ {/* News Categories */}
+
+
Categories
+
+ {newsCategories.map((category, index) => (
+
+ ))}
+
+
+ {/* Trending Topics */}
+
+
+
+ Trending
+
+
+ {['OpenAI GPT-5', 'Quantum Computing', 'Climate Tech', 'Space X'].map((topic, index) => (
+
+ ))}
+
+
+
+
+ {/* News Feed */}
+
+
+ {[...Array(6)].map((_, index) => (
+
+
+
+
+
+
+
+
+ AI & ML
+ TechCrunch
+ •
+
+
+ 2 hours ago
+
+
+
+
+ OpenAI Announces GPT-5 with Revolutionary Capabilities
+
+
+
+ The latest AI model shows unprecedented reasoning abilities and multimodal understanding,
+ setting new benchmarks across various tasks and potentially reshaping the AI landscape...
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+ );
+
+ const renderMCPServers = () => (
+
+ {/* Header */}
+
+
+
+
+ MCP Servers
+
+
+
+
+
+
+
+ {/* Search */}
+
+
+
+
+
+
+
+ {/* Categories Sidebar */}
+
+
Categories
+
+ {[
+ { name: "developer-tools", count: 1203, color: "--primary" },
+ { name: "search", count: 609, color: "--secondary" },
+ { name: "communication", count: 233, color: "--chart-1" },
+ { name: "entertainment", count: 106, color: "--chart-2" },
+ { name: "file-systems", count: 207, color: "--chart-3" },
+ { name: "finance", count: 226, color: "--chart-4" },
+ { name: "knowledge", count: 264, color: "--chart-5" },
+ { name: "location", count: 71, color: "--primary" },
+ { name: "other", count: 294, color: "--accent" }
+ ].map((category, index) => (
+
+ ))}
+
+
+ {/* Quick Filters */}
+
+
Server Type
+
+
+
+
+
+
+
+ {/* Content Area */}
+
+
+ {mcpServers.map((server, index) => {
+ const IconComponent = server.icon;
+ return (
+
+
+
+
+
{server.name}
+
+
+ {server.type}
+
+
+
+ {server.description}
+
+
+
+ {server.category}
+
+
+
{server.usage} uses
+
+
+
+
+ );
+ })}
+
+
+
+
+ );
+
+ const renderLLMTools = () => (
+
+ {/* Header */}
+
+
+
+
+ LLM Tools
+
+
+
+
+
+
+
+ {/* Search */}
+
+
+
+
+
+
+
+ {/* Categories Sidebar */}
+
+
Categories
+
+ {[
+ { name: "User Management", count: 12, color: "--primary" },
+ { name: "Location Services", count: 8, color: "--accent" },
+ { name: "E-commerce", count: 6, color: "--secondary" },
+ { name: "Knowledge", count: 15, color: "--chart-2" },
+ { name: "Development", count: 22, color: "--primary" },
+ { name: "Analytics", count: 9, color: "--chart-1" }
+ ].map((category, index) => (
+
+ ))}
+
+
+ {/* Featured Tools */}
+
+
+
+ Most Used
+
+
+ {llmTools.slice(0, 3).map((tool, index) => (
+
+ ))}
+
+
+
+
+ {/* Content Area */}
+
+
+ {llmTools.map((tool, index) => {
+ const IconComponent = tool.icon;
+ return (
+
+
+
+
+
{tool.name}
+
+
+
+
+ {tool.description}
+
+
+
+ {tool.category}
+
+
+
+
+ );
+ })}
+
+
+
+
+ );
+
+ return (
+
+ {/* Tab Navigation */}
+
+
+ {[
+ { id: 'prompts', label: 'Prompts', icon: Lightbulb, color: 'text-yellow-600' },
+ { id: 'templates', label: 'Templates', icon: FileText, color: 'text-green-600' },
+ { id: 'news', label: 'News', icon: Newspaper, color: 'text-blue-600' },
+ { id: 'mcp', label: 'MCP Servers', icon: Server, color: 'text-purple-600' },
+ { id: 'llm-tools', label: 'LLM Tools', icon: Cpu, color: 'text-indigo-600' }
+ ].map((tab) => {
+ const IconComponent = tab.icon;
+ return (
+
+ );
+ })}
+
+
+
+ {/* Content */}
+
+ {activeTab === 'prompts' && renderPrompts()}
+ {activeTab === 'templates' && renderTemplates()}
+ {activeTab === 'news' && renderNews()}
+ {activeTab === 'mcp' && renderMCPServers()}
+ {activeTab === 'llm-tools' && renderLLMTools()}
+
+
+ );
+}
diff --git a/app/templates/prompts.csv b/app/sources/prompts.csv
similarity index 100%
rename from app/templates/prompts.csv
rename to app/sources/prompts.csv
diff --git a/app/templates/components/album-artwork.tsx b/app/templates/components/album-artwork.tsx
deleted file mode 100644
index 428e9d0..0000000
--- a/app/templates/components/album-artwork.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import React from 'react';
-import { Album } from "../data/albums"
-
-interface AlbumArtworkProps {
- album: Album
- aspectRatio?: "portrait" | "square"
- width?: number
- height?: number
-}
-
-export function AlbumArtwork({
- album,
- aspectRatio = "portrait",
- width,
- height,
-}: AlbumArtworkProps) {
- return (
-
-
-

-
-
-
{album.name}
-
{album.artist}
-
-
- );
-}
diff --git a/app/templates/components/menu.tsx b/app/templates/components/menu.tsx
deleted file mode 100644
index 466d4cd..0000000
--- a/app/templates/components/menu.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react';
-
-export function Menu() {
- return (
-
-
-
-
-
-
-
- );
-}
diff --git a/app/templates/components/podcast-empty-placeholder.tsx b/app/templates/components/podcast-empty-placeholder.tsx
deleted file mode 100644
index 30600f9..0000000
--- a/app/templates/components/podcast-empty-placeholder.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from 'react';
-
-export function PodcastEmptyPlaceholder() {
- return (
-
-
-
No episodes added
-
- You have not added any podcasts. Add one below.
-
-
-
-
- );
-}
diff --git a/app/templates/components/sidebar.tsx b/app/templates/components/sidebar.tsx
deleted file mode 100644
index 9df2d82..0000000
--- a/app/templates/components/sidebar.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import React from 'react';
-import { Playlist } from "../data/playlists"
-
-interface SidebarProps {
- playlists: Playlist[]
-}
-
-export function Sidebar({ playlists }: SidebarProps) {
- return (
-
-
-
Discover
-
-
-
-
-
-
-
-
Library
-
-
-
-
-
-
-
-
-
-
Playlists
-
- {playlists?.map((playlist, i) => (
-
- ))}
-
-
-
- );
-}
diff --git a/app/templates/page.tsx b/app/templates/page.tsx
deleted file mode 100644
index b0a2936..0000000
--- a/app/templates/page.tsx
+++ /dev/null
@@ -1,213 +0,0 @@
-import { ChevronDown, ChevronRight, Search, Star, Grid, List } from 'lucide-react'
-
-interface Prompt {
- id: string
- name: string
- category: string
- description: string
- icon: string
- featured?: boolean
-}
-
-const prompts: Prompt[] = [
- {
- id: "1",
- name: "SOP Analyzer",
- category: "Education",
- description: "Analyzes statements of purpose for academic applications",
- icon: "📝",
- featured: true
- },
- {
- id: "2",
- name: "Break This GPT",
- category: "Security",
- description: "Tests GPT vulnerabilities and security",
- icon: "🔓",
- featured: true
- },
- // Add all your prompts here...
- {
- id: "100",
- name: "Coinflipper Game",
- category: "Games",
- description: "Simple coin flipping game",
- icon: "🪙"
- }
-]
-
-const categories = Array.from(new Set(prompts.map(p => p.category)))
-const featuredPrompts = prompts.filter(p => p.featured)
-
-export default function PromptsPage() {
- return (
-
- {/* Header */}
-
-
- {/* Main Content */}
-
- {/* Hero Section */}
-
-
-
Discover Amazing GPTs
-
Browse hundreds of specialized AI assistants
-
-
-
-
-
-
-
- {/* Featured Section */}
-
-
-
Featured Prompts
-
-
-
- {featuredPrompts.map(prompt => (
-
-
-
-
{prompt.icon}
-
-
{prompt.name}
-
{prompt.category}
-
-
-
{prompt.description}
-
-
-
- Featured
-
-
-
-
-
- ))}
-
-
-
- {/* Categories Section */}
-
-
-
Browse by Category
-
-
-
-
-
-
-
- {categories.map(category => {
- const categoryPrompts = prompts.filter(p => p.category === category)
- return (
-
-
-
{category}
-
-
-
- {categoryPrompts.slice(0, 4).map(prompt => (
-
-
-
- {prompt.icon}
-
{prompt.name}
-
-
{prompt.description}
-
-
-
- ))}
-
-
- )
- })}
-
-
-
-
- {/* Footer */}
-
-
- )
-}
\ No newline at end of file
diff --git a/app/theme-provider.tsx b/app/theme-provider.tsx
index 801a3b3..9a53758 100644
--- a/app/theme-provider.tsx
+++ b/app/theme-provider.tsx
@@ -19,7 +19,7 @@ const themes: Theme[] = [
{ name: 'jazzage', label: 'Jazzage', cssFile: '/themes/jazzage.css' },
{ name: 'mellowgold', label: 'Mellowgold', cssFile: '/themes/mellowgold.css' },
{ name: 'midcenturymod', label: 'Midcenturymod', cssFile: '/themes/midcenturymod.css' },
- { name: 'oldhollywood', label: 'Oldhollywood', cssFile: '/themes/oldhollywood.css' },
+ { name: 'orange', label: 'Orange', cssFile: '/themes/orange.css' },
{ name: 'polaroidmemories', label: 'Polaroidmemories', cssFile: '/themes/polaroidmemories.css' },
{ name: 'retrowave', label: 'Retrowave', cssFile: '/themes/retrowave.css' },
{ name: 'saturdaycartoons', label: 'Saturdaycartoons', cssFile: '/themes/saturdaycartoons.css' },
@@ -27,7 +27,8 @@ const themes: Theme[] = [
{ name: 'typewriter', label: 'Typewriter', cssFile: '/themes/typewriter.css' },
{ name: 'vapordream', label: 'Vapordream', cssFile: '/themes/vapordream.css' },
{ name: 'xeroxui', label: 'Xeroxui', cssFile: '/themes/xeroxui.css' },
- { name: 'y2kglow', label: 'Y2kglow', cssFile: '/themes/y2kglow.css' }
+ { name: 'y2kglow', label: 'Y2kglow', cssFile: '/themes/y2kglow.css' },
+ { name: 'xtreegold', label: 'XTreeGold', cssFile: '/themes/xtreegold.css' }
]
diff --git a/public/themes/3dbevel.css b/public/themes/3dbevel.css
index 1e9907c..6809391 100644
--- a/public/themes/3dbevel.css
+++ b/public/themes/3dbevel.css
@@ -1,28 +1,66 @@
-:root {
- /* 3DBevel Theme */
- --background: 0 0% 80%;
- --foreground: 0 0% 10%;
- --card: 0 0% 75%;
- --card-foreground: 0 0% 10%;
- --popover: 0 0% 80%;
- --popover-foreground: 0 0% 10%;
- --primary: 210 80% 40%;
- --primary-foreground: 0 0% 80%;
- --secondary: 0 0% 70%;
- --secondary-foreground: 0 0% 10%;
- --muted: 0 0% 65%;
- --muted-foreground: 0 0% 30%;
- --accent: 30 80% 40%;
- --accent-foreground: 0 0% 80%;
- --destructive: 0 85% 60%;
- --destructive-foreground: 0 0% 98%;
- --border: 0 0% 70%;
- --input: 0 0% 70%;
- --ring: 210 80% 40%;
- --radius: 0.5rem;
- --chart-1: 210 80% 40%;
- --chart-2: 30 80% 40%;
- --chart-3: 120 80% 40%;
- --chart-4: 300 80% 40%;
- --chart-5: 240 80% 40%;
+body, .card, .popover, .input, .button, .menu, .dialog {
+ font-family: 'IBM Plex Mono', 'Courier New', monospace !important;
+ background: #c0c0c0 !important;
+ color: #000 !important;
+ border-radius: 0 !important;
+ box-shadow: none !important;
+}
+
+.card, .popover, .menu, .dialog {
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+ padding: 8px !important;
+ background: #e0e0e0 !important;
+}
+
+.button, button, input[type="button"], input[type="submit"] {
+ background: #e0e0e0 !important;
+ color: #000 !important;
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+ padding: 4px 12px !important;
+ font-weight: bold !important;
+ box-shadow: none !important;
+ outline: none !important;
+}
+
+input, textarea, select {
+ background: #fff !important;
+ color: #000 !important;
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+ font-family: inherit !important;
+ box-shadow: none !important;
+}
+
+.menu {
+ background: #d0d0d0 !important;
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+}
+
+::-webkit-scrollbar {
+ width: 16px !important;
+ background: #c0c0c0 !important;
+}
+::-webkit-scrollbar-thumb {
+ background: #404040 !important;
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+}
+
+a {
+ color: #0000aa !important;
+ text-decoration: underline !important;
+}
+
+hr {
+ border: none !important;
+ border-top: 2px solid #404040 !important;
+ margin: 8px 0 !important;
}
diff --git a/public/themes/oldhollywood.css b/public/themes/oldhollywood.css
deleted file mode 100644
index 6a2eb1e..0000000
--- a/public/themes/oldhollywood.css
+++ /dev/null
@@ -1,28 +0,0 @@
-:root {
- /* OldHollywood Theme */
- --background: 30 20% 10%;
- --foreground: 30 30% 85%;
- --card: 30 20% 15%;
- --card-foreground: 30 30% 85%;
- --popover: 30 20% 10%;
- --popover-foreground: 30 30% 85%;
- --primary: 10 70% 50%;
- --primary-foreground: 30 30% 85%;
- --secondary: 30 20% 20%;
- --secondary-foreground: 30 30% 85%;
- --muted: 30 20% 25%;
- --muted-foreground: 30 30% 60%;
- --accent: 40 70% 50%;
- --accent-foreground: 30 30% 85%;
- --destructive: 0 85% 60%;
- --destructive-foreground: 0 0% 98%;
- --border: 30 20% 20%;
- --input: 30 20% 20%;
- --ring: 10 70% 50%;
- --radius: 0.5rem;
- --chart-1: 10 70% 50%;
- --chart-2: 40 70% 50%;
- --chart-3: 350 70% 50%;
- --chart-4: 200 70% 50%;
- --chart-5: 280 70% 50%;
-}
diff --git a/public/themes/orange.css b/public/themes/orange.css
new file mode 100644
index 0000000..d7fc303
--- /dev/null
+++ b/public/themes/orange.css
@@ -0,0 +1,27 @@
+:root {
+ --background: 0 0% 100%; /* White */
+ --foreground: 0 0% 13%; /* #212121 - near black */
+ --card: 0 0% 98%; /* #faf9f8 - light gray */
+ --card-foreground: 0 0% 13%; /* #212121 */
+ --popover: 0 0% 100%; /* White */
+ --popover-foreground: 0 0% 13%; /* #212121 */
+ --primary: 24 90% 54%; /* #d83b01 - Office orange */
+ --primary-foreground: 0 0% 100%; /* White */
+ --secondary: 210 36% 96%; /* #f3f2f1 - light blue-gray */
+ --secondary-foreground: 0 0% 13%; /* #212121 */
+ --muted: 0 0% 90%; /* #e1dfdd - muted gray */
+ --muted-foreground: 0 0% 40%; /* #666666 */
+ --accent: 207 90% 54%; /* #0078d4 - Office blue */
+ --accent-foreground: 0 0% 100%; /* White */
+ --destructive: 0 85% 60%; /* #e81123 - Office red */
+ --destructive-foreground: 0 0% 100%; /* White */
+ --border: 0 0% 85%; /* #d2d0ce - light border */
+ --input: 0 0% 100%; /* White */
+ --ring: 207 90% 54%; /* #0078d4 */
+ --radius: 0.25rem; /* Slightly less rounded */
+ --chart-1: 24 90% 54%; /* Office orange */
+ --chart-2: 207 90% 54%; /* Office blue */
+ --chart-3: 120 60% 40%; /* Office green */
+ --chart-4: 340 82% 52%; /* Office magenta */
+ --chart-5: 44 100% 50%; /* Office yellow */
+}
diff --git a/public/themes/xeroxui.css b/public/themes/xeroxui.css
index eaff5d9..ef174c2 100644
--- a/public/themes/xeroxui.css
+++ b/public/themes/xeroxui.css
@@ -1,28 +1,71 @@
:root {
- /* XeroxUI Theme */
- --background: 0 0% 90%;
- --foreground: 240 10% 10%;
- --card: 0 0% 85%;
- --card-foreground: 240 10% 10%;
- --popover: 0 0% 90%;
- --popover-foreground: 240 10% 10%;
- --primary: 240 80% 40%;
- --primary-foreground: 0 0% 90%;
- --secondary: 0 0% 80%;
- --secondary-foreground: 240 10% 10%;
- --muted: 0 0% 75%;
- --muted-foreground: 240 10% 30%;
- --accent: 120 80% 40%;
- --accent-foreground: 0 0% 90%;
- --destructive: 0 85% 60%;
- --destructive-foreground: 0 0% 98%;
- --border: 0 0% 80%;
- --input: 0 0% 80%;
- --ring: 240 80% 40%;
- --radius: 0.5rem;
- --chart-1: 240 80% 40%;
- --chart-2: 120 80% 40%;
- --chart-3: 60 80% 40%;
- --chart-4: 0 80% 40%;
- --chart-5: 300 80% 40%;
+ /* Windows 3.1 White & Blue Theme */
+ --background: 0 0% 100%; /* Pure white */
+ --foreground: 0 0% 0%; /* Black text */
+ --card: 0 0% 98%; /* Slightly off-white for cards */
+ --card-foreground: 0 0% 0%; /* Black text */
+ --popover: 0 0% 100%; /* White */
+ --popover-foreground: 0 0% 0%; /* Black */
+ --primary: 240 100% 27%; /* Windows blue */
+ --primary-foreground: 0 0% 100%; /* White text on blue */
+ --secondary: 0 0% 90%; /* Light gray for secondary */
+ --secondary-foreground: 0 0% 0%; /* Black text */
+ --muted: 0 0% 85%; /* Muted gray */
+ --muted-foreground: 240 10% 40%; /* Muted blue-gray */
+ --accent: 60 100% 50%; /* Classic yellow accent */
+ --accent-foreground: 240 100% 27%; /* Blue */
+ --destructive: 0 100% 50%; /* Red for destructive */
+ --destructive-foreground: 0 0% 100%; /* White */
+ --border: 240 100% 27%; /* Blue borders */
+ --input: 0 0% 100%; /* White input */
+ --ring: 240 100% 27%; /* Blue ring/focus */
+ --radius: 0.125rem; /* Small radius, almost square */
+ --chart-1: 240 100% 27%; /* Blue */
+ --chart-2: 0 0% 60%; /* Gray */
+ --chart-3: 60 100% 50%; /* Yellow */
+ --chart-4: 0 100% 50%; /* Red */
+ --chart-5: 120 100% 25%; /* Green */
+ --border-light: 0 0% 100%; /* White for top/left border */
+ --border-dark: 240 100% 20%; /* Dark blue for bottom/right border */
+}
+
+/* Windows 3.11 style border */
+.win311-border {
+ border-top: 2px solid hsl(var(--border-light));
+ border-left: 2px solid hsl(var(--border-light));
+ border-bottom: 2px solid hsl(var(--border-dark));
+ border-right: 2px solid hsl(var(--border-dark));
+ background: hsl(var(--background));
+}
+
+/* Titles */
+.win311-title {
+ color: hsl(var(--primary));
+ border-bottom: 2px solid hsl(var(--primary));
+ font-weight: bold;
+ padding: 0.25em 0.5em;
+ background: hsl(var(--background));
+}
+
+/* General text */
+body, .filemanager, .filemanager * {
+ color: hsl(var(--foreground));
+ background: hsl(var(--background));
+}
+
+button, .win311-button {
+ font-family: inherit;
+ font-size: 1em;
+ padding: 0.25em 1.5em;
+ background: #c0c0c0; /* classic light gray */
+ color: #000;
+ border-top: 2px solid #fff; /* light bevel */
+ border-left: 2px solid #fff; /* light bevel */
+ border-bottom: 2px solid #808080;/* dark bevel */
+ border-right: 2px solid #808080; /* dark bevel */
+ border-radius: 0;
+ box-shadow: inset 1px 1px 0 #fff, inset -1px -1px 0 #808080 !important;
+ outline: none !important;
+ cursor: pointer !important;
+ transition: none !important;
}
diff --git a/public/themes/xtreegold.css b/public/themes/xtreegold.css
new file mode 100644
index 0000000..aa3d889
--- /dev/null
+++ b/public/themes/xtreegold.css
@@ -0,0 +1,228 @@
+:root {
+ /* XTree Gold DOS File Manager Theme - Authentic 1980s Interface */
+
+ /* Core XTree Gold Palette - Exact Match */
+ --background: 240 100% 16%; /* Classic XTree blue background */
+ --foreground: 60 100% 88%; /* Bright yellow text */
+
+ /* Card Elements - File Panels */
+ --card: 240 100% 16%; /* Same blue as main background */
+ --card-foreground: 60 100% 88%; /* Bright yellow panel text */
+
+ /* Popover Elements - Context Menus */
+ --popover: 240 100% 12%; /* Slightly darker blue for menus */
+ --popover-foreground: 60 100% 90%; /* Bright yellow menu text */
+
+ /* Primary - XTree Gold Highlight (Cyan Selection) */
+ --primary: 180 100% 70%; /* Bright cyan for selections */
+ --primary-foreground: 240 100% 10%; /* Dark blue text on cyan */
+
+ /* Secondary - Directory Highlights */
+ --secondary: 180 100% 50%; /* Pure cyan for directories */
+ --secondary-foreground: 240 100% 10%; /* Dark blue on cyan */
+
+ /* Muted - Status Areas */
+ --muted: 240 100% 14%; /* Slightly darker blue */
+ --muted-foreground: 60 80% 75%; /* Dimmed yellow */
+
+ /* Accent - Function Keys & Highlights */
+ --accent: 60 100% 50%; /* Pure yellow for F-keys */
+ --accent-foreground: 240 100% 10%; /* Dark blue on yellow */
+
+ /* Destructive - Delete/Error */
+ --destructive: 0 100% 60%; /* Bright red for warnings */
+ --destructive-foreground: 60 90% 95%; /* Light yellow on red */
+
+ /* Interactive Elements */
+ --border: 60 100% 70%; /* Yellow border lines */
+ --input: 240 100% 14%; /* Dark blue input fields */
+ --ring: 180 100% 70%; /* Cyan focus ring */
+
+ /* Border Radius - Sharp DOS aesthetic */
+ --radius: 0rem; /* No rounding - pure DOS */
+
+ /* Chart Colors - Authentic DOS 16-color palette */
+ --chart-1: 180 100% 70%; /* Bright cyan */
+ --chart-2: 60 100% 50%; /* Yellow */
+ --chart-3: 120 100% 50%; /* Green */
+ --chart-4: 300 100% 50%; /* Magenta */
+ --chart-5: 0 100% 60%; /* Red */
+
+ /* Authentic XTree Gold Colors */
+ --xtree-blue: 240 100% 16%; /* Main background blue */
+ --xtree-yellow: 60 100% 88%; /* Text yellow */
+ --xtree-cyan: 180 100% 70%; /* Selection cyan */
+ --xtree-white: 0 0% 100%; /* Pure white */
+ --xtree-green: 120 100% 50%; /* DOS green */
+ --xtree-magenta: 300 100% 50%; /* DOS magenta */
+ --xtree-red: 0 100% 60%; /* DOS red */
+
+ /* File Type Colors - Authentic XTree */
+ --executable-color: 0 0% 100%; /* White for executables */
+ --directory-color: 180 100% 70%; /* Cyan for directories */
+ --archive-color: 300 100% 50%; /* Magenta for archives */
+ --text-color: 60 100% 88%; /* Yellow for text */
+ --system-color: 0 100% 60%; /* Red for system files */
+
+ /* Menu Bar Colors */
+ --menu-bar: 240 100% 8%; /* Dark blue menu bar */
+ --menu-text: 60 100% 88%; /* Yellow menu text */
+ --menu-highlight: 180 100% 50%; /* Cyan menu highlight */
+}
+
+/* Authentic XTree Gold Enhancement Classes */
+.xtree-main-panel {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ font-family: 'Perfect DOS VGA 437', 'Courier New', monospace;
+ font-size: 16px;
+ line-height: 1;
+ border: none;
+}
+
+.xtree-menu-bar {
+ background: hsl(var(--menu-bar));
+ color: hsl(var(--menu-text));
+ padding: 0;
+ height: 20px;
+ display: flex;
+ align-items: center;
+ font-weight: normal;
+}
+
+.xtree-menu-item {
+ padding: 0 8px;
+ color: hsl(var(--xtree-yellow));
+ background: transparent;
+}
+
+.xtree-menu-item:hover,
+.xtree-menu-item.active {
+ background: hsl(var(--xtree-cyan));
+ color: hsl(240 100% 10%);
+}
+
+.xtree-dual-pane {
+ display: flex;
+ height: calc(100vh - 60px);
+}
+
+.xtree-left-pane,
+.xtree-right-pane {
+ flex: 1;
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ padding: 0;
+ margin: 0;
+}
+
+.xtree-directory-tree {
+ color: hsl(var(--directory-color));
+ background: hsl(var(--xtree-blue));
+ padding: 4px;
+}
+
+.xtree-file-list {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ font-family: 'Perfect DOS VGA 437', 'Courier New', monospace;
+ font-size: 16px;
+ line-height: 20px;
+ padding: 4px;
+}
+
+.xtree-file-selected {
+ background: hsl(var(--xtree-cyan));
+ color: hsl(240 100% 10%);
+}
+
+.xtree-directory {
+ color: hsl(var(--directory-color));
+}
+
+.xtree-executable {
+ color: hsl(var(--executable-color));
+}
+
+.xtree-archive {
+ color: hsl(var(--archive-color));
+}
+
+.xtree-text-file {
+ color: hsl(var(--text-color));
+}
+
+.xtree-system-file {
+ color: hsl(var(--system-color));
+}
+
+.xtree-status-line {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ height: 20px;
+ padding: 0 8px;
+ display: flex;
+ align-items: center;
+ font-size: 16px;
+}
+
+.xtree-function-bar {
+ background: hsl(var(--menu-bar));
+ color: hsl(var(--xtree-yellow));
+ height: 20px;
+ display: flex;
+ padding: 0;
+ font-size: 14px;
+}
+
+.xtree-function-key {
+ padding: 0 4px;
+ color: hsl(var(--xtree-yellow));
+ border-right: 1px solid hsl(var(--xtree-yellow));
+}
+
+.xtree-function-key:last-child {
+ border-right: none;
+}
+
+.xtree-path-bar {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ padding: 2px 8px;
+ border-bottom: 1px solid hsl(var(--xtree-yellow));
+}
+
+.xtree-disk-info {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ padding: 4px 8px;
+ text-align: right;
+ font-size: 14px;
+}
+
+/* Authentic DOS Box Drawing Characters */
+.xtree-box-char {
+ font-family: 'Perfect DOS VGA 437', 'Courier New', monospace;
+ line-height: 1;
+ letter-spacing: 0;
+}
+
+/* Classic Text Mode Cursor */
+.xtree-cursor {
+ background: hsl(var(--xtree-yellow));
+ color: hsl(var(--xtree-blue));
+ animation: blink 1s infinite;
+}
+
+@keyframes blink {
+ 0%, 50% { opacity: 1; }
+ 51%, 100% { opacity: 0; }
+}
+
+/* Authentic DOS Window Styling */
+.xtree-window {
+ border: 2px outset hsl(var(--xtree-blue));
+ background: hsl(var(--xtree-blue));
+ box-shadow: none;
+ border-radius: 0;
+}
\ No newline at end of file