diff --git a/archon-ui-main/src/features/knowledge/inspector/components/ContentViewer.tsx b/archon-ui-main/src/features/knowledge/inspector/components/ContentViewer.tsx index d881ba8..d3f91a3 100644 --- a/archon-ui-main/src/features/knowledge/inspector/components/ContentViewer.tsx +++ b/archon-ui-main/src/features/knowledge/inspector/components/ContentViewer.tsx @@ -27,29 +27,36 @@ export const ContentViewer: React.FC = ({ selectedItem, onCo return (
- {/* Content Header */} -
-
- {selectedItem.type === "document" ? ( - <> + {/* Content Header - Fixed with proper overflow handling */} +
+ {/* Icon and Metadata - Allow to grow and shrink with min-w-0 for proper truncation */} +
+ {/* Icon - Fixed size, no shrink */} +
+ {selectedItem.type === "document" ? ( -
-

+ ) : ( + + )} +

+ + {/* Metadata Content - Can shrink with proper overflow */} +
+ {selectedItem.type === "document" ? ( + <> +

{selectedItem.metadata && "title" in selectedItem.metadata ? selectedItem.metadata.title || "Document" : "Document"}

{selectedItem.metadata && "section" in selectedItem.metadata && selectedItem.metadata.section && ( -

{selectedItem.metadata.section}

+

{selectedItem.metadata.section}

)} -
- - ) : ( - <> - -
-
- + + ) : ( + <> +
+ {selectedItem.type === "code" && selectedItem.metadata && "language" in selectedItem.metadata ? selectedItem.metadata.language || "unknown" : "unknown"} @@ -58,24 +65,28 @@ export const ContentViewer: React.FC = ({ selectedItem, onCo selectedItem.metadata && "file_path" in selectedItem.metadata && selectedItem.metadata.file_path && ( - {selectedItem.metadata.file_path} + + {selectedItem.metadata.file_path} + )}
{selectedItem.type === "code" && selectedItem.metadata && "summary" in selectedItem.metadata && selectedItem.metadata.summary && ( -

{selectedItem.metadata.summary}

+

{selectedItem.metadata.summary}

)} -
- - )} + + )} +
+ + {/* Copy Button - Never shrinks, always visible */}
@@ -150,6 +177,6 @@ export const InspectorSidebar: React.FC = ({
)}
-
+ ); }; diff --git a/archon-ui-main/src/features/knowledge/inspector/components/KnowledgeInspector.tsx b/archon-ui-main/src/features/knowledge/inspector/components/KnowledgeInspector.tsx index 585cd6c..ce9eb03 100644 --- a/archon-ui-main/src/features/knowledge/inspector/components/KnowledgeInspector.tsx +++ b/archon-ui-main/src/features/knowledge/inspector/components/KnowledgeInspector.tsx @@ -3,7 +3,7 @@ * Orchestrates split-view design with sidebar navigation and content viewer */ -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { InspectorDialog, InspectorDialogContent, InspectorDialogTitle } from "../../../ui/primitives"; import type { CodeExample, DocumentChunk, InspectorSelectedItem, KnowledgeItem } from "../../types"; import { useInspectorPagination } from "../hooks/useInspectorPagination"; @@ -79,49 +79,56 @@ export const KnowledgeInspector: React.FC = ({ item, op } }, [viewMode, currentItems, selectedItem]); - const handleCopy = async (text: string, id: string) => { - await navigator.clipboard.writeText(text); - setCopiedId(id); - setTimeout(() => setCopiedId(null), 2000); - }; - - const handleItemSelect = (item: DocumentChunk | CodeExample) => { - if (viewMode === "documents") { - const doc = item as DocumentChunk; - setSelectedItem({ - type: "document", - id: doc.id || "", - content: doc.content || "", - metadata: { - title: doc.metadata?.title, - section: doc.metadata?.section, - relevance_score: doc.metadata?.relevance_score, - url: doc.metadata?.url, - tags: doc.metadata?.tags, - }, - }); - } else { - const code = item as CodeExample; - setSelectedItem({ - type: "code", - id: String(code.id), - content: code.content || code.code || "", - metadata: { - language: code.language, - file_path: code.file_path, - summary: code.summary, - relevance_score: code.metadata?.relevance_score, - title: code.title || code.example_name, - }, - }); + const handleCopy = useCallback(async (text: string, id: string) => { + try { + await navigator.clipboard.writeText(text); + setCopiedId(id); + setTimeout(() => setCopiedId((v) => (v === id ? null : v)), 2000); + } catch (error) { + console.error("Failed to copy to clipboard:", error); } - }; + }, []); - const handleViewModeChange = (mode: ViewMode) => { + const handleItemSelect = useCallback( + (item: DocumentChunk | CodeExample) => { + if (viewMode === "documents") { + const doc = item as DocumentChunk; + setSelectedItem({ + type: "document", + id: doc.id || "", + content: doc.content || "", + metadata: { + title: doc.title || doc.metadata?.title, + section: doc.section || doc.metadata?.section, + relevance_score: doc.metadata?.relevance_score, + url: doc.url || doc.metadata?.url, + tags: doc.metadata?.tags, + }, + }); + } else { + const code = item as CodeExample; + setSelectedItem({ + type: "code", + id: String(code.id), + content: code.content || code.code || "", + metadata: { + language: code.language, + file_path: code.file_path, + summary: code.summary, + relevance_score: code.metadata?.relevance_score, + title: code.title || code.example_name, + }, + }); + } + }, + [viewMode], + ); + + const handleViewModeChange = useCallback((mode: ViewMode) => { setViewMode(mode); setSelectedItem(null); setSearchQuery(""); - }; + }, []); return (