From 3c588e15f9095908c8591d2c3bb0b6f2bfdde94b Mon Sep 17 00:00:00 2001 From: Farouq Adeshola Fashina Date: Mon, 31 Aug 2026 20:38:26 +0100 Subject: [PATCH 01/25] feat: feat: build Nvidia NIM-powered financial briefing chat inter (#73) --- src/features/chat/NvidiaAssistantWidget.tsx | 27 +++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/features/chat/NvidiaAssistantWidget.tsx b/src/features/chat/NvidiaAssistantWidget.tsx index bd25171..6753566 100644 --- a/src/features/chat/NvidiaAssistantWidget.tsx +++ b/src/features/chat/NvidiaAssistantWidget.tsx @@ -3,18 +3,21 @@ import React, { useState, useRef, useEffect } from 'react'; import { Sparkles, - Send, Bot, User, Zap, Maximize2, Minimize2, } from 'lucide-react'; +import { motion } from 'framer-motion'; +import ReactMarkdown from 'react-markdown'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { formatCurrency, formatRelativeTime } from '@/lib/format'; import type { ChatMessage, QuickPromptChip } from './types'; +const MotionCard = motion(Card); + const PRESET_CHIPS: QuickPromptChip[] = [ { id: 'chip-1', @@ -135,7 +138,12 @@ export function NvidiaAssistantWidget() { }; return ( - + {/* Header */}
@@ -176,7 +184,7 @@ export function NvidiaAssistantWidget() {
+ ); })} @@ -302,6 +315,6 @@ export function NvidiaAssistantWidget() {
-
+ ); } From 0cb268d850a5682811a13abd63cd85dd75591e8a Mon Sep 17 00:00:00 2001 From: Farouq Adeshola Fashina Date: Mon, 31 Aug 2026 20:38:31 +0100 Subject: [PATCH 02/25] feat: feat: build Nvidia NIM-powered financial briefing chat inter (#73) --- src/components/shell/assistant-drawer.tsx | 39 ++++++++++++++--------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/components/shell/assistant-drawer.tsx b/src/components/shell/assistant-drawer.tsx index 3d00676..94bcee3 100644 --- a/src/components/shell/assistant-drawer.tsx +++ b/src/components/shell/assistant-drawer.tsx @@ -7,6 +7,8 @@ import { useAssistantSeed, useBriefing } from '@/hooks/use-queries'; import { Avatar } from '@/components/ui/avatar'; import { cn } from '@/lib/cn'; import { env, isMockMode } from '@/lib/env'; +import { motion, AnimatePresence } from 'framer-motion'; +import ReactMarkdown from 'react-markdown'; import type { ChatMessage } from '@/types/domain'; const defaultSuggestions = [ @@ -122,14 +124,15 @@ export function AssistantDrawer() { ); return ( - <> - {/* Floating Bottom-Right AI Widget */} -
+ + {open && ( +
setOpen(false)} - className="grid h-8 w-8 place-items-center rounded-button text-foreground-secondary transition-colors duration-fast hover:bg-surface-secondary hover:text-foreground" + className="grid h-8 w-8 place-items-center rounded-button text-foreground-secondary transition-colors duration-fast hover:bg-surface-secondary hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2" aria-label="Close assistant" > @@ -183,7 +186,11 @@ export function AssistantDrawer() { : 'border border-border bg-surface-secondary/60 text-foreground', )} > - {msg.content} + {msg.role === 'assistant' ? ( + {msg.content} + ) : ( + msg.content + )}
))} @@ -198,8 +205,8 @@ export function AssistantDrawer() {