@kat-ai/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/citations/CitationDialog.tsx","../src/citations/CitationDisplay.tsx","../src/multichoice/MultiChoiceWidget.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { Citation } from '@kbs/core';\n\nexport interface CitationDialogProps {\n url: string | null;\n isOpen: boolean;\n onClose: () => void;\n citation?: Citation; // Optional direct citation object\n}\n\ninterface CitationMeta {\n label?: string;\n source?: string;\n fileName?: string;\n rowId?: string | number;\n category?: string;\n sourceType?: string;\n page?: number | null;\n preview?: string;\n}\n\n// Helper to extract page number from URL\nfunction extractPageFromUrl(url: string | null): number | null {\n if (!url) return null;\n try {\n const parsed = new URL(url, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');\n const searchPage = parsed.searchParams.get('page');\n const hashPart = url.split('#')[1];\n const hashParams = new URLSearchParams(hashPart?.replace(/^\\?/, '') || '');\n const hashPage = hashParams.get('page');\n const candidate = hashPage || searchPage;\n if (candidate) {\n const num = Number.parseInt(candidate, 10);\n return Number.isFinite(num) && num > 0 ? num : null;\n }\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n// Helper to parse metadata from URL hash\nfunction parseCitationMeta(url: string | null): CitationMeta | null {\n if (!url) return null;\n try {\n const hashPart = url.split('#')[1];\n const hashParams = new URLSearchParams(hashPart?.replace(/^\\?/, '') || '');\n const metaRaw = hashParams.get('meta');\n if (!metaRaw) return null;\n const parsed = JSON.parse(metaRaw);\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function CitationDialog({ url, isOpen, onClose, citation }: CitationDialogProps) {\n const [content, setContent] = useState<string>('');\n const [pdfUrl, setPdfUrl] = useState<string | null>(null);\n const [isPdf, setIsPdf] = useState(false);\n const [pageNumber, setPageNumber] = useState<number | null>(null);\n const [citationMeta, setCitationMeta] = useState<CitationMeta | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (isOpen && (url || citation)) {\n let cancelled = false;\n const loadCitation = async () => {\n setLoading(true);\n setError(null);\n setContent('');\n setPdfUrl(null);\n setIsPdf(false);\n setPageNumber(null);\n\n // If we have a direct citation object, use it\n if (citation) {\n const meta: CitationMeta = {\n label: citation.label,\n source: citation.referenceSummary,\n fileName: citation.fileName,\n preview: citation.preview,\n // Map other fields if available in reference metadata\n ...((citation.reference?.file?.metadata || {}) as any),\n };\n setCitationMeta(meta);\n\n if (citation.content) {\n setContent(citation.content);\n setLoading(false);\n return;\n }\n }\n\n const targetUrl = url || citation?.reference?.file?.signedUrl || (citation?.reference?.file as any)?.signed_url;\n\n if (!targetUrl) {\n if (citation?.content) {\n setContent(citation.content);\n setLoading(false);\n } else {\n setError('No content or URL available');\n setLoading(false);\n }\n return;\n }\n\n const meta = parseCitationMeta(targetUrl);\n if (!citationMeta) { // Don't overwrite if we set it from citation object\n setCitationMeta(meta);\n }\n\n // Preserve #page fragments for PDF navigation\n const [baseUrl, hashFragment] = targetUrl.split('#');\n const fragment = hashFragment ? `#${hashFragment}` : '';\n\n // Use our API route as a proxy to avoid CORS issues\n // If the URL is already a proxy URL, use it directly; otherwise, wrap it\n const apiUrlBase = baseUrl.startsWith('/api/citation')\n ? baseUrl\n : `/api/citation?url=${encodeURIComponent(baseUrl)}`;\n const apiUrlWithFragment = `${apiUrlBase}${fragment}`;\n const derivedPage = extractPageFromUrl(apiUrlWithFragment) ?? meta?.page ?? null;\n setPageNumber(derivedPage);\n\n // Quick URL sniff to avoid fetching binary PDFs as text\n let urlToCheck = baseUrl.toLowerCase();\n try {\n let decoded = urlToCheck;\n for (let i = 0; i < 3; i++) {\n const newDecoded = decodeURIComponent(decoded);\n if (newDecoded === decoded) break;\n decoded = newDecoded;\n }\n urlToCheck = decoded;\n } catch {\n // If decoding fails, fall back to the original\n }\n\n const looksLikePdf = urlToCheck.includes('.pdf') ||\n urlToCheck.includes('content-type=application/pdf') ||\n urlToCheck.includes('application/pdf') ||\n targetUrl.toLowerCase().includes('pdf') ||\n citation?.contentType === 'application/pdf';\n\n if (looksLikePdf) {\n if (!cancelled) {\n setPdfUrl(apiUrlWithFragment);\n setIsPdf(true);\n setPageNumber(derivedPage);\n setLoading(false);\n }\n return;\n }\n\n try {\n const res = await fetch(apiUrlBase);\n if (!res.ok) {\n const errorData = await res.json().catch(() => ({ error: res.statusText }));\n throw new Error(errorData.error || `Failed to fetch: ${res.status} ${res.statusText}`);\n }\n\n const contentType = res.headers.get('content-type') || '';\n if (contentType.includes('application/pdf')) {\n if (!cancelled) {\n setPdfUrl(apiUrlWithFragment);\n setIsPdf(true);\n setPageNumber(derivedPage);\n }\n return;\n }\n\n const text = await res.text();\n if (!cancelled) {\n setContent(text);\n }\n } catch (err) {\n console.error('Error fetching citation content:', err);\n if (!cancelled) {\n setError(err instanceof Error ? err.message : 'Failed to load content');\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n };\n\n loadCitation();\n return () => {\n cancelled = true;\n };\n } else {\n // Reset when dialog closes\n setContent('');\n setError(null);\n setPdfUrl(null);\n setIsPdf(false);\n setPageNumber(null);\n setCitationMeta(null);\n setLoading(false);\n }\n }, [isOpen, url, citation]);\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n // Prevent body scroll when dialog is open\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'unset';\n };\n }, [isOpen, onClose]);\n\n const renderCitationInfo = () => {\n if (!citationMeta && !pageNumber) return null;\n const meta = citationMeta || {};\n const infoItems = [\n { label: 'Page', value: pageNumber ?? meta.page ?? 'Not provided' },\n { label: 'Label', value: meta.label },\n { label: 'Source', value: meta.source },\n { label: 'File', value: meta.fileName },\n { label: 'Row ID', value: meta.rowId },\n { label: 'Category', value: meta.category },\n { label: 'Source Type', value: meta.sourceType },\n ].filter(item => item.value !== undefined && item.value !== null && item.value !== '');\n\n return (\n <div style={{\n padding: '12px 14px',\n backgroundColor: '#1a1a1a',\n border: '1px solid #2a2a2a',\n borderRadius: '8px',\n color: '#d0d0d0',\n fontSize: '14px',\n lineHeight: '1.6',\n }}>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '10px', alignItems: 'center' }}>\n {infoItems.map((item) => (\n <span key={item.label} style={{\n padding: '6px 10px',\n borderRadius: '6px',\n backgroundColor: '#0f172a',\n color: '#7dd3fc',\n border: '1px solid #1f2937',\n fontWeight: 600,\n fontSize: '13px',\n }}>\n {item.label}: {String(item.value)}\n </span>\n ))}\n </div>\n </div>\n );\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n backdropFilter: 'blur(8px)',\n zIndex: 1000,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n animation: 'fadeIn 0.2s ease-out',\n }}\n onClick={(e) => {\n // Close when clicking the backdrop\n if (e.target === e.currentTarget) {\n onClose();\n }\n }}\n >\n <style>{`\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n @keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n .citation-dialog-scrollbar::-webkit-scrollbar {\n width: 8px;\n }\n .citation-dialog-scrollbar::-webkit-scrollbar-track {\n background: #111111;\n border-radius: 4px;\n }\n .citation-dialog-scrollbar::-webkit-scrollbar-thumb {\n background: #1a1a1a;\n border-radius: 4px;\n }\n .citation-dialog-scrollbar::-webkit-scrollbar-thumb:hover {\n background: #2a2a2a;\n }\n `}</style>\n <div\n style={{\n backgroundColor: '#111111',\n borderRadius: '12px',\n border: '1px solid #1a1a1a',\n width: '100%',\n maxWidth: '950px',\n maxHeight: '92vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 20px 60px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.05)',\n animation: 'slideUp 0.3s ease-out',\n overflow: 'hidden',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n padding: '20px 28px',\n borderBottom: '1px solid #1a1a1a',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n background: 'linear-gradient(to bottom, #111111, #0a0a0a)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n <div\n style={{\n width: '36px',\n height: '36px',\n borderRadius: '8px',\n background: 'linear-gradient(135deg, #0070f3 0%, #0051cc 100%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '18px',\n boxShadow: '0 2px 8px rgba(0, 112, 243, 0.3)',\n }}\n >\n 📄\n </div>\n <div>\n <h2 style={{\n color: '#ffffff',\n margin: 0,\n fontSize: '20px',\n fontWeight: '600',\n letterSpacing: '-0.01em',\n lineHeight: '1.2',\n }}>\n Source Document\n </h2>\n <div style={{\n fontSize: '13px',\n color: '#888888',\n marginTop: '4px',\n fontWeight: '400',\n }}>\n Reference information\n </div>\n </div>\n </div>\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n border: '1px solid #1a1a1a',\n color: '#888888',\n fontSize: '20px',\n cursor: 'pointer',\n padding: '8px',\n lineHeight: 1,\n borderRadius: '6px',\n transition: 'all 0.2s ease',\n width: '36px',\n height: '36px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#1a1a1a';\n e.currentTarget.style.borderColor = '#2a2a2a';\n e.currentTarget.style.color = '#ffffff';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.borderColor = '#1a1a1a';\n e.currentTarget.style.color = '#888888';\n }}\n aria-label=\"Close dialog\"\n >\n ×\n </button>\n </div>\n\n {/* Content */}\n <div\n className=\"citation-dialog-scrollbar\"\n style={{\n flex: 1,\n overflowY: 'auto',\n padding: '24px',\n color: '#ffffff',\n background: '#111111',\n }}\n >\n {loading && (\n <div style={{\n textAlign: 'center',\n padding: '4rem 2rem',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '1rem',\n }}>\n <div\n style={{\n width: '40px',\n height: '40px',\n border: '3px solid #2a2a2a',\n borderTopColor: '#4a9eff',\n borderRadius: '50%',\n animation: 'spin 0.8s linear infinite',\n }}\n />\n <div style={{\n color: '#a0a0a0',\n fontSize: '0.95rem',\n fontWeight: '500',\n }}>\n Loading document...\n </div>\n </div>\n )}\n\n {error && (\n <div\n style={{\n padding: '1.25rem 1.5rem',\n backgroundColor: '#2a1a1a',\n borderRadius: '8px',\n color: '#ff6b6b',\n border: '1px solid #4a2a2a',\n display: 'flex',\n alignItems: 'flex-start',\n gap: '0.75rem',\n }}\n >\n <span style={{ fontSize: '1.25rem' }}>⚠️</span>\n <div>\n <strong style={{ display: 'block', marginBottom: '0.25rem', fontSize: '0.95rem' }}>\n Error loading document\n </strong>\n <div style={{ fontSize: '0.875rem', color: '#ff9999' }}>{error}</div>\n </div>\n </div>\n )}\n\n {!loading && !error && isPdf && pdfUrl && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n {renderCitationInfo()}\n\n <div style={{\n borderRadius: '8px',\n overflow: 'hidden',\n border: '1px solid #1a1a1a',\n backgroundColor: '#0a0a0a',\n minHeight: '60vh',\n }}>\n <object\n data={pdfUrl}\n type=\"application/pdf\"\n width=\"100%\"\n height=\"100%\"\n aria-label=\"PDF viewer\"\n style={{ display: 'block', minHeight: '70vh' }}\n >\n <iframe\n src={pdfUrl}\n title=\"PDF viewer\"\n style={{ width: '100%', height: '70vh', border: 'none' }}\n />\n </object>\n </div>\n\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n flexWrap: 'wrap',\n }}>\n <div style={{ color: '#888888', fontSize: '13px' }}>\n Prefer a new tab? Open the PDF directly.\n </div>\n <button\n onClick={() => window.open(pdfUrl, '_blank', 'noopener,noreferrer')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '10px 16px',\n backgroundColor: '#0070f3',\n color: '#ffffff',\n border: 'none',\n borderRadius: '6px',\n fontSize: '14px',\n fontWeight: '600',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#0051cc';\n e.currentTarget.style.transform = 'translateY(-1px)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#0070f3';\n e.currentTarget.style.transform = 'translateY(0)';\n }}\n >\n <span>Open in new tab</span>\n </button>\n </div>\n </div>\n )}\n\n {!loading && !error && !isPdf && content && (\n <div style={{\n maxWidth: '800px',\n margin: '0 auto',\n }}>\n <div style={{ marginBottom: '16px' }}>\n {renderCitationInfo()}\n </div>\n <ReactMarkdown\n remarkPlugins={[remarkMath]}\n rehypePlugins={[rehypeKatex]}\n components={{\n p: ({ children }) => <p style={{\n marginBottom: '1.25rem',\n marginTop: 0,\n lineHeight: '1.75',\n color: '#d0d0d0',\n fontSize: '0.95rem',\n }}>{children}</p>,\n h1: ({ children }) => <h1 style={{\n fontSize: '2rem',\n fontWeight: '700',\n marginBottom: '1.25rem',\n marginTop: '0',\n color: '#fff',\n borderBottom: '2px solid #2a2a2a',\n paddingBottom: '0.75rem',\n letterSpacing: '-0.02em',\n lineHeight: '1.3',\n }}>{children}</h1>,\n h2: ({ children }) => <h2 style={{\n fontSize: '1.5rem',\n fontWeight: '600',\n marginBottom: '1rem',\n marginTop: '1.75rem',\n color: '#fff',\n letterSpacing: '-0.01em',\n lineHeight: '1.4',\n }}>{children}</h2>,\n h3: ({ children }) => <h3 style={{\n fontSize: '1.25rem',\n fontWeight: '600',\n marginBottom: '0.75rem',\n marginTop: '1.5rem',\n color: '#f0f0f0',\n lineHeight: '1.4',\n }}>{children}</h3>,\n h4: ({ children }) => <h4 style={{\n fontSize: '1.1rem',\n fontWeight: '600',\n marginBottom: '0.75rem',\n marginTop: '1.25rem',\n color: '#f0f0f0',\n lineHeight: '1.4',\n }}>{children}</h4>,\n strong: ({ children }) => <strong style={{\n fontWeight: '600',\n color: '#fff'\n }}>{children}</strong>,\n em: ({ children }) => <em style={{\n fontStyle: 'italic',\n color: '#d0d0d0',\n }}>{children}</em>,\n ul: ({ children }) => <ul style={{\n marginBottom: '1.25rem',\n paddingLeft: '1.75rem',\n listStyleType: 'disc',\n lineHeight: '1.75',\n }}>{children}</ul>,\n ol: ({ children }) => <ol style={{\n marginBottom: '1.25rem',\n paddingLeft: '1.75rem',\n listStyleType: 'decimal',\n lineHeight: '1.75',\n }}>{children}</ol>,\n li: ({ children }) => <li style={{\n marginBottom: '0.5rem',\n lineHeight: '1.75',\n color: '#d0d0d0',\n paddingLeft: '0.25rem',\n }}>{children}</li>,\n code: ({ children }) => <code style={{\n backgroundColor: '#0f0f0f',\n padding: '0.2rem 0.5rem',\n borderRadius: '4px',\n fontSize: '0.875em',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n color: '#a0e0a0',\n border: '1px solid #1a1a1a',\n }}>{children}</code>,\n pre: ({ children }) => <pre style={{\n backgroundColor: '#0f0f0f',\n padding: '1.25rem',\n borderRadius: '8px',\n overflow: 'auto',\n marginBottom: '1.25rem',\n border: '1px solid #2a2a2a',\n fontSize: '0.875rem',\n lineHeight: '1.6',\n }}>{children}</pre>,\n blockquote: ({ children }) => <blockquote style={{\n borderLeft: '4px solid #4a9eff',\n paddingLeft: '1.25rem',\n marginLeft: 0,\n marginBottom: '1.25rem',\n color: '#c0c0c0',\n fontStyle: 'italic',\n backgroundColor: '#1f1f1f',\n padding: '1rem 1.25rem',\n borderRadius: '0 6px 6px 0',\n }}>{children}</blockquote>,\n a: ({ href, children }) => <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: '#4a9eff',\n textDecoration: 'none',\n borderBottom: '1px solid rgba(74, 158, 255, 0.3)',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = '#6bb0ff';\n e.currentTarget.style.borderBottomColor = 'rgba(107, 176, 255, 0.6)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = '#4a9eff';\n e.currentTarget.style.borderBottomColor = 'rgba(74, 158, 255, 0.3)';\n }}\n >{children}</a>,\n table: ({ children }) => <div style={{\n overflowX: 'auto',\n marginBottom: '1.25rem',\n }}>\n <table style={{\n width: '100%',\n borderCollapse: 'collapse',\n }}>{children}</table>\n </div>,\n th: ({ children }) => <th style={{\n border: '1px solid #2a2a2a',\n padding: '0.75rem',\n backgroundColor: '#1f1f1f',\n textAlign: 'left',\n fontWeight: '600',\n color: '#fff',\n fontSize: '0.9rem',\n }}>{children}</th>,\n td: ({ children }) => <td style={{\n border: '1px solid #2a2a2a',\n padding: '0.75rem',\n color: '#d0d0d0',\n fontSize: '0.9rem',\n }}>{children}</td>,\n hr: () => <hr style={{\n border: 'none',\n borderTop: '1px solid #2a2a2a',\n margin: '2rem 0',\n }} />,\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Citation } from '@kbs/core';\n\nexport interface CitationDisplayProps {\n citations: Citation[];\n onCitationClick: (citation: Citation) => void;\n chipColor?: string;\n borderColor?: string;\n /** Maximum length for reference summary text (default: 40) */\n maxSummaryLength?: number;\n}\n\n/**\n * Strip markdown formatting from a string for cleaner display\n * Removes headers, bold, italic, links, etc.\n */\nfunction stripMarkdown(text: string): string {\n if (!text) return '';\n \n return text\n // Remove markdown headers (# Title)\n .replace(/^#+\\s*/gm, '')\n // Remove bold (**text** or __text__)\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1')\n .replace(/__([^_]+)__/g, '$1')\n // Remove italic (*text* or _text_)\n .replace(/\\*([^*]+)\\*/g, '$1')\n .replace(/_([^_]+)_/g, '$1')\n // Remove links [text](url)\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n // Remove code blocks and inline code\n .replace(/`{1,3}[^`]*`{1,3}/g, '')\n // Collapse multiple spaces\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Format a reference summary for display in citation chips\n * Strips markdown and truncates to fit within the chip\n */\nfunction formatReferenceSummary(summary: string | undefined, maxLength: number): string {\n if (!summary) return '';\n \n const cleaned = stripMarkdown(summary);\n \n if (cleaned.length <= maxLength) {\n return cleaned;\n }\n \n return cleaned.substring(0, maxLength - 3) + '...';\n}\n\nexport function CitationDisplay({\n citations,\n onCitationClick,\n chipColor = '#2a1a3a',\n borderColor = '#4a2a5a',\n maxSummaryLength = 40\n}: CitationDisplayProps) {\n if (!citations || citations.length === 0) {\n return null;\n }\n\n return (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.35rem', marginTop: '0.5rem' }}>\n {citations.map((citation, idx) => {\n const displaySummary = formatReferenceSummary(citation.referenceSummary, maxSummaryLength);\n const tooltipText = stripMarkdown(citation.preview || citation.referenceSummary || '');\n \n return (\n <span\n key={citation.label || idx}\n title={tooltipText}\n onClick={() => onCitationClick(citation)}\n style={{\n padding: '0.35rem 0.5rem',\n backgroundColor: chipColor,\n borderRadius: '4px',\n border: `1px solid ${borderColor}`,\n fontSize: '0.75rem',\n color: '#d0a0f0',\n cursor: 'pointer',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <span style={{ fontWeight: 600 }}>[{citation.label}]</span>\n {displaySummary && <span>{displaySummary}</span>}\n </span>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, type KeyboardEvent } from 'react';\nimport { MultiChoiceOption } from '@kbs/core';\n\nexport interface MultiChoiceWidgetProps {\n /** Array of options to display */\n options: MultiChoiceOption[];\n /** Callback when an option is selected */\n onSelect: (value: string) => void;\n /** Optional placeholder for the free text input */\n freeTextPlaceholder?: string;\n /** Background color for option chips */\n chipColor?: string;\n /** Border color for option chips */\n borderColor?: string;\n /** Accent color for hover and focus states */\n accentColor?: string;\n /** Text color */\n textColor?: string;\n /** Whether the widget is disabled (e.g., while sending) */\n disabled?: boolean;\n}\n\n/**\n * Multi-choice widget for disambiguation questions.\n * Displays clickable option chips with an additional free-text input option.\n */\nexport function MultiChoiceWidget({\n options,\n onSelect,\n freeTextPlaceholder = 'Or type your own answer...',\n chipColor = 'rgba(139, 92, 246, 0.15)',\n borderColor = 'rgba(139, 92, 246, 0.3)',\n accentColor = 'rgba(139, 92, 246, 0.5)',\n textColor = '#d4b8ff',\n disabled = false,\n}: MultiChoiceWidgetProps) {\n const [showFreeText, setShowFreeText] = useState(false);\n const [freeTextValue, setFreeTextValue] = useState('');\n\n const handleOptionClick = useCallback(\n (option: MultiChoiceOption) => {\n if (disabled) return;\n onSelect(option.label);\n },\n [onSelect, disabled]\n );\n\n const handleOtherClick = useCallback(() => {\n if (disabled) return;\n setShowFreeText(true);\n }, [disabled]);\n\n const handleFreeTextSubmit = useCallback(() => {\n if (disabled || !freeTextValue.trim()) return;\n onSelect(freeTextValue.trim());\n setFreeTextValue('');\n setShowFreeText(false);\n }, [onSelect, freeTextValue, disabled]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleFreeTextSubmit();\n } else if (e.key === 'Escape') {\n setShowFreeText(false);\n setFreeTextValue('');\n }\n },\n [handleFreeTextSubmit]\n );\n\n const baseChipStyle: React.CSSProperties = {\n padding: '0.5rem 0.875rem',\n backgroundColor: chipColor,\n borderRadius: '9999px',\n border: `1px solid ${borderColor}`,\n fontSize: '0.875rem',\n color: textColor,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n transition: 'all 0.15s ease',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.375rem',\n };\n\n const hoverChipStyle: React.CSSProperties = {\n ...baseChipStyle,\n backgroundColor: accentColor,\n borderColor: textColor,\n };\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '0.75rem',\n marginTop: '0.75rem',\n }}\n >\n {/* Options container */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '0.5rem',\n }}\n >\n {options.map((option) => (\n <button\n key={option.id}\n onClick={() => handleOptionClick(option)}\n disabled={disabled}\n title={option.description}\n style={baseChipStyle}\n onMouseEnter={(e) => {\n if (!disabled) {\n Object.assign(e.currentTarget.style, hoverChipStyle);\n }\n }}\n onMouseLeave={(e) => {\n Object.assign(e.currentTarget.style, baseChipStyle);\n }}\n >\n {option.label}\n </button>\n ))}\n\n {/* \"Other\" option */}\n {!showFreeText && (\n <button\n onClick={handleOtherClick}\n disabled={disabled}\n style={{\n ...baseChipStyle,\n backgroundColor: 'transparent',\n borderStyle: 'dashed',\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = chipColor;\n e.currentTarget.style.borderStyle = 'solid';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.borderStyle = 'dashed';\n }}\n >\n <span style={{ fontSize: '1rem', lineHeight: 1 }}>+</span>\n Other\n </button>\n )}\n </div>\n\n {/* Free text input */}\n {showFreeText && (\n <div\n style={{\n display: 'flex',\n gap: '0.5rem',\n alignItems: 'center',\n }}\n >\n <input\n type=\"text\"\n value={freeTextValue}\n onChange={(e) => setFreeTextValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={freeTextPlaceholder}\n disabled={disabled}\n autoFocus\n style={{\n flex: 1,\n padding: '0.5rem 0.75rem',\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\n border: `1px solid ${borderColor}`,\n borderRadius: '0.5rem',\n color: textColor,\n fontSize: '0.875rem',\n outline: 'none',\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = accentColor;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = borderColor;\n }}\n />\n <button\n onClick={handleFreeTextSubmit}\n disabled={disabled || !freeTextValue.trim()}\n style={{\n padding: '0.5rem 1rem',\n backgroundColor: freeTextValue.trim() ? accentColor : chipColor,\n border: `1px solid ${freeTextValue.trim() ? textColor : borderColor}`,\n borderRadius: '0.5rem',\n color: textColor,\n fontSize: '0.875rem',\n cursor: disabled || !freeTextValue.trim() ? 'not-allowed' : 'pointer',\n opacity: disabled || !freeTextValue.trim() ? 0.5 : 1,\n transition: 'all 0.15s ease',\n }}\n >\n Send\n </button>\n <button\n onClick={() => {\n setShowFreeText(false);\n setFreeTextValue('');\n }}\n disabled={disabled}\n style={{\n padding: '0.5rem',\n backgroundColor: 'transparent',\n border: 'none',\n color: textColor,\n fontSize: '1rem',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 0.7,\n }}\n title=\"Cancel\"\n >\n ×\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default MultiChoiceWidget;\n\n\n\n\n"],"mappings":"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","names":["meta","jsx","jsxs","useState","jsx","jsxs"]}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@kat-ai/react",
3
+ "version": "0.1.0",
4
+ "description": "React components and hooks for KAT agent experiences",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js",
13
+ "default": "./dist/index.mjs"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "peerDependencies": {
21
+ "react": ">=18",
22
+ "react-dom": ">=18"
23
+ },
24
+ "dependencies": {
25
+ "react-markdown": "^9.0.0",
26
+ "rehype-katex": "^7.0.0",
27
+ "remark-math": "^6.0.0",
28
+ "@kat-ai/sdk": "0.1.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/react": "^18.2.0",
32
+ "@types/react-dom": "^18.2.0",
33
+ "react": "^18.3.1",
34
+ "react-dom": "^18.3.1",
35
+ "tsup": "^8.0.0",
36
+ "typescript": "^5.5.0"
37
+ },
38
+ "engines": {
39
+ "node": ">=18"
40
+ },
41
+ "keywords": [
42
+ "kat",
43
+ "react",
44
+ "components",
45
+ "citations",
46
+ "agent-ui"
47
+ ],
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/pinecone-io/kat.git",
51
+ "directory": "packages/react"
52
+ },
53
+ "license": "MIT",
54
+ "publishConfig": {
55
+ "access": "public"
56
+ },
57
+ "scripts": {
58
+ "build": "tsup",
59
+ "dev": "tsup --watch",
60
+ "lint": "eslint src/",
61
+ "typecheck": "tsc --noEmit"
62
+ }
63
+ }