
Some checks failed
GBCI / build (push) Failing after 10m45s
- Introduced a new CSS theme for Orange, featuring a modern color palette with distinct foreground and background colors. - Added an XTree Gold theme that emulates the classic 1980s DOS interface, complete with authentic colors and styles for file management elements. - Both themes include variables for customization and specific styles for various UI components such as cards, popovers, and menus.
132 lines
No EOL
5.5 KiB
TypeScript
132 lines
No EOL
5.5 KiB
TypeScript
"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 (
|
|
<div className={cn("border-t bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", className)}>
|
|
{/* XTreeGold-style two-row footer */}
|
|
<div className="flex flex-col">
|
|
{/* First row - F1-F10 keys */}
|
|
<div className="flex h-8 items-center px-2 border-b">
|
|
<div className="flex items-center gap-4 overflow-x-auto">
|
|
{shortcutGroups[0].map((shortcut, index) => (
|
|
<div
|
|
key={index}
|
|
className="flex items-center text-xs cursor-pointer hover:bg-accent/50 px-1 py-0.5 rounded transition-colors min-w-fit"
|
|
onClick={shortcut.action}
|
|
>
|
|
<span className="font-bold text-blue-600 mr-1">{shortcut.key}</span>
|
|
<span className="text-muted-foreground">{shortcut.label}</span>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
{/* Second row - Other keys */}
|
|
<div className="flex h-8 items-center px-2">
|
|
<div className="flex items-center gap-4 overflow-x-auto">
|
|
{shortcutGroups[1].map((shortcut, index) => (
|
|
<div
|
|
key={index}
|
|
className="flex items-center text-xs cursor-pointer hover:bg-accent/50 px-1 py-0.5 rounded transition-colors min-w-fit"
|
|
onClick={shortcut.action}
|
|
>
|
|
<span className="font-bold text-blue-600 mr-1">{shortcut.key}</span>
|
|
<span className="text-muted-foreground">{shortcut.label}</span>
|
|
</div>
|
|
))}
|
|
</div>
|
|
|
|
{/* Right side - Status/AI Assistant */}
|
|
<div className="ml-auto flex items-center gap-2">
|
|
<Badge variant="outline" className="text-xs h-6">
|
|
<span className="text-green-500">●</span> Ready
|
|
</Badge>
|
|
|
|
<Button
|
|
variant="ghost"
|
|
size="sm"
|
|
onClick={() => setIsChatOpen(!isChatOpen)}
|
|
className="flex items-center gap-2 text-xs h-6"
|
|
>
|
|
<MessageCircle className="w-3 h-3" />
|
|
<span>Assistant</span>
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Chat Window (optional) */}
|
|
{isChatOpen && !isChatMinimized && (
|
|
<div className="border-t bg-card">
|
|
<div className="h-48 flex flex-col">
|
|
<div className="flex items-center justify-between p-2 border-b bg-muted/30">
|
|
<div className="flex items-center gap-2">
|
|
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse" />
|
|
<span className="text-xs font-medium">General Bots Assistant</span>
|
|
</div>
|
|
<div className="flex gap-1">
|
|
<Button
|
|
variant="ghost"
|
|
size="icon"
|
|
onClick={() => setIsChatMinimized(!isChatMinimized)}
|
|
className="h-6 w-6"
|
|
>
|
|
{isChatMinimized ? <Maximize2 className="w-3 h-3" /> : <Minimize2 className="w-3 h-3" />}
|
|
</Button>
|
|
<Button
|
|
variant="ghost"
|
|
size="icon"
|
|
onClick={() => setIsChatOpen(false)}
|
|
className="h-6 w-6"
|
|
>
|
|
<X className="w-3 h-3" />
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
<ScrollArea className="flex-1 p-2">
|
|
<div className="text-xs text-muted-foreground p-4 text-center">
|
|
General Bots Assistant is ready to help with file operations.
|
|
</div>
|
|
</ScrollArea>
|
|
<div className="flex items-center gap-1 p-2 border-t">
|
|
<Input
|
|
placeholder="Ask about your files..."
|
|
className="flex-1 h-7 text-xs"
|
|
/>
|
|
<Button size="icon" className="h-7 w-7">
|
|
<Send className="w-3 h-3" />
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Footer; |