@arbidocs/react 0.3.15 → 0.3.17

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ArbiProvider.tsx","../src/useArbi.ts","../src/hooks.ts"],"names":["createContext","useMemo","Arbi","useContext","useQuery","useMutation"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ArbiProvider — React context that holds an Arbi instance.\n *\n * Usage:\n * <ArbiProvider url=\"https://arbi.mycompany.com\">\n * <App />\n * </ArbiProvider>\n */\n\nimport { createContext, useMemo, type ReactNode } from 'react'\nimport { Arbi, type ArbiOptions } from '@arbidocs/sdk/browser'\n\nexport const ArbiContext = createContext<Arbi | null>(null)\n\nexport interface ArbiProviderProps extends ArbiOptions {\n children: ReactNode\n}\n\nexport function ArbiProvider({ children, ...options }: ArbiProviderProps) {\n const arbi = useMemo(\n () => new Arbi(options),\n // Stable on url + deploymentDomain — re-creating the instance on every render would be wrong\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [options.url, options.deploymentDomain, options.credentials]\n )\n\n return <ArbiContext.Provider value={arbi}>{children}</ArbiContext.Provider>\n}\n","/**\n * Hook to access the Arbi instance from the nearest ArbiProvider.\n */\n\nimport { useContext } from 'react'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { ArbiContext } from './ArbiProvider'\n\nexport function useArbi(): Arbi {\n const arbi = useContext(ArbiContext)\n if (!arbi) {\n throw new Error('useArbi() must be used within an <ArbiProvider>')\n }\n return arbi\n}\n","/**\n * React Query hooks that use the Arbi instance from context.\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query'\nimport type { SSEStreamResult, SSEStreamStartData, AgentStepEvent } from '@arbidocs/sdk/browser'\nimport { useArbi } from './useArbi'\n\n// ── Query keys ──────────────────────────────────────────────────────────────\n\nexport const arbiQueryKeys = {\n workspaces: () => ['arbi', 'workspaces'] as const,\n documents: (workspaceId: string) => ['arbi', 'documents', workspaceId] as const,\n conversations: (workspaceId: string) => ['arbi', 'conversations', workspaceId] as const,\n tags: (workspaceId: string) => ['arbi', 'tags', workspaceId] as const,\n health: () => ['arbi', 'health'] as const,\n}\n\n// ── Hooks ───────────────────────────────────────────────────────────────────\n\n/** List the logged-in user's workspaces. */\nexport function useWorkspaces(options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.workspaces(),\n queryFn: () => arbi.workspaces.list(),\n enabled: options?.enabled ?? arbi.isLoggedIn,\n })\n}\n\n/** List documents in a workspace. */\nexport function useDocuments(workspaceId: string | undefined, options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.documents(workspaceId ?? ''),\n queryFn: () => arbi.documents.list(),\n enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace,\n })\n}\n\n/** List conversations in a workspace. */\nexport function useConversations(workspaceId: string | undefined, options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.conversations(workspaceId ?? ''),\n queryFn: () => arbi.conversations.list(),\n enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace,\n })\n}\n\n/** List tags in a workspace. */\nexport function useTags(workspaceId: string | undefined, options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.tags(workspaceId ?? ''),\n queryFn: () => arbi.tags.list(),\n enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace,\n })\n}\n\n/** Send a streaming query to the RAG assistant. Returns a mutation. */\nexport function useAssistantQuery() {\n const arbi = useArbi()\n\n return useMutation<\n SSEStreamResult,\n Error,\n {\n question: string\n docIds: string[]\n previousResponseId?: string | null\n model?: string\n onToken?: (content: string) => void\n onStreamStart?: (data: SSEStreamStartData) => void\n onAgentStep?: (data: AgentStepEvent) => void\n onError?: (message: string) => void\n onComplete?: () => void\n }\n >({\n mutationFn: ({ question, ...options }) => arbi.assistant.query(question, options),\n })\n}\n\n/** Check backend health. */\nexport function useHealth(options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.health(),\n queryFn: () => arbi.health.check(),\n enabled: options?.enabled,\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/ArbiProvider.tsx","../src/chat/styles.ts","../src/useArbi.ts","../src/chat/AuthScreen.tsx","../src/hooks.ts","../src/chat/WorkspaceScreen.tsx","../src/chat/MessageBubble.tsx","../src/chat/ChatView.tsx","../src/chat/ChatWidget.tsx","../src/chat/ArbiChat.tsx"],"names":["createContext","useMemo","Arbi","useContext","useState","jsxs","jsx","useQuery","useMutation","resolveCitations","summarizeCitations","useRef","useEffect","useCallback","Fragment","QueryClient","QueryClientProvider"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ArbiProvider — React context that holds an Arbi instance.\n *\n * Usage:\n * <ArbiProvider url=\"https://arbi.mycompany.com\">\n * <App />\n * </ArbiProvider>\n */\n\nimport { createContext, useMemo, type ReactNode } from 'react'\nimport { Arbi, type ArbiOptions } from '@arbidocs/sdk/browser'\n\nexport const ArbiContext = createContext<Arbi | null>(null)\n\nexport interface ArbiProviderProps extends ArbiOptions {\n children: ReactNode\n}\n\nexport function ArbiProvider({ children, ...options }: ArbiProviderProps) {\n const arbi = useMemo(\n () => new Arbi(options),\n // Stable on url + deploymentDomain — re-creating the instance on every render would be wrong\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [options.url, options.deploymentDomain, options.credentials]\n )\n\n return <ArbiContext.Provider value={arbi}>{children}</ArbiContext.Provider>\n}\n","import type { CSSProperties } from 'react'\nimport type { ArbiChatLabels, ArbiChatTheme, ResolvedLabels, ResolvedTheme } from './types'\n\n/**\n * Default theme matching the ARBI frontend color palette.\n *\n * - Primary action color: ARBI cyan (#00adef)\n * - Message bubbles: light gray (user) / light cyan (assistant)\n * - Text/border: standard ARBI grays\n * - Border radius: 8px (ARBI default)\n */\nconst DEFAULT_THEME: ArbiChatTheme = {\n primaryColor: '#00adef',\n backgroundColor: '#ffffff',\n surfaceColor: '#f9fafb',\n textColor: '#111827',\n mutedColor: '#6b7280',\n borderColor: '#e5e7eb',\n userBubbleColor: '#f3f4f6',\n userBubbleTextColor: '#111827',\n assistantBubbleColor: 'rgba(0, 173, 239, 0.08)',\n assistantBubbleTextColor: '#111827',\n borderRadius: '8px',\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\",\n}\n\nconst DEFAULT_LABELS: ResolvedLabels = {\n title: 'Chat',\n email: 'Email',\n password: 'Password',\n loginButton: 'Log in',\n loginButtonLoading: 'Logging in...',\n registerButton: 'Create account',\n sendCodeButton: 'Email me a code',\n haveCodeButton: 'I have an invitation code',\n verificationCode: 'Verification code',\n confirmPassword: 'Confirm password',\n firstName: 'First name',\n lastName: 'Last name',\n switchToRegister: 'Create account',\n switchToLogin: 'Back to login',\n selectWorkspace: 'Select a workspace',\n workspacePlaceholder: 'Choose...',\n continueButton: 'Continue',\n createWorkspace: 'Create new workspace',\n workspaceName: 'Workspace name',\n createButton: 'Create',\n changeWorkspace: 'Change workspace',\n documents: 'Documents',\n sendButton: 'Send',\n placeholder: 'Ask a question...',\n uploadButton: 'Upload',\n uploading: 'Uploading...',\n emptyNoDocs: 'No documents found in this workspace.',\n emptyNoSelection: 'Select at least one document to start chatting.',\n emptyReady: 'Ask a question about your documents.',\n}\n\nexport function getTheme(partial?: Partial<ArbiChatTheme>): ResolvedTheme {\n return { ...DEFAULT_THEME, ...partial }\n}\n\nexport function getLabels(partial?: ArbiChatLabels): ResolvedLabels {\n return { ...DEFAULT_LABELS, ...partial }\n}\n\n// ── Container ────────────────────────────────────────────────────────────────\n\nexport function containerStyle(\n theme: ResolvedTheme,\n width: string | number,\n height: string | number\n): CSSProperties {\n return {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n display: 'flex',\n flexDirection: 'column',\n fontFamily: theme.fontFamily,\n fontSize: '14px',\n lineHeight: '1.5',\n color: theme.textColor,\n backgroundColor: theme.backgroundColor,\n border: `1px solid ${theme.borderColor}`,\n borderRadius: theme.borderRadius,\n overflow: 'hidden',\n boxSizing: 'border-box',\n }\n}\n\nexport function headerStyle(theme: ResolvedTheme): CSSProperties {\n return {\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n fontWeight: 600,\n fontSize: '15px',\n borderBottom: `1px solid ${theme.borderColor}`,\n flexShrink: 0,\n }\n}\n\nexport function bodyStyle(): CSSProperties {\n return {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n }\n}\n\n// ── Forms ────────────────────────────────────────────────────────────────────\n\nexport function formContainerStyle(): CSSProperties {\n return {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: '24px 16px',\n gap: '12px',\n }\n}\n\nexport function labelStyle(theme: ResolvedTheme): CSSProperties {\n return {\n fontSize: '13px',\n fontWeight: 500,\n color: theme.textColor,\n marginBottom: '4px',\n }\n}\n\nexport function inputStyle(theme: ResolvedTheme): CSSProperties {\n return {\n width: '100%',\n padding: '8px 12px',\n fontSize: '14px',\n fontFamily: theme.fontFamily,\n color: theme.textColor,\n backgroundColor: theme.backgroundColor,\n border: `1px solid ${theme.borderColor}`,\n borderRadius: '8px',\n outline: 'none',\n boxSizing: 'border-box',\n }\n}\n\nexport function selectStyle(theme: ResolvedTheme): CSSProperties {\n return {\n ...inputStyle(theme),\n cursor: 'pointer',\n appearance: 'auto' as CSSProperties['appearance'],\n }\n}\n\nexport function buttonStyle(theme: ResolvedTheme, disabled?: boolean): CSSProperties {\n return {\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: theme.fontFamily,\n color: '#ffffff',\n backgroundColor: disabled ? theme.mutedColor : theme.primaryColor,\n border: 'none',\n borderRadius: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.6 : 1,\n transition: 'opacity 150ms',\n }\n}\n\nexport function errorStyle(): CSSProperties {\n return {\n fontSize: '13px',\n color: '#ef4444',\n margin: '4px 0 0',\n }\n}\n\n// ── Chat view ────────────────────────────────────────────────────────────────\n\nexport function messagesContainerStyle(): CSSProperties {\n return {\n flex: 1,\n overflowY: 'auto',\n padding: '12px 16px',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n }\n}\n\nexport function messageBubbleStyle(\n theme: ResolvedTheme,\n role: 'user' | 'assistant'\n): CSSProperties {\n const isUser = role === 'user'\n return {\n maxWidth: '85%',\n padding: '8px 12px',\n borderRadius: '12px',\n fontSize: '14px',\n lineHeight: '1.5',\n wordBreak: 'break-word',\n whiteSpace: 'pre-wrap',\n alignSelf: isUser ? 'flex-end' : 'flex-start',\n backgroundColor: isUser ? theme.userBubbleColor : theme.assistantBubbleColor,\n color: isUser ? theme.userBubbleTextColor : theme.assistantBubbleTextColor,\n }\n}\n\nexport function inputBarStyle(theme: ResolvedTheme): CSSProperties {\n return {\n display: 'flex',\n gap: '8px',\n padding: '12px 16px',\n borderTop: `1px solid ${theme.borderColor}`,\n flexShrink: 0,\n }\n}\n\nexport function chatInputStyle(theme: ResolvedTheme): CSSProperties {\n return {\n ...inputStyle(theme),\n flex: 1,\n }\n}\n\nexport function sendButtonStyle(theme: ResolvedTheme, disabled?: boolean): CSSProperties {\n return {\n ...buttonStyle(theme, disabled),\n padding: '8px 14px',\n flexShrink: 0,\n }\n}\n\n// ── Document selector ────────────────────────────────────────────────────────\n\nexport function docSelectorStyle(theme: ResolvedTheme): CSSProperties {\n return {\n padding: '8px 16px',\n borderBottom: `1px solid ${theme.borderColor}`,\n flexShrink: 0,\n }\n}\n\nexport function docToggleStyle(theme: ResolvedTheme): CSSProperties {\n return {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n fontSize: '13px',\n fontWeight: 500,\n color: theme.mutedColor,\n cursor: 'pointer',\n background: 'none',\n border: 'none',\n padding: 0,\n fontFamily: theme.fontFamily,\n }\n}\n\nexport function docListStyle(): CSSProperties {\n return {\n marginTop: '6px',\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n maxHeight: '120px',\n overflowY: 'auto',\n }\n}\n\nexport function docItemStyle(theme: ResolvedTheme): CSSProperties {\n return {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n fontSize: '13px',\n color: theme.textColor,\n cursor: 'pointer',\n textAlign: 'left',\n }\n}\n\nexport function emptyStateStyle(theme: ResolvedTheme): CSSProperties {\n return {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.mutedColor,\n fontSize: '13px',\n padding: '24px',\n textAlign: 'center',\n }\n}\n\nexport function loadingContainerStyle(): CSSProperties {\n return {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n fontSize: '13px',\n }\n}\n\nexport function brandingStyle(theme: ResolvedTheme): CSSProperties {\n return {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n padding: '6px 16px',\n fontSize: '11px',\n color: theme.mutedColor,\n borderTop: `1px solid ${theme.borderColor}`,\n flexShrink: 0,\n userSelect: 'none',\n }\n}\n\nexport function brandingLinkStyle(theme: ResolvedTheme): CSSProperties {\n return {\n color: theme.mutedColor,\n fontWeight: 600,\n textDecoration: 'none',\n }\n}\n\n// ── Auth / Workspace creation ─────────────────────────────────────────────────\n\nexport function linkButtonStyle(theme: ResolvedTheme): CSSProperties {\n return {\n background: 'none',\n border: 'none',\n padding: 0,\n fontSize: '13px',\n color: theme.primaryColor,\n cursor: 'pointer',\n fontFamily: theme.fontFamily,\n textDecoration: 'underline',\n }\n}\n\nexport function secondaryButtonStyle(theme: ResolvedTheme, disabled?: boolean): CSSProperties {\n return {\n padding: '4px 10px',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: theme.fontFamily,\n color: disabled ? theme.mutedColor : theme.primaryColor,\n backgroundColor: 'transparent',\n border: `1px solid ${disabled ? theme.borderColor : theme.primaryColor}`,\n borderRadius: '6px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.6 : 1,\n transition: 'opacity 150ms',\n whiteSpace: 'nowrap',\n }\n}\n\nexport function fileInputStyle(): CSSProperties {\n return { display: 'none' }\n}\n\nexport function agentStatusStyle(theme: ResolvedTheme): CSSProperties {\n return {\n fontSize: '12px',\n color: theme.mutedColor,\n fontStyle: 'italic',\n padding: '4px 0',\n alignSelf: 'flex-start',\n }\n}\n","/**\n * Hook to access the Arbi instance from the nearest ArbiProvider.\n */\n\nimport { useContext } from 'react'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { ArbiContext } from './ArbiProvider'\n\nexport function useArbi(): Arbi {\n const arbi = useContext(ArbiContext)\n if (!arbi) {\n throw new Error('useArbi() must be used within an <ArbiProvider>')\n }\n return arbi\n}\n","import { useState, type FormEvent } from 'react'\nimport { useArbi } from '../useArbi'\nimport type { ResolvedLabels, ResolvedTheme } from './types'\nimport {\n formContainerStyle,\n labelStyle,\n inputStyle,\n buttonStyle,\n errorStyle,\n linkButtonStyle,\n} from './styles'\n\ninterface AuthScreenProps {\n theme: ResolvedTheme\n labels: ResolvedLabels\n onLogin: () => void\n}\n\ntype AuthMode = 'login' | 'register'\ntype RegisterStep = 'email' | 'verify'\n\nexport function AuthScreen({ theme, labels, onLogin }: AuthScreenProps) {\n const arbi = useArbi()\n const [mode, setMode] = useState<AuthMode>('login')\n const [step, setStep] = useState<RegisterStep>('email')\n\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [confirmPw, setConfirmPw] = useState('')\n const [code, setCode] = useState('')\n const [firstName, setFirstName] = useState('')\n const [lastName, setLastName] = useState('')\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n\n const resetForm = () => {\n setPassword('')\n setConfirmPw('')\n setCode('')\n setFirstName('')\n setLastName('')\n setError('')\n setStep('email')\n }\n\n const switchMode = (next: AuthMode) => {\n resetForm()\n setMode(next)\n }\n\n // ── Login ─────────────────────────────────────────────────────────────────\n\n const handleLogin = async (e: FormEvent) => {\n e.preventDefault()\n setLoading(true)\n setError('')\n try {\n await arbi.login(email, password)\n onLogin()\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Login failed')\n } finally {\n setLoading(false)\n }\n }\n\n // ── Register: skip straight to verify (user already has a code) ────────────\n\n const handleHaveCode = () => {\n setError('')\n setStep('verify')\n }\n\n // ── Register: send code via email then go to verify ───────────────────────\n\n const handleEmailCode = async () => {\n if (!email) return\n setLoading(true)\n setError('')\n try {\n await arbi.requestVerification(email)\n setStep('verify')\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to send verification code')\n } finally {\n setLoading(false)\n }\n }\n\n // ── Register step 2: create account ───────────────────────────────────────\n\n const handleRegister = async (e: FormEvent) => {\n e.preventDefault()\n if (password !== confirmPw) {\n setError('Passwords do not match')\n return\n }\n setLoading(true)\n setError('')\n try {\n await arbi.register({ email, password, verificationCode: code, firstName, lastName })\n await arbi.login(email, password)\n onLogin()\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Registration failed')\n } finally {\n setLoading(false)\n }\n }\n\n // ── Login form ────────────────────────────────────────────────────────────\n\n if (mode === 'login') {\n return (\n <form onSubmit={handleLogin} style={formContainerStyle()}>\n <div>\n <div style={labelStyle(theme)}>{labels.email}</div>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n required\n style={inputStyle(theme)}\n />\n </div>\n <div>\n <div style={labelStyle(theme)}>{labels.password}</div>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n autoComplete=\"current-password\"\n required\n style={inputStyle(theme)}\n />\n </div>\n <button type=\"submit\" disabled={loading} style={buttonStyle(theme, loading)}>\n {loading ? labels.loginButtonLoading : labels.loginButton}\n </button>\n {error && <div style={errorStyle()}>{error}</div>}\n <div style={{ textAlign: 'center' }}>\n <button\n type=\"button\"\n onClick={() => switchMode('register')}\n style={linkButtonStyle(theme)}\n >\n {labels.switchToRegister}\n </button>\n </div>\n </form>\n )\n }\n\n // ── Register step 1: email + choose code method ────────────────────────────\n\n if (step === 'email') {\n const noEmail = !email.trim()\n return (\n <div style={formContainerStyle()}>\n <div>\n <div style={labelStyle(theme)}>{labels.email}</div>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n style={inputStyle(theme)}\n />\n </div>\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n type=\"button\"\n onClick={handleHaveCode}\n disabled={noEmail}\n style={{ ...buttonStyle(theme, noEmail), flex: 1 }}\n >\n {labels.haveCodeButton}\n </button>\n <button\n type=\"button\"\n onClick={handleEmailCode}\n disabled={noEmail || loading}\n style={{ ...buttonStyle(theme, noEmail || loading), flex: 1 }}\n >\n {loading ? '...' : labels.sendCodeButton}\n </button>\n </div>\n {error && <div style={errorStyle()}>{error}</div>}\n <div style={{ textAlign: 'center' }}>\n <button type=\"button\" onClick={() => switchMode('login')} style={linkButtonStyle(theme)}>\n {labels.switchToLogin}\n </button>\n </div>\n </div>\n )\n }\n\n // ── Register step 2: verify + create account ─────────────────────────────\n\n return (\n <form onSubmit={handleRegister} style={formContainerStyle()}>\n <div style={{ display: 'flex', gap: '8px' }}>\n <div style={{ flex: 1 }}>\n <div style={labelStyle(theme)}>{labels.firstName}</div>\n <input\n type=\"text\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n autoComplete=\"given-name\"\n required\n style={inputStyle(theme)}\n />\n </div>\n <div style={{ flex: 1 }}>\n <div style={labelStyle(theme)}>{labels.lastName}</div>\n <input\n type=\"text\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n autoComplete=\"family-name\"\n required\n style={inputStyle(theme)}\n />\n </div>\n </div>\n <div>\n <div style={labelStyle(theme)}>{labels.verificationCode}</div>\n <input\n type=\"text\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n autoComplete=\"one-time-code\"\n required\n style={inputStyle(theme)}\n />\n </div>\n <div>\n <div style={labelStyle(theme)}>{labels.password}</div>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n autoComplete=\"new-password\"\n required\n style={inputStyle(theme)}\n />\n </div>\n <div>\n <div style={labelStyle(theme)}>{labels.confirmPassword}</div>\n <input\n type=\"password\"\n value={confirmPw}\n onChange={(e) => setConfirmPw(e.target.value)}\n autoComplete=\"new-password\"\n required\n style={inputStyle(theme)}\n />\n </div>\n <button type=\"submit\" disabled={loading} style={buttonStyle(theme, loading)}>\n {loading ? '...' : labels.registerButton}\n </button>\n {error && <div style={errorStyle()}>{error}</div>}\n <div style={{ textAlign: 'center' }}>\n <button type=\"button\" onClick={() => switchMode('login')} style={linkButtonStyle(theme)}>\n {labels.switchToLogin}\n </button>\n </div>\n </form>\n )\n}\n","/**\n * React Query hooks that use the Arbi instance from context.\n */\n\nimport { useQuery, useMutation } from '@tanstack/react-query'\nimport type { SSEStreamResult, SSEStreamStartData, AgentStepEvent } from '@arbidocs/sdk/browser'\nimport { useArbi } from './useArbi'\n\n// ── Query keys ──────────────────────────────────────────────────────────────\n\nexport const arbiQueryKeys = {\n workspaces: () => ['arbi', 'workspaces'] as const,\n documents: (workspaceId: string) => ['arbi', 'documents', workspaceId] as const,\n conversations: (workspaceId: string) => ['arbi', 'conversations', workspaceId] as const,\n tags: (workspaceId: string) => ['arbi', 'tags', workspaceId] as const,\n health: () => ['arbi', 'health'] as const,\n}\n\n// ── Hooks ───────────────────────────────────────────────────────────────────\n\n/** List the logged-in user's workspaces. */\nexport function useWorkspaces(options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.workspaces(),\n queryFn: () => arbi.workspaces.list(),\n enabled: options?.enabled ?? arbi.isLoggedIn,\n })\n}\n\n/** List documents in a workspace. */\nexport function useDocuments(workspaceId: string | undefined, options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.documents(workspaceId ?? ''),\n queryFn: () => arbi.documents.list(),\n enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace,\n })\n}\n\n/** List conversations in a workspace. */\nexport function useConversations(workspaceId: string | undefined, options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.conversations(workspaceId ?? ''),\n queryFn: () => arbi.conversations.list(),\n enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace,\n })\n}\n\n/** List tags in a workspace. */\nexport function useTags(workspaceId: string | undefined, options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.tags(workspaceId ?? ''),\n queryFn: () => arbi.tags.list(),\n enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace,\n })\n}\n\n/** Send a streaming query to the RAG assistant. Returns a mutation. */\nexport function useAssistantQuery() {\n const arbi = useArbi()\n\n return useMutation<\n SSEStreamResult,\n Error,\n {\n question: string\n docIds: string[]\n previousResponseId?: string | null\n model?: string\n onToken?: (content: string) => void\n onStreamStart?: (data: SSEStreamStartData) => void\n onAgentStep?: (data: AgentStepEvent) => void\n onError?: (message: string) => void\n onComplete?: () => void\n }\n >({\n mutationFn: ({ question, ...options }) => arbi.assistant.query(question, options),\n })\n}\n\n/** Check backend health. */\nexport function useHealth(options?: { enabled?: boolean }) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.health(),\n queryFn: () => arbi.health.check(),\n enabled: options?.enabled,\n })\n}\n","import { useState } from 'react'\nimport { useArbi } from '../useArbi'\nimport { useWorkspaces } from '../hooks'\nimport type { ResolvedLabels, ResolvedTheme } from './types'\nimport {\n formContainerStyle,\n labelStyle,\n inputStyle,\n selectStyle,\n buttonStyle,\n errorStyle,\n loadingContainerStyle,\n linkButtonStyle,\n} from './styles'\n\ninterface WorkspaceScreenProps {\n theme: ResolvedTheme\n labels: ResolvedLabels\n onSelect: (workspaceId: string) => void\n}\n\ntype ScreenMode = 'select' | 'create'\n\nexport function WorkspaceScreen({ theme, labels, onSelect }: WorkspaceScreenProps) {\n const arbi = useArbi()\n const { data: workspaces, isLoading } = useWorkspaces()\n\n const [mode, setMode] = useState<ScreenMode>('select')\n const [selected, setSelected] = useState('')\n const [newName, setNewName] = useState('')\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n\n if (isLoading) {\n return <div style={loadingContainerStyle()}>Loading workspaces...</div>\n }\n\n // ── Select existing workspace ─────────────────────────────────────────────\n\n const handleConfirm = async () => {\n if (!selected) return\n setLoading(true)\n setError('')\n try {\n await arbi.selectWorkspace(selected)\n onSelect(selected)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to select workspace')\n } finally {\n setLoading(false)\n }\n }\n\n // ── Create new workspace ──────────────────────────────────────────────────\n\n const handleCreate = async () => {\n const name = newName.trim()\n if (!name) return\n setLoading(true)\n setError('')\n try {\n const ws = await arbi.workspaces.create(name)\n await arbi.selectWorkspace(ws.external_id)\n onSelect(ws.external_id)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create workspace')\n } finally {\n setLoading(false)\n }\n }\n\n if (mode === 'create') {\n return (\n <div style={formContainerStyle()}>\n <div>\n <div style={labelStyle(theme)}>{labels.workspaceName}</div>\n <input\n type=\"text\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n disabled={loading}\n style={inputStyle(theme)}\n />\n </div>\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={!newName.trim() || loading}\n style={buttonStyle(theme, !newName.trim() || loading)}\n >\n {loading ? '...' : labels.createButton}\n </button>\n {error && <div style={errorStyle()}>{error}</div>}\n <div style={{ textAlign: 'center' }}>\n <button\n type=\"button\"\n onClick={() => {\n setError('')\n setMode('select')\n }}\n style={linkButtonStyle(theme)}\n >\n or select existing\n </button>\n </div>\n </div>\n )\n }\n\n return (\n <div style={formContainerStyle()}>\n <div>\n <div style={labelStyle(theme)}>{labels.selectWorkspace}</div>\n <select\n value={selected}\n onChange={(e) => setSelected(e.target.value)}\n disabled={loading}\n style={selectStyle(theme)}\n >\n <option value=\"\" disabled>\n {labels.workspacePlaceholder}\n </option>\n {workspaces?.map((ws) => (\n <option key={ws.external_id} value={ws.external_id}>\n {ws.name}\n </option>\n ))}\n </select>\n </div>\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={!selected || loading}\n style={buttonStyle(theme, !selected || loading)}\n >\n {loading ? 'Connecting...' : labels.continueButton}\n </button>\n {error && <div style={errorStyle()}>{error}</div>}\n <div style={{ textAlign: 'center' }}>\n <button\n type=\"button\"\n onClick={() => {\n setError('')\n setMode('create')\n }}\n style={linkButtonStyle(theme)}\n >\n {labels.createWorkspace}\n </button>\n </div>\n </div>\n )\n}\n","import { useState, type ReactNode, type CSSProperties } from 'react'\nimport { resolveCitations, summarizeCitations } from '@arbidocs/sdk/browser'\nimport type { ChatMessage, ResolvedTheme } from './types'\nimport { messageBubbleStyle } from './styles'\n\ninterface MessageBubbleProps {\n message: ChatMessage\n theme: ResolvedTheme\n}\n\nconst CITE_RE = /\\[([^\\]]+)\\]\\(#cite-(\\d+)\\)/g\n\n/** Parse text with `[statement](#cite-N)` markers into React nodes. */\nfunction renderWithCitations(\n text: string,\n theme: ResolvedTheme,\n onCiteClick: (num: string) => void\n): ReactNode[] {\n const nodes: ReactNode[] = []\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = CITE_RE.exec(text)) !== null) {\n // Text before the citation\n if (match.index > lastIndex) {\n nodes.push(text.slice(lastIndex, match.index))\n }\n const statement = match[1]\n const citeNum = match[2]\n nodes.push(\n <span key={`cite-${match.index}`}>\n {statement}\n <sup\n onClick={(e) => {\n e.stopPropagation()\n onCiteClick(citeNum)\n }}\n style={citeSupStyle(theme)}\n title={`Citation ${citeNum}`}\n >\n {citeNum}\n </sup>\n </span>\n )\n lastIndex = match.index + match[0].length\n }\n\n // Remaining text\n if (lastIndex < text.length) {\n nodes.push(text.slice(lastIndex))\n }\n\n return nodes.length > 0 ? nodes : [text]\n}\n\nexport function MessageBubble({ message, theme }: MessageBubbleProps) {\n const [expandedCite, setExpandedCite] = useState<string | null>(null)\n\n const hasCitations =\n message.role === 'assistant' && message.metadata && CITE_RE.test(message.text)\n\n // Reset regex lastIndex after test\n CITE_RE.lastIndex = 0\n\n const resolved = hasCitations\n ? resolveCitations(message.metadata as Parameters<typeof resolveCitations>[0])\n : []\n const summaries = hasCitations ? summarizeCitations(resolved) : []\n const summaryMap = new Map(summaries.map((s) => [s.citationNum, s]))\n\n const handleCiteClick = (num: string) => {\n setExpandedCite((prev) => (prev === num ? null : num))\n }\n\n const activeSummary = expandedCite ? summaryMap.get(expandedCite) : null\n const activeResolved = expandedCite ? resolved.find((r) => r.citationNum === expandedCite) : null\n\n return (\n <div>\n <div style={messageBubbleStyle(theme, message.role)}>\n {hasCitations ? renderWithCitations(message.text, theme, handleCiteClick) : message.text}\n </div>\n {activeSummary && activeResolved && (\n <div style={citePanelStyle(theme)}>\n <div style={citePanelHeaderStyle(theme)}>\n <strong>[{activeSummary.citationNum}]</strong> {activeSummary.docTitle}\n {activeSummary.pageNumber != null && (\n <span style={{ color: theme.mutedColor }}> p.{activeSummary.pageNumber}</span>\n )}\n </div>\n {activeResolved.chunks.map((chunk, i) => (\n <div key={i} style={citeChunkStyle(theme)}>\n {chunk.content}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ── Inline styles ───────────────────────────────────────────────────────────\n\nfunction citeSupStyle(theme: ResolvedTheme): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '10px',\n fontWeight: 600,\n color: theme.primaryColor,\n cursor: 'pointer',\n marginLeft: '1px',\n minWidth: '14px',\n lineHeight: 1,\n }\n}\n\nfunction citePanelStyle(theme: ResolvedTheme): CSSProperties {\n return {\n marginTop: '4px',\n padding: '8px 10px',\n fontSize: '12px',\n lineHeight: '1.5',\n backgroundColor: theme.surfaceColor,\n border: `1px solid ${theme.borderColor}`,\n borderRadius: '8px',\n maxWidth: '85%',\n }\n}\n\nfunction citePanelHeaderStyle(theme: ResolvedTheme): CSSProperties {\n return {\n fontSize: '12px',\n fontWeight: 500,\n color: theme.textColor,\n marginBottom: '4px',\n }\n}\n\nfunction citeChunkStyle(theme: ResolvedTheme): CSSProperties {\n return {\n fontSize: '11px',\n color: theme.mutedColor,\n borderLeft: `2px solid ${theme.borderColor}`,\n paddingLeft: '8px',\n marginTop: '4px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }\n}\n","import { useState, useRef, useEffect, useCallback, type FormEvent, type ChangeEvent } from 'react'\nimport { useArbi } from '../useArbi'\nimport { useDocuments, useAssistantQuery } from '../hooks'\nimport type { ChatMessage, ResolvedLabels, ResolvedTheme } from './types'\nimport { MessageBubble } from './MessageBubble'\nimport {\n messagesContainerStyle,\n inputBarStyle,\n chatInputStyle,\n sendButtonStyle,\n docSelectorStyle,\n docToggleStyle,\n docListStyle,\n docItemStyle,\n emptyStateStyle,\n secondaryButtonStyle,\n fileInputStyle,\n agentStatusStyle,\n} from './styles'\n\ninterface ChatViewProps {\n workspaceId: string\n theme: ResolvedTheme\n labels: ResolvedLabels\n}\n\nexport function ChatView({ workspaceId, theme, labels }: ChatViewProps) {\n const arbi = useArbi()\n const { data: docs, refetch: refetchDocs } = useDocuments(workspaceId)\n const mutation = useAssistantQuery()\n\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [input, setInput] = useState('')\n const [streaming, setStreaming] = useState('')\n const [agentStatus, setAgentStatus] = useState('')\n const [selectedDocs, setSelectedDocs] = useState<string[]>([])\n const [docsExpanded, setDocsExpanded] = useState(false)\n const [previousResponseId, setPreviousResponseId] = useState<string | null>(null)\n const [uploading, setUploading] = useState(false)\n\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n // Auto-select all docs when they first load\n useEffect(() => {\n if (docs && docs.length > 0 && selectedDocs.length === 0) {\n setSelectedDocs(docs.map((d) => d.external_id))\n }\n }, [docs, selectedDocs.length])\n\n // Auto-scroll to bottom\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages, streaming, agentStatus])\n\n const toggleDoc = (docId: string) => {\n setSelectedDocs((prev) =>\n prev.includes(docId) ? prev.filter((id) => id !== docId) : [...prev, docId]\n )\n }\n\n const handleUpload = useCallback(\n async (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (!files || files.length === 0) return\n setUploading(true)\n try {\n const newIds: string[] = []\n for (const file of Array.from(files)) {\n const result = await arbi.documents.uploadFile(file, file.name)\n newIds.push(...result.doc_ext_ids)\n }\n await refetchDocs()\n setSelectedDocs((prev) => [...prev, ...newIds])\n } catch {\n // Upload errors are silently ignored — the user sees the doc list unchanged\n } finally {\n setUploading(false)\n // Reset file input so the same file can be re-selected\n if (fileInputRef.current) fileInputRef.current.value = ''\n }\n },\n [arbi, refetchDocs]\n )\n\n const handleSubmit = useCallback(\n (e: FormEvent) => {\n e.preventDefault()\n const question = input.trim()\n if (!question || selectedDocs.length === 0 || mutation.isPending) return\n\n setMessages((prev) => [...prev, { role: 'user', text: question }])\n setInput('')\n setStreaming('')\n setAgentStatus('')\n\n mutation.mutate(\n {\n question,\n docIds: selectedDocs,\n previousResponseId,\n onToken: (t) => setStreaming((prev) => prev + t),\n onAgentStep: (step) => {\n if (step.focus) setAgentStatus(step.focus)\n },\n },\n {\n onSuccess: (result) => {\n setStreaming('')\n setAgentStatus('')\n setMessages((prev) => [\n ...prev,\n { role: 'assistant', text: result.text, metadata: result.metadata },\n ])\n setPreviousResponseId(result.assistantMessageExtId)\n },\n onError: (err) => {\n setStreaming('')\n setAgentStatus('')\n setMessages((prev) => [...prev, { role: 'assistant', text: `Error: ${err.message}` }])\n },\n }\n )\n },\n [input, selectedDocs, previousResponseId, mutation]\n )\n\n const noDocs = !docs || docs.length === 0\n const noDocsSelected = selectedDocs.length === 0\n\n return (\n <>\n {/* Hidden file input (shared across upload buttons) */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept=\".pdf,.txt,.md,.html,.doc,.docx,.rtf,.ppt,.pptx,.xls,.xlsx\"\n onChange={handleUpload}\n style={fileInputStyle()}\n />\n\n {/* Document selector — always visible so users can upload */}\n <div style={docSelectorStyle(theme)}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <button\n type=\"button\"\n onClick={() => setDocsExpanded((prev) => !prev)}\n style={docToggleStyle(theme)}\n >\n <span style={{ fontSize: '10px' }}>{docsExpanded ? '\\u25BC' : '\\u25B6'}</span>\n {labels.documents} ({selectedDocs.length}/{docs?.length ?? 0} in chat)\n </button>\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading}\n style={secondaryButtonStyle(theme, uploading)}\n >\n {uploading ? labels.uploading : labels.uploadButton}\n </button>\n </div>\n {docsExpanded && docs && docs.length > 0 && (\n <div style={docListStyle()}>\n {docs.map((doc) => (\n <label key={doc.external_id} style={docItemStyle(theme)}>\n <input\n type=\"checkbox\"\n checked={selectedDocs.includes(doc.external_id)}\n onChange={() => toggleDoc(doc.external_id)}\n />\n {doc.file_name}\n </label>\n ))}\n </div>\n )}\n </div>\n\n {/* Messages */}\n <div style={messagesContainerStyle()}>\n {messages.length === 0 && !streaming && (\n <div style={emptyStateStyle(theme)}>\n {noDocs\n ? labels.emptyNoDocs\n : noDocsSelected\n ? labels.emptyNoSelection\n : labels.emptyReady}\n </div>\n )}\n {messages.map((msg, i) => (\n <MessageBubble key={i} message={msg} theme={theme} />\n ))}\n {agentStatus && !streaming && <div style={agentStatusStyle(theme)}>{agentStatus}...</div>}\n {streaming && (\n <MessageBubble message={{ role: 'assistant', text: streaming }} theme={theme} />\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input bar */}\n <form onSubmit={handleSubmit} style={inputBarStyle(theme)}>\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={noDocs || noDocsSelected ? 'Select documents first...' : labels.placeholder}\n disabled={noDocs || noDocsSelected || mutation.isPending}\n style={chatInputStyle(theme)}\n />\n <button\n type=\"submit\"\n disabled={!input.trim() || noDocsSelected || mutation.isPending}\n style={sendButtonStyle(theme, !input.trim() || noDocsSelected || mutation.isPending)}\n >\n {mutation.isPending ? '...' : labels.sendButton}\n </button>\n </form>\n </>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useArbi } from '../useArbi'\nimport type { ResolvedLabels, ResolvedTheme, WidgetScreen } from './types'\nimport { AuthScreen } from './AuthScreen'\nimport { WorkspaceScreen } from './WorkspaceScreen'\nimport { ChatView } from './ChatView'\nimport {\n containerStyle,\n headerStyle,\n bodyStyle,\n brandingStyle,\n brandingLinkStyle,\n linkButtonStyle,\n} from './styles'\n\ninterface ChatWidgetProps {\n theme: ResolvedTheme\n labels: ResolvedLabels\n initialWorkspaceId?: string\n width: string | number\n height: string | number\n}\n\nexport function ChatWidget({ theme, labels, initialWorkspaceId, width, height }: ChatWidgetProps) {\n const arbi = useArbi()\n const [screen, setScreen] = useState<WidgetScreen>('auth')\n const [workspaceId, setWorkspaceId] = useState<string | undefined>(initialWorkspaceId)\n\n const handleLogin = useCallback(async () => {\n if (initialWorkspaceId) {\n try {\n await arbi.selectWorkspace(initialWorkspaceId)\n setScreen('chat')\n } catch {\n // Fall back to workspace selection if the provided ID fails\n setScreen('workspace')\n }\n } else {\n setScreen('workspace')\n }\n }, [arbi, initialWorkspaceId])\n\n const handleWorkspaceSelect = useCallback((id: string) => {\n setWorkspaceId(id)\n setScreen('chat')\n }, [])\n\n const handleChangeWorkspace = useCallback(() => {\n setScreen('workspace')\n }, [])\n\n return (\n <div style={containerStyle(theme, width, height)}>\n <div style={{ ...headerStyle(theme), justifyContent: 'space-between' }}>\n <span>{labels.title}</span>\n {screen === 'chat' && !initialWorkspaceId && (\n <button type=\"button\" onClick={handleChangeWorkspace} style={linkButtonStyle(theme)}>\n {labels.changeWorkspace}\n </button>\n )}\n </div>\n\n <div style={bodyStyle()}>\n {screen === 'auth' && <AuthScreen theme={theme} labels={labels} onLogin={handleLogin} />}\n {screen === 'workspace' && (\n <WorkspaceScreen theme={theme} labels={labels} onSelect={handleWorkspaceSelect} />\n )}\n {screen === 'chat' && workspaceId && (\n <ChatView workspaceId={workspaceId} theme={theme} labels={labels} />\n )}\n </div>\n\n <div style={brandingStyle(theme)}>\n Powered by{' '}\n <a\n href=\"https://www.arbidocs.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={brandingLinkStyle(theme)}\n >\n ARBI\n </a>\n </div>\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider } from '../ArbiProvider'\nimport type { ArbiChatLabels, ArbiChatProps, ArbiChatTheme } from './types'\nimport { getLabels, getTheme } from './styles'\nimport { ChatWidget } from './ChatWidget'\n\nexport type { ArbiChatProps, ArbiChatTheme, ArbiChatLabels }\n\n/**\n * Self-contained ARBI chat widget.\n *\n * Wraps its own QueryClientProvider and ArbiProvider so it works\n * anywhere — no setup required from the host app.\n *\n * ```tsx\n * import { ArbiChat } from '@arbidocs/react'\n *\n * <ArbiChat url=\"https://www.arbidocs.com\" />\n * ```\n */\nexport function ArbiChat({\n url,\n workspaceId,\n theme: themeOverrides,\n labels: labelOverrides,\n width = '400px',\n height = '600px',\n}: ArbiChatProps) {\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: { retry: 1, refetchOnWindowFocus: false },\n mutations: { retry: false },\n },\n }),\n []\n )\n\n const theme = useMemo(() => getTheme(themeOverrides), [themeOverrides])\n const labels = useMemo(() => getLabels(labelOverrides), [labelOverrides])\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={url}>\n <ChatWidget\n theme={theme}\n labels={labels}\n initialWorkspaceId={workspaceId}\n width={width}\n height={height}\n />\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -10,6 +10,121 @@ interface ArbiProviderProps extends ArbiOptions {
10
10
  }
11
11
  declare function ArbiProvider({ children, ...options }: ArbiProviderProps): react_jsx_runtime.JSX.Element;
12
12
 
13
+ interface ArbiChatTheme {
14
+ /** Primary action color — buttons, links (default: '#00adef' ARBI cyan) */
15
+ primaryColor: string;
16
+ /** Widget background (default: '#ffffff') */
17
+ backgroundColor: string;
18
+ /** Surface / muted background (default: '#f9fafb') */
19
+ surfaceColor: string;
20
+ /** Primary text color (default: '#111827') */
21
+ textColor: string;
22
+ /** Secondary / muted text (default: '#6b7280') */
23
+ mutedColor: string;
24
+ /** Border color (default: '#e5e7eb') */
25
+ borderColor: string;
26
+ /** User message bubble background (default: '#f3f4f6') */
27
+ userBubbleColor: string;
28
+ /** User message text color (default: '#111827') */
29
+ userBubbleTextColor: string;
30
+ /** Assistant message bubble background (default: 'rgba(0, 173, 239, 0.08)') */
31
+ assistantBubbleColor: string;
32
+ /** Assistant message text color (default: '#111827') */
33
+ assistantBubbleTextColor: string;
34
+ /** Border radius for the outer container (default: '8px') */
35
+ borderRadius: string;
36
+ /** Font family stack (default: system fonts) */
37
+ fontFamily: string;
38
+ }
39
+ interface ArbiChatLabels {
40
+ /** Header title (default: 'Chat') */
41
+ title?: string;
42
+ /** Email field label (default: 'Email') */
43
+ email?: string;
44
+ /** Password field label (default: 'Password') */
45
+ password?: string;
46
+ /** Login button text (default: 'Log in') */
47
+ loginButton?: string;
48
+ /** Logging in button text (default: 'Logging in...') */
49
+ loginButtonLoading?: string;
50
+ /** Register button text (default: 'Create account') */
51
+ registerButton?: string;
52
+ /** Send verification code button text (default: 'Email me a code') */
53
+ sendCodeButton?: string;
54
+ /** Already have a code button text (default: 'I have an invitation code') */
55
+ haveCodeButton?: string;
56
+ /** Verification code field label (default: 'Verification code') */
57
+ verificationCode?: string;
58
+ /** Confirm password field label (default: 'Confirm password') */
59
+ confirmPassword?: string;
60
+ /** First name field label (default: 'First name') */
61
+ firstName?: string;
62
+ /** Last name field label (default: 'Last name') */
63
+ lastName?: string;
64
+ /** Link to switch to register view (default: 'Create account') */
65
+ switchToRegister?: string;
66
+ /** Link to switch back to login view (default: 'Back to login') */
67
+ switchToLogin?: string;
68
+ /** Workspace selector label (default: 'Select a workspace') */
69
+ selectWorkspace?: string;
70
+ /** Workspace selector placeholder (default: 'Choose...') */
71
+ workspacePlaceholder?: string;
72
+ /** Continue button after workspace select (default: 'Continue') */
73
+ continueButton?: string;
74
+ /** Create workspace button label (default: 'Create new workspace') */
75
+ createWorkspace?: string;
76
+ /** Workspace name field label (default: 'Workspace name') */
77
+ workspaceName?: string;
78
+ /** Generic create button text (default: 'Create') */
79
+ createButton?: string;
80
+ /** Change workspace link text (default: 'Change workspace') */
81
+ changeWorkspace?: string;
82
+ /** Documents section label (default: 'Documents') */
83
+ documents?: string;
84
+ /** Send button text (default: 'Send') */
85
+ sendButton?: string;
86
+ /** Input placeholder (default: 'Ask a question...') */
87
+ placeholder?: string;
88
+ /** Upload button text (default: 'Upload') */
89
+ uploadButton?: string;
90
+ /** Uploading state text (default: 'Uploading...') */
91
+ uploading?: string;
92
+ /** Empty state when no documents (default: 'No documents found in this workspace.') */
93
+ emptyNoDocs?: string;
94
+ /** Empty state when no docs selected (default: 'Select at least one document to start chatting.') */
95
+ emptyNoSelection?: string;
96
+ /** Empty state ready to chat (default: 'Ask a question about your documents.') */
97
+ emptyReady?: string;
98
+ }
99
+ interface ArbiChatProps {
100
+ /** Backend URL (required) */
101
+ url: string;
102
+ /** Skip workspace selection — go straight to chat */
103
+ workspaceId?: string;
104
+ /** Customize colors and appearance */
105
+ theme?: Partial<ArbiChatTheme>;
106
+ /** Customize text labels */
107
+ labels?: ArbiChatLabels;
108
+ /** Widget width (default: '400px') */
109
+ width?: string | number;
110
+ /** Widget height (default: '600px') */
111
+ height?: string | number;
112
+ }
113
+
114
+ /**
115
+ * Self-contained ARBI chat widget.
116
+ *
117
+ * Wraps its own QueryClientProvider and ArbiProvider so it works
118
+ * anywhere — no setup required from the host app.
119
+ *
120
+ * ```tsx
121
+ * import { ArbiChat } from '@arbidocs/react'
122
+ *
123
+ * <ArbiChat url="https://www.arbidocs.com" />
124
+ * ```
125
+ */
126
+ declare function ArbiChat({ url, workspaceId, theme: themeOverrides, labels: labelOverrides, width, height, }: ArbiChatProps): react_jsx_runtime.JSX.Element;
127
+
13
128
  /**
14
129
  * Hook to access the Arbi instance from the nearest ArbiProvider.
15
130
  */
@@ -179,4 +294,4 @@ declare function useHealth(options?: {
179
294
  available_models: string[];
180
295
  }, Error>;
181
296
 
182
- export { ArbiProvider, type ArbiProviderProps, arbiQueryKeys, useArbi, useAssistantQuery, useConversations, useDocuments, useHealth, useTags, useWorkspaces };
297
+ export { ArbiChat, type ArbiChatLabels, type ArbiChatProps, type ArbiChatTheme, ArbiProvider, type ArbiProviderProps, arbiQueryKeys, useArbi, useAssistantQuery, useConversations, useDocuments, useHealth, useTags, useWorkspaces };
package/dist/index.d.ts CHANGED
@@ -10,6 +10,121 @@ interface ArbiProviderProps extends ArbiOptions {
10
10
  }
11
11
  declare function ArbiProvider({ children, ...options }: ArbiProviderProps): react_jsx_runtime.JSX.Element;
12
12
 
13
+ interface ArbiChatTheme {
14
+ /** Primary action color — buttons, links (default: '#00adef' ARBI cyan) */
15
+ primaryColor: string;
16
+ /** Widget background (default: '#ffffff') */
17
+ backgroundColor: string;
18
+ /** Surface / muted background (default: '#f9fafb') */
19
+ surfaceColor: string;
20
+ /** Primary text color (default: '#111827') */
21
+ textColor: string;
22
+ /** Secondary / muted text (default: '#6b7280') */
23
+ mutedColor: string;
24
+ /** Border color (default: '#e5e7eb') */
25
+ borderColor: string;
26
+ /** User message bubble background (default: '#f3f4f6') */
27
+ userBubbleColor: string;
28
+ /** User message text color (default: '#111827') */
29
+ userBubbleTextColor: string;
30
+ /** Assistant message bubble background (default: 'rgba(0, 173, 239, 0.08)') */
31
+ assistantBubbleColor: string;
32
+ /** Assistant message text color (default: '#111827') */
33
+ assistantBubbleTextColor: string;
34
+ /** Border radius for the outer container (default: '8px') */
35
+ borderRadius: string;
36
+ /** Font family stack (default: system fonts) */
37
+ fontFamily: string;
38
+ }
39
+ interface ArbiChatLabels {
40
+ /** Header title (default: 'Chat') */
41
+ title?: string;
42
+ /** Email field label (default: 'Email') */
43
+ email?: string;
44
+ /** Password field label (default: 'Password') */
45
+ password?: string;
46
+ /** Login button text (default: 'Log in') */
47
+ loginButton?: string;
48
+ /** Logging in button text (default: 'Logging in...') */
49
+ loginButtonLoading?: string;
50
+ /** Register button text (default: 'Create account') */
51
+ registerButton?: string;
52
+ /** Send verification code button text (default: 'Email me a code') */
53
+ sendCodeButton?: string;
54
+ /** Already have a code button text (default: 'I have an invitation code') */
55
+ haveCodeButton?: string;
56
+ /** Verification code field label (default: 'Verification code') */
57
+ verificationCode?: string;
58
+ /** Confirm password field label (default: 'Confirm password') */
59
+ confirmPassword?: string;
60
+ /** First name field label (default: 'First name') */
61
+ firstName?: string;
62
+ /** Last name field label (default: 'Last name') */
63
+ lastName?: string;
64
+ /** Link to switch to register view (default: 'Create account') */
65
+ switchToRegister?: string;
66
+ /** Link to switch back to login view (default: 'Back to login') */
67
+ switchToLogin?: string;
68
+ /** Workspace selector label (default: 'Select a workspace') */
69
+ selectWorkspace?: string;
70
+ /** Workspace selector placeholder (default: 'Choose...') */
71
+ workspacePlaceholder?: string;
72
+ /** Continue button after workspace select (default: 'Continue') */
73
+ continueButton?: string;
74
+ /** Create workspace button label (default: 'Create new workspace') */
75
+ createWorkspace?: string;
76
+ /** Workspace name field label (default: 'Workspace name') */
77
+ workspaceName?: string;
78
+ /** Generic create button text (default: 'Create') */
79
+ createButton?: string;
80
+ /** Change workspace link text (default: 'Change workspace') */
81
+ changeWorkspace?: string;
82
+ /** Documents section label (default: 'Documents') */
83
+ documents?: string;
84
+ /** Send button text (default: 'Send') */
85
+ sendButton?: string;
86
+ /** Input placeholder (default: 'Ask a question...') */
87
+ placeholder?: string;
88
+ /** Upload button text (default: 'Upload') */
89
+ uploadButton?: string;
90
+ /** Uploading state text (default: 'Uploading...') */
91
+ uploading?: string;
92
+ /** Empty state when no documents (default: 'No documents found in this workspace.') */
93
+ emptyNoDocs?: string;
94
+ /** Empty state when no docs selected (default: 'Select at least one document to start chatting.') */
95
+ emptyNoSelection?: string;
96
+ /** Empty state ready to chat (default: 'Ask a question about your documents.') */
97
+ emptyReady?: string;
98
+ }
99
+ interface ArbiChatProps {
100
+ /** Backend URL (required) */
101
+ url: string;
102
+ /** Skip workspace selection — go straight to chat */
103
+ workspaceId?: string;
104
+ /** Customize colors and appearance */
105
+ theme?: Partial<ArbiChatTheme>;
106
+ /** Customize text labels */
107
+ labels?: ArbiChatLabels;
108
+ /** Widget width (default: '400px') */
109
+ width?: string | number;
110
+ /** Widget height (default: '600px') */
111
+ height?: string | number;
112
+ }
113
+
114
+ /**
115
+ * Self-contained ARBI chat widget.
116
+ *
117
+ * Wraps its own QueryClientProvider and ArbiProvider so it works
118
+ * anywhere — no setup required from the host app.
119
+ *
120
+ * ```tsx
121
+ * import { ArbiChat } from '@arbidocs/react'
122
+ *
123
+ * <ArbiChat url="https://www.arbidocs.com" />
124
+ * ```
125
+ */
126
+ declare function ArbiChat({ url, workspaceId, theme: themeOverrides, labels: labelOverrides, width, height, }: ArbiChatProps): react_jsx_runtime.JSX.Element;
127
+
13
128
  /**
14
129
  * Hook to access the Arbi instance from the nearest ArbiProvider.
15
130
  */
@@ -179,4 +294,4 @@ declare function useHealth(options?: {
179
294
  available_models: string[];
180
295
  }, Error>;
181
296
 
182
- export { ArbiProvider, type ArbiProviderProps, arbiQueryKeys, useArbi, useAssistantQuery, useConversations, useDocuments, useHealth, useTags, useWorkspaces };
297
+ export { ArbiChat, type ArbiChatLabels, type ArbiChatProps, type ArbiChatTheme, ArbiProvider, type ArbiProviderProps, arbiQueryKeys, useArbi, useAssistantQuery, useConversations, useDocuments, useHealth, useTags, useWorkspaces };