diff --git a/src/app/chat/page.tsx b/src/app/chat/page.tsx new file mode 100644 index 0000000..7946b00 --- /dev/null +++ b/src/app/chat/page.tsx @@ -0,0 +1,37 @@ +"use client"; + +import ChatComponent from "@/components/ChatComponent"; +import { Button } from "@/components/ui/button"; +import { ArrowLeft, Maximize2 } from "lucide-react"; +import Link from "next/link"; + +export default function ChatPage() { + return ( +
+ {/* Header for full-page chat */} +
+
+ + + +
+ +

Full-Page Chat

+
+
+
+ Distraction-free Kubernetes Assistant +
+
+ + {/* Main Chat Area */} +
+
+ +
+
+
+ ); +} diff --git a/src/app/k8s-dashboard/Sidebar.tsx b/src/app/k8s-dashboard/Sidebar.tsx index b1e6c77..b0d67c5 100644 --- a/src/app/k8s-dashboard/Sidebar.tsx +++ b/src/app/k8s-dashboard/Sidebar.tsx @@ -16,10 +16,12 @@ import { Clock, Play, Lock, - Zap + Zap, + MessageSquareShare } from "lucide-react"; import Image from "next/image"; import { useState, useEffect } from "react"; +import Link from "next/link"; export type ToolType = | "pod-resources" @@ -122,6 +124,18 @@ export default function Sidebar({ ))} + +
+ + + +
); diff --git a/src/components/ChatComponent.tsx b/src/components/ChatComponent.tsx index d2c99b2..8d64f11 100644 --- a/src/components/ChatComponent.tsx +++ b/src/components/ChatComponent.tsx @@ -4,6 +4,7 @@ import { useState, useRef, useEffect, FormEvent } from "react"; import { Button } from "./ui/button"; import { Input } from "./ui/input"; import { Card } from "./ui/card"; +import { cn } from "@/lib/utils"; import { Send, X, @@ -19,6 +20,7 @@ import { Trash2, RotateCcw, MessageSquare, + ExternalLink, } from "lucide-react"; import { DropdownMenu, @@ -30,10 +32,12 @@ import { useChat } from "./ChatContext"; import type { ChatSession } from "./ChatContext"; import { WebLLMProvider, useWebLLM } from "./WebLLMProvider"; import * as webllm from "@mlc-ai/web-llm"; +import Link from "next/link"; interface ChatComponentProps { isOpen?: boolean; onClose?: () => void; + isFullPage?: boolean; } export default function ChatComponent(props: ChatComponentProps) { @@ -47,8 +51,9 @@ export default function ChatComponent(props: ChatComponentProps) { function ChatComponentInner({ isOpen: controlledIsOpen, onClose, + isFullPage = false, }: ChatComponentProps) { - const [isOpen, setIsOpen] = useState(!!controlledIsOpen); + const [isOpen, setIsOpen] = useState(isFullPage || !!controlledIsOpen); const [model, setModel] = useState("gpt-4o"); const [availableModels, setAvailableModels] = useState<{ id: string; name: string; isLocal?: boolean }[]>([]); const [input, setInput] = useState(""); @@ -331,15 +336,28 @@ function ChatComponentInner({ return ( {/* Header */} -
+
ST-K8s Chat + {!isFullPage && ( + + + + )}
+ {!isFullPage && ( + + )}
@@ -556,10 +576,13 @@ function ChatComponentInner({ className={`flex \${msg.role === "user" ? "justify-end" : "justify-start"}`} >
{msg.content}
@@ -575,7 +598,10 @@ function ChatComponentInner({ )} {webllmLoading && webllmProgress && (
-
+
Downloading Model Array into Browser