New frontend and tools
This commit is contained in:
		| @ -3,25 +3,62 @@ | ||||
| @tailwind utilities; | ||||
|  | ||||
| :root { | ||||
|   --background: #ffffff; | ||||
|   --foreground: #171717; | ||||
| } | ||||
|  | ||||
| @media (prefers-color-scheme: dark) { | ||||
|   :root { | ||||
|     --background: #0a0a0a; | ||||
|     --foreground: #ededed; | ||||
|   } | ||||
|   --foreground-rgb: 255, 255, 255; | ||||
|   --background-start-rgb: 0, 0, 0; | ||||
|   --background-end-rgb: 0, 0, 0; | ||||
| } | ||||
|  | ||||
| body { | ||||
|   color: var(--foreground); | ||||
|   background: var(--background); | ||||
|   font-family: Arial, Helvetica, sans-serif; | ||||
|   color: rgb(var(--foreground-rgb)); | ||||
|   background: linear-gradient( | ||||
|       to bottom, | ||||
|       transparent, | ||||
|       rgb(var(--background-end-rgb)) | ||||
|     ) | ||||
|     rgb(var(--background-start-rgb)); | ||||
|   font-family: 'Noto Sans Mono', monospace; | ||||
| } | ||||
|  | ||||
| @layer utilities { | ||||
|   .text-balance { | ||||
|     text-wrap: balance; | ||||
|   } | ||||
| /* Custom styles from the original index.html */ | ||||
| .thinking-section { | ||||
|   margin-bottom: 20px; | ||||
|   border-left: 2px solid #444; | ||||
|   padding-left: 10px; | ||||
| } | ||||
|  | ||||
| .thought-summary { | ||||
|   font-weight: bold; | ||||
|   margin-bottom: 5px; | ||||
|   padding: 5px; | ||||
|   border-radius: 3px; | ||||
| } | ||||
|  | ||||
| .thought-summary.plan { background-color: #2c3e50; } | ||||
| .thought-summary.decision { background-color: #34495e; } | ||||
| .thought-summary.tool_call { background-color: #16a085; } | ||||
| .thought-summary.tool_result { background-color: #27ae60; } | ||||
| .thought-summary.think_more { background-color: #2980b9; } | ||||
| .thought-summary.answer { background-color: #8e44ad; } | ||||
|  | ||||
| .thought-details { | ||||
|   display: none; | ||||
|   margin-left: 20px; | ||||
|   border-left: 2px solid #444; | ||||
|   padding-left: 10px; | ||||
|   margin-bottom: 10px; | ||||
|   white-space: pre-wrap; | ||||
|   font-family: 'Noto Sans Mono', monospace; | ||||
|   background-color: #222; | ||||
| } | ||||
|  | ||||
| .collapsible::before { | ||||
|   content: '▶ '; | ||||
|   display: inline-block; | ||||
|   transition: transform 0.3s; | ||||
| } | ||||
|  | ||||
| .collapsible.open::before { | ||||
|   transform: rotate(90deg); | ||||
| } | ||||
|  | ||||
| /* Add any other custom styles from the original index.html here */ | ||||
|  | ||||
| @ -1,35 +1,31 @@ | ||||
| import type { Metadata } from "next"; | ||||
| import localFont from "next/font/local"; | ||||
| import "./globals.css"; | ||||
| import './globals.css' | ||||
| import { Inter } from 'next/font/google' | ||||
|  | ||||
| const geistSans = localFont({ | ||||
|   src: "./fonts/GeistVF.woff", | ||||
|   variable: "--font-geist-sans", | ||||
|   weight: "100 900", | ||||
| }); | ||||
| const geistMono = localFont({ | ||||
|   src: "./fonts/GeistMonoVF.woff", | ||||
|   variable: "--font-geist-mono", | ||||
|   weight: "100 900", | ||||
| }); | ||||
| const inter = Inter({ subsets: ['latin'] }) | ||||
|  | ||||
| export const metadata: Metadata = { | ||||
|   title: "Create Next App", | ||||
|   description: "Generated by create next app", | ||||
| }; | ||||
| export const metadata = { | ||||
|   title: 'DWS Intelligence', | ||||
|   description: 'AI-powered chat application', | ||||
| } | ||||
|  | ||||
| export default function RootLayout({ | ||||
|   children, | ||||
| }: Readonly<{ | ||||
|   children: React.ReactNode; | ||||
| }>) { | ||||
| }: { | ||||
|   children: React.ReactNode | ||||
| }) { | ||||
|   return ( | ||||
|     <html lang="en"> | ||||
|       <body | ||||
|         className={`${geistSans.variable} ${geistMono.variable} antialiased`} | ||||
|       > | ||||
|         {children} | ||||
|       </body> | ||||
|       <head> | ||||
|         <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script> | ||||
|         <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> | ||||
|         <script src="https://cdn.jsdelivr.net/npm/moment@2.29.4/moment.min.js"></script> | ||||
|         <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> | ||||
|         <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment@1.0.1/dist/chartjs-adapter-moment.min.js"></script> | ||||
|         <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script> | ||||
|         <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/default.min.css" /> | ||||
|         <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Mono:wght@400;700&display=swap" rel="stylesheet" /> | ||||
|       </head> | ||||
|       <body className={inter.className}>{children}</body> | ||||
|     </html> | ||||
|   ); | ||||
|   ) | ||||
| } | ||||
|  | ||||
| @ -1,101 +1,44 @@ | ||||
| import Image from "next/image"; | ||||
| 'use client' | ||||
|  | ||||
| import { useState, useEffect } from 'react' | ||||
| import ChatArea from '../components/ChatArea' | ||||
| import Sidebar from '../components/Sidebar' | ||||
| import useSocket from '../hooks/useSocket' | ||||
| import useLocalStorage from '../hooks/useLocalStorage' | ||||
|  | ||||
| export default function Home() { | ||||
|   return ( | ||||
|     <div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]"> | ||||
|       <main className="flex flex-col gap-8 row-start-2 items-center sm:items-start"> | ||||
|         <Image | ||||
|           className="dark:invert" | ||||
|           src="https://nextjs.org/icons/next.svg" | ||||
|           alt="Next.js logo" | ||||
|           width={180} | ||||
|           height={38} | ||||
|           priority | ||||
|         /> | ||||
|         <ol className="list-inside list-decimal text-sm text-center sm:text-left font-[family-name:var(--font-geist-mono)]"> | ||||
|           <li className="mb-2"> | ||||
|             Get started by editing{" "} | ||||
|             <code className="bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-semibold"> | ||||
|               app/page.tsx | ||||
|             </code> | ||||
|             . | ||||
|           </li> | ||||
|           <li>Save and see your changes instantly.</li> | ||||
|         </ol> | ||||
|   const [currentChatId, setCurrentChatId] = useState<string | null>(null) | ||||
|   const [chats, setChats] = useLocalStorage('chats', {}) | ||||
|   const socket = useSocket() | ||||
|  | ||||
|         <div className="flex gap-4 items-center flex-col sm:flex-row"> | ||||
|           <a | ||||
|             className="rounded-full border border-solid border-transparent transition-colors flex items-center justify-center bg-foreground text-background gap-2 hover:bg-[#383838] dark:hover:bg-[#ccc] text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5" | ||||
|             href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|           > | ||||
|             <Image | ||||
|               className="dark:invert" | ||||
|               src="https://nextjs.org/icons/vercel.svg" | ||||
|               alt="Vercel logomark" | ||||
|               width={20} | ||||
|               height={20} | ||||
|             /> | ||||
|             Deploy now | ||||
|           </a> | ||||
|           <a | ||||
|             className="rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 sm:min-w-44" | ||||
|             href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|           > | ||||
|             Read our docs | ||||
|           </a> | ||||
|         </div> | ||||
|       </main> | ||||
|       <footer className="row-start-3 flex gap-6 flex-wrap items-center justify-center"> | ||||
|         <a | ||||
|           className="flex items-center gap-2 hover:underline hover:underline-offset-4" | ||||
|           href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app" | ||||
|           target="_blank" | ||||
|           rel="noopener noreferrer" | ||||
|         > | ||||
|           <Image | ||||
|             aria-hidden | ||||
|             src="https://nextjs.org/icons/file.svg" | ||||
|             alt="File icon" | ||||
|             width={16} | ||||
|             height={16} | ||||
|           /> | ||||
|           Learn | ||||
|         </a> | ||||
|         <a | ||||
|           className="flex items-center gap-2 hover:underline hover:underline-offset-4" | ||||
|           href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app" | ||||
|           target="_blank" | ||||
|           rel="noopener noreferrer" | ||||
|         > | ||||
|           <Image | ||||
|             aria-hidden | ||||
|             src="https://nextjs.org/icons/window.svg" | ||||
|             alt="Window icon" | ||||
|             width={16} | ||||
|             height={16} | ||||
|           /> | ||||
|           Examples | ||||
|         </a> | ||||
|         <a | ||||
|           className="flex items-center gap-2 hover:underline hover:underline-offset-4" | ||||
|           href="https://nextjs.org?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app" | ||||
|           target="_blank" | ||||
|           rel="noopener noreferrer" | ||||
|         > | ||||
|           <Image | ||||
|             aria-hidden | ||||
|             src="https://nextjs.org/icons/globe.svg" | ||||
|             alt="Globe icon" | ||||
|             width={16} | ||||
|             height={16} | ||||
|           /> | ||||
|           Go to nextjs.org → | ||||
|         </a> | ||||
|       </footer> | ||||
|   useEffect(() => { | ||||
|     if (Object.keys(chats).length === 0) { | ||||
|       createNewChat() | ||||
|     } else { | ||||
|       setCurrentChatId(Object.keys(chats)[0]) | ||||
|     } | ||||
|   }, []) | ||||
|  | ||||
|   const createNewChat = () => { | ||||
|     const chatId = Date.now().toString() | ||||
|     setChats(prevChats => ({ | ||||
|       ...prevChats, | ||||
|       [chatId]: { messages: [], thinkingSections: [] } | ||||
|     })) | ||||
|     setCurrentChatId(chatId) | ||||
|   } | ||||
|  | ||||
|   return ( | ||||
|     <div className="flex h-screen"> | ||||
|       <ChatArea | ||||
|         currentChatId={currentChatId} | ||||
|         setCurrentChatId={setCurrentChatId} | ||||
|         chats={chats} | ||||
|         setChats={setChats} | ||||
|         createNewChat={createNewChat} | ||||
|         socket={socket} | ||||
|       /> | ||||
|       <Sidebar socket={socket} /> | ||||
|     </div> | ||||
|   ); | ||||
|   ) | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user