@centive/aria-sdk 0.9.2 → 0.9.3

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/lib/AriaSessionManager.ts","../src/lib/AriaCore.ts","../src/lib/tokenUtils.ts","../src/components/ShadowContainer.tsx","../src/lib/cssLoader.ts","../node_modules/clsx/dist/clsx.mjs","../node_modules/tailwind-merge/dist/bundle-mjs.mjs","../src/lib/utils.ts","../src/assets/aria-avatar.jpg","../src/components/AriaStandaloneUI.tsx"],"sourcesContent":["/**\n * AriaSessionManager - Singleton class for global session management\n * \n * This class manages the WebSocket connection, Anam client, and session state\n * outside of React's lifecycle, ensuring session continuity across page navigation.\n * \n * Key features:\n * - Singleton pattern ensures only one instance exists globally\n * - Session persists across React component unmounts/remounts\n * - Proactive session refresh before expiration\n * - Tab visibility awareness for resource optimization\n * - Error recovery with exponential backoff\n */\n\nimport type { AnamClient } from '@anam-ai/js-sdk';\nimport type {\n AriaSDKConfig,\n SessionState,\n SessionResponse,\n SessionManagerStatus,\n SessionManagerEventType,\n SessionManagerListener,\n SessionManagerEvent,\n SessionRefreshConfig,\n AnamMessage,\n AnamMessageStreamEvent,\n ChatMessage,\n MessageHistoryEvent,\n MessageStreamEvent,\n SessionEndEvent,\n MessageHistoryAckResponse,\n MessageStreamAckResponse,\n SessionEndAckResponse,\n SessionEndErrorResponse,\n GenericAckResponse,\n MissingFieldsErrorResponse,\n WebSocketTriggerEvent,\n ClientToolEvent,\n} from '@/types';\n\n// ============================================================================\n// Type Guards for Message Handling\n// ============================================================================\n\nfunction isSessionResponse(msg: unknown): msg is SessionResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'status' in msg &&\n (msg.status === 'success' || msg.status === 'error') &&\n !('type' in msg)\n );\n}\n\nfunction isMessageHistoryAck(msg: unknown): msg is MessageHistoryAckResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'message_history_ack' &&\n 'status' in msg &&\n msg.status === 'ok'\n );\n}\n\nfunction isMessageStreamAck(msg: unknown): msg is MessageStreamAckResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'message_stream_ack' &&\n 'status' in msg &&\n msg.status === 'ok'\n );\n}\n\nfunction isSessionEndAck(msg: unknown): msg is SessionEndAckResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'session_end_ack' &&\n 'status' in msg &&\n msg.status === 'ok'\n );\n}\n\nfunction isSessionEndError(msg: unknown): msg is SessionEndErrorResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'session_end_error' &&\n 'status' in msg &&\n msg.status === 'error'\n );\n}\n\nfunction isWebSocketTriggerEvent(msg: unknown): msg is WebSocketTriggerEvent {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'trigger_event'\n );\n}\n\nfunction isGenericAck(msg: unknown): msg is GenericAckResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'status' in msg &&\n msg.status === 'ok' &&\n 'message' in msg &&\n !('type' in msg)\n );\n}\n\nfunction isMissingFieldsError(msg: unknown): msg is MissingFieldsErrorResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'status' in msg &&\n msg.status === 'error' &&\n 'error' in msg &&\n msg.error === 'MISSING_FIELDS'\n );\n}\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\nconst DEFAULT_REFRESH_CONFIG: SessionRefreshConfig = {\n bufferMinutes: 5,\n maxRetries: 3,\n baseRetryDelay: 1000,\n refreshOnlyWhenVisible: true,\n};\n\n// ============================================================================\n// AriaSessionManager Singleton\n// ============================================================================\n\nexport class AriaSessionManager {\n private static instance: AriaSessionManager | null = null;\n\n // Configuration\n private config: AriaSDKConfig;\n private refreshConfig: SessionRefreshConfig;\n\n // WebSocket connection\n private ws: WebSocket | null = null;\n\n // Anam client and streaming\n private anamClient: AnamClient | null = null;\n private videoStream: MediaStream | null = null;\n private audioInputStream: MediaStream | null = null;\n private hiddenVideoElement: HTMLVideoElement | null = null;\n private hiddenAudioElement: HTMLAudioElement | null = null;\n\n // Session state\n private sessionState: SessionState = {\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n };\n\n // Manager status\n private status: SessionManagerStatus = 'idle';\n\n // Chat state\n private chatMessages: ChatMessage[] = [];\n private liveTranscript: string = '';\n private lastMessageHistory: AnamMessage[] = [];\n\n // Event listeners\n private listeners: Map<SessionManagerEventType, Set<SessionManagerListener>> = new Map();\n\n // Timers and retry state\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private retryCount: number = 0;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Tab visibility\n private isTabVisible: boolean = true;\n private pendingRefresh: boolean = false;\n\n // Callback for WebSocket trigger events (to open assistant)\n private onWebSocketTrigger: ((event: WebSocketTriggerEvent) => void) | null = null;\n\n // Session persistence state\n private isPaused: boolean = false;\n private beforeUnloadHandler: (() => void) | null = null;\n\n // Lazy initialization flag - when true, Anam client is initialized only when widget opens\n private deferAnamInit: boolean = true;\n private isAnamInitializing: boolean = false;\n\n // Tool call state\n private isToolCallActive: boolean = false;\n private activeToolCall: ClientToolEvent | null = null;\n\n // Auto-reconnect state\n private autoReconnectEnabled: boolean = true;\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number = 10;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private isIntentionalDisconnect: boolean = false;\n\n // Auto-reconnect on Anam disconnect (for inactivity timeout)\n private isReconnecting: boolean = false;\n private autoReconnectOnAnamDisconnect: boolean = true;\n\n // Track if user has had a session before (to skip greeting on subsequent sessions)\n // This persists across session restarts within the same app lifecycle\n private hasHadSessionBefore: boolean = false;\n\n // ============================================================================\n // Singleton Pattern\n // ============================================================================\n\n private constructor(config: AriaSDKConfig) {\n this.config = config;\n this.refreshConfig = {\n ...DEFAULT_REFRESH_CONFIG,\n bufferMinutes: config.sessionRefreshBuffer ?? DEFAULT_REFRESH_CONFIG.bufferMinutes,\n };\n\n // Validate userId is provided (required for message storage)\n if (!config.userId) {\n console.warn('[AriaSessionManager] WARNING: userId not provided. Message storage will not work.');\n } else {\n console.log('[AriaSessionManager] Instance created with userId:', config.userId);\n }\n\n // Set up tab visibility listener\n this.setupVisibilityListener();\n\n // Set up beforeunload handler for session cleanup\n this.setupBeforeUnloadHandler();\n }\n\n /**\n * Get or create the singleton instance\n * \n * If instance already exists and config has meaningful values (websocketUrl),\n * the config will be updated. Otherwise, existing config is preserved.\n */\n static getInstance(config: AriaSDKConfig): AriaSessionManager {\n if (!AriaSessionManager.instance) {\n AriaSessionManager.instance = new AriaSessionManager(config);\n } else if (config.websocketUrl) {\n // Only update config if it has meaningful values (not an empty object)\n // This prevents overwriting the config when getting existing instance\n AriaSessionManager.instance.updateConfig(config);\n }\n return AriaSessionManager.instance;\n }\n\n /**\n * Check if an instance exists\n */\n static hasInstance(): boolean {\n return AriaSessionManager.instance !== null;\n }\n\n /**\n * Destroy the singleton instance (for testing or cleanup)\n */\n static destroyInstance(): void {\n if (AriaSessionManager.instance) {\n AriaSessionManager.instance.destroy();\n AriaSessionManager.instance = null;\n }\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n private updateConfig(config: AriaSDKConfig): void {\n const previousUserId = this.config.userId;\n this.config = config;\n this.refreshConfig = {\n ...this.refreshConfig,\n bufferMinutes: config.sessionRefreshBuffer ?? this.refreshConfig.bufferMinutes,\n };\n \n // Warn if userId changed or is missing\n if (!config.userId) {\n console.warn('[AriaSessionManager] WARNING: Config updated without userId. Message storage will not work.');\n } else if (previousUserId !== config.userId) {\n console.log('[AriaSessionManager] Config updated, userId changed:', previousUserId, '->', config.userId);\n }\n }\n\n getConfig(): AriaSDKConfig {\n return this.config;\n }\n\n /**\n * Check if the manager is properly configured for message storage\n * Returns true if both userId and WebSocket are available\n */\n canStoreMessages(): boolean {\n return !!(this.config.userId && this.ws && this.ws.readyState === WebSocket.OPEN);\n }\n\n /**\n * Get the current userId from config\n */\n getUserId(): string | undefined {\n return this.config.userId;\n }\n\n // ============================================================================\n // Event System\n // ============================================================================\n\n addEventListener(type: SessionManagerEventType, listener: SessionManagerListener): void {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, new Set());\n }\n this.listeners.get(type)!.add(listener);\n }\n\n removeEventListener(type: SessionManagerEventType, listener: SessionManagerListener): void {\n this.listeners.get(type)?.delete(listener);\n }\n\n private emit(event: SessionManagerEvent): void {\n const typeListeners = this.listeners.get(event.type);\n if (typeListeners) {\n typeListeners.forEach(listener => {\n try {\n listener(event);\n } catch (err) {\n console.error('[AriaSessionManager] Error in event listener:', err);\n }\n });\n }\n }\n\n // ============================================================================\n // Status Management\n // ============================================================================\n\n private setStatus(newStatus: SessionManagerStatus): void {\n if (this.status !== newStatus) {\n const oldStatus = this.status;\n this.status = newStatus;\n console.log(`[AriaSessionManager] Status changed: ${oldStatus} -> ${newStatus}`);\n this.emit({ type: 'status_change', data: { oldStatus, newStatus } });\n }\n }\n\n getStatus(): SessionManagerStatus {\n return this.status;\n }\n\n // ============================================================================\n // Session State\n // ============================================================================\n\n getSessionState(): SessionState {\n return { ...this.sessionState };\n }\n\n private updateSessionState(updates: Partial<SessionState>): void {\n this.sessionState = { ...this.sessionState, ...updates };\n }\n\n // ============================================================================\n // WebSocket Connection\n // ============================================================================\n\n connect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n console.log('[AriaSessionManager] WebSocket already connected');\n return;\n }\n\n if (this.ws?.readyState === WebSocket.CONNECTING) {\n console.log('[AriaSessionManager] WebSocket already connecting');\n return;\n }\n\n // Reset reconnect state for fresh connection\n this.resetReconnectState();\n this.setStatus('connecting');\n\n try {\n this.ws = new WebSocket(this.config.websocketUrl);\n\n this.ws.onopen = () => {\n console.log('[AriaSessionManager] WebSocket connected');\n this.setStatus('connected');\n this.retryCount = 0;\n this.emit({ type: 'connection_change', data: { connected: true } });\n this.config.onConnectionStateChange?.(true);\n\n // Auto-request session token on connect with user_trigger=true\n // This ensures we get a valid session token that can be used when user opens widget\n // The token is stored and the Anam client is initialized lazily when widget opens\n if (this.config.preloadSession !== false) {\n console.log('[AriaSessionManager] Requesting session token for user:', this.config.userId || '(no userId)');\n this.requestSessionToken();\n }\n };\n\n this.ws.onmessage = (event) => this.handleWebSocketMessage(event);\n\n this.ws.onerror = (error) => {\n console.error('[AriaSessionManager] WebSocket error:', error);\n this.setStatus('error');\n this.updateSessionState({ lastError: 'WebSocket connection error' });\n this.config.onError?.(new Error('WebSocket connection failed'));\n };\n\n this.ws.onclose = (event) => {\n console.log('[AriaSessionManager] WebSocket disconnected, code:', event.code);\n this.emit({ type: 'connection_change', data: { connected: false } });\n this.config.onConnectionStateChange?.(false);\n\n // Don't reset session state on close - we want to preserve it for reconnection\n // Only reset if we're not in a refresh cycle\n if (!this.sessionState.isRefreshing) {\n this.setStatus('idle');\n }\n\n // Auto-reconnect if enabled and not intentionally disconnected\n if (this.autoReconnectEnabled && !this.isIntentionalDisconnect && !this.isPaused) {\n this.scheduleReconnect();\n }\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to connect WebSocket';\n console.error('[AriaSessionManager] Connection error:', errorMessage);\n this.setStatus('error');\n this.updateSessionState({ lastError: errorMessage });\n this.config.onError?.(err instanceof Error ? err : new Error(errorMessage));\n }\n }\n\n disconnect(): void {\n // Mark as intentional disconnect to prevent auto-reconnect\n this.isIntentionalDisconnect = true;\n this.clearTimers();\n this.clearReconnectTimer();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus('idle');\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n // ============================================================================\n // Auto-Reconnect Logic\n // ============================================================================\n\n /**\n * Enable or disable auto-reconnect functionality\n */\n setAutoReconnect(enabled: boolean): void {\n this.autoReconnectEnabled = enabled;\n if (!enabled) {\n this.clearReconnectTimer();\n }\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff\n */\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error('[AriaSessionManager] Max reconnect attempts reached, giving up');\n this.setStatus('error');\n this.updateSessionState({ lastError: 'Connection lost - max reconnect attempts reached' });\n this.config.onError?.(new Error('WebSocket connection lost after max reconnect attempts'));\n return;\n }\n\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s, 32s (max 30s)\n const baseDelay = 1000;\n const delay = Math.min(baseDelay * Math.pow(2, this.reconnectAttempts), 30000);\n this.reconnectAttempts++;\n\n console.log(`[AriaSessionManager] Scheduling reconnect attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts} in ${delay}ms`);\n\n this.reconnectTimer = setTimeout(() => {\n if (!this.isIntentionalDisconnect && !this.isPaused) {\n console.log(`[AriaSessionManager] Attempting reconnect (attempt ${this.reconnectAttempts})`);\n this.reconnect();\n }\n }, delay);\n }\n\n /**\n * Attempt to reconnect the WebSocket\n */\n private reconnect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n console.log('[AriaSessionManager] Already connected, skipping reconnect');\n return;\n }\n\n if (this.ws?.readyState === WebSocket.CONNECTING) {\n console.log('[AriaSessionManager] Already connecting, skipping reconnect');\n return;\n }\n\n this.setStatus('connecting');\n\n try {\n this.ws = new WebSocket(this.config.websocketUrl);\n\n this.ws.onopen = () => {\n console.log('[AriaSessionManager] WebSocket reconnected successfully');\n this.setStatus('connected');\n this.reconnectAttempts = 0; // Reset on successful connection\n this.emit({ type: 'connection_change', data: { connected: true } });\n this.config.onConnectionStateChange?.(true);\n\n // If we have a valid session token, we're good to go\n // Otherwise, request a new session token\n if (this.sessionState.token && !this.isTokenExpired()) {\n console.log('[AriaSessionManager] Reconnected with existing valid session token');\n // If Anam client is initialized, we're ready\n if (this.anamClient) {\n this.setStatus('ready');\n }\n // Re-schedule refresh timer\n this.scheduleRefresh();\n } else if (this.config.preloadSession !== false && this.config.userId) {\n console.log('[AriaSessionManager] Reconnected, requesting new session token');\n this.requestSessionToken();\n }\n };\n\n this.ws.onmessage = (event) => this.handleWebSocketMessage(event);\n\n this.ws.onerror = (error) => {\n console.error('[AriaSessionManager] WebSocket reconnect error:', error);\n // Don't set error status here, let onclose handle reconnect scheduling\n };\n\n this.ws.onclose = (event) => {\n console.log('[AriaSessionManager] WebSocket disconnected during reconnect, code:', event.code);\n this.emit({ type: 'connection_change', data: { connected: false } });\n this.config.onConnectionStateChange?.(false);\n\n // Continue trying to reconnect\n if (this.autoReconnectEnabled && !this.isIntentionalDisconnect && !this.isPaused) {\n this.scheduleReconnect();\n }\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to reconnect WebSocket';\n console.error('[AriaSessionManager] Reconnect error:', errorMessage);\n \n // Schedule another reconnect attempt\n if (this.autoReconnectEnabled && !this.isIntentionalDisconnect && !this.isPaused) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Check if the current session token is expired\n */\n private isTokenExpired(): boolean {\n if (!this.sessionState.expires_at) {\n return false; // No expiry means token doesn't expire\n }\n const expiresAt = new Date(this.sessionState.expires_at).getTime();\n return Date.now() >= expiresAt;\n }\n\n /**\n * Check if the session token is valid and can be used\n * Public method for external checks\n */\n isSessionValid(): boolean {\n return this.sessionState.token !== null && !this.isTokenExpired();\n }\n\n /**\n * Get time until token expires in milliseconds\n * Returns -1 if no expiry or already expired\n */\n getTimeUntilExpiry(): number {\n if (!this.sessionState.expires_at) {\n return -1;\n }\n const expiresAt = new Date(this.sessionState.expires_at).getTime();\n const remaining = expiresAt - Date.now();\n return remaining > 0 ? remaining : -1;\n }\n\n /**\n * Clear the reconnect timer\n */\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n /**\n * Reset reconnect state (call when intentionally connecting)\n */\n private resetReconnectState(): void {\n this.reconnectAttempts = 0;\n this.isIntentionalDisconnect = false;\n this.clearReconnectTimer();\n }\n\n // ============================================================================\n // WebSocket Message Handling\n // ============================================================================\n\n private handleWebSocketMessage(event: MessageEvent): void {\n try {\n const parsedData: unknown = JSON.parse(event.data);\n\n // Handle session response\n if (isSessionResponse(parsedData)) {\n this.handleSessionResponse(parsedData);\n return;\n }\n\n // Handle message history acknowledgment\n if (isMessageHistoryAck(parsedData)) {\n console.log(`[AriaSessionManager] Message history acknowledged: ${parsedData.message_count} messages`);\n this.config.onMessageHistoryAck?.(parsedData.message_count);\n this.emit({ type: 'message_history', data: parsedData });\n return;\n }\n\n // Handle message stream acknowledgment\n if (isMessageStreamAck(parsedData)) {\n console.log('[AriaSessionManager] Message stream acknowledged');\n this.config.onMessageStreamAck?.();\n this.emit({ type: 'message_stream', data: parsedData });\n return;\n }\n\n // Handle session end acknowledgment\n if (isSessionEndAck(parsedData)) {\n console.log(`[AriaSessionManager] Session end acknowledged: ${parsedData.saved_count} messages saved`);\n this.config.onSessionEndAck?.(parsedData.saved_count);\n return;\n }\n\n // Handle session end error\n if (isSessionEndError(parsedData)) {\n console.error(`[AriaSessionManager] Session end error: ${parsedData.message}`);\n this.config.onSessionEndError?.(parsedData.message, parsedData.error);\n this.config.onError?.(new Error(`Session end failed: ${parsedData.error} - ${parsedData.message}`));\n return;\n }\n\n // Handle missing fields error\n if (isMissingFieldsError(parsedData)) {\n console.error(`[AriaSessionManager] Missing fields error: ${parsedData.message}`);\n this.config.onError?.(new Error(parsedData.message));\n return;\n }\n\n // Handle WebSocket trigger events\n if (isWebSocketTriggerEvent(parsedData)) {\n console.log('[AriaSessionManager] WebSocket trigger event received:', parsedData.data);\n this.config.onWebSocketEvent?.(parsedData);\n this.onWebSocketTrigger?.(parsedData);\n return;\n }\n\n // Handle generic acknowledgments\n if (isGenericAck(parsedData)) {\n console.log(`[AriaSessionManager] Generic acknowledgment: ${parsedData.message}`);\n return;\n }\n\n // Legacy support for old session_token format\n if (\n typeof parsedData === 'object' &&\n parsedData !== null &&\n 'type' in parsedData &&\n parsedData.type === 'session_token' &&\n 'sessionToken' in parsedData &&\n typeof parsedData.sessionToken === 'string'\n ) {\n console.warn('[AriaSessionManager] Received legacy session_token format, converting');\n this.handleSessionResponse({\n status: 'success',\n message: 'Session created successfully (legacy format)',\n session_data: {\n session_id: 'legacy',\n token: parsedData.sessionToken,\n expires_at: new Date(Date.now() + 3600000).toISOString(),\n },\n time_taken: 0,\n });\n return;\n }\n\n console.warn('[AriaSessionManager] Received unknown message type:', parsedData);\n } catch (err) {\n if (err instanceof SyntaxError) {\n console.error('[AriaSessionManager] Failed to parse WebSocket message:', event.data);\n this.config.onError?.(new Error('Invalid JSON received from WebSocket'));\n } else {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error';\n console.error('[AriaSessionManager] Error handling message:', errorMsg);\n this.config.onError?.(err instanceof Error ? err : new Error(errorMsg));\n }\n }\n }\n\n private handleSessionResponse(response: SessionResponse): void {\n const isRefreshing = this.sessionState.isRefreshing;\n\n if (response.status === 'success') {\n console.log('[AriaSessionManager] Session response:', response.message);\n\n if (response.session_data) {\n const sessionToken = response.session_data.sessionToken || response.session_data.token;\n\n if (!sessionToken) {\n console.error('[AriaSessionManager] No session token found in response');\n this.handleSessionError('No session token found in response');\n return;\n }\n\n console.log('[AriaSessionManager] Session token received successfully');\n console.log('[AriaSessionManager] Token expires at:', response.session_data.expires_at);\n\n this.updateSessionState({\n session_id: null, // Will be set when Anam client is ready\n token: sessionToken,\n expires_at: response.session_data.expires_at || null,\n isSessionReady: true,\n lastError: null,\n isRefreshing: false,\n isPreloaded: true, // Token is ready for use\n });\n\n // Set up proactive refresh timer based on expiration\n this.scheduleRefresh();\n\n // LAZY INITIALIZATION: Token is stored, Anam client will be initialized when widget opens\n if (this.deferAnamInit) {\n if (isRefreshing) {\n // Token was refreshed - if Anam client is already running, it continues to work\n // The new token will be used for the next session\n console.log('[AriaSessionManager] Session token refreshed proactively');\n this.config.onSessionRefresh?.();\n this.emit({ type: 'session_refresh', data: { token: sessionToken } });\n // Keep status as ready if Anam client is initialized\n if (this.anamClient) {\n this.setStatus('ready');\n } else {\n this.setStatus('connected');\n }\n } else if (this.isReconnecting) {\n // Token received during auto-reconnect - initialize Anam client immediately\n console.log('[AriaSessionManager] Token received during reconnect, initializing Anam client');\n this.initializeAnamClient(sessionToken)\n .then(() => {\n console.log('[AriaSessionManager] Anam client initialized after reconnect');\n this.isReconnecting = false;\n this.emit({ type: 'reconnecting', data: { isReconnecting: false } });\n })\n .catch((err) => {\n console.error('[AriaSessionManager] Failed to initialize Anam client during reconnect:', err);\n this.isReconnecting = false;\n this.emit({ type: 'reconnecting', data: { isReconnecting: false } });\n this.setStatus('error');\n this.updateSessionState({ lastError: 'Failed to reconnect session' });\n });\n } else {\n // Initial token received - ready for user to open widget\n console.log('[AriaSessionManager] Session token ready, waiting for user to open widget');\n this.setStatus('connected');\n this.emit({ type: 'session_ready', data: { sessionId: null, tokenReady: true, lazyInit: true } });\n this.config.onSessionPreloaded?.();\n }\n } else {\n // Non-lazy mode: Initialize Anam client immediately (old behavior)\n if (!this.anamClient) {\n this.initializeAnamClient(sessionToken);\n } else if (isRefreshing) {\n console.log('[AriaSessionManager] Session refreshed, token updated');\n this.config.onSessionRefresh?.();\n this.emit({ type: 'session_refresh', data: { token: sessionToken } });\n }\n }\n } else {\n console.log('[AriaSessionManager] Session response without data:', response.message);\n // Don't treat this as an error - the backend might be acknowledging something else\n this.updateSessionState({\n isRefreshing: false,\n });\n }\n } else {\n this.handleSessionError(`${response.error}: ${response.message}`);\n }\n }\n\n private handleSessionError(errorMsg: string): void {\n console.error('[AriaSessionManager] Session error:', errorMsg);\n\n this.updateSessionState({\n isSessionReady: false,\n lastError: errorMsg,\n isRefreshing: false,\n });\n\n this.setStatus('error');\n this.emit({ type: 'session_error', error: new Error(errorMsg) });\n this.config.onError?.(new Error(errorMsg));\n\n // Attempt retry with exponential backoff\n this.scheduleRetry();\n }\n\n // ============================================================================\n // Session Token Request (on component mount)\n // ============================================================================\n\n /**\n * Request a session token from the backend with user_trigger=true\n * This is called automatically when WebSocket connects\n * The token is stored and used when user opens the widget for the first time\n * \n * If user has had a session before (in this app lifecycle), skip_greeting is sent\n * to prevent the greeting from playing again on subsequent sessions.\n */\n private requestSessionToken(): void {\n // Don't request if session token already exists and is valid\n if (this.sessionState.token && !this.isTokenExpired()) {\n console.log('[AriaSessionManager] Valid session token already exists, skipping request');\n return;\n }\n\n // Don't request if already in progress\n if (this.status === 'preloading') {\n console.log('[AriaSessionManager] Session request already in progress');\n return;\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn('[AriaSessionManager] Cannot request session token: WebSocket not connected');\n return;\n }\n\n // Skip greeting if user has already had a session in this app lifecycle\n const shouldSkipGreeting = this.hasHadSessionBefore;\n \n console.log('[AriaSessionManager] Requesting session token with user_trigger=true for user:', this.config.userId, \n shouldSkipGreeting ? '(skip_greeting: true)' : '(with greeting)');\n this.setStatus('preloading');\n\n try {\n // Send user_trigger: true to get a valid session token\n // Include userId for backends that need it\n // Include skip_greeting if user has had a session before\n const message = JSON.stringify({ \n user_trigger: true,\n ...(this.config.userId && { userId: this.config.userId }),\n ...(shouldSkipGreeting && { skip_greeting: true })\n });\n console.log('[AriaSessionManager] Sending message:', message);\n this.ws.send(message);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to request session token';\n console.error('[AriaSessionManager] Session token request error:', errorMessage);\n this.handleSessionError(errorMessage);\n }\n }\n\n\n /**\n * Manually trigger a session (for user-initiated actions)\n * \n * NOTE: With global session management, this is typically not needed.\n * The session token is automatically requested when the provider mounts.\n * This method will request a new token if one doesn't exist or is expired.\n */\n triggerSession(userTrigger: boolean = true): void {\n // If session token already exists and is valid, don't request a new one\n if (this.sessionState.token && !this.isTokenExpired()) {\n console.log('[AriaSessionManager] Valid session token already exists, skipping trigger');\n return;\n }\n\n // If we're already in a preloading state, don't trigger\n if (this.status === 'preloading') {\n console.log('[AriaSessionManager] Session request already in progress, skipping trigger');\n return;\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.error('[AriaSessionManager] Cannot trigger session: WebSocket not connected');\n return;\n }\n\n // Skip greeting if user has already had a session in this app lifecycle\n const shouldSkipGreeting = this.hasHadSessionBefore;\n\n try {\n // Always use user_trigger: true with userId to ensure we get a valid session token\n // Include skip_greeting if user has had a session before\n const message = JSON.stringify({ \n user_trigger: true,\n userId: this.config.userId,\n ...(shouldSkipGreeting && { skip_greeting: true })\n });\n this.ws.send(message);\n console.log('[AriaSessionManager] Sent session request with user_trigger: true, userId:', this.config.userId,\n shouldSkipGreeting ? '(skip_greeting: true)' : '(with greeting)');\n\n if (userTrigger && this.config.userId) {\n this.config.onManualTrigger?.(this.config.userId);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to trigger session';\n console.error('[AriaSessionManager] Trigger error:', errorMessage);\n this.config.onError?.(err instanceof Error ? err : new Error(errorMessage));\n }\n }\n\n // ============================================================================\n // Anam Client Management\n // ============================================================================\n\n /**\n * Check if Anam client is initialized\n */\n isAnamClientInitialized(): boolean {\n return this.anamClient !== null;\n }\n\n /**\n * Check if session token is available (ready for on-demand initialization)\n */\n hasSessionToken(): boolean {\n return this.sessionState.token !== null;\n }\n\n /**\n * Initialize the Anam client on demand (called when widget opens)\n * This is the lazy initialization entry point - ensures greeting plays when user opens widget\n */\n async initializeSessionOnDemand(): Promise<void> {\n // Already initialized\n if (this.anamClient) {\n console.log('[AriaSessionManager] Anam client already initialized');\n return;\n }\n\n // Already initializing\n if (this.isAnamInitializing) {\n console.log('[AriaSessionManager] Anam client initialization already in progress');\n return;\n }\n\n // Check if token is expired and refresh if needed\n if (this.sessionState.token && this.isTokenExpired()) {\n console.log('[AriaSessionManager] Session token expired, requesting new token');\n // Clear the expired token\n this.updateSessionState({ token: null, isSessionReady: false });\n // Request a new token\n this.requestSessionToken();\n throw new Error('Session token expired, requesting new token');\n }\n\n // No token available\n if (!this.sessionState.token) {\n console.error('[AriaSessionManager] Cannot initialize on demand: no session token');\n throw new Error('No session token available');\n }\n\n console.log('[AriaSessionManager] Initializing Anam client on demand (user opened widget)');\n await this.initializeAnamClient(this.sessionState.token);\n }\n\n private async initializeAnamClient(sessionToken: string): Promise<void> {\n if (this.anamClient) {\n console.log('[AriaSessionManager] Anam client already initialized');\n return;\n }\n\n if (this.isAnamInitializing) {\n console.log('[AriaSessionManager] Anam client initialization already in progress');\n return;\n }\n\n this.isAnamInitializing = true;\n console.log('[AriaSessionManager] Initializing Anam client');\n this.setStatus('preloading');\n\n try {\n // Create hidden video element for preloading\n this.createHiddenVideoElement();\n\n // Dynamically import the Anam SDK (including AnamEvent)\n const { createClient, AnamEvent } = await import('@anam-ai/js-sdk');\n const client = createClient(sessionToken);\n\n // Set up event listeners\n // Note: SESSION_READY fires when Anam session is established, but video stream\n // may not be available yet. We'll emit our own session_ready event after stream() returns.\n client.addListener(AnamEvent.SESSION_READY, () => {\n const anamSessionId = client.getActiveSessionId();\n\n if (anamSessionId) {\n this.updateSessionState({ session_id: anamSessionId });\n console.log('[AriaSessionManager] Anam session ready with ID:', anamSessionId);\n }\n \n // Don't emit session_ready here - wait until video stream is available\n // The session_ready event will be emitted after client.stream() completes\n });\n\n client.addListener(AnamEvent.CONNECTION_CLOSED, () => {\n console.log('[AriaSessionManager] Anam connection closed');\n this.emit({ type: 'connection_change', data: { connected: false } });\n \n // If paused, clear the stale session so a new one is created on resume\n if (this.isPaused) {\n console.log('[AriaSessionManager] Anam disconnected while paused, clearing stale session');\n this.clearStaleSessionForResume();\n return;\n }\n \n // Auto-reconnect if widget is open:\n // 1. Auto-reconnect on Anam disconnect is enabled\n // 2. Not intentionally disconnected (user didn't close widget)\n // 3. Not already reconnecting\n if (this.autoReconnectOnAnamDisconnect && \n !this.isIntentionalDisconnect && \n !this.isReconnecting) {\n console.log('[AriaSessionManager] Anam disconnected unexpectedly, auto-reconnecting...');\n this.autoReconnectSession();\n }\n });\n\n client.addListener(AnamEvent.MESSAGE_HISTORY_UPDATED, (messages) => {\n // Ensure we have session_id before sending (may arrive before SESSION_READY event)\n if (!this.sessionState.session_id) {\n const anamSessionId = client.getActiveSessionId();\n if (anamSessionId) {\n this.updateSessionState({ session_id: anamSessionId });\n console.log('[AriaSessionManager] Got session ID from message history event:', anamSessionId);\n }\n }\n\n this.chatMessages = messages.map(msg => ({\n role: msg.role as 'user' | 'persona',\n content: msg.content,\n timestamp: Date.now(),\n }));\n\n const anamMessages: AnamMessage[] = messages.map(msg => ({\n role: msg.role as 'user' | 'persona',\n content: msg.content,\n timestamp: new Date().toISOString(),\n }));\n\n this.sendMessageHistory(anamMessages);\n this.emit({ type: 'message_history', data: { messages: this.chatMessages } });\n });\n\n client.addListener(AnamEvent.MESSAGE_STREAM_EVENT_RECEIVED, (event: AnamMessageStreamEvent) => {\n // Ensure we have session_id before sending (may arrive before SESSION_READY event)\n if (!this.sessionState.session_id) {\n const anamSessionId = client.getActiveSessionId();\n if (anamSessionId) {\n this.updateSessionState({ session_id: anamSessionId });\n console.log('[AriaSessionManager] Got session ID from message stream event:', anamSessionId);\n }\n }\n\n if (event.role === 'persona') {\n this.liveTranscript += event.content;\n } else if (event.role === 'user') {\n this.liveTranscript = '';\n }\n\n const anamMessage: AnamMessage = {\n role: event.role,\n content: event.content,\n timestamp: new Date().toISOString(),\n };\n this.sendMessageStream(anamMessage, event.is_final ?? false);\n this.emit({ type: 'message_stream', data: { event, liveTranscript: this.liveTranscript } });\n });\n\n // Listen for tool call events\n client.addListener(AnamEvent.CLIENT_TOOL_EVENT_RECEIVED, (toolEvent: ClientToolEvent) => {\n console.log('[AriaSessionManager] Tool call event received:', toolEvent.eventName);\n this.isToolCallActive = true;\n this.activeToolCall = toolEvent;\n this.emit({ \n type: 'tool_call', \n data: { \n isActive: true, \n toolName: toolEvent.eventName,\n toolData: toolEvent.eventData,\n toolEvent \n } \n });\n\n // Auto-clear tool call state after a timeout (tool calls should complete)\n // This is a fallback in case we don't receive a completion signal\n setTimeout(() => {\n if (this.activeToolCall?.eventUid === toolEvent.eventUid) {\n this.clearToolCallState();\n }\n }, 30000); // 30 second timeout\n });\n\n this.anamClient = client;\n\n // Get user microphone input\n this.audioInputStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n\n // Create hidden audio element for proper audio playback\n this.createHiddenAudioElement();\n\n // Use stream() to get the video/audio stream, then handle audio separately\n // The stream() method returns [videoStream, audioStream]\n const streams = await client.stream(this.audioInputStream);\n const videoStream = streams[0];\n const audioStream = streams[1]; // Audio stream from Anam\n \n this.videoStream = videoStream;\n\n // Attach video stream to hidden video element (for preloading)\n if (this.hiddenVideoElement) {\n this.hiddenVideoElement.srcObject = videoStream;\n this.hiddenVideoElement.muted = true; // Video element stays muted\n }\n \n // Attach audio stream to hidden audio element for proper audio playback\n // This is the key fix: audio comes through a separate stream that we play through an audio element\n if (this.hiddenAudioElement && audioStream) {\n this.hiddenAudioElement.srcObject = audioStream;\n // Audio element is NOT muted - this is where Aria's voice comes from\n this.hiddenAudioElement.muted = false;\n this.hiddenAudioElement.play().catch((err) => {\n console.warn('[AriaSessionManager] Initial audio play failed (may need user interaction):', err);\n });\n console.log('[AriaSessionManager] Audio stream attached to audio element');\n } else {\n console.log('[AriaSessionManager] No separate audio stream available, audio may come through video');\n }\n\n // NOW emit session_ready - video stream is available\n // This is the correct time to notify the UI that it can attach the video element\n this.isAnamInitializing = false;\n this.setStatus('ready');\n const anamSessionId = client.getActiveSessionId();\n console.log('[AriaSessionManager] Session fully ready with video stream, ID:', anamSessionId);\n this.emit({ type: 'session_ready', data: { sessionId: anamSessionId, streamReady: true } });\n this.config.onSessionReady?.();\n\n // Mark that user has had a session - subsequent sessions will skip greeting\n if (!this.hasHadSessionBefore) {\n this.hasHadSessionBefore = true;\n console.log('[AriaSessionManager] First session started - subsequent sessions will skip greeting');\n }\n\n console.log('[AriaSessionManager] Anam client initialized and streaming');\n } catch (err) {\n this.isAnamInitializing = false;\n const errorMessage = err instanceof Error ? err.message : 'Failed to initialize Anam client';\n console.error('[AriaSessionManager] Anam client error:', errorMessage);\n this.setStatus('error');\n this.updateSessionState({ lastError: errorMessage });\n this.config.onError?.(err instanceof Error ? err : new Error(errorMessage));\n throw err;\n }\n }\n\n /**\n * Clear tool call state\n */\n private clearToolCallState(): void {\n if (this.isToolCallActive) {\n this.isToolCallActive = false;\n this.activeToolCall = null;\n this.emit({ type: 'tool_call', data: { isActive: false, toolName: null, toolData: null } });\n }\n }\n\n /**\n * Get current tool call state\n */\n getToolCallState(): { isActive: boolean; toolName: string | null; toolData: Record<string, unknown> | null } {\n return {\n isActive: this.isToolCallActive,\n toolName: this.activeToolCall?.eventName ?? null,\n toolData: this.activeToolCall?.eventData ?? null,\n };\n }\n\n private createHiddenVideoElement(): void {\n if (this.hiddenVideoElement) return;\n\n this.hiddenVideoElement = document.createElement('video');\n this.hiddenVideoElement.autoplay = true;\n this.hiddenVideoElement.playsInline = true;\n this.hiddenVideoElement.muted = true; // Video is muted, audio comes from separate audio element\n this.hiddenVideoElement.style.position = 'absolute';\n this.hiddenVideoElement.style.width = '1px';\n this.hiddenVideoElement.style.height = '1px';\n this.hiddenVideoElement.style.opacity = '0';\n this.hiddenVideoElement.style.pointerEvents = 'none';\n this.hiddenVideoElement.style.zIndex = '-9999';\n\n document.body.appendChild(this.hiddenVideoElement);\n console.log('[AriaSessionManager] Hidden video element created');\n }\n\n private createHiddenAudioElement(): void {\n if (this.hiddenAudioElement) return;\n\n this.hiddenAudioElement = document.createElement('audio');\n this.hiddenAudioElement.autoplay = true;\n // Audio element is NOT muted - this is where Aria's voice comes from\n // The Anam SDK handles audio through this element, ensuring proper playback\n this.hiddenAudioElement.style.position = 'absolute';\n this.hiddenAudioElement.style.width = '1px';\n this.hiddenAudioElement.style.height = '1px';\n this.hiddenAudioElement.style.opacity = '0';\n this.hiddenAudioElement.style.pointerEvents = 'none';\n this.hiddenAudioElement.style.zIndex = '-9999';\n\n document.body.appendChild(this.hiddenAudioElement);\n console.log('[AriaSessionManager] Hidden audio element created');\n }\n\n private removeHiddenVideoElement(): void {\n if (this.hiddenVideoElement) {\n this.hiddenVideoElement.srcObject = null;\n this.hiddenVideoElement.remove();\n this.hiddenVideoElement = null;\n }\n }\n\n private removeHiddenAudioElement(): void {\n if (this.hiddenAudioElement) {\n this.hiddenAudioElement.srcObject = null;\n this.hiddenAudioElement.pause();\n this.hiddenAudioElement.remove();\n this.hiddenAudioElement = null;\n }\n }\n\n // ============================================================================\n // Video Stream Management\n // ============================================================================\n\n /**\n * Get the current video stream\n */\n getVideoStream(): MediaStream | null {\n return this.videoStream;\n }\n\n /**\n * Attach the video stream to a visible video element\n * Audio is handled by the hidden audio element if available, otherwise through video element\n */\n attachToVideoElement(element: HTMLVideoElement): void {\n if (this.videoStream) {\n // Log track status for debugging (but don't block attachment)\n const tracks = this.videoStream.getTracks();\n const activeTracks = tracks.filter(track => track.readyState === 'live');\n const audioTracks = tracks.filter(track => track.kind === 'audio');\n console.log('[AriaSessionManager] Attaching video stream, tracks:', tracks.length, 'active:', activeTracks.length, 'audio:', audioTracks.length);\n \n element.srcObject = this.videoStream;\n \n // Check if we have a separate audio element with audio\n const hasAudioElement = this.hiddenAudioElement && this.hiddenAudioElement.srcObject;\n \n if (hasAudioElement) {\n // Audio comes from separate audio element - keep video muted\n element.muted = true;\n // Ensure audio element is playing and not muted\n this.hiddenAudioElement!.muted = false;\n this.hiddenAudioElement!.play().catch((err) => {\n console.warn('[AriaSessionManager] Audio play failed:', err);\n });\n console.log('[AriaSessionManager] Audio playing through separate audio element');\n } else {\n // No separate audio element - audio comes through video element\n element.muted = false;\n console.log('[AriaSessionManager] Audio playing through video element');\n }\n \n // Ensure the video plays (important when re-attaching after pause/resume or minimize/maximize)\n element.play().catch((err) => {\n // Autoplay might be blocked, but usually works since user has interacted\n console.warn('[AriaSessionManager] Video play failed:', err);\n });\n } else {\n // No video stream - this is expected during session initialization or after session ended\n // Don't log as warning during normal operation\n console.log('[AriaSessionManager] No video stream available to attach (session may be initializing)');\n }\n }\n\n /**\n * Detach video stream from visible element (when widget closes)\n */\n detachFromVideoElement(element: HTMLVideoElement): void {\n element.srcObject = null;\n \n // Keep stream on hidden element\n if (this.hiddenVideoElement && this.videoStream) {\n this.hiddenVideoElement.srcObject = this.videoStream;\n this.hiddenVideoElement.muted = true;\n }\n \n // Mute audio when widget closes (but keep it attached for quick resume)\n if (this.hiddenAudioElement) {\n this.hiddenAudioElement.muted = true;\n console.log('[AriaSessionManager] Audio element muted (widget closed)');\n }\n \n console.log('[AriaSessionManager] Video stream detached from visible element');\n }\n\n // ============================================================================\n // Chat State\n // ============================================================================\n\n getChatMessages(): ChatMessage[] {\n return [...this.chatMessages];\n }\n\n getLiveTranscript(): string {\n return this.liveTranscript;\n }\n\n clearLiveTranscript(): void {\n this.liveTranscript = '';\n }\n\n // ============================================================================\n // Message Sending\n // ============================================================================\n\n private sendMessageHistory(messages: AnamMessage[], force: boolean = false): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.log('[AriaSessionManager] Cannot send message history: WebSocket not connected');\n return;\n }\n if (!this.sessionState.session_id) {\n console.log('[AriaSessionManager] Cannot send message history: no session_id');\n return;\n }\n if (!this.config.userId) {\n console.log('[AriaSessionManager] Cannot send message history: no userId');\n return;\n }\n\n if (!force && JSON.stringify(messages) === JSON.stringify(this.lastMessageHistory)) {\n return;\n }\n\n this.lastMessageHistory = messages;\n\n const payload: MessageHistoryEvent = {\n type: 'message_history',\n session_id: this.sessionState.session_id,\n user_id: this.config.userId,\n messages,\n };\n\n try {\n this.ws.send(JSON.stringify(payload));\n console.log('[AriaSessionManager] Sent message history:', messages.length, 'messages to session:', this.sessionState.session_id);\n } catch (err) {\n console.error('[AriaSessionManager] Failed to send message history:', err);\n }\n }\n\n private sendMessageStream(message: AnamMessage, is_final: boolean): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.log('[AriaSessionManager] Cannot send message stream: WebSocket not connected');\n return;\n }\n if (!this.sessionState.session_id) {\n console.log('[AriaSessionManager] Cannot send message stream: no session_id');\n return;\n }\n if (!this.config.userId) {\n console.log('[AriaSessionManager] Cannot send message stream: no userId');\n return;\n }\n\n const payload: MessageStreamEvent = {\n type: 'message_stream',\n session_id: this.sessionState.session_id,\n user_id: this.config.userId,\n message: { ...message, is_final },\n };\n\n try {\n this.ws.send(JSON.stringify(payload));\n if (is_final) {\n console.log('[AriaSessionManager] Sent final message stream:', message.role, 'to session:', this.sessionState.session_id);\n }\n } catch (err) {\n console.error('[AriaSessionManager] Failed to send message stream:', err);\n }\n }\n\n sendSessionEnd(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.log('[AriaSessionManager] Cannot send session end: WebSocket not connected');\n return;\n }\n if (!this.sessionState.session_id) {\n console.log('[AriaSessionManager] Cannot send session end: no session_id');\n return;\n }\n if (!this.config.userId) {\n console.log('[AriaSessionManager] Cannot send session end: no userId');\n return;\n }\n\n // Send final message history before ending session\n if (this.lastMessageHistory.length > 0) {\n console.log('[AriaSessionManager] Sending final message history before session end:', this.lastMessageHistory.length, 'messages');\n this.sendMessageHistory(this.lastMessageHistory, true);\n }\n\n const payload: SessionEndEvent = {\n type: 'session_end',\n session_id: this.sessionState.session_id,\n user_id: this.config.userId,\n };\n\n try {\n this.ws.send(JSON.stringify(payload));\n console.log('[AriaSessionManager] Sent session end event for session:', this.sessionState.session_id);\n } catch (err) {\n console.error('[AriaSessionManager] Failed to send session end:', err);\n }\n }\n\n // ============================================================================\n // Anam Client Actions\n // ============================================================================\n\n async sendMessage(message: string): Promise<void> {\n if (!this.anamClient) {\n throw new Error('Anam client not initialized');\n }\n\n try {\n await this.anamClient.talk(message);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to send message';\n this.config.onError?.(err instanceof Error ? err : new Error(errorMessage));\n throw err;\n }\n }\n\n toggleMute(): boolean {\n if (!this.anamClient) return false;\n\n const currentState = this.anamClient.getInputAudioState();\n if (currentState.isMuted) {\n this.anamClient.unmuteInputAudio();\n return false;\n } else {\n this.anamClient.muteInputAudio();\n return true;\n }\n }\n\n isMuted(): boolean {\n return this.anamClient?.getInputAudioState().isMuted ?? false;\n }\n\n async stopStreaming(): Promise<void> {\n if (this.anamClient) {\n try {\n await this.anamClient.stopStreaming();\n } catch (err) {\n console.error('[AriaSessionManager] Error stopping streaming:', err);\n }\n this.anamClient = null;\n }\n\n if (this.audioInputStream) {\n this.audioInputStream.getTracks().forEach(track => track.stop());\n this.audioInputStream = null;\n }\n\n this.videoStream = null;\n this.chatMessages = [];\n this.liveTranscript = '';\n this.lastMessageHistory = [];\n \n // Clean up hidden elements\n this.removeHiddenVideoElement();\n this.removeHiddenAudioElement();\n \n // Reset session state so next open creates a new session\n this.resetSessionState();\n this.setStatus('idle');\n }\n\n // ============================================================================\n // Session Refresh\n // ============================================================================\n\n private scheduleRefresh(): void {\n this.clearRefreshTimer();\n\n if (!this.sessionState.expires_at) {\n console.log('[AriaSessionManager] No expiration time, skipping refresh scheduling');\n return;\n }\n\n const expiresAt = new Date(this.sessionState.expires_at).getTime();\n const now = Date.now();\n const bufferMs = this.refreshConfig.bufferMinutes * 60 * 1000;\n const refreshAt = expiresAt - bufferMs;\n const delay = Math.max(0, refreshAt - now);\n const timeToExpiry = expiresAt - now;\n\n console.log(`[AriaSessionManager] Token expires at: ${new Date(expiresAt).toISOString()}`);\n console.log(`[AriaSessionManager] Time until expiry: ${Math.round(timeToExpiry / 1000 / 60)} minutes`);\n console.log(`[AriaSessionManager] Refresh buffer: ${this.refreshConfig.bufferMinutes} minutes`);\n\n if (delay <= 0) {\n // Already past refresh time, refresh immediately\n console.log('[AriaSessionManager] Session expiring soon, refreshing immediately');\n this.refreshSession();\n } else {\n console.log(`[AriaSessionManager] Scheduling proactive refresh in ${Math.round(delay / 1000 / 60)} minutes`);\n this.refreshTimer = setTimeout(() => {\n console.log('[AriaSessionManager] Proactive refresh timer fired');\n this.refreshSession();\n }, delay);\n }\n }\n\n async refreshSession(): Promise<void> {\n // Check tab visibility\n if (this.refreshConfig.refreshOnlyWhenVisible && !this.isTabVisible) {\n console.log('[AriaSessionManager] Tab not visible, deferring refresh');\n this.pendingRefresh = true;\n return;\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn('[AriaSessionManager] Cannot refresh: WebSocket not connected');\n // Try to reconnect if not connected\n if (!this.isIntentionalDisconnect && !this.isPaused) {\n this.connect();\n }\n return;\n }\n\n if (this.sessionState.isRefreshing) {\n console.log('[AriaSessionManager] Refresh already in progress');\n return;\n }\n\n console.log('[AriaSessionManager] Refreshing session token (proactive refresh)');\n this.updateSessionState({ isRefreshing: true });\n this.setStatus('refreshing');\n\n // Always skip greeting on refresh since user has already had a session\n const shouldSkipGreeting = this.hasHadSessionBefore;\n\n try {\n // Use user_trigger: true with userId to get a fresh valid session token\n // Include skip_greeting if user has had a session before\n const message = JSON.stringify({ \n user_trigger: true,\n userId: this.config.userId,\n ...(shouldSkipGreeting && { skip_greeting: true })\n });\n this.ws.send(message);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to refresh session';\n console.error('[AriaSessionManager] Refresh error:', errorMessage);\n this.updateSessionState({ isRefreshing: false });\n this.config.onSessionRefreshError?.(err instanceof Error ? err : new Error(errorMessage));\n this.scheduleRetry();\n }\n }\n\n // ============================================================================\n // Retry Logic\n // ============================================================================\n\n private scheduleRetry(): void {\n if (this.retryCount >= this.refreshConfig.maxRetries) {\n console.error('[AriaSessionManager] Max retries reached');\n this.setStatus('error');\n this.updateSessionState({ lastError: 'Failed to get session token after max retries' });\n return;\n }\n\n const delay = this.refreshConfig.baseRetryDelay * Math.pow(2, this.retryCount);\n this.retryCount++;\n\n console.log(`[AriaSessionManager] Scheduling retry ${this.retryCount}/${this.refreshConfig.maxRetries} in ${delay}ms`);\n\n this.retryTimer = setTimeout(() => {\n if (this.isConnected()) {\n console.log('[AriaSessionManager] Retrying session token request');\n this.requestSessionToken();\n } else {\n console.log('[AriaSessionManager] Reconnecting WebSocket for retry');\n this.connect();\n }\n }, delay);\n }\n\n // ============================================================================\n // Tab Visibility\n // ============================================================================\n\n private setupVisibilityListener(): void {\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n }\n\n private handleVisibilityChange = (): void => {\n this.isTabVisible = document.visibilityState === 'visible';\n\n if (this.isTabVisible && this.pendingRefresh) {\n console.log('[AriaSessionManager] Tab visible, executing pending refresh');\n this.pendingRefresh = false;\n this.refreshSession();\n }\n };\n\n // ============================================================================\n // Session Persistence (beforeunload handler)\n // ============================================================================\n\n private setupBeforeUnloadHandler(): void {\n if (typeof window !== 'undefined') {\n this.beforeUnloadHandler = () => {\n // Always end session when tab/window closes\n if (this.sessionState.session_id) {\n console.log('[AriaSessionManager] Tab closing, ending session');\n this.sendSessionEnd();\n }\n };\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\n }\n }\n\n private removeBeforeUnloadHandler(): void {\n if (typeof window !== 'undefined' && this.beforeUnloadHandler) {\n window.removeEventListener('beforeunload', this.beforeUnloadHandler);\n this.beforeUnloadHandler = null;\n }\n }\n\n // ============================================================================\n // Session Pause/Resume (for persistSession feature)\n // ============================================================================\n\n /**\n * Check if session persistence is enabled\n * Returns FALSE - sessions are ended when widget closes to save Anam resources\n * A new session with skip_greeting is created when widget reopens\n */\n isPersistSessionEnabled(): boolean {\n // Always false - closing widget ends session, reopening creates new one with skip_greeting\n return false;\n }\n\n /**\n * Check if WebSocket should stay alive when paused\n */\n shouldKeepWebSocketAlive(): boolean {\n // Default to true if persistSession is enabled\n return this.config.keepWebSocketAlive !== false;\n }\n\n /**\n * Check if widget is closed (session was ended on close)\n * Note: With the new behavior, sessions are ended when widget closes,\n * not paused. This returns true if the widget was closed.\n */\n isSessionPaused(): boolean {\n // Returns true if we don't have an active Anam client (session was ended)\n return !this.anamClient && this.hasHadSessionBefore;\n }\n\n /**\n * Pause the session (called when widget closes / user hangs up)\n * \n * NEW BEHAVIOR: Ends the Anam session to save resources.\n * When widget reopens, a new session is created with skip_greeting: true\n * so the greeting doesn't play again.\n * \n * This is more resource-efficient than keeping the session alive.\n */\n async pauseSession(): Promise<void> {\n // Only end if we have an active Anam client\n if (!this.anamClient) {\n console.log('[AriaSessionManager] No active Anam client, nothing to pause/end');\n return;\n }\n\n console.log('[AriaSessionManager] Widget closed - ending Anam session (will skip greeting on reopen)');\n \n // End the current session - this frees up Anam resources\n // The next session will have skip_greeting: true since hasHadSessionBefore is set\n await this.endCurrentSession();\n\n this.config.onSessionPaused?.();\n }\n\n /**\n * Resume the session (called when widget reopens)\n * \n * Since we end the session on pause (to free Anam resources), this requests a new\n * session token with skip_greeting: true, then initializes the Anam client.\n * \n * @returns true if session is ready or initialization started, false if waiting for token\n */\n async resumeSession(): Promise<boolean> {\n console.log('[AriaSessionManager] Widget reopened - will create new session with skip_greeting');\n \n // Reset intentional disconnect flag since user is reopening\n this.isIntentionalDisconnect = false;\n\n // If we already have an active Anam client, we're good\n if (this.anamClient && this.videoStream) {\n console.log('[AriaSessionManager] Active session exists, no need to create new one');\n this.setStatus('ready');\n this.config.onSessionResumed?.();\n return true;\n }\n\n // Check if we have a preloaded session token ready\n if (this.sessionState.token && !this.isTokenExpired()) {\n console.log('[AriaSessionManager] Session token ready, initializing Anam client (skip_greeting applied)');\n try {\n await this.initializeAnamClient(this.sessionState.token);\n this.config.onSessionResumed?.();\n return true;\n } catch (err) {\n console.error('[AriaSessionManager] Failed to initialize session on resume:', err);\n // Token might be invalid, request a new one\n this.updateSessionState({ token: null, isSessionReady: false });\n }\n }\n\n // No valid token, need to request one (will include skip_greeting: true)\n if (this.isConnected()) {\n console.log('[AriaSessionManager] Requesting new session token for resume');\n this.requestSessionToken();\n } else {\n console.log('[AriaSessionManager] WebSocket not connected, reconnecting...');\n this.connect();\n }\n\n // Return false to indicate session is being created asynchronously\n // The caller should wait for session_ready event\n return false;\n }\n\n /**\n * Reset session state (used when session expires or needs to be recreated)\n */\n private resetSessionState(): void {\n this.sessionState = {\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n };\n this.isPaused = false;\n }\n\n /**\n * Force end the session (explicit user action or logout)\n * This always ends the session regardless of persistSession setting\n * \n * @param resetGreeting - If true, resets the greeting state so next session shows greeting (useful for logout)\n */\n async forceEndSession(resetGreeting: boolean = false): Promise<void> {\n console.log('[AriaSessionManager] Force ending session', resetGreeting ? '(resetting greeting state)' : '');\n \n // Send session end event\n this.sendSessionEnd();\n \n // Stop streaming and cleanup\n await this.stopStreaming();\n \n // Reset state\n this.resetSessionState();\n this.isPaused = false;\n \n // Optionally reset greeting state (for logout scenarios)\n if (resetGreeting) {\n this.hasHadSessionBefore = false;\n console.log('[AriaSessionManager] Greeting state reset - next session will show greeting');\n }\n \n this.setStatus('idle');\n }\n\n /**\n * Reset the greeting state so the next session will show the greeting\n * Call this when user logs out or you want to show greeting again\n */\n resetGreetingState(): void {\n this.hasHadSessionBefore = false;\n console.log('[AriaSessionManager] Greeting state reset - next session will show greeting');\n }\n\n /**\n * Check if greeting will be skipped on next session\n */\n willSkipGreeting(): boolean {\n return this.hasHadSessionBefore;\n }\n\n // ============================================================================\n // Auto-Reconnect on Anam Disconnect (Inactivity Timeout)\n // ============================================================================\n\n /**\n * Check if the session is currently reconnecting\n */\n isSessionReconnecting(): boolean {\n return this.isReconnecting;\n }\n\n /**\n * Enable or disable auto-reconnect when Anam disconnects (e.g., due to inactivity)\n */\n setAutoReconnectOnAnamDisconnect(enabled: boolean): void {\n this.autoReconnectOnAnamDisconnect = enabled;\n }\n\n /**\n * Auto-reconnect the session after Anam disconnects (e.g., due to inactivity timeout)\n * This creates a new session seamlessly without user intervention\n */\n private async autoReconnectSession(): Promise<void> {\n if (this.isReconnecting) {\n console.log('[AriaSessionManager] Already reconnecting, skipping');\n return;\n }\n\n console.log('[AriaSessionManager] Starting auto-reconnect...');\n this.isReconnecting = true;\n this.emit({ type: 'reconnecting', data: { isReconnecting: true } });\n\n try {\n // Clean up old session (but don't send session_end - Anam connection already closed)\n await this.cleanupForReconnect();\n\n // Ensure WebSocket is connected\n if (!this.isConnected()) {\n console.log('[AriaSessionManager] WebSocket not connected, reconnecting...');\n this.connect();\n // Wait for WebSocket to connect (the session token request happens automatically)\n return; // handleSessionResponse will continue the flow\n }\n\n // Request new session token\n console.log('[AriaSessionManager] Requesting new session token for reconnect');\n this.requestSessionToken();\n \n // The handleSessionResponse will receive the token and we'll initialize from there\n } catch (err) {\n console.error('[AriaSessionManager] Auto-reconnect failed:', err);\n this.isReconnecting = false;\n this.emit({ type: 'reconnecting', data: { isReconnecting: false } });\n this.setStatus('error');\n this.updateSessionState({ lastError: 'Failed to reconnect session' });\n this.config.onError?.(err instanceof Error ? err : new Error('Failed to reconnect session'));\n }\n }\n\n /**\n * Clean up resources for reconnection (without sending session_end)\n */\n private async cleanupForReconnect(): Promise<void> {\n console.log('[AriaSessionManager] Cleaning up for reconnect');\n\n // Stop Anam client without sending session_end (connection already closed)\n if (this.anamClient) {\n try {\n await this.anamClient.stopStreaming();\n } catch (err) {\n // Ignore - connection already closed\n console.log('[AriaSessionManager] Anam stopStreaming error (expected):', err);\n }\n this.anamClient = null;\n }\n\n // Stop audio input\n if (this.audioInputStream) {\n this.audioInputStream.getTracks().forEach(track => track.stop());\n this.audioInputStream = null;\n }\n\n // Clear video stream\n this.videoStream = null;\n\n // Remove hidden elements (will be recreated)\n this.removeHiddenVideoElement();\n this.removeHiddenAudioElement();\n\n // Clear chat state for fresh session\n this.chatMessages = [];\n this.liveTranscript = '';\n this.lastMessageHistory = [];\n\n // Clear tool call state\n this.clearToolCallState();\n\n // Reset session state for new session (keep WebSocket connected)\n this.updateSessionState({\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n });\n\n this.isAnamInitializing = false;\n }\n\n /**\n * Clear stale session data when Anam disconnects while paused\n * This ensures a fresh session is created when the widget reopens\n */\n private clearStaleSessionForResume(): void {\n console.log('[AriaSessionManager] Clearing stale session for resume');\n\n // Clear Anam client reference (already disconnected)\n this.anamClient = null;\n\n // Clear video/audio streams\n this.videoStream = null;\n if (this.audioInputStream) {\n this.audioInputStream.getTracks().forEach(track => track.stop());\n this.audioInputStream = null;\n }\n\n // Remove hidden elements\n this.removeHiddenVideoElement();\n this.removeHiddenAudioElement();\n\n // Clear the stale token so a new one is requested on resume\n this.updateSessionState({\n session_id: null,\n token: null,\n isSessionReady: false,\n isPreloaded: false,\n });\n\n // Reset initialization flag\n this.isAnamInitializing = false;\n\n // Keep isPaused = true so resumeSession flow is triggered\n // Keep WebSocket connected for faster reconnection\n console.log('[AriaSessionManager] Stale session cleared, ready for fresh session on resume');\n }\n\n /**\n * End the current session but keep WebSocket connected for new session creation\n * This is called when widget closes without persistSession enabled\n * The next time the widget opens, a new session will be created\n */\n async endCurrentSession(): Promise<void> {\n console.log('[AriaSessionManager] Ending current session (keeping WebSocket alive)');\n \n // Mark as intentional disconnect to prevent auto-reconnect when Anam connection closes\n this.isIntentionalDisconnect = true;\n \n // Send session end event to backend\n this.sendSessionEnd();\n \n // Stop the Anam client and streaming\n if (this.anamClient) {\n try {\n await this.anamClient.stopStreaming();\n } catch (err) {\n console.error('[AriaSessionManager] Error stopping streaming:', err);\n }\n this.anamClient = null;\n }\n\n // Stop audio input\n if (this.audioInputStream) {\n this.audioInputStream.getTracks().forEach(track => track.stop());\n this.audioInputStream = null;\n }\n\n // Clear video stream\n this.videoStream = null;\n \n // Clear chat state\n this.chatMessages = [];\n this.liveTranscript = '';\n this.lastMessageHistory = [];\n \n // Clear tool call state\n this.clearToolCallState();\n \n // Reset session state but keep WebSocket connected\n // This allows a new session to be created when widget reopens\n this.updateSessionState({\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n });\n \n this.isPaused = false;\n this.isAnamInitializing = false;\n \n // Set status to connected (WebSocket is still alive) rather than idle\n // Don't request new token here - wait until widget reopens\n if (this.isConnected()) {\n this.setStatus('connected');\n console.log('[AriaSessionManager] Session ended, ready for new session when widget reopens');\n } else {\n this.setStatus('idle');\n }\n }\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n private clearTimers(): void {\n this.clearRefreshTimer();\n this.clearReconnectTimer();\n this.clearRetryTimer();\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n private clearRetryTimer(): void {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n }\n\n /**\n * Set callback for WebSocket trigger events\n */\n setWebSocketTriggerCallback(callback: ((event: WebSocketTriggerEvent) => void) | null): void {\n this.onWebSocketTrigger = callback;\n }\n\n /**\n * Destroy the session manager and clean up all resources\n */\n destroy(): void {\n console.log('[AriaSessionManager] Destroying instance');\n\n // Send session end if active\n if (this.sessionState.session_id) {\n this.sendSessionEnd();\n }\n\n // Stop streaming (this also removes hidden elements)\n this.stopStreaming();\n\n // Remove hidden elements (in case stopStreaming didn't run)\n this.removeHiddenVideoElement();\n this.removeHiddenAudioElement();\n\n // Clear timers\n this.clearTimers();\n\n // Disconnect WebSocket\n this.disconnect();\n\n // Remove visibility listener\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n // Remove beforeunload handler\n this.removeBeforeUnloadHandler();\n\n // Clear listeners\n this.listeners.clear();\n\n // Reset state\n this.resetSessionState();\n }\n}\n\nexport default AriaSessionManager;\n","/**\n * AriaCore - Main entry point for the Aria SDK\n * \n * This class provides a simple, function-based API for initializing and controlling\n * the Aria AI assistant. All session management is handled internally.\n * \n * @example\n * ```typescript\n * import { Aria } from '@centive/aria-sdk';\n * \n * // Initialize the SDK\n * Aria.init({\n * websocketUrl: 'wss://your-server.com/ws',\n * userId: 'user_123',\n * theme: 'light',\n * onError: (err) => console.error(err),\n * });\n * \n * // Programmatic control\n * Aria.open(); // Open the assistant\n * Aria.close(); // Close the assistant\n * Aria.destroy(); // Cleanup when done\n * ```\n */\n\nimport { AriaSessionManager } from './AriaSessionManager';\nimport type { AriaInitConfig, AriaSDKConfig, Theme } from '@/types';\n\n// ============================================================================\n// Internal State\n// ============================================================================\n\ninterface AriaCoreState {\n initialized: boolean;\n config: AriaInitConfig | null;\n sessionManager: AriaSessionManager | null;\n uiContainer: HTMLDivElement | null;\n reactRoot: unknown | null; // React root for rendering\n}\n\nconst state: AriaCoreState = {\n initialized: false,\n config: null,\n sessionManager: null,\n uiContainer: null,\n reactRoot: null,\n};\n\n// ============================================================================\n// AriaCore Class (Static Methods Only)\n// ============================================================================\n\nexport class AriaCore {\n /**\n * Initialize the Aria SDK with the given configuration.\n * This sets up the WebSocket connection, session management, and UI components.\n * \n * @param config - Configuration options for the SDK\n * @throws Error if already initialized (call destroy() first)\n * \n * @example\n * ```typescript\n * Aria.init({\n * websocketUrl: 'wss://your-server.com/ws',\n * userId: 'user_123',\n * theme: 'dark',\n * triggerLabel: 'Help',\n * onError: (err) => console.error('Aria error:', err),\n * });\n * ```\n */\n static init(config: AriaInitConfig): void {\n if (state.initialized) {\n console.warn('[AriaCore] Already initialized. Call Aria.destroy() before re-initializing.');\n return;\n }\n\n // Validate required fields\n if (!config.websocketUrl) {\n throw new Error('[AriaCore] websocketUrl is required');\n }\n if (!config.userId) {\n throw new Error('[AriaCore] userId is required');\n }\n\n console.log('[AriaCore] Initializing Aria SDK...');\n state.config = config;\n\n // Convert simplified config to full SDK config\n const fullConfig: AriaSDKConfig = AriaCore.buildFullConfig(config);\n\n // Initialize session manager (singleton)\n state.sessionManager = AriaSessionManager.getInstance(fullConfig);\n\n // Auto-connect WebSocket\n state.sessionManager.connect();\n\n // Mount UI components to DOM\n AriaCore.mountUI(config.theme || 'light', config.triggerLabel);\n\n state.initialized = true;\n console.log('[AriaCore] Aria SDK initialized successfully');\n }\n\n /**\n * Open the Aria assistant widget.\n * \n * @param mode - Optional trigger mode ('user' for bottom-right, 'websocket' for center)\n * \n * @example\n * ```typescript\n * Aria.open(); // Open in default position\n * Aria.open('websocket'); // Open in center (like incoming call)\n * ```\n */\n static open(mode: 'user' | 'websocket' = 'user'): void {\n if (!state.initialized) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n\n // Dispatch custom event that the mounted React component listens to\n const event = new CustomEvent('aria:open', { detail: { mode } });\n window.dispatchEvent(event);\n }\n\n /**\n * Close the Aria assistant widget.\n * \n * @example\n * ```typescript\n * Aria.close();\n * ```\n */\n static close(): void {\n if (!state.initialized) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n\n // Dispatch custom event that the mounted React component listens to\n const event = new CustomEvent('aria:close');\n window.dispatchEvent(event);\n }\n\n /**\n * Minimize the Aria assistant widget to a compact floating state.\n * \n * @example\n * ```typescript\n * Aria.minimize();\n * ```\n */\n static minimize(): void {\n if (!state.initialized) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n\n const event = new CustomEvent('aria:minimize');\n window.dispatchEvent(event);\n }\n\n /**\n * Maximize the Aria assistant widget from minimized state.\n * \n * @example\n * ```typescript\n * Aria.maximize();\n * ```\n */\n static maximize(): void {\n if (!state.initialized) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n\n const event = new CustomEvent('aria:maximize');\n window.dispatchEvent(event);\n }\n\n /**\n * Check if the Aria SDK is initialized.\n * \n * @returns true if initialized, false otherwise\n */\n static isInitialized(): boolean {\n return state.initialized;\n }\n\n /**\n * Check if the assistant widget is currently open.\n * \n * @returns true if open, false otherwise\n */\n static isOpen(): boolean {\n if (!state.initialized) return false;\n // Check via DOM attribute set by React component\n return state.uiContainer?.getAttribute('data-aria-open') === 'true';\n }\n\n /**\n * Get the current session ID if available.\n * \n * @returns Session ID or null if no active session\n */\n static getSessionId(): string | null {\n if (!state.sessionManager) return null;\n return state.sessionManager.getSessionState().session_id;\n }\n\n /**\n * Get the current connection status.\n * \n * @returns true if WebSocket is connected, false otherwise\n */\n static isConnected(): boolean {\n if (!state.sessionManager) return false;\n return state.sessionManager.isConnected();\n }\n\n /**\n * Manually refresh the session token.\n * Usually not needed as the SDK auto-refreshes before expiry.\n * \n * @example\n * ```typescript\n * await Aria.refreshSession();\n * ```\n */\n static async refreshSession(): Promise<void> {\n if (!state.sessionManager) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n await state.sessionManager.refreshSession();\n }\n\n /**\n * Destroy the Aria SDK instance and clean up all resources.\n * Call this when you want to completely remove Aria from your app.\n * \n * @example\n * ```typescript\n * Aria.destroy();\n * ```\n */\n static destroy(): void {\n if (!state.initialized) {\n console.log('[AriaCore] Not initialized, nothing to destroy.');\n return;\n }\n\n console.log('[AriaCore] Destroying Aria SDK...');\n\n // Unmount React UI\n AriaCore.unmountUI();\n\n // Destroy session manager singleton\n AriaSessionManager.destroyInstance();\n\n // Reset state\n state.initialized = false;\n state.config = null;\n state.sessionManager = null;\n state.uiContainer = null;\n state.reactRoot = null;\n\n console.log('[AriaCore] Aria SDK destroyed');\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Convert simplified AriaInitConfig to full AriaSDKConfig\n */\n private static buildFullConfig(config: AriaInitConfig): AriaSDKConfig {\n return {\n websocketUrl: config.websocketUrl,\n userId: config.userId,\n theme: config.theme || 'light',\n triggerLabel: config.triggerLabel,\n onError: config.onError,\n \n // Enable all automatic session management features\n preloadSession: true,\n sessionRefreshBuffer: 5, // 5 minutes before expiry\n persistSession: true, // Keep session alive when widget closes\n keepWebSocketAlive: true,\n \n // Internal callbacks for session management\n onSessionReady: () => {\n console.log('[AriaCore] Session ready');\n },\n onConnectionStateChange: (connected) => {\n console.log('[AriaCore] Connection state:', connected ? 'connected' : 'disconnected');\n },\n onSessionPreloaded: () => {\n console.log('[AriaCore] Session preloaded and ready');\n },\n onSessionRefresh: () => {\n console.log('[AriaCore] Session refreshed');\n },\n onSessionRefreshError: (error) => {\n console.error('[AriaCore] Session refresh error:', error);\n config.onError?.(error);\n },\n \n // UI options - SDK manages these internally\n showFloatingButton: true,\n showAssistant: true,\n };\n }\n\n /**\n * Mount the Aria UI components to the DOM\n */\n private static mountUI(theme: Theme, triggerLabel?: string): void {\n // Create container element\n const container = document.createElement('div');\n container.id = 'aria-sdk-root';\n container.setAttribute('data-aria-theme', theme);\n container.setAttribute('data-aria-open', 'false');\n document.body.appendChild(container);\n state.uiContainer = container;\n\n // Dynamically import React and render the component\n // This allows the SDK to work without requiring React in the consuming app's bundle\n AriaCore.renderReactUI(container, theme, triggerLabel);\n }\n\n /**\n * Render React UI components\n */\n private static async renderReactUI(\n container: HTMLElement, \n theme: Theme, \n triggerLabel?: string\n ): Promise<void> {\n try {\n // Dynamic imports to avoid bundling React if not needed\n const React = await import('react');\n const ReactDOM = await import('react-dom/client');\n const { AriaStandaloneUI } = await import('@/components/AriaStandaloneUI');\n\n const root = ReactDOM.createRoot(container);\n state.reactRoot = root;\n\n root.render(\n React.createElement(AriaStandaloneUI, {\n theme,\n triggerLabel,\n container,\n })\n );\n\n console.log('[AriaCore] React UI mounted');\n } catch (error) {\n console.error('[AriaCore] Failed to mount React UI:', error);\n state.config?.onError?.(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Unmount the Aria UI components from the DOM\n */\n private static unmountUI(): void {\n if (state.reactRoot && typeof (state.reactRoot as { unmount?: () => void }).unmount === 'function') {\n (state.reactRoot as { unmount: () => void }).unmount();\n }\n\n if (state.uiContainer) {\n state.uiContainer.remove();\n }\n }\n}\n\n// Export as default for convenient importing\nexport default AriaCore;\n","/**\n * Token Utilities for Aria SDK\n * \n * Provides functions to decode and extract session information from tokens.\n * Supports both JWT tokens (decodable) and opaque tokens (backend-provided session_id).\n * \n * @example\n * ```typescript\n * // Check if token is a JWT\n * const token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\";\n * if (isJWT(token)) {\n * const sessionId = extractSessionIdFromToken(token);\n * console.log('Session ID:', sessionId);\n * }\n * \n * // Decode full JWT payload\n * const decoded = decodeJWT(token);\n * if (decoded) {\n * console.log('Payload:', decoded);\n * }\n * ```\n */\n\n/**\n * Information extracted from a decoded token\n */\nexport interface TokenInfo {\n /** Session ID if found in token */\n sessionId: string | null;\n /** Full decoded payload */\n payload: Record<string, unknown> | null;\n /** Token expiration timestamp (Unix timestamp in seconds) */\n exp: number | null;\n /** Token issued at timestamp (Unix timestamp in seconds) */\n iat: number | null;\n}\n\n/**\n * Check if a token is in JWT format\n * \n * @param token - The token to check\n * @returns True if the token is a valid JWT format (3 parts separated by dots)\n * \n * @example\n * ```typescript\n * isJWT(\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U\")\n * // Returns: true\n * \n * isJWT(\"opaque-token-12345\")\n * // Returns: false\n * ```\n */\nexport function isJWT(token: string): boolean {\n if (!token || typeof token !== 'string') {\n return false;\n }\n \n const parts = token.split('.');\n return parts.length === 3;\n}\n\n/**\n * Decode a JWT token without verification\n * \n * **Note:** This function does NOT verify the token signature.\n * It only decodes the payload for client-side use.\n * \n * @param token - The JWT token to decode\n * @returns The decoded payload or null if decoding fails\n * \n * @example\n * ```typescript\n * const token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uX2lkIjoiMTIzNDU2In0.xxxxx\";\n * const payload = decodeJWT(token);\n * // Returns: { session_id: \"123456\" }\n * ```\n */\nexport function decodeJWT(token: string): Record<string, unknown> | null {\n if (!isJWT(token)) {\n return null;\n }\n \n try {\n // Get the payload part (second part of JWT)\n const parts = token.split('.');\n const payload = parts[1];\n \n // JWT uses base64url encoding, need to convert to standard base64\n // Replace URL-safe characters and add padding if needed\n const base64 = payload\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n \n // Add padding if needed\n const padded = base64.padEnd(base64.length + (4 - base64.length % 4) % 4, '=');\n \n // Decode base64\n const decoded = atob(padded);\n \n // Parse JSON\n return JSON.parse(decoded);\n } catch (error) {\n console.error('Failed to decode JWT:', error);\n return null;\n }\n}\n\n/**\n * Extract session ID from a token\n * \n * This function attempts to extract a session ID from a JWT token by checking\n * common claim names used for session identifiers.\n * \n * Checked claim names (in order):\n * - `session_id`\n * - `sessionId`\n * - `sid`\n * - `jti` (JWT ID)\n * - `sub` (Subject)\n * \n * @param token - The token to extract session ID from\n * @returns The session ID if found, null otherwise\n * \n * @example\n * ```typescript\n * const token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uX2lkIjoiYWJjMTIzIn0.xxxxx\";\n * const sessionId = extractSessionIdFromToken(token);\n * // Returns: \"abc123\"\n * \n * const opaqueToken = \"opaque-token-12345\";\n * const result = extractSessionIdFromToken(opaqueToken);\n * // Returns: null (not a JWT)\n * ```\n */\nexport function extractSessionIdFromToken(token: string): string | null {\n const payload = decodeJWT(token);\n \n if (!payload) {\n return null;\n }\n \n // Check common session ID claim names\n const sessionIdClaims = [\n 'session_id',\n 'sessionId', \n 'sid',\n 'jti', // JWT ID\n 'sub', // Subject (sometimes used for session)\n ];\n \n for (const claim of sessionIdClaims) {\n if (claim in payload && typeof payload[claim] === 'string') {\n return payload[claim] as string;\n }\n }\n \n return null;\n}\n\n/**\n * Get comprehensive token information\n * \n * Decodes a JWT token and extracts session ID, expiration, and other metadata.\n * \n * @param token - The token to decode\n * @returns Token information object with session ID, payload, and timestamps\n * \n * @example\n * ```typescript\n * const tokenInfo = getTokenInfo(myToken);\n * if (tokenInfo.sessionId) {\n * console.log('Session ID:', tokenInfo.sessionId);\n * console.log('Expires at:', new Date(tokenInfo.exp * 1000));\n * }\n * ```\n */\nexport function getTokenInfo(token: string): TokenInfo {\n const payload = decodeJWT(token);\n \n if (!payload) {\n return {\n sessionId: null,\n payload: null,\n exp: null,\n iat: null,\n };\n }\n \n const sessionId = extractSessionIdFromToken(token);\n const exp = typeof payload.exp === 'number' ? payload.exp : null;\n const iat = typeof payload.iat === 'number' ? payload.iat : null;\n \n return {\n sessionId,\n payload,\n exp,\n iat,\n };\n}\n\n/**\n * Check if a JWT token is expired\n * \n * @param token - The JWT token to check\n * @returns True if the token is expired, false otherwise\n * \n * @example\n * ```typescript\n * if (isTokenExpired(myToken)) {\n * console.log('Token has expired, need to refresh');\n * }\n * ```\n */\nexport function isTokenExpired(token: string): boolean {\n const payload = decodeJWT(token);\n \n if (!payload || typeof payload.exp !== 'number') {\n // If we can't decode or no expiration, assume expired for safety\n return true;\n }\n \n const now = Math.floor(Date.now() / 1000); // Current time in seconds\n return payload.exp < now;\n}\n","import { useRef, useEffect, useState, type FC, type ReactNode, type CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface ShadowContainerProps {\n children: ReactNode;\n /** CSS string to inject into the shadow root */\n styles?: string;\n /** Optional class name for the shadow host element */\n className?: string;\n /** Optional inline styles for the shadow host element */\n style?: CSSProperties;\n /** Tag name for the shadow host element */\n as?: 'div' | 'span' | 'section' | 'article' | 'aside' | 'main' | 'nav' | 'header' | 'footer';\n}\n\n/**\n * ShadowContainer wraps children in a Shadow DOM boundary for complete CSS isolation.\n * \n * This component:\n * - Creates a shadow root on mount\n * - Injects provided CSS styles into the shadow root\n * - Renders children inside the shadow DOM via portal\n * - Prevents host app styles from affecting SDK components\n * - Prevents SDK styles from leaking to host app\n */\nexport const ShadowContainer: FC<ShadowContainerProps> = ({\n children,\n styles = '',\n className,\n style,\n as: Tag = 'div',\n}) => {\n const hostRef = useRef<HTMLDivElement>(null);\n const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n // Check if shadow root already exists (React strict mode double-mount)\n let shadow = host.shadowRoot;\n if (!shadow) {\n shadow = host.attachShadow({ mode: 'open' });\n }\n\n setShadowRoot(shadow);\n }, []);\n\n // Inject styles into shadow root\n useEffect(() => {\n if (!shadowRoot || !styles) return;\n\n // Check if style element already exists\n const existingStyle = shadowRoot.querySelector('style[data-aria-styles]');\n if (existingStyle) {\n existingStyle.textContent = styles;\n return;\n }\n\n // Create and inject style element\n const styleElement = document.createElement('style');\n styleElement.setAttribute('data-aria-styles', 'true');\n styleElement.textContent = styles;\n shadowRoot.prepend(styleElement);\n\n return () => {\n styleElement.remove();\n };\n }, [shadowRoot, styles]);\n\n // Create a container div inside shadow root for React portal\n const [portalContainer, setPortalContainer] = useState<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!shadowRoot) return;\n\n // Check if container already exists\n let container = shadowRoot.querySelector('.aria-shadow-content') as HTMLDivElement;\n if (!container) {\n container = document.createElement('div');\n container.className = 'aria-shadow-content';\n shadowRoot.appendChild(container);\n }\n\n setPortalContainer(container);\n }, [shadowRoot]);\n\n return (\n <Tag\n ref={hostRef as React.RefObject<HTMLDivElement>}\n className={className}\n style={style}\n >\n {portalContainer && createPortal(children, portalContainer)}\n </Tag>\n );\n};\n\nexport default ShadowContainer;\n","/**\n * CSS Loader for Shadow DOM injection\n * \n * This module provides the SDK's CSS as a string that can be injected\n * into Shadow DOM roots for complete style isolation.\n */\n\n// Import CSS as inline string using Vite's ?inline query\n// This imports the CSS file content as a string rather than injecting it into the document\nimport cssString from '../lib-styles.css?inline';\n\n/**\n * Get the SDK's CSS styles as a string for shadow DOM injection.\n * \n * @returns The complete CSS string for the Aria SDK\n * \n * @example\n * ```tsx\n * import { getAriaStyles } from '@centive/aria-sdk';\n * \n * // Use with ShadowContainer\n * <ShadowContainer styles={getAriaStyles()}>\n * <AriaWidget />\n * </ShadowContainer>\n * ```\n */\nexport function getAriaStyles(): string {\n return cssString;\n}\n\n/**\n * The raw CSS string for the Aria SDK.\n * Use this if you need direct access to the CSS string.\n */\nexport const ariaStyles = cssString;\n\nexport default cssString;\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Concatenates two arrays faster than the array spread operator.\n */\nconst concatArrays = (array1, array2) => {\n // Pre-allocate for better V8 optimization\n const combinedArray = new Array(array1.length + array2.length);\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i];\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i];\n }\n return combinedArray;\n};\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (classGroupId, validator) => ({\n classGroupId,\n validator\n});\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (nextPart = new Map(), validators = null, classGroupId) => ({\n nextPart,\n validators,\n classGroupId\n});\nconst CLASS_PART_SEPARATOR = '-';\nconst EMPTY_CONFLICTS = [];\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className);\n }\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0;\n return getGroupRecursive(classParts, startIndex, classMap);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId];\n const baseConflicts = conflictingClassGroups[classGroupId];\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts);\n }\n // Only modifier conflicts\n return modifierConflicts;\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS;\n }\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, startIndex, classPartObject) => {\n const classPathsLength = classParts.length - startIndex;\n if (classPathsLength === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[startIndex];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);\n if (result) return result;\n }\n const validators = classPartObject.validators;\n if (validators === null) {\n return undefined;\n }\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);\n const validatorsLength = validators.length;\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i];\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId;\n }\n }\n return undefined;\n};\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = className => className.slice(1, -1).indexOf(':') === -1 ? undefined : (() => {\n const content = className.slice(1, -1);\n const colonIndex = content.indexOf(':');\n const property = content.slice(0, colonIndex);\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined;\n})();\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n classGroups\n } = config;\n return processClassGroups(classGroups, theme);\n};\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (classGroups, theme) => {\n const classMap = createClassPartObject();\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId];\n processClassesRecursively(group, classMap, classGroupId, theme);\n }\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n const len = classGroup.length;\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i];\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme);\n }\n};\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId);\n return;\n }\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);\n return;\n }\n processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);\n};\nconst processStringDefinition = (classDefinition, classPartObject, classGroupId) => {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n};\nconst processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n if (classPartObject.validators === null) {\n classPartObject.validators = [];\n }\n classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));\n};\nconst processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n const entries = Object.entries(classDefinition);\n const len = entries.length;\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i];\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);\n }\n};\nconst getPart = (classPartObject, path) => {\n let current = classPartObject;\n const parts = path.split(CLASS_PART_SEPARATOR);\n const len = parts.length;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n let next = current.nextPart.get(part);\n if (!next) {\n next = createClassPartObject();\n current.nextPart.set(part, next);\n }\n current = next;\n }\n return current;\n};\n// Type guard maintains monomorphic check\nconst isThemeGetter = func => 'isThemeGetter' in func && func.isThemeGetter === true;\n\n// LRU cache implementation using plain objects for simplicity\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = Object.create(null);\n let previousCache = Object.create(null);\n const update = (key, value) => {\n cache[key] = value;\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = Object.create(null);\n }\n };\n return {\n get(key) {\n let value = cache[key];\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value;\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst MODIFIER_SEPARATOR = ':';\nconst EMPTY_MODIFIERS = [];\n// Pre-allocated result object shape for consistency\nconst createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal\n});\nconst createParseClassName = config => {\n const {\n prefix,\n experimentalParseClassName\n } = config;\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = className => {\n // Use simple array with push for better performance\n const modifiers = [];\n let bracketDepth = 0;\n let parenDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n const len = className.length;\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index];\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + 1;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') bracketDepth++;else if (currentCharacter === ']') bracketDepth--;else if (currentCharacter === '(') parenDepth++;else if (currentCharacter === ')') parenDepth--;\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier;\n let hasImportantModifier = false;\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1);\n hasImportantModifier = true;\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(1);\n hasImportantModifier = true;\n }\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);\n };\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR;\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true);\n }\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => experimentalParseClassName({\n className,\n parseClassName: parseClassNameOriginal\n });\n }\n return parseClassName;\n};\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst createSortModifiers = config => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map();\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index); // High weights for sensitive mods\n });\n return modifiers => {\n const result = [];\n let currentSegment = [];\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i];\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '[';\n const isOrderSensitive = modifierWeights.has(modifier);\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n currentSegment = [];\n }\n result.push(modifier);\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier);\n }\n }\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n }\n return result;\n };\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n let hasPostfixModifier = !!maybePostfixModifierPosition;\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n // Fast path: skip sorting for empty or single modifier\n const variantModifier = modifiers.length === 0 ? '' : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nconst twJoin = (...classLists) => {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < classLists.length) {\n if (argument = classLists[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst toValue = mix => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst createTailwindMerge = (createConfigFirst, ...createConfigRest) => {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall;\n const initTailwindMerge = classList => {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n };\n const tailwindMerge = classList => {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n };\n functionToCall = initTailwindMerge;\n return (...args) => functionToCall(twJoin(...args));\n};\nconst fallbackThemeArr = [];\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || fallbackThemeArr;\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i;\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isFraction = value => fractionRegex.test(value);\nconst isNumber = value => !!value && !Number.isNaN(Number(value));\nconst isInteger = value => !!value && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst isAny = () => true;\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);\nconst isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);\nconst isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);\nconst isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);\nconst isArbitraryVariable = value => arbitraryVariableRegex.test(value);\nconst isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);\nconst isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);\nconst isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);\nconst isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);\nconst isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);\nconst isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);\n// Helpers\nconst getIsArbitraryValue = (value, testLabel, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {\n const result = arbitraryVariableRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return shouldMatchNoLabel;\n }\n return false;\n};\n// Labels\nconst isLabelPosition = label => label === 'position' || label === 'percentage';\nconst isLabelImage = label => label === 'image' || label === 'url';\nconst isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';\nconst isLabelLength = label => label === 'length';\nconst isLabelNumber = label => label === 'number';\nconst isLabelFamilyName = label => label === 'family-name';\nconst isLabelShadow = label => label === 'shadow';\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isAnyNonArbitrary,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isFraction,\n isInteger,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n const themeColor = fromTheme('color');\n const themeFont = fromTheme('font');\n const themeText = fromTheme('text');\n const themeFontWeight = fromTheme('font-weight');\n const themeTracking = fromTheme('tracking');\n const themeLeading = fromTheme('leading');\n const themeBreakpoint = fromTheme('breakpoint');\n const themeContainer = fromTheme('container');\n const themeSpacing = fromTheme('spacing');\n const themeRadius = fromTheme('radius');\n const themeShadow = fromTheme('shadow');\n const themeInsetShadow = fromTheme('inset-shadow');\n const themeTextShadow = fromTheme('text-shadow');\n const themeDropShadow = fromTheme('drop-shadow');\n const themeBlur = fromTheme('blur');\n const themePerspective = fromTheme('perspective');\n const themeAspect = fromTheme('aspect');\n const themeEase = fromTheme('ease');\n const themeAnimate = fromTheme('animate');\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top', 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top', 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom', 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom'];\n const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const scaleOverscroll = () => ['auto', 'contain', 'none'];\n const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];\n const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartAndEnd = () => ['auto', {\n span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]\n }, isInteger, isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];\n const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];\n const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];\n const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];\n const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];\n const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {\n position: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleBgRepeat = () => ['no-repeat', {\n repeat: ['', 'x', 'y', 'space', 'round']\n }];\n const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {\n size: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];\n const scaleRadius = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];\n const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];\n const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];\n const scaleBlur = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': scaleBreak()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': scaleBreak()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: scalePositionWithArbitrary()\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: scaleOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': scaleOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': scaleOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: scaleOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': scaleOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': scaleOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: scaleInset()\n }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': scaleInset()\n }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': scaleInset()\n }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{\n start: scaleInset()\n }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{\n end: scaleInset()\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: scaleInset()\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: scaleInset()\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: scaleInset()\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: scaleInset()\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['nowrap', 'wrap', 'wrap-reverse']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': scaleGridAutoColsRows()\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': scaleGridAutoColsRows()\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: scaleUnambiguousSpacing()\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': scaleUnambiguousSpacing()\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': scaleUnambiguousSpacing()\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: [...scaleAlignPrimaryAxis(), 'normal']\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...scaleAlignPrimaryAxis()]\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: [...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', ...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': scaleAlignPrimaryAxis()\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: scaleUnambiguousSpacing()\n }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: scaleUnambiguousSpacing()\n }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: scaleUnambiguousSpacing()\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: scaleMargin()\n }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: scaleMargin()\n }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: scaleMargin()\n }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: scaleMargin()\n }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: scaleMargin()\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: scaleMargin()\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: scaleMargin()\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: scaleMargin()\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: scaleMargin()\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{\n 'space-x': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{\n 'space-y': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n // --------------\n // --- Sizing ---\n // --------------\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{\n size: scaleSizing()\n }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: [themeContainer, 'screen', ...scaleSizing()]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none', ...scaleSizing()]\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n {\n screen: [themeBreakpoint]\n }, ...scaleSizing()]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: ['screen', 'lh', ...scaleSizing()]\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': ['screen', 'lh', ...scaleSizing()]\n }],\n // ------------------\n // --- Typography ---\n // ------------------\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [{\n 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading, ...scaleUnambiguousSpacing()]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: scaleColor()\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: scaleColor()\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...scaleLineStyle(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: scaleColor()\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: scaleUnambiguousSpacing()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{\n wrap: ['break-word', 'anywhere', 'normal']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // -------------------\n // --- Backgrounds ---\n // -------------------\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: scaleBgPosition()\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: scaleBgRepeat()\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: scaleBgSize()\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n linear: [{\n to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isInteger, isArbitraryVariable, isArbitraryValue],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue]\n }, isArbitraryVariableImage, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: scaleColor()\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: scaleColor()\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: scaleColor()\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: scaleColor()\n }],\n // ---------------\n // --- Borders ---\n // ---------------\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: scaleRadius()\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': scaleRadius()\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': scaleRadius()\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': scaleRadius()\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': scaleRadius()\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': scaleRadius()\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': scaleRadius()\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': scaleRadius()\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': scaleRadius()\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': scaleRadius()\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': scaleRadius()\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': scaleRadius()\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': scaleRadius()\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': scaleRadius()\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': scaleRadius()\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: scaleBorderWidth()\n }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': scaleBorderWidth()\n }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': scaleBorderWidth()\n }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': scaleBorderWidth()\n }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': scaleBorderWidth()\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': scaleBorderWidth()\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': scaleBorderWidth()\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': scaleBorderWidth()\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': scaleBorderWidth()\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{\n 'divide-x': scaleBorderWidth()\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{\n 'divide-y': scaleBorderWidth()\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{\n divide: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: scaleColor()\n }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': scaleColor()\n }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': scaleColor()\n }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': scaleColor()\n }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': scaleColor()\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': scaleColor()\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': scaleColor()\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': scaleColor()\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': scaleColor()\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: scaleColor()\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: [...scaleLineStyle(), 'none', 'hidden']\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: scaleColor()\n }],\n // ---------------\n // --- Effects ---\n // ---------------\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{\n shadow: scaleColor()\n }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [{\n 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{\n 'inset-shadow': scaleColor()\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{\n ring: scaleBorderWidth()\n }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{\n ring: scaleColor()\n }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{\n 'ring-offset': [isNumber, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{\n 'ring-offset': scaleColor()\n }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{\n 'inset-ring': scaleBorderWidth()\n }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{\n 'inset-ring': scaleColor()\n }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [{\n 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{\n 'text-shadow': scaleColor()\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': scaleBlendMode()\n }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [{\n 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }, 'mask-no-clip'],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{\n mask: ['add', 'subtract', 'intersect', 'exclude']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{\n 'mask-linear': [isNumber]\n }],\n 'mask-image-linear-from-pos': [{\n 'mask-linear-from': scaleMaskImagePosition()\n }],\n 'mask-image-linear-to-pos': [{\n 'mask-linear-to': scaleMaskImagePosition()\n }],\n 'mask-image-linear-from-color': [{\n 'mask-linear-from': scaleColor()\n }],\n 'mask-image-linear-to-color': [{\n 'mask-linear-to': scaleColor()\n }],\n 'mask-image-t-from-pos': [{\n 'mask-t-from': scaleMaskImagePosition()\n }],\n 'mask-image-t-to-pos': [{\n 'mask-t-to': scaleMaskImagePosition()\n }],\n 'mask-image-t-from-color': [{\n 'mask-t-from': scaleColor()\n }],\n 'mask-image-t-to-color': [{\n 'mask-t-to': scaleColor()\n }],\n 'mask-image-r-from-pos': [{\n 'mask-r-from': scaleMaskImagePosition()\n }],\n 'mask-image-r-to-pos': [{\n 'mask-r-to': scaleMaskImagePosition()\n }],\n 'mask-image-r-from-color': [{\n 'mask-r-from': scaleColor()\n }],\n 'mask-image-r-to-color': [{\n 'mask-r-to': scaleColor()\n }],\n 'mask-image-b-from-pos': [{\n 'mask-b-from': scaleMaskImagePosition()\n }],\n 'mask-image-b-to-pos': [{\n 'mask-b-to': scaleMaskImagePosition()\n }],\n 'mask-image-b-from-color': [{\n 'mask-b-from': scaleColor()\n }],\n 'mask-image-b-to-color': [{\n 'mask-b-to': scaleColor()\n }],\n 'mask-image-l-from-pos': [{\n 'mask-l-from': scaleMaskImagePosition()\n }],\n 'mask-image-l-to-pos': [{\n 'mask-l-to': scaleMaskImagePosition()\n }],\n 'mask-image-l-from-color': [{\n 'mask-l-from': scaleColor()\n }],\n 'mask-image-l-to-color': [{\n 'mask-l-to': scaleColor()\n }],\n 'mask-image-x-from-pos': [{\n 'mask-x-from': scaleMaskImagePosition()\n }],\n 'mask-image-x-to-pos': [{\n 'mask-x-to': scaleMaskImagePosition()\n }],\n 'mask-image-x-from-color': [{\n 'mask-x-from': scaleColor()\n }],\n 'mask-image-x-to-color': [{\n 'mask-x-to': scaleColor()\n }],\n 'mask-image-y-from-pos': [{\n 'mask-y-from': scaleMaskImagePosition()\n }],\n 'mask-image-y-to-pos': [{\n 'mask-y-to': scaleMaskImagePosition()\n }],\n 'mask-image-y-from-color': [{\n 'mask-y-from': scaleColor()\n }],\n 'mask-image-y-to-color': [{\n 'mask-y-to': scaleColor()\n }],\n 'mask-image-radial': [{\n 'mask-radial': [isArbitraryVariable, isArbitraryValue]\n }],\n 'mask-image-radial-from-pos': [{\n 'mask-radial-from': scaleMaskImagePosition()\n }],\n 'mask-image-radial-to-pos': [{\n 'mask-radial-to': scaleMaskImagePosition()\n }],\n 'mask-image-radial-from-color': [{\n 'mask-radial-from': scaleColor()\n }],\n 'mask-image-radial-to-color': [{\n 'mask-radial-to': scaleColor()\n }],\n 'mask-image-radial-shape': [{\n 'mask-radial': ['circle', 'ellipse']\n }],\n 'mask-image-radial-size': [{\n 'mask-radial': [{\n closest: ['side', 'corner'],\n farthest: ['side', 'corner']\n }]\n }],\n 'mask-image-radial-pos': [{\n 'mask-radial-at': scalePosition()\n }],\n 'mask-image-conic-pos': [{\n 'mask-conic': [isNumber]\n }],\n 'mask-image-conic-from-pos': [{\n 'mask-conic-from': scaleMaskImagePosition()\n }],\n 'mask-image-conic-to-pos': [{\n 'mask-conic-to': scaleMaskImagePosition()\n }],\n 'mask-image-conic-from-color': [{\n 'mask-conic-from': scaleColor()\n }],\n 'mask-image-conic-to-color': [{\n 'mask-conic-to': scaleColor()\n }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{\n mask: ['alpha', 'luminance', 'match']\n }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [{\n 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{\n mask: scaleBgPosition()\n }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{\n mask: scaleBgRepeat()\n }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{\n mask: scaleBgSize()\n }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{\n 'mask-type': ['alpha', 'luminance']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{\n mask: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------\n // --- Filters ---\n // ---------------\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: scaleBlur()\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{\n 'drop-shadow': scaleColor()\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': scaleBlur()\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n // --------------\n // --- Tables ---\n // --------------\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': scaleUnambiguousSpacing()\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{\n transition: ['normal', 'discrete']\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------\n // --- Transforms ---\n // ------------------\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{\n backface: ['hidden', 'visible']\n }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [{\n perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{\n 'perspective-origin': scalePositionWithArbitrary()\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: scaleRotate()\n }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{\n 'rotate-x': scaleRotate()\n }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{\n 'rotate-y': scaleRotate()\n }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{\n 'rotate-z': scaleRotate()\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: scaleScale()\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': scaleScale()\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': scaleScale()\n }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{\n 'scale-z': scaleScale()\n }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{\n skew: scaleSkew()\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': scaleSkew()\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': scaleSkew()\n }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: scalePositionWithArbitrary()\n }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{\n transform: ['3d', 'flat']\n }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{\n translate: scaleTranslate()\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': scaleTranslate()\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': scaleTranslate()\n }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{\n 'translate-z': scaleTranslate()\n }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: scaleColor()\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: scaleColor()\n }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [{\n scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{\n 'field-sizing': ['fixed', 'content']\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['auto', 'none']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', '', 'y', 'x']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]\n }],\n // -----------\n // --- SVG ---\n // -----------\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: ['none', ...scaleColor()]\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: ['none', ...scaleColor()]\n }],\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n },\n orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n overrideConfigProperties(baseConfig.theme, override.theme);\n overrideConfigProperties(baseConfig.classGroups, override.classGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroupModifiers, override.conflictingClassGroupModifiers);\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers);\n mergeConfigProperties(baseConfig.theme, extend.theme);\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroupModifiers, extend.conflictingClassGroupModifiers);\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers');\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key);\n }\n }\n};\nconst mergeArrayProperties = (baseObject, mergeObject, key) => {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue;\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n","export default \"data:image/jpeg;base64,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\"","/**\n * AriaStandaloneUI - Standalone React component for Aria SDK\n * \n * This component is mounted by AriaCore.init() and manages its own state\n * independently of any parent React context. It listens to window events\n * dispatched by AriaCore for programmatic control.\n */\n\nimport { useState, useEffect, useCallback, useRef, type FC } from 'react';\nimport { \n Sparkles, \n MessageCircle, \n Mic, \n MicOff, \n X, \n Phone, \n RefreshCw, \n Minimize2, \n Maximize2, \n Wrench,\n Send,\n User,\n Bot,\n} from 'lucide-react';\nimport type { \n ChatMessage, \n TriggerMode, \n SessionState, \n SessionManagerStatus,\n SessionManagerEvent,\n ToolCallState,\n Theme,\n} from '@/types';\nimport { AriaSessionManager } from '@/lib/AriaSessionManager';\nimport { ShadowContainer } from './ShadowContainer';\nimport { getAriaStyles } from '@/lib/cssLoader';\nimport { cn } from '@/lib/utils';\nimport ariaAvatar from '@/assets/aria-avatar.jpg';\n\ninterface AriaStandaloneUIProps {\n theme: Theme;\n triggerLabel?: string;\n container: HTMLElement;\n}\n\nexport const AriaStandaloneUI: FC<AriaStandaloneUIProps> = ({\n theme,\n triggerLabel,\n container,\n}) => {\n // UI State\n const [isOpen, setIsOpen] = useState(false);\n const [isMinimized, setIsMinimized] = useState(false);\n const [isConnected, setIsConnected] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [chatMessages, setChatMessages] = useState<ChatMessage[]>([]);\n const [liveTranscript, setLiveTranscript] = useState('');\n const [isChatVisible, setIsChatVisible] = useState(false);\n const [isMuted, setIsMuted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [, setTriggerMode] = useState<TriggerMode>('user');\n const [displayMode, setDisplayMode] = useState<'center' | 'bottom-right'>('bottom-right');\n \n // Tool call state\n const [toolCallState, setToolCallState] = useState<ToolCallState>({\n isActive: false,\n toolName: null,\n toolData: null,\n });\n \n // Session State\n const [sessionState, setSessionState] = useState<SessionState>({\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n });\n const [sessionManagerStatus, setSessionManagerStatus] = useState<SessionManagerStatus>('idle');\n const [, setIsSessionPaused] = useState(false);\n\n // Refs\n const managerRef = useRef<AriaSessionManager | null>(null);\n const videoElementRef = useRef<HTMLVideoElement | null>(null);\n const isOpenRef = useRef(isOpen); // Track isOpen in a ref for event callbacks\n \n // Keep the ref in sync with state\n isOpenRef.current = isOpen;\n\n // ============================================================================\n // Session Manager Event Handlers\n // ============================================================================\n\n const handleStatusChange = useCallback((event: SessionManagerEvent) => {\n const { newStatus } = event.data as { oldStatus: SessionManagerStatus; newStatus: SessionManagerStatus };\n setSessionManagerStatus(newStatus);\n \n // Use isOpenRef.current to get the latest value (avoids stale closure issue)\n if (newStatus === 'preloading' || newStatus === 'connecting') {\n if (isOpenRef.current) {\n setIsLoading(true);\n }\n } else if (newStatus === 'ready') {\n setIsLoading(false);\n setIsConnected(true);\n } else if (newStatus === 'error') {\n setIsLoading(false);\n }\n }, []); // Remove isOpen dependency since we use ref now\n\n const handleSessionReady = useCallback((event: SessionManagerEvent) => {\n const eventData = event.data as { \n sessionId?: string | null; \n tokenReady?: boolean; \n lazyInit?: boolean;\n streamReady?: boolean;\n } | undefined;\n console.log('[AriaStandaloneUI] Session ready event:', eventData, 'isOpen:', isOpenRef.current);\n \n if (managerRef.current) {\n const state = managerRef.current.getSessionState();\n setSessionState(state);\n \n // Check if this is a lazy init event (token ready but no stream yet)\n // vs a full session ready event (stream is available)\n const isLazyInit = eventData?.lazyInit === true;\n const isStreamReady = eventData?.streamReady === true;\n \n if (isStreamReady) {\n // Full session ready with video stream available\n // Attach video stream now that it's available\n if (videoElementRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after full session ready (streamReady=true)');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n \n setIsConnected(true);\n setIsLoading(false);\n setError(null);\n } else if (isLazyInit && eventData?.tokenReady) {\n // Lazy init - token is ready\n // If widget is open, initialize the Anam client now\n // Use isOpenRef.current to get the latest value (avoids stale closure issue)\n if (isOpenRef.current) {\n const isAnamReady = managerRef.current.isAnamClientInitialized();\n if (!isAnamReady) {\n console.log('[AriaStandaloneUI] Token received while widget is open, initializing Anam client');\n setIsLoading(true);\n managerRef.current.initializeSessionOnDemand()\n .then(() => {\n console.log('[AriaStandaloneUI] Anam client initialized after token received');\n setIsLoading(false);\n setIsConnected(true);\n setError(null);\n // Attach video stream now that it's ready\n if (videoElementRef.current && managerRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after lazy init');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n })\n .catch((err) => {\n console.error('[AriaStandaloneUI] Failed to initialize Anam client:', err);\n setIsLoading(false);\n setError(err instanceof Error ? err.message : 'Failed to initialize session');\n });\n }\n } else {\n // Widget not open - just log that token is ready\n console.log('[AriaStandaloneUI] Token ready (lazy init), button enabled');\n }\n } else {\n // Legacy event format without streamReady flag - try to attach anyway\n if (videoElementRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream (legacy event)');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n setIsConnected(true);\n setIsLoading(false);\n setError(null);\n }\n }\n }, []);\n\n const handleSessionError = useCallback((event: SessionManagerEvent) => {\n const errorMsg = event.error?.message || 'Session error';\n console.error('[AriaStandaloneUI] Session error:', errorMsg);\n setError(errorMsg);\n setIsLoading(false);\n \n if (managerRef.current) {\n const state = managerRef.current.getSessionState();\n setSessionState(state);\n }\n }, []);\n\n const handleConnectionChange = useCallback((event: SessionManagerEvent) => {\n const { connected } = event.data as { connected: boolean };\n setIsConnected(connected);\n \n if (!connected && managerRef.current) {\n const state = managerRef.current.getSessionState();\n setSessionState(state);\n }\n }, []);\n\n const handleMessageHistory = useCallback((event: SessionManagerEvent) => {\n const { messages } = event.data as { messages?: ChatMessage[] };\n if (messages) {\n setChatMessages(messages);\n }\n }, []);\n\n const handleMessageStream = useCallback((event: SessionManagerEvent) => {\n const { liveTranscript: transcript } = event.data as { liveTranscript?: string };\n if (transcript !== undefined) {\n setLiveTranscript(transcript);\n }\n }, []);\n\n const handleToolCall = useCallback((event: SessionManagerEvent) => {\n const data = event.data as { isActive: boolean; toolName: string | null; toolData: Record<string, unknown> | null };\n setToolCallState({\n isActive: data.isActive,\n toolName: data.toolName,\n toolData: data.toolData,\n });\n }, []);\n\n // ============================================================================\n // Video Element Management\n // ============================================================================\n\n const setVideoElement = useCallback((element: HTMLVideoElement | null) => {\n const previousElement = videoElementRef.current;\n videoElementRef.current = element;\n \n if (element && managerRef.current) {\n // Only attach if video stream is available (session is ready)\n // Otherwise, the stream will be attached when session_ready event fires\n const hasVideoStream = managerRef.current.getVideoStream() !== null;\n if (hasVideoStream) {\n console.log('[AriaStandaloneUI] Attaching video stream to element');\n managerRef.current.attachToVideoElement(element);\n } else {\n console.log('[AriaStandaloneUI] Video element registered, waiting for stream to be ready');\n }\n } else if (!element && previousElement && managerRef.current) {\n console.log('[AriaStandaloneUI] Detaching video stream from element');\n managerRef.current.detachFromVideoElement(previousElement);\n }\n }, []);\n\n // ============================================================================\n // Assistant Actions\n // ============================================================================\n\n const openAssistant = useCallback((mode: TriggerMode = 'user') => {\n setTriggerMode(mode);\n setDisplayMode(mode === 'websocket' ? 'center' : 'bottom-right');\n setIsOpen(true);\n setIsMinimized(false);\n setError(null);\n\n if (!managerRef.current) return;\n\n const isPaused = managerRef.current.isSessionPaused();\n console.log('[AriaStandaloneUI] openAssistant called, isPaused:', isPaused);\n \n if (isPaused) {\n setIsLoading(true);\n managerRef.current.resumeSession().then((resumed) => {\n setIsSessionPaused(false);\n \n if (resumed) {\n // Session was successfully resumed\n setIsLoading(false);\n setIsConnected(true);\n const state = managerRef.current!.getSessionState();\n setSessionState(state);\n setChatMessages(managerRef.current!.getChatMessages());\n // Re-attach video stream after resume\n if (videoElementRef.current && managerRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after resume');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n } else {\n // Session could not be resumed, start new session\n const hasToken = managerRef.current!.hasSessionToken();\n \n if (hasToken) {\n managerRef.current!.initializeSessionOnDemand()\n .then(() => {\n setIsLoading(false);\n setIsConnected(true);\n const state = managerRef.current!.getSessionState();\n setSessionState(state);\n // Attach video stream now that it's ready\n if (videoElementRef.current && managerRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after initialization (from resume)');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n })\n .catch((initErr) => {\n setIsLoading(false);\n setError(initErr instanceof Error ? initErr.message : 'Failed to start new session');\n });\n } else if (!managerRef.current!.isConnected()) {\n managerRef.current!.connect();\n }\n }\n }).catch((err) => {\n setIsLoading(false);\n setIsSessionPaused(false);\n setError(err instanceof Error ? err.message : 'Failed to resume session');\n });\n return;\n }\n\n const isAnamReady = managerRef.current.isAnamClientInitialized();\n const hasToken = managerRef.current.hasSessionToken();\n const status = managerRef.current.getStatus();\n \n console.log('[AriaStandaloneUI] openAssistant state check:', { isAnamReady, hasToken, status, isPaused: false });\n \n if (isAnamReady && status === 'ready') {\n console.log('[AriaStandaloneUI] Anam already ready, attaching video');\n setIsLoading(false);\n setIsConnected(true);\n // Re-attach video stream in case element was registered before\n if (videoElementRef.current) {\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n } else if (hasToken) {\n console.log('[AriaStandaloneUI] Has token, calling initializeSessionOnDemand');\n setIsLoading(true);\n \n managerRef.current.initializeSessionOnDemand()\n .then(() => {\n setIsLoading(false);\n setIsConnected(true);\n const state = managerRef.current!.getSessionState();\n setSessionState(state);\n // Attach video stream now that it's ready\n if (videoElementRef.current && managerRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after initialization');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n })\n .catch((err) => {\n setIsLoading(false);\n setError(err instanceof Error ? err.message : 'Failed to initialize session');\n });\n } else {\n // No token yet - this shouldn't happen since button is disabled until ready\n // But handle it gracefully just in case\n console.warn('[AriaStandaloneUI] No token available, button should have been disabled');\n setError('Session not ready. Please wait and try again.');\n }\n }, []);\n\n const minimizeAssistant = useCallback(() => {\n setIsMinimized(true);\n }, []);\n\n const maximizeAssistant = useCallback(() => {\n setIsMinimized(false);\n }, []);\n\n const closeAssistant = useCallback(() => {\n setIsOpen(false);\n setIsMinimized(false);\n \n if (!managerRef.current) return;\n \n if (videoElementRef.current) {\n managerRef.current.detachFromVideoElement(videoElementRef.current);\n }\n \n // Clear live transcript display (but keep in memory)\n setLiveTranscript('');\n \n // Always pause session when closing widget - session only ends on logout or unmount\n console.log('[AriaStandaloneUI] Pausing session (widget closed)');\n managerRef.current.pauseSession();\n setIsSessionPaused(true);\n }, []);\n\n const handleWebSocketTrigger = useCallback(() => {\n console.log('[AriaStandaloneUI] WebSocket trigger event');\n openAssistant('websocket');\n }, [openAssistant]);\n\n // ============================================================================\n // Initialize Session Manager\n // ============================================================================\n\n useEffect(() => {\n // Get the existing singleton instance (created by AriaCore.init)\n if (!AriaSessionManager.hasInstance()) {\n console.error('[AriaStandaloneUI] AriaSessionManager not initialized');\n return;\n }\n\n const manager = AriaSessionManager.getInstance({} as never); // Get existing instance\n managerRef.current = manager;\n\n // Set up event listeners\n manager.addEventListener('status_change', handleStatusChange);\n manager.addEventListener('session_ready', handleSessionReady);\n manager.addEventListener('session_error', handleSessionError);\n manager.addEventListener('connection_change', handleConnectionChange);\n manager.addEventListener('message_history', handleMessageHistory);\n manager.addEventListener('message_stream', handleMessageStream);\n manager.addEventListener('tool_call', handleToolCall);\n manager.setWebSocketTriggerCallback(handleWebSocketTrigger);\n\n // Sync initial state from manager (deferred to avoid synchronous setState in effect)\n const syncInitialState = () => {\n setSessionState(manager.getSessionState());\n setSessionManagerStatus(manager.getStatus());\n setIsConnected(manager.isConnected());\n setChatMessages(manager.getChatMessages());\n setLiveTranscript(manager.getLiveTranscript());\n setIsMuted(manager.isMuted());\n setIsSessionPaused(manager.isSessionPaused());\n \n const toolState = manager.getToolCallState();\n setToolCallState(toolState);\n };\n \n // Use queueMicrotask to defer state sync and avoid cascading renders warning\n queueMicrotask(syncInitialState);\n\n return () => {\n manager.removeEventListener('status_change', handleStatusChange);\n manager.removeEventListener('session_ready', handleSessionReady);\n manager.removeEventListener('session_error', handleSessionError);\n manager.removeEventListener('connection_change', handleConnectionChange);\n manager.removeEventListener('message_history', handleMessageHistory);\n manager.removeEventListener('message_stream', handleMessageStream);\n manager.removeEventListener('tool_call', handleToolCall);\n manager.setWebSocketTriggerCallback(null);\n };\n }, [\n handleStatusChange,\n handleSessionReady,\n handleSessionError,\n handleConnectionChange,\n handleMessageHistory,\n handleMessageStream,\n handleToolCall,\n handleWebSocketTrigger,\n ]);\n\n // ============================================================================\n // Window Event Listeners (for AriaCore programmatic control)\n // ============================================================================\n\n useEffect(() => {\n const handleOpen = (e: Event) => {\n const customEvent = e as CustomEvent<{ mode?: TriggerMode }>;\n openAssistant(customEvent.detail?.mode || 'user');\n };\n\n const handleClose = () => {\n closeAssistant();\n };\n\n const handleMinimize = () => {\n minimizeAssistant();\n };\n\n const handleMaximize = () => {\n maximizeAssistant();\n };\n\n window.addEventListener('aria:open', handleOpen);\n window.addEventListener('aria:close', handleClose);\n window.addEventListener('aria:minimize', handleMinimize);\n window.addEventListener('aria:maximize', handleMaximize);\n\n return () => {\n window.removeEventListener('aria:open', handleOpen);\n window.removeEventListener('aria:close', handleClose);\n window.removeEventListener('aria:minimize', handleMinimize);\n window.removeEventListener('aria:maximize', handleMaximize);\n };\n }, [openAssistant, closeAssistant, minimizeAssistant, maximizeAssistant]);\n\n // Update container data attribute when open state changes\n useEffect(() => {\n container.setAttribute('data-aria-open', String(isOpen));\n }, [isOpen, container]);\n\n // ============================================================================\n // Chat Actions\n // ============================================================================\n\n const toggleChat = useCallback(() => {\n setIsChatVisible(prev => !prev);\n }, []);\n\n const sendMessage = useCallback(async (message: string) => {\n if (!managerRef.current || !isConnected) {\n throw new Error('Not connected to Aria');\n }\n\n await managerRef.current.sendMessage(message);\n }, [isConnected]);\n\n const toggleMute = useCallback(() => {\n if (!managerRef.current) return;\n const newMuteState = managerRef.current.toggleMute();\n setIsMuted(newMuteState);\n }, []);\n\n const refreshSession = useCallback(() => {\n if (!managerRef.current) return;\n setIsLoading(true);\n setError(null);\n managerRef.current.refreshSession().catch((err) => {\n setError(err instanceof Error ? err.message : 'Failed to refresh session');\n setIsLoading(false);\n });\n }, []);\n\n // ============================================================================\n // Render\n // ============================================================================\n\n return (\n <>\n {/* Floating Trigger Button - shown when assistant is closed */}\n {!isOpen && (\n <AriaTriggerButtonStandalone \n showAvatar={true} \n label={triggerLabel}\n theme={theme}\n isReady={sessionState.isPreloaded || sessionManagerStatus === 'ready' || (sessionManagerStatus === 'connected' && sessionState.token !== null)}\n onClick={() => openAssistant('user')}\n />\n )}\n\n {/* Assistant Widget - render when open */}\n {isOpen && (\n <>\n {/* Backdrop overlay - only shown when widget is NOT minimized */}\n {!isMinimized && (\n <div \n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n minimizeAssistant();\n }}\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n backdropFilter: 'blur(1px)',\n WebkitBackdropFilter: 'blur(1px)',\n zIndex: 9998,\n cursor: 'pointer',\n }}\n aria-hidden=\"true\"\n />\n )}\n \n {/* Aria Widget wrapped in Shadow DOM */}\n <ShadowContainer \n styles={getAriaStyles()}\n style={{ \n position: 'fixed',\n zIndex: 9999,\n inset: 0,\n pointerEvents: 'none',\n }}\n >\n <div style={{ pointerEvents: 'auto' }}>\n <AriaWidgetStandalone\n onClose={closeAssistant}\n isMinimized={isMinimized}\n onMinimize={minimizeAssistant}\n onMaximize={maximizeAssistant}\n theme={theme}\n displayMode={displayMode}\n isConnected={isConnected}\n isLoading={isLoading}\n chatMessages={chatMessages}\n liveTranscript={liveTranscript}\n isChatVisible={isChatVisible}\n isMuted={isMuted}\n error={error}\n toolCallState={toolCallState}\n sessionState={sessionState}\n setVideoElement={setVideoElement}\n toggleChat={toggleChat}\n sendMessage={sendMessage}\n toggleMute={toggleMute}\n refreshSession={refreshSession}\n />\n </div>\n </ShadowContainer>\n </>\n )}\n </>\n );\n};\n\n// ============================================================================\n// Standalone Trigger Button (doesn't use context)\n// ============================================================================\n\ninterface AriaTriggerButtonStandaloneProps {\n showAvatar?: boolean;\n label?: string;\n theme: Theme;\n isReady?: boolean;\n onClick: () => void;\n}\n\nconst AriaTriggerButtonStandalone: FC<AriaTriggerButtonStandaloneProps> = ({\n showAvatar = true,\n label,\n theme,\n isReady = false,\n onClick,\n}) => {\n const isDark = theme === 'dark';\n const buttonLabel = label || 'Talk to Aria';\n \n return (\n <ShadowContainer \n styles={getAriaStyles()}\n style={{\n position: 'fixed',\n bottom: '1.5rem',\n right: '1.5rem',\n zIndex: 9997,\n }}\n >\n <div className={cn('aria-assistant-container', isDark && 'aria-dark')}>\n <button\n onClick={(e) => {\n e.preventDefault();\n if (isReady) {\n onClick();\n }\n }}\n disabled={!isReady}\n className={cn(\n \"group relative flex items-center gap-3 px-3.5 py-2.5 rounded-xl\",\n \"transition-all duration-200 ease-out\",\n \"aria-animate-slide-up\",\n \"border-none outline-none\",\n // Disabled state - more prominent visual feedback\n !isReady && \"opacity-50 pointer-events-none\",\n // Light mode styling\n !isDark && [\n \"bg-white shadow-[0_8px_30px_rgb(0,0,0,0.12)]\",\n isReady && \"hover:bg-gray-50 hover:shadow-[0_8px_30px_rgb(0,0,0,0.16)] hover:-translate-y-0.5\",\n ],\n // Dark mode styling\n isDark && [\n \"bg-gray-900 shadow-[0_8px_30px_rgb(0,0,0,0.3)]\",\n isReady && \"hover:bg-gray-850 hover:shadow-[0_8px_30px_rgb(0,0,0,0.4)] hover:-translate-y-0.5\",\n ],\n )}\n >\n {/* Avatar/Icon */}\n {showAvatar ? (\n <div className={cn(\n \"relative w-9 h-9 rounded-lg overflow-hidden shrink-0\",\n \"shadow-sm transition-all duration-200\",\n !isDark \n ? \"bg-gray-100\" \n : \"bg-gray-800\",\n // Grayscale when not ready\n !isReady && \"grayscale\"\n )}>\n <img \n src={ariaAvatar} \n alt={buttonLabel}\n className=\"w-full h-full object-cover\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n // Show sparkles as fallback\n const fallback = e.currentTarget.nextElementSibling as HTMLElement;\n if (fallback) fallback.style.display = 'flex';\n }}\n />\n <div \n className=\"hidden w-full h-full items-center justify-center aria-gradient-bg text-white\"\n >\n <Sparkles className=\"w-4 h-4\" />\n </div>\n {/* Online indicator - shows session readiness */}\n <span className={cn(\n \"absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full border-2\",\n !isDark ? \"border-white\" : \"border-gray-900\",\n isReady ? \"bg-emerald-500\" : \"bg-amber-500 animate-pulse\"\n )} />\n </div>\n ) : (\n <div className={cn(\n \"relative w-9 h-9 rounded-lg flex items-center justify-center shrink-0\",\n \"aria-gradient-bg text-white shadow-sm\",\n \"transition-transform duration-200\",\n isReady && \"group-hover:scale-105\",\n !isReady && \"grayscale\"\n )}>\n <Sparkles className=\"w-4 h-4\" />\n </div>\n )}\n \n {/* Text content */}\n <div className=\"relative flex flex-col items-start min-w-0 text-left\">\n <span className={cn(\n \"font-bold text-[13px] tracking-tight leading-none\",\n !isDark ? \"text-gray-900\" : \"text-white\"\n )}>\n {buttonLabel}\n </span>\n <span className={cn(\n \"text-[10px] font-medium mt-1 leading-none\",\n !isDark ? \"text-gray-500\" : \"text-gray-400\",\n !isReady && \"animate-pulse\"\n )}>\n {isReady ? \"I'm here to chat\" : \"Connecting...\"}\n </span>\n </div>\n </button>\n </div>\n </ShadowContainer>\n );\n};\n\n// ============================================================================\n// Standalone Widget (doesn't use context)\n// ============================================================================\n\ninterface AriaWidgetStandaloneProps {\n onClose: () => void;\n isMinimized: boolean;\n onMinimize: () => void;\n onMaximize: () => void;\n theme: Theme;\n displayMode: 'center' | 'bottom-right';\n isConnected: boolean;\n isLoading: boolean;\n chatMessages: ChatMessage[];\n liveTranscript: string;\n isChatVisible: boolean;\n isMuted: boolean;\n error: string | null;\n toolCallState: ToolCallState;\n sessionState: SessionState;\n setVideoElement: (element: HTMLVideoElement | null) => void;\n toggleChat: () => void;\n sendMessage: (message: string) => Promise<void>;\n toggleMute: () => void;\n refreshSession: () => void;\n}\n\nconst AriaWidgetStandalone: FC<AriaWidgetStandaloneProps> = ({\n onClose,\n isMinimized,\n onMinimize,\n onMaximize,\n theme,\n displayMode,\n isConnected,\n isLoading,\n chatMessages,\n liveTranscript,\n isChatVisible,\n isMuted,\n error,\n toolCallState,\n setVideoElement,\n toggleChat,\n sendMessage,\n toggleMute,\n refreshSession,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const transcriptRef = useRef<HTMLParagraphElement>(null);\n const [inputValue, setInputValue] = useState('');\n const [isSending, setIsSending] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const isDark = theme === 'dark';\n const isFloating = displayMode === 'bottom-right';\n const isCenter = displayMode === 'center';\n\n // Auto-scroll transcript to bottom when new content arrives\n useEffect(() => {\n if (transcriptRef.current) {\n transcriptRef.current.scrollTop = transcriptRef.current.scrollHeight;\n }\n }, [liveTranscript]);\n\n // Register the video element when it mounts\n useEffect(() => {\n if (videoRef.current) {\n console.log('[AriaWidgetStandalone] Registering video element, minimized:', isMinimized);\n setVideoElement(videoRef.current);\n }\n return () => {\n setVideoElement(null);\n };\n }, [setVideoElement, isMinimized]);\n\n // Auto-scroll chat messages\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [chatMessages]);\n\n const handleSendMessage = async () => {\n if (!inputValue.trim() || !isConnected || isSending) return;\n\n const messageToSend = inputValue.trim();\n setInputValue('');\n setIsSending(true);\n\n try {\n await sendMessage(messageToSend);\n } catch (err) {\n console.error('Failed to send message:', err);\n setInputValue(messageToSend);\n } finally {\n setIsSending(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSendMessage();\n }\n };\n\n const formatTimestamp = (timestamp: number) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n // Minimized state: smaller compact widget\n if (isMinimized) {\n return (\n <div\n className={cn(\n 'aria-assistant-container flex flex-col overflow-hidden aria-animate-scale-in',\n isDark && 'aria-dark',\n 'shadow-2xl rounded-xl',\n !isDark && 'bg-white/95 border border-gray-200/80',\n isDark && 'bg-gray-950/95 border border-gray-800/50',\n 'fixed bottom-6 right-6',\n 'w-[320px] h-[240px]'\n )}\n style={{\n zIndex: 9999,\n backdropFilter: 'blur(8px)',\n WebkitBackdropFilter: 'blur(8px)',\n }}\n >\n <div className={cn(\n 'relative flex-1 flex items-center justify-center overflow-hidden',\n !isDark ? 'bg-gradient-to-br from-gray-100 to-gray-50' : 'bg-gradient-to-br from-gray-900 to-black'\n )}>\n <video\n ref={videoRef}\n autoPlay\n playsInline\n className=\"w-full h-full object-cover\"\n />\n\n {/* Tool Call Indicator */}\n {toolCallState.isActive && isConnected && (\n <div className={cn(\n 'absolute top-3 left-3 aria-animate-fade-in z-20',\n 'flex items-center gap-2 px-3 py-2 rounded-lg',\n 'shadow-lg',\n !isDark \n ? 'bg-amber-50 border border-amber-200' \n : 'bg-amber-900/30 border border-amber-700/50'\n )}\n style={{ backdropFilter: 'blur(8px)' }}\n >\n <div className={cn(\n 'w-5 h-5 rounded-full flex items-center justify-center',\n !isDark ? 'bg-amber-100' : 'bg-amber-800/50'\n )}>\n <Wrench className={cn(\n 'w-3 h-3 animate-pulse',\n !isDark ? 'text-amber-600' : 'text-amber-400'\n )} />\n </div>\n <span className={cn(\n 'text-[10px] font-semibold',\n !isDark ? 'text-amber-800' : 'text-amber-200'\n )}>\n {toolCallState.toolName \n ? toolCallState.toolName.replace(/_/g, ' ')\n : 'Processing...'\n }\n </span>\n </div>\n )}\n\n {/* Control Bar */}\n {isConnected && !error && (\n <div className={cn(\n 'absolute bottom-3 left-1/2 transform -translate-x-1/2 z-20',\n 'flex items-center gap-1 p-1 rounded-full',\n 'shadow-xl',\n !isDark \n ? 'bg-white/90' \n : 'bg-gray-900/90'\n )}\n style={{ backdropFilter: 'blur(12px)' }}\n >\n <button\n onClick={toggleMute}\n className={cn(\n 'w-8 h-8 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n isMuted \n ? 'bg-red-500 hover:bg-red-600 text-white' \n : !isDark\n ? 'bg-gray-100/80 hover:bg-gray-200 text-gray-600'\n : 'bg-gray-800/80 hover:bg-gray-700 text-gray-300'\n )}\n title={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <MicOff className=\"h-3.5 w-3.5\" /> : <Mic className=\"h-3.5 w-3.5\" />}\n </button>\n\n <button\n onClick={onMaximize}\n className={cn(\n 'w-8 h-8 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n !isDark\n ? 'bg-indigo-500 hover:bg-indigo-600 text-white'\n : 'bg-indigo-600 hover:bg-indigo-700 text-white'\n )}\n title=\"Maximize\"\n >\n <Maximize2 className=\"h-3.5 w-3.5\" />\n </button>\n \n <button\n onClick={onClose}\n className=\"w-8 h-8 rounded-full bg-red-500 hover:bg-red-600 flex items-center justify-center transition-all duration-200 text-white border-0 outline-none focus:outline-none shadow-sm\"\n title=\"End Call\"\n >\n <Phone className=\"h-3.5 w-3.5 rotate-[135deg]\" />\n </button>\n </div>\n )}\n\n {/* Loading State */}\n {isLoading && (\n <div className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center z-10',\n !isDark ? 'bg-gradient-to-br from-gray-50 to-white' : 'bg-gradient-to-br from-gray-900 to-gray-950'\n )}>\n <div className=\"relative mb-3\">\n <div className={cn(\n 'absolute -inset-2 rounded-full animate-spin',\n !isDark \n ? 'bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500' \n : 'bg-gradient-to-r from-indigo-400 via-purple-400 to-pink-400'\n )} style={{ animationDuration: '3s' }}>\n <div className={cn(\n 'absolute inset-[2px] rounded-full',\n !isDark ? 'bg-white' : 'bg-gray-900'\n )} />\n </div>\n <div className={cn(\n 'relative w-12 h-12 rounded-full overflow-hidden shadow-lg',\n !isDark ? 'bg-gray-100 ring-2 ring-white' : 'bg-gray-800 ring-2 ring-gray-900'\n )}>\n <img \n src={ariaAvatar} \n alt=\"Aria\" \n className=\"w-full h-full object-cover\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n </div>\n </div>\n <p className={cn(\n 'text-xs font-medium',\n !isDark ? 'text-gray-600' : 'text-gray-400'\n )}>\n Connecting...\n </p>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <div className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center z-10 p-4',\n !isDark ? 'bg-white/90' : 'bg-gray-950/90'\n )}>\n <div className=\"w-10 h-10 rounded-full bg-red-500/10 flex items-center justify-center mb-2\">\n <X className=\"w-5 h-5 text-red-500\" />\n </div>\n <p className={cn(\n 'text-xs font-medium text-center mb-2',\n !isDark ? 'text-red-700' : 'text-red-300'\n )}>\n Connection error\n </p>\n <button\n onClick={refreshSession}\n className={cn(\n 'inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-medium',\n 'transition-all duration-200',\n !isDark \n ? 'bg-indigo-500 hover:bg-indigo-600 text-white' \n : 'bg-indigo-600 hover:bg-indigo-700 text-white'\n )}\n >\n <RefreshCw className=\"w-3 h-3\" />\n Retry\n </button>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Full size widget\n return (\n <div\n className={cn(\n 'aria-assistant-container flex flex-col overflow-hidden aria-animate-scale-in',\n isDark && 'aria-dark',\n 'shadow-2xl',\n !isDark && 'bg-white/95 border border-gray-200/80',\n isDark && 'bg-gray-950/95 border border-gray-800/50',\n isFloating && 'fixed bottom-6 right-6 rounded-xl',\n isFloating && (isChatVisible ? 'w-[960px]' : 'w-[640px]'),\n isFloating && 'h-[500px]',\n isCenter && 'fixed inset-8 md:inset-16 lg:inset-20 rounded-2xl'\n )}\n style={{\n zIndex: 9999,\n backdropFilter: 'blur(8px)',\n WebkitBackdropFilter: 'blur(8px)',\n }}\n >\n <div className=\"flex-1 flex overflow-hidden min-h-0\">\n {/* Video Section */}\n <div className={cn(\n 'relative flex items-center justify-center overflow-hidden',\n !isDark ? 'bg-gradient-to-br from-gray-100 to-gray-50' : 'bg-gradient-to-br from-gray-900 to-black',\n isChatVisible ? 'flex-1' : 'w-full'\n )}>\n {/* Loading State */}\n {isLoading && (\n <div className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center z-10',\n !isDark ? 'bg-gradient-to-br from-gray-50 to-white' : 'bg-gradient-to-br from-gray-900 to-gray-950'\n )}>\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className={cn(\n 'absolute w-96 h-96 rounded-full opacity-20 blur-3xl',\n 'animate-pulse',\n !isDark ? 'bg-indigo-300' : 'bg-indigo-900'\n )} style={{ top: '20%', left: '10%', animationDuration: '3s' }} />\n <div className={cn(\n 'absolute w-64 h-64 rounded-full opacity-20 blur-3xl',\n 'animate-pulse',\n !isDark ? 'bg-purple-300' : 'bg-purple-900'\n )} style={{ bottom: '20%', right: '10%', animationDuration: '4s', animationDelay: '1s' }} />\n </div>\n \n <div className=\"relative flex flex-col items-center\">\n <div className=\"relative mb-6\">\n <div className={cn(\n 'absolute -inset-3 rounded-full',\n 'animate-spin',\n !isDark \n ? 'bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500' \n : 'bg-gradient-to-r from-indigo-400 via-purple-400 to-pink-400'\n )} style={{ animationDuration: '3s' }}>\n <div className={cn(\n 'absolute inset-[3px] rounded-full',\n !isDark ? 'bg-white' : 'bg-gray-900'\n )} />\n </div>\n \n <div className={cn(\n 'absolute -inset-1.5 rounded-full opacity-60 animate-pulse',\n !isDark \n ? 'bg-gradient-to-r from-indigo-400 to-purple-400' \n : 'bg-gradient-to-r from-indigo-500 to-purple-500'\n )} />\n \n <div className={cn(\n 'relative w-20 h-20 rounded-full overflow-hidden',\n 'shadow-xl',\n !isDark ? 'bg-gray-100 ring-4 ring-white' : 'bg-gray-800 ring-4 ring-gray-900'\n )}>\n <img \n src={ariaAvatar} \n alt=\"Aria\" \n className=\"w-full h-full object-cover\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n </div>\n </div>\n \n <h3 className={cn(\n 'text-2xl font-bold tracking-tight mb-2',\n !isDark ? 'text-gray-900' : 'text-white'\n )}>\n Aria is joining...\n </h3>\n \n <div className=\"flex items-center gap-1.5 mb-6\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={cn(\n 'w-2.5 h-2.5 rounded-full',\n !isDark ? 'bg-indigo-500' : 'bg-indigo-400'\n )}\n style={{\n animation: 'aria-loading-bounce 1.4s ease-in-out infinite',\n animationDelay: `${i * 0.15}s`,\n }}\n />\n ))}\n </div>\n \n <p className={cn(\n 'text-sm font-medium px-4 py-2 rounded-full',\n !isDark \n ? 'bg-gray-100 text-gray-600' \n : 'bg-gray-800 text-gray-400'\n )}>\n Get ready to chat\n </p>\n </div>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <div className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center z-10 p-6',\n !isDark ? 'bg-white/80' : 'bg-gray-950/80'\n )}\n style={{ backdropFilter: 'blur(4px)' }}\n >\n <div className={cn(\n 'rounded-lg p-6 max-w-sm w-full shadow-lg border',\n !isDark ? 'bg-white border-red-100' : 'bg-gray-900 border-red-900/30'\n )}>\n <div className=\"flex flex-col items-center text-center gap-3\">\n <div className=\"w-12 h-12 rounded-full bg-red-500/10 flex items-center justify-center\">\n <X className=\"w-6 h-6 text-red-500\" />\n </div>\n <div>\n <p className={cn(\n 'text-base font-bold mb-2',\n !isDark ? 'text-red-900' : 'text-red-200'\n )}>\n Couldn't reach Aria\n </p>\n <p className={cn(\n 'text-sm leading-relaxed mb-4',\n !isDark ? 'text-red-600' : 'text-red-400'\n )}>\n {error}\n </p>\n <button\n onClick={refreshSession}\n className={cn(\n 'inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium',\n 'transition-all duration-200',\n !isDark \n ? 'bg-indigo-500 hover:bg-indigo-600 text-white' \n : 'bg-indigo-600 hover:bg-indigo-700 text-white'\n )}\n >\n <RefreshCw className=\"w-4 h-4\" />\n Try Again\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Video Element */}\n <video\n ref={videoRef}\n autoPlay\n playsInline\n className=\"w-full h-full object-contain\"\n />\n\n {/* Tool Call Indicator */}\n {toolCallState.isActive && isConnected && (\n <div className={cn(\n 'absolute top-3 left-3 aria-animate-fade-in z-20',\n 'flex items-center gap-2 px-3 py-2 rounded-lg',\n 'shadow-lg',\n !isDark \n ? 'bg-amber-50 border border-amber-200' \n : 'bg-amber-900/30 border border-amber-700/50'\n )}\n style={{ backdropFilter: 'blur(8px)' }}\n >\n <div className={cn(\n 'w-6 h-6 rounded-full flex items-center justify-center',\n !isDark ? 'bg-amber-100' : 'bg-amber-800/50'\n )}>\n <Wrench className={cn(\n 'w-3.5 h-3.5 animate-pulse',\n !isDark ? 'text-amber-600' : 'text-amber-400'\n )} />\n </div>\n <div className=\"flex flex-col\">\n <span className={cn(\n 'text-xs font-semibold',\n !isDark ? 'text-amber-800' : 'text-amber-200'\n )}>\n {toolCallState.toolName \n ? `Running: ${toolCallState.toolName.replace(/_/g, ' ')}`\n : 'Processing...'\n }\n </span>\n <span className={cn(\n 'text-[10px]',\n !isDark ? 'text-amber-600' : 'text-amber-400'\n )}>\n Please wait...\n </span>\n </div>\n <div className=\"flex items-center gap-0.5 ml-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={cn(\n 'w-1.5 h-1.5 rounded-full',\n !isDark ? 'bg-amber-500' : 'bg-amber-400'\n )}\n style={{\n animation: 'aria-loading-bounce 1.4s ease-in-out infinite',\n animationDelay: `${i * 0.15}s`,\n }}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Live Transcript Overlay */}\n {liveTranscript && isConnected && !toolCallState.isActive && (\n <div className={cn(\n 'absolute top-0 left-0 right-0 aria-animate-fade-in',\n 'px-4 py-2',\n !isDark \n ? 'bg-gradient-to-b from-black/60 to-transparent text-white' \n : 'bg-gradient-to-b from-white/60 to-transparent text-gray-900'\n )}\n style={{ backdropFilter: 'blur(4px)' }}\n >\n <div className=\"flex items-start gap-2 max-w-full\">\n <div className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse shrink-0 mt-1\" />\n <p ref={transcriptRef} className=\"text-xs leading-relaxed flex-1 max-h-[3.5em] overflow-y-auto scrollbar-hide\">\n {liveTranscript}\n </p>\n </div>\n </div>\n )}\n\n {/* Control Bar */}\n {isConnected && !error && (\n <div className={cn(\n 'absolute bottom-4 left-1/2 transform -translate-x-1/2 z-20',\n 'flex items-center gap-1.5 p-1 rounded-full',\n 'shadow-xl',\n !isDark \n ? 'bg-white/90' \n : 'bg-gray-900/90'\n )}\n style={{ backdropFilter: 'blur(12px)' }}\n >\n <button\n onClick={toggleChat}\n className={cn(\n 'w-9 h-9 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n isChatVisible\n ? !isDark\n ? 'bg-indigo-500 hover:bg-indigo-600 text-white'\n : 'bg-indigo-600 hover:bg-indigo-700 text-white'\n : !isDark\n ? 'bg-gray-100/80 hover:bg-gray-200 text-gray-600'\n : 'bg-gray-800/80 hover:bg-gray-700 text-gray-300'\n )}\n title={isChatVisible ? 'Hide Chat' : 'Show Chat'}\n >\n <MessageCircle className=\"h-4 w-4\" />\n </button>\n \n <button\n onClick={toggleMute}\n className={cn(\n 'w-9 h-9 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n isMuted \n ? 'bg-red-500 hover:bg-red-600 text-white' \n : !isDark\n ? 'bg-gray-100/80 hover:bg-gray-200 text-gray-600'\n : 'bg-gray-800/80 hover:bg-gray-700 text-gray-300'\n )}\n title={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <MicOff className=\"h-4 w-4\" /> : <Mic className=\"h-4 w-4\" />}\n </button>\n\n <button\n onClick={onMinimize}\n className={cn(\n 'w-9 h-9 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n !isDark\n ? 'bg-gray-100/80 hover:bg-gray-200 text-gray-600'\n : 'bg-gray-800/80 hover:bg-gray-700 text-gray-300'\n )}\n title=\"Minimize\"\n >\n <Minimize2 className=\"h-4 w-4\" />\n </button>\n \n <button\n onClick={onClose}\n className=\"w-10 h-9 rounded-full bg-red-500 hover:bg-red-600 flex items-center justify-center transition-all duration-200 text-white border-0 outline-none focus:outline-none shadow-sm\"\n title=\"End Call\"\n >\n <Phone className=\"h-4 w-4 rotate-[135deg]\" />\n </button>\n </div>\n )}\n </div>\n\n {/* Chat Panel - Inline implementation */}\n {isChatVisible && (\n <div className={cn(\n 'flex flex-col shrink-0 border-l',\n isFloating ? 'w-[320px]' : 'w-[360px]',\n !isDark ? 'bg-white border-gray-100' : 'bg-gray-900 border-gray-800'\n )}>\n {/* Chat Header */}\n <div className={cn(\n 'px-4 py-3 border-b',\n !isDark ? 'border-gray-100 bg-white' : 'border-gray-800 bg-gray-900'\n )}>\n <div className=\"flex items-center gap-2\">\n <div className={cn(\n 'w-7 h-7 rounded-lg flex items-center justify-center',\n !isDark ? 'bg-indigo-100' : 'bg-indigo-900/30'\n )}>\n <MessageCircle className={cn(\n 'w-4 h-4',\n !isDark ? 'text-indigo-600' : 'text-indigo-400'\n )} />\n </div>\n <h3 className={cn(\n 'font-bold text-sm',\n !isDark ? 'text-gray-900' : 'text-white'\n )}>\n Chat with Aria\n </h3>\n </div>\n </div>\n\n {/* Messages Container */}\n <div className={cn(\n 'flex-1 overflow-y-auto p-4 space-y-4',\n !isDark ? 'bg-gray-50/30' : 'bg-gray-900/30'\n )}>\n {chatMessages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center px-4 aria-animate-fade-in\">\n <div className={cn(\n 'rounded-2xl p-6 mb-4',\n !isDark \n ? 'bg-gradient-to-br from-indigo-50 to-purple-50' \n : 'bg-gradient-to-br from-indigo-900/20 to-purple-900/20'\n )}>\n <Sparkles className={cn(\n 'h-8 w-8',\n !isDark ? 'text-indigo-500' : 'text-indigo-400'\n )} />\n </div>\n <p className={cn(\n 'text-sm font-bold mb-1',\n !isDark ? 'text-gray-900' : 'text-white'\n )}>\n Let's talk!\n </p>\n <p className={cn(\n 'text-xs',\n !isDark ? 'text-gray-500' : 'text-gray-400'\n )}>\n Aria is here to chat with you\n </p>\n </div>\n ) : (\n chatMessages\n .filter((message) => message.content && message.content.trim() !== '')\n .map((message, index) => (\n <div\n key={index}\n className={cn(\n 'flex gap-2 aria-animate-fade-in',\n message.role === 'user' ? 'flex-row-reverse' : 'flex-row'\n )}\n style={{ animationDelay: `${index * 50}ms` }}\n >\n <div\n className={cn(\n 'shrink-0 w-6 h-6 rounded-full flex items-center justify-center',\n message.role === 'user'\n ? 'bg-indigo-500 text-white'\n : !isDark\n ? 'bg-gray-200 text-gray-600'\n : 'bg-gray-700 text-gray-300'\n )}\n >\n {message.role === 'user' ? (\n <User className=\"h-3 w-3\" />\n ) : (\n <Bot className=\"h-3 w-3\" />\n )}\n </div>\n\n <div\n className={cn(\n 'flex flex-col max-w-[80%]',\n message.role === 'user' ? 'items-end' : 'items-start'\n )}\n >\n <div\n className={cn(\n 'px-3 py-2 rounded-2xl',\n message.role === 'user'\n ? 'bg-indigo-500 text-white rounded-br-md'\n : !isDark\n ? 'bg-white shadow-sm text-gray-800 rounded-bl-md'\n : 'bg-gray-800 text-gray-100 rounded-bl-md'\n )}\n >\n <p className={cn(\n 'text-xs leading-relaxed break-words',\n message.role === 'user' && 'text-white'\n )}>\n {message.content}\n </p>\n </div>\n <span className={cn(\n 'text-[9px] mt-1 px-1',\n !isDark ? 'text-gray-400' : 'text-gray-500'\n )}>\n {formatTimestamp(message.timestamp)}\n </span>\n </div>\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <div className={cn(\n 'p-3 border-t',\n !isDark ? 'border-gray-100 bg-white' : 'border-gray-800 bg-gray-900'\n )}>\n <div className={cn(\n 'flex gap-2 p-1 rounded-lg border transition-all duration-200',\n !isDark \n ? 'bg-gray-50 border-gray-200 focus-within:border-indigo-500/50 focus-within:bg-white' \n : 'bg-gray-850 border-gray-700 focus-within:border-indigo-500/50'\n )}>\n <input\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={isConnected ? 'Message Aria...' : 'Connecting...'}\n disabled={!isConnected || isSending}\n className={cn(\n 'flex-1 border-0 bg-transparent shadow-none focus:outline-none px-2 h-8 text-xs',\n !isDark ? 'placeholder:text-gray-400 text-gray-900' : 'placeholder:text-gray-500 text-white'\n )}\n />\n <button\n onClick={handleSendMessage}\n disabled={!isConnected || !inputValue.trim() || isSending}\n className={cn(\n 'h-7 w-7 rounded-md shrink-0 transition-all duration-200 flex items-center justify-center',\n 'bg-indigo-500 hover:bg-indigo-600 disabled:opacity-40 text-white'\n )}\n >\n <Send className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default AriaStandaloneUI;\n"],"names":["isSessionResponse","msg","isMessageHistoryAck","isMessageStreamAck","isSessionEndAck","isSessionEndError","isWebSocketTriggerEvent","isGenericAck","isMissingFieldsError","DEFAULT_REFRESH_CONFIG","AriaSessionManager","config","previousUserId","type","listener","event","typeListeners","err","newStatus","oldStatus","updates","error","errorMessage","enabled","delay","expiresAt","remaining","parsedData","errorMsg","response","isRefreshing","sessionToken","shouldSkipGreeting","message","userTrigger","createClient","AnamEvent","client","anamSessionId","messages","anamMessages","anamMessage","toolEvent","streams","videoStream","audioStream","element","tracks","activeTracks","track","audioTracks","force","payload","is_final","now","bufferMs","refreshAt","timeToExpiry","resetGreeting","callback","state","AriaCore","fullConfig","mode","connected","theme","triggerLabel","container","React","ReactDOM","AriaStandaloneUI","AriaStandaloneUI$1","root","isJWT","token","decodeJWT","base64","padded","decoded","extractSessionIdFromToken","sessionIdClaims","claim","getTokenInfo","sessionId","exp","iat","isTokenExpired","ShadowContainer","children","styles","className","style","Tag","hostRef","useRef","shadowRoot","setShadowRoot","useState","useEffect","host","shadow","existingStyle","styleElement","portalContainer","setPortalContainer","jsx","createPortal","getAriaStyles","cssString","r","e","t","f","n","o","clsx","concatArrays","array1","array2","combinedArray","i","createClassValidatorObject","classGroupId","validator","createClassPartObject","nextPart","validators","CLASS_PART_SEPARATOR","EMPTY_CONFLICTS","ARBITRARY_PROPERTY_PREFIX","createClassGroupUtils","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getGroupIdForArbitraryProperty","classParts","startIndex","getGroupRecursive","hasPostfixModifier","modifierConflicts","baseConflicts","classPartObject","currentClassPart","nextClassPartObject","result","classRest","validatorsLength","validatorObj","content","colonIndex","property","classGroups","processClassGroups","group","processClassesRecursively","classGroup","len","classDefinition","processClassDefinition","processStringDefinition","processFunctionDefinition","processObjectDefinition","classPartObjectToEdit","getPart","isThemeGetter","entries","key","value","path","current","parts","part","next","func","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR","EMPTY_MODIFIERS","createResultObject","modifiers","hasImportantModifier","baseClassName","maybePostfixModifierPosition","isExternal","createParseClassName","prefix","experimentalParseClassName","parseClassName","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","fullPrefix","parseClassNameOriginal","createSortModifiers","modifierWeights","mod","currentSegment","modifier","isArbitrary","isOrderSensitive","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","getClassGroupId","getConflictingClassGroupIds","sortModifiers","classGroupsInConflict","classNames","originalClassName","variantModifier","modifierId","classId","conflictGroups","twJoin","classLists","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","args","fallbackThemeArr","fromTheme","themeGetter","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","isNumber","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitraryValue","isArbitraryVariable","isArbitrarySize","getIsArbitraryValue","isLabelSize","isArbitraryLength","isLabelLength","isArbitraryNumber","isLabelNumber","isArbitraryPosition","isLabelPosition","isArbitraryImage","isLabelImage","isArbitraryShadow","isLabelShadow","isArbitraryVariableLength","getIsArbitraryVariable","isArbitraryVariableFamilyName","isLabelFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","testLabel","testValue","shouldMatchNoLabel","label","getDefaultConfig","themeColor","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","scaleGridTemplateColsRows","scaleGridColRowStartAndEnd","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleColor","scaleBgPosition","scaleBgRepeat","scaleBgSize","scaleGradientStopPosition","scaleRadius","scaleBorderWidth","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","twMerge","cn","inputs","ariaAvatar","isOpen","setIsOpen","isMinimized","setIsMinimized","isConnected","setIsConnected","isLoading","setIsLoading","chatMessages","setChatMessages","liveTranscript","setLiveTranscript","isChatVisible","setIsChatVisible","isMuted","setIsMuted","setError","setTriggerMode","displayMode","setDisplayMode","toolCallState","setToolCallState","sessionState","setSessionState","sessionManagerStatus","setSessionManagerStatus","setIsSessionPaused","managerRef","videoElementRef","isOpenRef","handleStatusChange","useCallback","handleSessionReady","eventData","isLazyInit","handleSessionError","handleConnectionChange","handleMessageHistory","handleMessageStream","transcript","handleToolCall","data","setVideoElement","previousElement","openAssistant","isPaused","resumed","initErr","isAnamReady","hasToken","status","minimizeAssistant","maximizeAssistant","closeAssistant","handleWebSocketTrigger","manager","toolState","handleOpen","handleClose","handleMinimize","handleMaximize","toggleChat","prev","sendMessage","toggleMute","newMuteState","refreshSession","jsxs","Fragment","AriaTriggerButtonStandalone","AriaWidgetStandalone","showAvatar","isReady","onClick","isDark","buttonLabel","fallback","Sparkles","onClose","onMinimize","onMaximize","videoRef","transcriptRef","inputValue","setInputValue","isSending","setIsSending","messagesEndRef","isFloating","isCenter","handleSendMessage","messageToSend","handleKeyDown","formatTimestamp","timestamp","Wrench","MicOff","Mic","Maximize2","Phone","X","RefreshCw","MessageCircle","Minimize2","User","Bot","Send"],"mappings":"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","x_google_ignoreList":[5,6]}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/AriaSessionManager.ts","../src/lib/AriaCore.ts","../src/lib/tokenUtils.ts","../src/components/ShadowContainer.tsx","../src/lib/cssLoader.ts","../node_modules/clsx/dist/clsx.mjs","../node_modules/tailwind-merge/dist/bundle-mjs.mjs","../src/lib/utils.ts","../src/assets/aria-avatar.jpg","../src/components/AriaStandaloneUI.tsx"],"sourcesContent":["/**\n * AriaSessionManager - Singleton class for global session management\n * \n * This class manages the WebSocket connection, Anam client, and session state\n * outside of React's lifecycle, ensuring session continuity across page navigation.\n * \n * Key features:\n * - Singleton pattern ensures only one instance exists globally\n * - Session persists across React component unmounts/remounts\n * - Proactive session refresh before expiration\n * - Tab visibility awareness for resource optimization\n * - Error recovery with exponential backoff\n */\n\nimport type { AnamClient } from '@anam-ai/js-sdk';\nimport type {\n AriaSDKConfig,\n SessionState,\n SessionResponse,\n SessionManagerStatus,\n SessionManagerEventType,\n SessionManagerListener,\n SessionManagerEvent,\n SessionRefreshConfig,\n AnamMessage,\n AnamMessageStreamEvent,\n ChatMessage,\n MessageHistoryEvent,\n MessageStreamEvent,\n SessionEndEvent,\n MessageHistoryAckResponse,\n MessageStreamAckResponse,\n SessionEndAckResponse,\n SessionEndErrorResponse,\n GenericAckResponse,\n MissingFieldsErrorResponse,\n WebSocketTriggerEvent,\n ClientToolEvent,\n} from '@/types';\n\n// ============================================================================\n// Type Guards for Message Handling\n// ============================================================================\n\nfunction isSessionResponse(msg: unknown): msg is SessionResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'status' in msg &&\n (msg.status === 'success' || msg.status === 'error') &&\n !('type' in msg)\n );\n}\n\nfunction isMessageHistoryAck(msg: unknown): msg is MessageHistoryAckResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'message_history_ack' &&\n 'status' in msg &&\n msg.status === 'ok'\n );\n}\n\nfunction isMessageStreamAck(msg: unknown): msg is MessageStreamAckResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'message_stream_ack' &&\n 'status' in msg &&\n msg.status === 'ok'\n );\n}\n\nfunction isSessionEndAck(msg: unknown): msg is SessionEndAckResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'session_end_ack' &&\n 'status' in msg &&\n msg.status === 'ok'\n );\n}\n\nfunction isSessionEndError(msg: unknown): msg is SessionEndErrorResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'session_end_error' &&\n 'status' in msg &&\n msg.status === 'error'\n );\n}\n\nfunction isWebSocketTriggerEvent(msg: unknown): msg is WebSocketTriggerEvent {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'type' in msg &&\n msg.type === 'trigger_event'\n );\n}\n\nfunction isGenericAck(msg: unknown): msg is GenericAckResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'status' in msg &&\n msg.status === 'ok' &&\n 'message' in msg &&\n !('type' in msg)\n );\n}\n\nfunction isMissingFieldsError(msg: unknown): msg is MissingFieldsErrorResponse {\n return (\n typeof msg === 'object' &&\n msg !== null &&\n 'status' in msg &&\n msg.status === 'error' &&\n 'error' in msg &&\n msg.error === 'MISSING_FIELDS'\n );\n}\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\nconst DEFAULT_REFRESH_CONFIG: SessionRefreshConfig = {\n bufferMinutes: 5,\n maxRetries: 3,\n baseRetryDelay: 1000,\n refreshOnlyWhenVisible: true,\n};\n\n// ============================================================================\n// AriaSessionManager Singleton\n// ============================================================================\n\nexport class AriaSessionManager {\n private static instance: AriaSessionManager | null = null;\n\n // Configuration\n private config: AriaSDKConfig;\n private refreshConfig: SessionRefreshConfig;\n\n // WebSocket connection\n private ws: WebSocket | null = null;\n\n // Anam client and streaming\n private anamClient: AnamClient | null = null;\n private videoStream: MediaStream | null = null;\n private audioInputStream: MediaStream | null = null;\n private hiddenVideoElement: HTMLVideoElement | null = null;\n private hiddenAudioElement: HTMLAudioElement | null = null;\n\n // Session state\n private sessionState: SessionState = {\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n };\n\n // Manager status\n private status: SessionManagerStatus = 'idle';\n\n // Chat state\n private chatMessages: ChatMessage[] = [];\n private liveTranscript: string = '';\n private lastMessageHistory: AnamMessage[] = [];\n\n // Event listeners\n private listeners: Map<SessionManagerEventType, Set<SessionManagerListener>> = new Map();\n\n // Timers and retry state\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private retryCount: number = 0;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Tab visibility\n private isTabVisible: boolean = true;\n private pendingRefresh: boolean = false;\n\n // Callback for WebSocket trigger events (to open assistant)\n private onWebSocketTrigger: ((event: WebSocketTriggerEvent) => void) | null = null;\n\n // Session persistence state\n private isPaused: boolean = false;\n private beforeUnloadHandler: (() => void) | null = null;\n\n // Lazy initialization flag - when true, Anam client is initialized only when widget opens\n private deferAnamInit: boolean = true;\n private isAnamInitializing: boolean = false;\n\n // Tool call state\n private isToolCallActive: boolean = false;\n private activeToolCall: ClientToolEvent | null = null;\n\n // Auto-reconnect state\n private autoReconnectEnabled: boolean = true;\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number = 10;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private isIntentionalDisconnect: boolean = false;\n\n // Auto-reconnect on Anam disconnect (for inactivity timeout)\n private isReconnecting: boolean = false;\n private autoReconnectOnAnamDisconnect: boolean = true;\n\n // Track if user has had a session before (to skip greeting on subsequent sessions)\n // This persists across session restarts within the same app lifecycle\n private hasHadSessionBefore: boolean = false;\n\n // ============================================================================\n // Singleton Pattern\n // ============================================================================\n\n private constructor(config: AriaSDKConfig) {\n this.config = config;\n this.refreshConfig = {\n ...DEFAULT_REFRESH_CONFIG,\n bufferMinutes: config.sessionRefreshBuffer ?? DEFAULT_REFRESH_CONFIG.bufferMinutes,\n };\n\n // Validate userId is provided (required for message storage)\n if (!config.userId) {\n console.warn('[AriaSessionManager] WARNING: userId not provided. Message storage will not work.');\n } else {\n console.log('[AriaSessionManager] Instance created with userId:', config.userId);\n }\n\n // Set up tab visibility listener\n this.setupVisibilityListener();\n\n // Set up beforeunload handler for session cleanup\n this.setupBeforeUnloadHandler();\n }\n\n /**\n * Get or create the singleton instance\n * \n * If instance already exists and config has meaningful values (websocketUrl),\n * the config will be updated. Otherwise, existing config is preserved.\n */\n static getInstance(config: AriaSDKConfig): AriaSessionManager {\n if (!AriaSessionManager.instance) {\n AriaSessionManager.instance = new AriaSessionManager(config);\n } else if (config.websocketUrl) {\n // Only update config if it has meaningful values (not an empty object)\n // This prevents overwriting the config when getting existing instance\n AriaSessionManager.instance.updateConfig(config);\n }\n return AriaSessionManager.instance;\n }\n\n /**\n * Check if an instance exists\n */\n static hasInstance(): boolean {\n return AriaSessionManager.instance !== null;\n }\n\n /**\n * Destroy the singleton instance (for testing or cleanup)\n */\n static destroyInstance(): void {\n if (AriaSessionManager.instance) {\n AriaSessionManager.instance.destroy();\n AriaSessionManager.instance = null;\n }\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n private updateConfig(config: AriaSDKConfig): void {\n const previousUserId = this.config.userId;\n this.config = config;\n this.refreshConfig = {\n ...this.refreshConfig,\n bufferMinutes: config.sessionRefreshBuffer ?? this.refreshConfig.bufferMinutes,\n };\n \n // Warn if userId changed or is missing\n if (!config.userId) {\n console.warn('[AriaSessionManager] WARNING: Config updated without userId. Message storage will not work.');\n } else if (previousUserId !== config.userId) {\n console.log('[AriaSessionManager] Config updated, userId changed:', previousUserId, '->', config.userId);\n }\n }\n\n getConfig(): AriaSDKConfig {\n return this.config;\n }\n\n /**\n * Check if the manager is properly configured for message storage\n * Returns true if both userId and WebSocket are available\n */\n canStoreMessages(): boolean {\n return !!(this.config.userId && this.ws && this.ws.readyState === WebSocket.OPEN);\n }\n\n /**\n * Get the current userId from config\n */\n getUserId(): string | undefined {\n return this.config.userId;\n }\n\n // ============================================================================\n // Event System\n // ============================================================================\n\n addEventListener(type: SessionManagerEventType, listener: SessionManagerListener): void {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, new Set());\n }\n this.listeners.get(type)!.add(listener);\n }\n\n removeEventListener(type: SessionManagerEventType, listener: SessionManagerListener): void {\n this.listeners.get(type)?.delete(listener);\n }\n\n private emit(event: SessionManagerEvent): void {\n const typeListeners = this.listeners.get(event.type);\n if (typeListeners) {\n typeListeners.forEach(listener => {\n try {\n listener(event);\n } catch (err) {\n console.error('[AriaSessionManager] Error in event listener:', err);\n }\n });\n }\n }\n\n // ============================================================================\n // Status Management\n // ============================================================================\n\n private setStatus(newStatus: SessionManagerStatus): void {\n if (this.status !== newStatus) {\n const oldStatus = this.status;\n this.status = newStatus;\n console.log(`[AriaSessionManager] Status changed: ${oldStatus} -> ${newStatus}`);\n this.emit({ type: 'status_change', data: { oldStatus, newStatus } });\n }\n }\n\n getStatus(): SessionManagerStatus {\n return this.status;\n }\n\n // ============================================================================\n // Session State\n // ============================================================================\n\n getSessionState(): SessionState {\n return { ...this.sessionState };\n }\n\n private updateSessionState(updates: Partial<SessionState>): void {\n this.sessionState = { ...this.sessionState, ...updates };\n }\n\n // ============================================================================\n // WebSocket Connection\n // ============================================================================\n\n connect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n console.log('[AriaSessionManager] WebSocket already connected');\n return;\n }\n\n if (this.ws?.readyState === WebSocket.CONNECTING) {\n console.log('[AriaSessionManager] WebSocket already connecting');\n return;\n }\n\n // Reset reconnect state for fresh connection\n this.resetReconnectState();\n this.setStatus('connecting');\n\n try {\n this.ws = new WebSocket(this.config.websocketUrl);\n\n this.ws.onopen = () => {\n console.log('[AriaSessionManager] WebSocket connected');\n this.setStatus('connected');\n this.retryCount = 0;\n this.emit({ type: 'connection_change', data: { connected: true } });\n this.config.onConnectionStateChange?.(true);\n\n // Auto-request session token on connect with user_trigger=true\n // This ensures we get a valid session token that can be used when user opens widget\n // The token is stored and the Anam client is initialized lazily when widget opens\n if (this.config.preloadSession !== false) {\n console.log('[AriaSessionManager] Requesting session token for user:', this.config.userId || '(no userId)');\n this.requestSessionToken();\n }\n };\n\n this.ws.onmessage = (event) => this.handleWebSocketMessage(event);\n\n this.ws.onerror = (error) => {\n console.error('[AriaSessionManager] WebSocket error:', error);\n this.setStatus('error');\n this.updateSessionState({ lastError: 'WebSocket connection error' });\n this.config.onError?.(new Error('WebSocket connection failed'));\n };\n\n this.ws.onclose = (event) => {\n console.log('[AriaSessionManager] WebSocket disconnected, code:', event.code);\n this.emit({ type: 'connection_change', data: { connected: false } });\n this.config.onConnectionStateChange?.(false);\n\n // Don't reset session state on close - we want to preserve it for reconnection\n // Only reset if we're not in a refresh cycle\n if (!this.sessionState.isRefreshing) {\n this.setStatus('idle');\n }\n\n // Auto-reconnect if enabled and not intentionally disconnected\n if (this.autoReconnectEnabled && !this.isIntentionalDisconnect && !this.isPaused) {\n this.scheduleReconnect();\n }\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to connect WebSocket';\n console.error('[AriaSessionManager] Connection error:', errorMessage);\n this.setStatus('error');\n this.updateSessionState({ lastError: errorMessage });\n this.config.onError?.(err instanceof Error ? err : new Error(errorMessage));\n }\n }\n\n disconnect(): void {\n // Mark as intentional disconnect to prevent auto-reconnect\n this.isIntentionalDisconnect = true;\n this.clearTimers();\n this.clearReconnectTimer();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus('idle');\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n // ============================================================================\n // Auto-Reconnect Logic\n // ============================================================================\n\n /**\n * Enable or disable auto-reconnect functionality\n */\n setAutoReconnect(enabled: boolean): void {\n this.autoReconnectEnabled = enabled;\n if (!enabled) {\n this.clearReconnectTimer();\n }\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff\n */\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error('[AriaSessionManager] Max reconnect attempts reached, giving up');\n this.setStatus('error');\n this.updateSessionState({ lastError: 'Connection lost - max reconnect attempts reached' });\n this.config.onError?.(new Error('WebSocket connection lost after max reconnect attempts'));\n return;\n }\n\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s, 32s (max 30s)\n const baseDelay = 1000;\n const delay = Math.min(baseDelay * Math.pow(2, this.reconnectAttempts), 30000);\n this.reconnectAttempts++;\n\n console.log(`[AriaSessionManager] Scheduling reconnect attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts} in ${delay}ms`);\n\n this.reconnectTimer = setTimeout(() => {\n if (!this.isIntentionalDisconnect && !this.isPaused) {\n console.log(`[AriaSessionManager] Attempting reconnect (attempt ${this.reconnectAttempts})`);\n this.reconnect();\n }\n }, delay);\n }\n\n /**\n * Attempt to reconnect the WebSocket\n */\n private reconnect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n console.log('[AriaSessionManager] Already connected, skipping reconnect');\n return;\n }\n\n if (this.ws?.readyState === WebSocket.CONNECTING) {\n console.log('[AriaSessionManager] Already connecting, skipping reconnect');\n return;\n }\n\n this.setStatus('connecting');\n\n try {\n this.ws = new WebSocket(this.config.websocketUrl);\n\n this.ws.onopen = () => {\n console.log('[AriaSessionManager] WebSocket reconnected successfully');\n this.setStatus('connected');\n this.reconnectAttempts = 0; // Reset on successful connection\n this.emit({ type: 'connection_change', data: { connected: true } });\n this.config.onConnectionStateChange?.(true);\n\n // If we have a valid session token, we're good to go\n // Otherwise, request a new session token\n if (this.sessionState.token && !this.isTokenExpired()) {\n console.log('[AriaSessionManager] Reconnected with existing valid session token');\n // If Anam client is initialized, we're ready\n if (this.anamClient) {\n this.setStatus('ready');\n }\n // Re-schedule refresh timer\n this.scheduleRefresh();\n } else if (this.config.preloadSession !== false && this.config.userId) {\n console.log('[AriaSessionManager] Reconnected, requesting new session token');\n this.requestSessionToken();\n }\n };\n\n this.ws.onmessage = (event) => this.handleWebSocketMessage(event);\n\n this.ws.onerror = (error) => {\n console.error('[AriaSessionManager] WebSocket reconnect error:', error);\n // Don't set error status here, let onclose handle reconnect scheduling\n };\n\n this.ws.onclose = (event) => {\n console.log('[AriaSessionManager] WebSocket disconnected during reconnect, code:', event.code);\n this.emit({ type: 'connection_change', data: { connected: false } });\n this.config.onConnectionStateChange?.(false);\n\n // Continue trying to reconnect\n if (this.autoReconnectEnabled && !this.isIntentionalDisconnect && !this.isPaused) {\n this.scheduleReconnect();\n }\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to reconnect WebSocket';\n console.error('[AriaSessionManager] Reconnect error:', errorMessage);\n \n // Schedule another reconnect attempt\n if (this.autoReconnectEnabled && !this.isIntentionalDisconnect && !this.isPaused) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Check if the current session token is expired\n */\n private isTokenExpired(): boolean {\n if (!this.sessionState.expires_at) {\n return false; // No expiry means token doesn't expire\n }\n const expiresAt = new Date(this.sessionState.expires_at).getTime();\n return Date.now() >= expiresAt;\n }\n\n /**\n * Check if the session token is valid and can be used\n * Public method for external checks\n */\n isSessionValid(): boolean {\n return this.sessionState.token !== null && !this.isTokenExpired();\n }\n\n /**\n * Get time until token expires in milliseconds\n * Returns -1 if no expiry or already expired\n */\n getTimeUntilExpiry(): number {\n if (!this.sessionState.expires_at) {\n return -1;\n }\n const expiresAt = new Date(this.sessionState.expires_at).getTime();\n const remaining = expiresAt - Date.now();\n return remaining > 0 ? remaining : -1;\n }\n\n /**\n * Clear the reconnect timer\n */\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n /**\n * Reset reconnect state (call when intentionally connecting)\n */\n private resetReconnectState(): void {\n this.reconnectAttempts = 0;\n this.isIntentionalDisconnect = false;\n this.clearReconnectTimer();\n }\n\n // ============================================================================\n // WebSocket Message Handling\n // ============================================================================\n\n private handleWebSocketMessage(event: MessageEvent): void {\n try {\n const parsedData: unknown = JSON.parse(event.data);\n\n // Handle session response\n if (isSessionResponse(parsedData)) {\n this.handleSessionResponse(parsedData);\n return;\n }\n\n // Handle message history acknowledgment\n if (isMessageHistoryAck(parsedData)) {\n console.log(`[AriaSessionManager] Message history acknowledged: ${parsedData.message_count} messages`);\n this.config.onMessageHistoryAck?.(parsedData.message_count);\n this.emit({ type: 'message_history', data: parsedData });\n return;\n }\n\n // Handle message stream acknowledgment\n if (isMessageStreamAck(parsedData)) {\n console.log('[AriaSessionManager] Message stream acknowledged');\n this.config.onMessageStreamAck?.();\n this.emit({ type: 'message_stream', data: parsedData });\n return;\n }\n\n // Handle session end acknowledgment\n if (isSessionEndAck(parsedData)) {\n console.log(`[AriaSessionManager] Session end acknowledged: ${parsedData.saved_count} messages saved`);\n this.config.onSessionEndAck?.(parsedData.saved_count);\n return;\n }\n\n // Handle session end error\n if (isSessionEndError(parsedData)) {\n console.error(`[AriaSessionManager] Session end error: ${parsedData.message}`);\n this.config.onSessionEndError?.(parsedData.message, parsedData.error);\n this.config.onError?.(new Error(`Session end failed: ${parsedData.error} - ${parsedData.message}`));\n return;\n }\n\n // Handle missing fields error\n if (isMissingFieldsError(parsedData)) {\n console.error(`[AriaSessionManager] Missing fields error: ${parsedData.message}`);\n this.config.onError?.(new Error(parsedData.message));\n return;\n }\n\n // Handle WebSocket trigger events\n if (isWebSocketTriggerEvent(parsedData)) {\n console.log('[AriaSessionManager] WebSocket trigger event received:', parsedData.data);\n this.config.onWebSocketEvent?.(parsedData);\n this.onWebSocketTrigger?.(parsedData);\n return;\n }\n\n // Handle generic acknowledgments\n if (isGenericAck(parsedData)) {\n console.log(`[AriaSessionManager] Generic acknowledgment: ${parsedData.message}`);\n return;\n }\n\n // Legacy support for old session_token format\n if (\n typeof parsedData === 'object' &&\n parsedData !== null &&\n 'type' in parsedData &&\n parsedData.type === 'session_token' &&\n 'sessionToken' in parsedData &&\n typeof parsedData.sessionToken === 'string'\n ) {\n console.warn('[AriaSessionManager] Received legacy session_token format, converting');\n this.handleSessionResponse({\n status: 'success',\n message: 'Session created successfully (legacy format)',\n session_data: {\n session_id: 'legacy',\n token: parsedData.sessionToken,\n expires_at: new Date(Date.now() + 3600000).toISOString(),\n },\n time_taken: 0,\n });\n return;\n }\n\n console.warn('[AriaSessionManager] Received unknown message type:', parsedData);\n } catch (err) {\n if (err instanceof SyntaxError) {\n console.error('[AriaSessionManager] Failed to parse WebSocket message:', event.data);\n this.config.onError?.(new Error('Invalid JSON received from WebSocket'));\n } else {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error';\n console.error('[AriaSessionManager] Error handling message:', errorMsg);\n this.config.onError?.(err instanceof Error ? err : new Error(errorMsg));\n }\n }\n }\n\n private handleSessionResponse(response: SessionResponse): void {\n const isRefreshing = this.sessionState.isRefreshing;\n\n if (response.status === 'success') {\n console.log('[AriaSessionManager] Session response:', response.message);\n\n if (response.session_data) {\n const sessionToken = response.session_data.sessionToken || response.session_data.token;\n\n if (!sessionToken) {\n console.error('[AriaSessionManager] No session token found in response');\n this.handleSessionError('No session token found in response');\n return;\n }\n\n console.log('[AriaSessionManager] Session token received successfully');\n console.log('[AriaSessionManager] Token expires at:', response.session_data.expires_at);\n\n this.updateSessionState({\n session_id: null, // Will be set when Anam client is ready\n token: sessionToken,\n expires_at: response.session_data.expires_at || null,\n isSessionReady: true,\n lastError: null,\n isRefreshing: false,\n isPreloaded: true, // Token is ready for use\n });\n\n // Set up proactive refresh timer based on expiration\n this.scheduleRefresh();\n\n // LAZY INITIALIZATION: Token is stored, Anam client will be initialized when widget opens\n if (this.deferAnamInit) {\n if (isRefreshing) {\n // Token was refreshed - if Anam client is already running, it continues to work\n // The new token will be used for the next session\n console.log('[AriaSessionManager] Session token refreshed proactively');\n this.config.onSessionRefresh?.();\n this.emit({ type: 'session_refresh', data: { token: sessionToken } });\n // Keep status as ready if Anam client is initialized\n if (this.anamClient) {\n this.setStatus('ready');\n } else {\n this.setStatus('connected');\n }\n } else if (this.isReconnecting) {\n // Token received during auto-reconnect - initialize Anam client immediately\n console.log('[AriaSessionManager] Token received during reconnect, initializing Anam client');\n this.initializeAnamClient(sessionToken)\n .then(() => {\n console.log('[AriaSessionManager] Anam client initialized after reconnect');\n this.isReconnecting = false;\n this.emit({ type: 'reconnecting', data: { isReconnecting: false } });\n })\n .catch((err) => {\n console.error('[AriaSessionManager] Failed to initialize Anam client during reconnect:', err);\n this.isReconnecting = false;\n this.emit({ type: 'reconnecting', data: { isReconnecting: false } });\n this.setStatus('error');\n this.updateSessionState({ lastError: 'Failed to reconnect session' });\n });\n } else {\n // Initial token received - ready for user to open widget\n console.log('[AriaSessionManager] Session token ready, waiting for user to open widget');\n this.setStatus('connected');\n this.emit({ type: 'session_ready', data: { sessionId: null, tokenReady: true, lazyInit: true } });\n this.config.onSessionPreloaded?.();\n }\n } else {\n // Non-lazy mode: Initialize Anam client immediately (old behavior)\n if (!this.anamClient) {\n this.initializeAnamClient(sessionToken);\n } else if (isRefreshing) {\n console.log('[AriaSessionManager] Session refreshed, token updated');\n this.config.onSessionRefresh?.();\n this.emit({ type: 'session_refresh', data: { token: sessionToken } });\n }\n }\n } else {\n console.log('[AriaSessionManager] Session response without data:', response.message);\n // Don't treat this as an error - the backend might be acknowledging something else\n this.updateSessionState({\n isRefreshing: false,\n });\n }\n } else {\n this.handleSessionError(`${response.error}: ${response.message}`);\n }\n }\n\n private handleSessionError(errorMsg: string): void {\n console.error('[AriaSessionManager] Session error:', errorMsg);\n\n this.updateSessionState({\n isSessionReady: false,\n lastError: errorMsg,\n isRefreshing: false,\n });\n\n this.setStatus('error');\n this.emit({ type: 'session_error', error: new Error(errorMsg) });\n this.config.onError?.(new Error(errorMsg));\n\n // Attempt retry with exponential backoff\n this.scheduleRetry();\n }\n\n // ============================================================================\n // Session Token Request (on component mount)\n // ============================================================================\n\n /**\n * Request a session token from the backend with user_trigger=true\n * This is called automatically when WebSocket connects\n * The token is stored and used when user opens the widget for the first time\n * \n * If user has had a session before (in this app lifecycle), skip_greeting is sent\n * to prevent the greeting from playing again on subsequent sessions.\n */\n private requestSessionToken(): void {\n // Don't request if session token already exists and is valid\n if (this.sessionState.token && !this.isTokenExpired()) {\n console.log('[AriaSessionManager] Valid session token already exists, skipping request');\n return;\n }\n\n // Don't request if already in progress\n if (this.status === 'preloading') {\n console.log('[AriaSessionManager] Session request already in progress');\n return;\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn('[AriaSessionManager] Cannot request session token: WebSocket not connected');\n return;\n }\n\n // Skip greeting if user has already had a session in this app lifecycle\n const shouldSkipGreeting = this.hasHadSessionBefore;\n \n console.log('[AriaSessionManager] Requesting session token with user_trigger=true for user:', this.config.userId, \n shouldSkipGreeting ? '(skip_greeting: true)' : '(with greeting)');\n this.setStatus('preloading');\n\n try {\n // Send user_trigger: true to get a valid session token\n // Include userId for backends that need it\n // Include skip_greeting if user has had a session before\n const message = JSON.stringify({ \n user_trigger: true,\n ...(this.config.userId && { userId: this.config.userId }),\n ...(shouldSkipGreeting && { skip_greeting: true })\n });\n console.log('[AriaSessionManager] Sending message:', message);\n this.ws.send(message);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to request session token';\n console.error('[AriaSessionManager] Session token request error:', errorMessage);\n this.handleSessionError(errorMessage);\n }\n }\n\n\n /**\n * Manually trigger a session (for user-initiated actions)\n * \n * NOTE: With global session management, this is typically not needed.\n * The session token is automatically requested when the provider mounts.\n * This method will request a new token if one doesn't exist or is expired.\n */\n triggerSession(userTrigger: boolean = true): void {\n // If session token already exists and is valid, don't request a new one\n if (this.sessionState.token && !this.isTokenExpired()) {\n console.log('[AriaSessionManager] Valid session token already exists, skipping trigger');\n return;\n }\n\n // If we're already in a preloading state, don't trigger\n if (this.status === 'preloading') {\n console.log('[AriaSessionManager] Session request already in progress, skipping trigger');\n return;\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.error('[AriaSessionManager] Cannot trigger session: WebSocket not connected');\n return;\n }\n\n // Skip greeting if user has already had a session in this app lifecycle\n const shouldSkipGreeting = this.hasHadSessionBefore;\n\n try {\n // Always use user_trigger: true with userId to ensure we get a valid session token\n // Include skip_greeting if user has had a session before\n const message = JSON.stringify({ \n user_trigger: true,\n userId: this.config.userId,\n ...(shouldSkipGreeting && { skip_greeting: true })\n });\n this.ws.send(message);\n console.log('[AriaSessionManager] Sent session request with user_trigger: true, userId:', this.config.userId,\n shouldSkipGreeting ? '(skip_greeting: true)' : '(with greeting)');\n\n if (userTrigger && this.config.userId) {\n this.config.onManualTrigger?.(this.config.userId);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to trigger session';\n console.error('[AriaSessionManager] Trigger error:', errorMessage);\n this.config.onError?.(err instanceof Error ? err : new Error(errorMessage));\n }\n }\n\n // ============================================================================\n // Anam Client Management\n // ============================================================================\n\n /**\n * Check if Anam client is initialized\n */\n isAnamClientInitialized(): boolean {\n return this.anamClient !== null;\n }\n\n /**\n * Check if session token is available (ready for on-demand initialization)\n */\n hasSessionToken(): boolean {\n return this.sessionState.token !== null;\n }\n\n /**\n * Initialize the Anam client on demand (called when widget opens)\n * This is the lazy initialization entry point - ensures greeting plays when user opens widget\n */\n async initializeSessionOnDemand(): Promise<void> {\n // Already initialized\n if (this.anamClient) {\n console.log('[AriaSessionManager] Anam client already initialized');\n return;\n }\n\n // Already initializing\n if (this.isAnamInitializing) {\n console.log('[AriaSessionManager] Anam client initialization already in progress');\n return;\n }\n\n // Check if token is expired and refresh if needed\n if (this.sessionState.token && this.isTokenExpired()) {\n console.log('[AriaSessionManager] Session token expired, requesting new token');\n // Clear the expired token\n this.updateSessionState({ token: null, isSessionReady: false });\n // Request a new token\n this.requestSessionToken();\n throw new Error('Session token expired, requesting new token');\n }\n\n // No token available\n if (!this.sessionState.token) {\n console.error('[AriaSessionManager] Cannot initialize on demand: no session token');\n throw new Error('No session token available');\n }\n\n console.log('[AriaSessionManager] Initializing Anam client on demand (user opened widget)');\n await this.initializeAnamClient(this.sessionState.token);\n }\n\n private async initializeAnamClient(sessionToken: string): Promise<void> {\n if (this.anamClient) {\n console.log('[AriaSessionManager] Anam client already initialized');\n return;\n }\n\n if (this.isAnamInitializing) {\n console.log('[AriaSessionManager] Anam client initialization already in progress');\n return;\n }\n\n this.isAnamInitializing = true;\n console.log('[AriaSessionManager] Initializing Anam client');\n this.setStatus('preloading');\n\n try {\n // Create hidden video element for preloading\n this.createHiddenVideoElement();\n\n // Dynamically import the Anam SDK (including AnamEvent)\n const { createClient, AnamEvent } = await import('@anam-ai/js-sdk');\n const client = createClient(sessionToken);\n\n // Set up event listeners\n // Note: SESSION_READY fires when Anam session is established, but video stream\n // may not be available yet. We'll emit our own session_ready event after stream() returns.\n client.addListener(AnamEvent.SESSION_READY, () => {\n const anamSessionId = client.getActiveSessionId();\n\n if (anamSessionId) {\n this.updateSessionState({ session_id: anamSessionId });\n console.log('[AriaSessionManager] Anam session ready with ID:', anamSessionId);\n }\n \n // Don't emit session_ready here - wait until video stream is available\n // The session_ready event will be emitted after client.stream() completes\n });\n\n client.addListener(AnamEvent.CONNECTION_CLOSED, () => {\n console.log('[AriaSessionManager] Anam connection closed');\n this.emit({ type: 'connection_change', data: { connected: false } });\n \n // If paused, clear the stale session so a new one is created on resume\n if (this.isPaused) {\n console.log('[AriaSessionManager] Anam disconnected while paused, clearing stale session');\n this.clearStaleSessionForResume();\n return;\n }\n \n // Auto-reconnect if widget is open:\n // 1. Auto-reconnect on Anam disconnect is enabled\n // 2. Not intentionally disconnected (user didn't close widget)\n // 3. Not already reconnecting\n if (this.autoReconnectOnAnamDisconnect && \n !this.isIntentionalDisconnect && \n !this.isReconnecting) {\n console.log('[AriaSessionManager] Anam disconnected unexpectedly, auto-reconnecting...');\n this.autoReconnectSession();\n }\n });\n\n client.addListener(AnamEvent.MESSAGE_HISTORY_UPDATED, (messages) => {\n // Ensure we have session_id before sending (may arrive before SESSION_READY event)\n if (!this.sessionState.session_id) {\n const anamSessionId = client.getActiveSessionId();\n if (anamSessionId) {\n this.updateSessionState({ session_id: anamSessionId });\n console.log('[AriaSessionManager] Got session ID from message history event:', anamSessionId);\n }\n }\n\n this.chatMessages = messages.map(msg => ({\n role: msg.role as 'user' | 'persona',\n content: msg.content,\n timestamp: Date.now(),\n }));\n\n const anamMessages: AnamMessage[] = messages.map(msg => ({\n role: msg.role as 'user' | 'persona',\n content: msg.content,\n timestamp: new Date().toISOString(),\n }));\n\n this.sendMessageHistory(anamMessages);\n this.emit({ type: 'message_history', data: { messages: this.chatMessages } });\n });\n\n client.addListener(AnamEvent.MESSAGE_STREAM_EVENT_RECEIVED, (event: AnamMessageStreamEvent) => {\n // Ensure we have session_id before sending (may arrive before SESSION_READY event)\n if (!this.sessionState.session_id) {\n const anamSessionId = client.getActiveSessionId();\n if (anamSessionId) {\n this.updateSessionState({ session_id: anamSessionId });\n console.log('[AriaSessionManager] Got session ID from message stream event:', anamSessionId);\n }\n }\n\n if (event.role === 'persona') {\n this.liveTranscript += event.content;\n } else if (event.role === 'user') {\n this.liveTranscript = '';\n }\n\n const anamMessage: AnamMessage = {\n role: event.role,\n content: event.content,\n timestamp: new Date().toISOString(),\n };\n this.sendMessageStream(anamMessage, event.is_final ?? false);\n this.emit({ type: 'message_stream', data: { event, liveTranscript: this.liveTranscript } });\n });\n\n // Listen for tool call events\n client.addListener(AnamEvent.CLIENT_TOOL_EVENT_RECEIVED, (toolEvent: ClientToolEvent) => {\n console.log('[AriaSessionManager] Tool call event received:', toolEvent.eventName);\n this.isToolCallActive = true;\n this.activeToolCall = toolEvent;\n this.emit({ \n type: 'tool_call', \n data: { \n isActive: true, \n toolName: toolEvent.eventName,\n toolData: toolEvent.eventData,\n toolEvent \n } \n });\n\n // Auto-clear tool call state after a timeout (tool calls should complete)\n // This is a fallback in case we don't receive a completion signal\n setTimeout(() => {\n if (this.activeToolCall?.eventUid === toolEvent.eventUid) {\n this.clearToolCallState();\n }\n }, 30000); // 30 second timeout\n });\n\n this.anamClient = client;\n\n // Get user microphone input\n this.audioInputStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n\n // Create hidden audio element for proper audio playback\n this.createHiddenAudioElement();\n\n // Use stream() to get the video/audio stream, then handle audio separately\n // The stream() method returns [videoStream, audioStream]\n const streams = await client.stream(this.audioInputStream);\n const videoStream = streams[0];\n const audioStream = streams[1]; // Audio stream from Anam\n \n this.videoStream = videoStream;\n\n // Attach video stream to hidden video element (for preloading)\n if (this.hiddenVideoElement) {\n this.hiddenVideoElement.srcObject = videoStream;\n this.hiddenVideoElement.muted = true; // Video element stays muted\n }\n \n // Attach audio stream to hidden audio element for proper audio playback\n // This is the key fix: audio comes through a separate stream that we play through an audio element\n if (this.hiddenAudioElement && audioStream) {\n this.hiddenAudioElement.srcObject = audioStream;\n // Audio element is NOT muted - this is where Aria's voice comes from\n this.hiddenAudioElement.muted = false;\n this.hiddenAudioElement.play().catch((err) => {\n console.warn('[AriaSessionManager] Initial audio play failed (may need user interaction):', err);\n });\n console.log('[AriaSessionManager] Audio stream attached to audio element');\n } else {\n console.log('[AriaSessionManager] No separate audio stream available, audio may come through video');\n }\n\n // NOW emit session_ready - video stream is available\n // This is the correct time to notify the UI that it can attach the video element\n this.isAnamInitializing = false;\n this.setStatus('ready');\n const anamSessionId = client.getActiveSessionId();\n console.log('[AriaSessionManager] Session fully ready with video stream, ID:', anamSessionId);\n this.emit({ type: 'session_ready', data: { sessionId: anamSessionId, streamReady: true } });\n this.config.onSessionReady?.();\n\n // Mark that user has had a session - subsequent sessions will skip greeting\n if (!this.hasHadSessionBefore) {\n this.hasHadSessionBefore = true;\n console.log('[AriaSessionManager] First session started - subsequent sessions will skip greeting');\n }\n\n console.log('[AriaSessionManager] Anam client initialized and streaming');\n } catch (err) {\n this.isAnamInitializing = false;\n const errorMessage = err instanceof Error ? err.message : 'Failed to initialize Anam client';\n console.error('[AriaSessionManager] Anam client error:', errorMessage);\n this.setStatus('error');\n this.updateSessionState({ lastError: errorMessage });\n this.config.onError?.(err instanceof Error ? err : new Error(errorMessage));\n throw err;\n }\n }\n\n /**\n * Clear tool call state\n */\n private clearToolCallState(): void {\n if (this.isToolCallActive) {\n this.isToolCallActive = false;\n this.activeToolCall = null;\n this.emit({ type: 'tool_call', data: { isActive: false, toolName: null, toolData: null } });\n }\n }\n\n /**\n * Get current tool call state\n */\n getToolCallState(): { isActive: boolean; toolName: string | null; toolData: Record<string, unknown> | null } {\n return {\n isActive: this.isToolCallActive,\n toolName: this.activeToolCall?.eventName ?? null,\n toolData: this.activeToolCall?.eventData ?? null,\n };\n }\n\n private createHiddenVideoElement(): void {\n if (this.hiddenVideoElement) return;\n\n this.hiddenVideoElement = document.createElement('video');\n this.hiddenVideoElement.autoplay = true;\n this.hiddenVideoElement.playsInline = true;\n this.hiddenVideoElement.muted = true; // Video is muted, audio comes from separate audio element\n this.hiddenVideoElement.style.position = 'absolute';\n this.hiddenVideoElement.style.width = '1px';\n this.hiddenVideoElement.style.height = '1px';\n this.hiddenVideoElement.style.opacity = '0';\n this.hiddenVideoElement.style.pointerEvents = 'none';\n this.hiddenVideoElement.style.zIndex = '-9999';\n\n document.body.appendChild(this.hiddenVideoElement);\n console.log('[AriaSessionManager] Hidden video element created');\n }\n\n private createHiddenAudioElement(): void {\n if (this.hiddenAudioElement) return;\n\n this.hiddenAudioElement = document.createElement('audio');\n this.hiddenAudioElement.autoplay = true;\n // Audio element is NOT muted - this is where Aria's voice comes from\n // The Anam SDK handles audio through this element, ensuring proper playback\n this.hiddenAudioElement.style.position = 'absolute';\n this.hiddenAudioElement.style.width = '1px';\n this.hiddenAudioElement.style.height = '1px';\n this.hiddenAudioElement.style.opacity = '0';\n this.hiddenAudioElement.style.pointerEvents = 'none';\n this.hiddenAudioElement.style.zIndex = '-9999';\n\n document.body.appendChild(this.hiddenAudioElement);\n console.log('[AriaSessionManager] Hidden audio element created');\n }\n\n private removeHiddenVideoElement(): void {\n if (this.hiddenVideoElement) {\n this.hiddenVideoElement.srcObject = null;\n this.hiddenVideoElement.remove();\n this.hiddenVideoElement = null;\n }\n }\n\n private removeHiddenAudioElement(): void {\n if (this.hiddenAudioElement) {\n this.hiddenAudioElement.srcObject = null;\n this.hiddenAudioElement.pause();\n this.hiddenAudioElement.remove();\n this.hiddenAudioElement = null;\n }\n }\n\n // ============================================================================\n // Video Stream Management\n // ============================================================================\n\n /**\n * Get the current video stream\n */\n getVideoStream(): MediaStream | null {\n return this.videoStream;\n }\n\n /**\n * Attach the video stream to a visible video element\n * Audio is handled by the hidden audio element if available, otherwise through video element\n */\n attachToVideoElement(element: HTMLVideoElement): void {\n if (this.videoStream) {\n // Log track status for debugging (but don't block attachment)\n const tracks = this.videoStream.getTracks();\n const activeTracks = tracks.filter(track => track.readyState === 'live');\n const audioTracks = tracks.filter(track => track.kind === 'audio');\n console.log('[AriaSessionManager] Attaching video stream, tracks:', tracks.length, 'active:', activeTracks.length, 'audio:', audioTracks.length);\n \n element.srcObject = this.videoStream;\n \n // Check if we have a separate audio element with audio\n const hasAudioElement = this.hiddenAudioElement && this.hiddenAudioElement.srcObject;\n \n if (hasAudioElement) {\n // Audio comes from separate audio element - keep video muted\n element.muted = true;\n // Ensure audio element is playing and not muted\n this.hiddenAudioElement!.muted = false;\n this.hiddenAudioElement!.play().catch((err) => {\n console.warn('[AriaSessionManager] Audio play failed:', err);\n });\n console.log('[AriaSessionManager] Audio playing through separate audio element');\n } else {\n // No separate audio element - audio comes through video element\n element.muted = false;\n console.log('[AriaSessionManager] Audio playing through video element');\n }\n \n // Ensure the video plays (important when re-attaching after pause/resume or minimize/maximize)\n element.play().catch((err) => {\n // Autoplay might be blocked, but usually works since user has interacted\n console.warn('[AriaSessionManager] Video play failed:', err);\n });\n } else {\n // No video stream - this is expected during session initialization or after session ended\n // Don't log as warning during normal operation\n console.log('[AriaSessionManager] No video stream available to attach (session may be initializing)');\n }\n }\n\n /**\n * Detach video stream from visible element (when widget closes)\n */\n detachFromVideoElement(element: HTMLVideoElement): void {\n element.srcObject = null;\n \n // Keep stream on hidden element\n if (this.hiddenVideoElement && this.videoStream) {\n this.hiddenVideoElement.srcObject = this.videoStream;\n this.hiddenVideoElement.muted = true;\n }\n \n // Mute audio when widget closes (but keep it attached for quick resume)\n if (this.hiddenAudioElement) {\n this.hiddenAudioElement.muted = true;\n console.log('[AriaSessionManager] Audio element muted (widget closed)');\n }\n \n console.log('[AriaSessionManager] Video stream detached from visible element');\n }\n\n // ============================================================================\n // Chat State\n // ============================================================================\n\n getChatMessages(): ChatMessage[] {\n return [...this.chatMessages];\n }\n\n getLiveTranscript(): string {\n return this.liveTranscript;\n }\n\n clearLiveTranscript(): void {\n this.liveTranscript = '';\n }\n\n // ============================================================================\n // Message Sending\n // ============================================================================\n\n private sendMessageHistory(messages: AnamMessage[], force: boolean = false): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.log('[AriaSessionManager] Cannot send message history: WebSocket not connected');\n return;\n }\n if (!this.sessionState.session_id) {\n console.log('[AriaSessionManager] Cannot send message history: no session_id');\n return;\n }\n if (!this.config.userId) {\n console.log('[AriaSessionManager] Cannot send message history: no userId');\n return;\n }\n\n if (!force && JSON.stringify(messages) === JSON.stringify(this.lastMessageHistory)) {\n return;\n }\n\n this.lastMessageHistory = messages;\n\n const payload: MessageHistoryEvent = {\n type: 'message_history',\n session_id: this.sessionState.session_id,\n user_id: this.config.userId,\n messages,\n };\n\n try {\n this.ws.send(JSON.stringify(payload));\n console.log('[AriaSessionManager] Sent message history:', messages.length, 'messages to session:', this.sessionState.session_id);\n } catch (err) {\n console.error('[AriaSessionManager] Failed to send message history:', err);\n }\n }\n\n private sendMessageStream(message: AnamMessage, is_final: boolean): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.log('[AriaSessionManager] Cannot send message stream: WebSocket not connected');\n return;\n }\n if (!this.sessionState.session_id) {\n console.log('[AriaSessionManager] Cannot send message stream: no session_id');\n return;\n }\n if (!this.config.userId) {\n console.log('[AriaSessionManager] Cannot send message stream: no userId');\n return;\n }\n\n const payload: MessageStreamEvent = {\n type: 'message_stream',\n session_id: this.sessionState.session_id,\n user_id: this.config.userId,\n message: { ...message, is_final },\n };\n\n try {\n this.ws.send(JSON.stringify(payload));\n if (is_final) {\n console.log('[AriaSessionManager] Sent final message stream:', message.role, 'to session:', this.sessionState.session_id);\n }\n } catch (err) {\n console.error('[AriaSessionManager] Failed to send message stream:', err);\n }\n }\n\n sendSessionEnd(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.log('[AriaSessionManager] Cannot send session end: WebSocket not connected');\n return;\n }\n if (!this.sessionState.session_id) {\n console.log('[AriaSessionManager] Cannot send session end: no session_id');\n return;\n }\n if (!this.config.userId) {\n console.log('[AriaSessionManager] Cannot send session end: no userId');\n return;\n }\n\n // Send final message history before ending session\n if (this.lastMessageHistory.length > 0) {\n console.log('[AriaSessionManager] Sending final message history before session end:', this.lastMessageHistory.length, 'messages');\n this.sendMessageHistory(this.lastMessageHistory, true);\n }\n\n const payload: SessionEndEvent = {\n type: 'session_end',\n session_id: this.sessionState.session_id,\n user_id: this.config.userId,\n };\n\n try {\n this.ws.send(JSON.stringify(payload));\n console.log('[AriaSessionManager] Sent session end event for session:', this.sessionState.session_id);\n } catch (err) {\n console.error('[AriaSessionManager] Failed to send session end:', err);\n }\n }\n\n // ============================================================================\n // Anam Client Actions\n // ============================================================================\n\n async sendMessage(message: string): Promise<void> {\n if (!this.anamClient) {\n throw new Error('Anam client not initialized');\n }\n\n try {\n await this.anamClient.talk(message);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to send message';\n this.config.onError?.(err instanceof Error ? err : new Error(errorMessage));\n throw err;\n }\n }\n\n toggleMute(): boolean {\n if (!this.anamClient) return false;\n\n const currentState = this.anamClient.getInputAudioState();\n if (currentState.isMuted) {\n this.anamClient.unmuteInputAudio();\n return false;\n } else {\n this.anamClient.muteInputAudio();\n return true;\n }\n }\n\n isMuted(): boolean {\n return this.anamClient?.getInputAudioState().isMuted ?? false;\n }\n\n async stopStreaming(): Promise<void> {\n if (this.anamClient) {\n try {\n await this.anamClient.stopStreaming();\n } catch (err) {\n console.error('[AriaSessionManager] Error stopping streaming:', err);\n }\n this.anamClient = null;\n }\n\n if (this.audioInputStream) {\n this.audioInputStream.getTracks().forEach(track => track.stop());\n this.audioInputStream = null;\n }\n\n this.videoStream = null;\n this.chatMessages = [];\n this.liveTranscript = '';\n this.lastMessageHistory = [];\n \n // Clean up hidden elements\n this.removeHiddenVideoElement();\n this.removeHiddenAudioElement();\n \n // Reset session state so next open creates a new session\n this.resetSessionState();\n this.setStatus('idle');\n }\n\n // ============================================================================\n // Session Refresh\n // ============================================================================\n\n private scheduleRefresh(): void {\n this.clearRefreshTimer();\n\n if (!this.sessionState.expires_at) {\n console.log('[AriaSessionManager] No expiration time, skipping refresh scheduling');\n return;\n }\n\n const expiresAt = new Date(this.sessionState.expires_at).getTime();\n const now = Date.now();\n const bufferMs = this.refreshConfig.bufferMinutes * 60 * 1000;\n const refreshAt = expiresAt - bufferMs;\n const delay = Math.max(0, refreshAt - now);\n const timeToExpiry = expiresAt - now;\n\n console.log(`[AriaSessionManager] Token expires at: ${new Date(expiresAt).toISOString()}`);\n console.log(`[AriaSessionManager] Time until expiry: ${Math.round(timeToExpiry / 1000 / 60)} minutes`);\n console.log(`[AriaSessionManager] Refresh buffer: ${this.refreshConfig.bufferMinutes} minutes`);\n\n if (delay <= 0) {\n // Already past refresh time, refresh immediately\n console.log('[AriaSessionManager] Session expiring soon, refreshing immediately');\n this.refreshSession();\n } else {\n console.log(`[AriaSessionManager] Scheduling proactive refresh in ${Math.round(delay / 1000 / 60)} minutes`);\n this.refreshTimer = setTimeout(() => {\n console.log('[AriaSessionManager] Proactive refresh timer fired');\n this.refreshSession();\n }, delay);\n }\n }\n\n async refreshSession(): Promise<void> {\n // Check tab visibility\n if (this.refreshConfig.refreshOnlyWhenVisible && !this.isTabVisible) {\n console.log('[AriaSessionManager] Tab not visible, deferring refresh');\n this.pendingRefresh = true;\n return;\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn('[AriaSessionManager] Cannot refresh: WebSocket not connected');\n // Try to reconnect if not connected\n if (!this.isIntentionalDisconnect && !this.isPaused) {\n this.connect();\n }\n return;\n }\n\n if (this.sessionState.isRefreshing) {\n console.log('[AriaSessionManager] Refresh already in progress');\n return;\n }\n\n console.log('[AriaSessionManager] Refreshing session token (proactive refresh)');\n this.updateSessionState({ isRefreshing: true });\n this.setStatus('refreshing');\n\n // Always skip greeting on refresh since user has already had a session\n const shouldSkipGreeting = this.hasHadSessionBefore;\n\n try {\n // Use user_trigger: true with userId to get a fresh valid session token\n // Include skip_greeting if user has had a session before\n const message = JSON.stringify({ \n user_trigger: true,\n userId: this.config.userId,\n ...(shouldSkipGreeting && { skip_greeting: true })\n });\n this.ws.send(message);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to refresh session';\n console.error('[AriaSessionManager] Refresh error:', errorMessage);\n this.updateSessionState({ isRefreshing: false });\n this.config.onSessionRefreshError?.(err instanceof Error ? err : new Error(errorMessage));\n this.scheduleRetry();\n }\n }\n\n // ============================================================================\n // Retry Logic\n // ============================================================================\n\n private scheduleRetry(): void {\n if (this.retryCount >= this.refreshConfig.maxRetries) {\n console.error('[AriaSessionManager] Max retries reached');\n this.setStatus('error');\n this.updateSessionState({ lastError: 'Failed to get session token after max retries' });\n return;\n }\n\n const delay = this.refreshConfig.baseRetryDelay * Math.pow(2, this.retryCount);\n this.retryCount++;\n\n console.log(`[AriaSessionManager] Scheduling retry ${this.retryCount}/${this.refreshConfig.maxRetries} in ${delay}ms`);\n\n this.retryTimer = setTimeout(() => {\n if (this.isConnected()) {\n console.log('[AriaSessionManager] Retrying session token request');\n this.requestSessionToken();\n } else {\n console.log('[AriaSessionManager] Reconnecting WebSocket for retry');\n this.connect();\n }\n }, delay);\n }\n\n // ============================================================================\n // Tab Visibility\n // ============================================================================\n\n private setupVisibilityListener(): void {\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n }\n\n private handleVisibilityChange = (): void => {\n this.isTabVisible = document.visibilityState === 'visible';\n\n if (this.isTabVisible && this.pendingRefresh) {\n console.log('[AriaSessionManager] Tab visible, executing pending refresh');\n this.pendingRefresh = false;\n this.refreshSession();\n }\n };\n\n // ============================================================================\n // Session Persistence (beforeunload handler)\n // ============================================================================\n\n private setupBeforeUnloadHandler(): void {\n if (typeof window !== 'undefined') {\n this.beforeUnloadHandler = () => {\n // Always end session when tab/window closes\n if (this.sessionState.session_id) {\n console.log('[AriaSessionManager] Tab closing, ending session');\n this.sendSessionEnd();\n }\n };\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\n }\n }\n\n private removeBeforeUnloadHandler(): void {\n if (typeof window !== 'undefined' && this.beforeUnloadHandler) {\n window.removeEventListener('beforeunload', this.beforeUnloadHandler);\n this.beforeUnloadHandler = null;\n }\n }\n\n // ============================================================================\n // Session Pause/Resume (for persistSession feature)\n // ============================================================================\n\n /**\n * Check if session persistence is enabled\n * Returns FALSE - sessions are ended when widget closes to save Anam resources\n * A new session with skip_greeting is created when widget reopens\n */\n isPersistSessionEnabled(): boolean {\n // Always false - closing widget ends session, reopening creates new one with skip_greeting\n return false;\n }\n\n /**\n * Check if WebSocket should stay alive when paused\n */\n shouldKeepWebSocketAlive(): boolean {\n // Default to true if persistSession is enabled\n return this.config.keepWebSocketAlive !== false;\n }\n\n /**\n * Check if widget is closed (session was ended on close)\n * Note: With the new behavior, sessions are ended when widget closes,\n * not paused. This returns true if the widget was closed.\n */\n isSessionPaused(): boolean {\n // Returns true if we don't have an active Anam client (session was ended)\n return !this.anamClient && this.hasHadSessionBefore;\n }\n\n /**\n * Pause the session (called when widget closes / user hangs up)\n * \n * NEW BEHAVIOR: Ends the Anam session to save resources.\n * When widget reopens, a new session is created with skip_greeting: true\n * so the greeting doesn't play again.\n * \n * This is more resource-efficient than keeping the session alive.\n */\n async pauseSession(): Promise<void> {\n // Only end if we have an active Anam client\n if (!this.anamClient) {\n console.log('[AriaSessionManager] No active Anam client, nothing to pause/end');\n return;\n }\n\n console.log('[AriaSessionManager] Widget closed - ending Anam session (will skip greeting on reopen)');\n \n // End the current session - this frees up Anam resources\n // The next session will have skip_greeting: true since hasHadSessionBefore is set\n await this.endCurrentSession();\n\n this.config.onSessionPaused?.();\n }\n\n /**\n * Resume the session (called when widget reopens)\n * \n * Since we end the session on pause (to free Anam resources), this requests a new\n * session token with skip_greeting: true, then initializes the Anam client.\n * \n * @returns true if session is ready or initialization started, false if waiting for token\n */\n async resumeSession(): Promise<boolean> {\n console.log('[AriaSessionManager] Widget reopened - will create new session with skip_greeting');\n \n // Reset intentional disconnect flag since user is reopening\n this.isIntentionalDisconnect = false;\n\n // If we already have an active Anam client, we're good\n if (this.anamClient && this.videoStream) {\n console.log('[AriaSessionManager] Active session exists, no need to create new one');\n this.setStatus('ready');\n this.config.onSessionResumed?.();\n return true;\n }\n\n // Check if we have a preloaded session token ready\n if (this.sessionState.token && !this.isTokenExpired()) {\n console.log('[AriaSessionManager] Session token ready, initializing Anam client (skip_greeting applied)');\n try {\n await this.initializeAnamClient(this.sessionState.token);\n this.config.onSessionResumed?.();\n return true;\n } catch (err) {\n console.error('[AriaSessionManager] Failed to initialize session on resume:', err);\n // Token might be invalid, request a new one\n this.updateSessionState({ token: null, isSessionReady: false });\n }\n }\n\n // No valid token, need to request one (will include skip_greeting: true)\n if (this.isConnected()) {\n console.log('[AriaSessionManager] Requesting new session token for resume');\n this.requestSessionToken();\n } else {\n console.log('[AriaSessionManager] WebSocket not connected, reconnecting...');\n this.connect();\n }\n\n // Return false to indicate session is being created asynchronously\n // The caller should wait for session_ready event\n return false;\n }\n\n /**\n * Reset session state (used when session expires or needs to be recreated)\n */\n private resetSessionState(): void {\n this.sessionState = {\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n };\n this.isPaused = false;\n }\n\n /**\n * Force end the session (explicit user action or logout)\n * This always ends the session regardless of persistSession setting\n * \n * @param resetGreeting - If true, resets the greeting state so next session shows greeting (useful for logout)\n */\n async forceEndSession(resetGreeting: boolean = false): Promise<void> {\n console.log('[AriaSessionManager] Force ending session', resetGreeting ? '(resetting greeting state)' : '');\n \n // Send session end event\n this.sendSessionEnd();\n \n // Stop streaming and cleanup\n await this.stopStreaming();\n \n // Reset state\n this.resetSessionState();\n this.isPaused = false;\n \n // Optionally reset greeting state (for logout scenarios)\n if (resetGreeting) {\n this.hasHadSessionBefore = false;\n console.log('[AriaSessionManager] Greeting state reset - next session will show greeting');\n }\n \n this.setStatus('idle');\n }\n\n /**\n * Reset the greeting state so the next session will show the greeting\n * Call this when user logs out or you want to show greeting again\n */\n resetGreetingState(): void {\n this.hasHadSessionBefore = false;\n console.log('[AriaSessionManager] Greeting state reset - next session will show greeting');\n }\n\n /**\n * Check if greeting will be skipped on next session\n */\n willSkipGreeting(): boolean {\n return this.hasHadSessionBefore;\n }\n\n // ============================================================================\n // Auto-Reconnect on Anam Disconnect (Inactivity Timeout)\n // ============================================================================\n\n /**\n * Check if the session is currently reconnecting\n */\n isSessionReconnecting(): boolean {\n return this.isReconnecting;\n }\n\n /**\n * Enable or disable auto-reconnect when Anam disconnects (e.g., due to inactivity)\n */\n setAutoReconnectOnAnamDisconnect(enabled: boolean): void {\n this.autoReconnectOnAnamDisconnect = enabled;\n }\n\n /**\n * Auto-reconnect the session after Anam disconnects (e.g., due to inactivity timeout)\n * This creates a new session seamlessly without user intervention\n */\n private async autoReconnectSession(): Promise<void> {\n if (this.isReconnecting) {\n console.log('[AriaSessionManager] Already reconnecting, skipping');\n return;\n }\n\n console.log('[AriaSessionManager] Starting auto-reconnect...');\n this.isReconnecting = true;\n this.emit({ type: 'reconnecting', data: { isReconnecting: true } });\n\n try {\n // Clean up old session (but don't send session_end - Anam connection already closed)\n await this.cleanupForReconnect();\n\n // Ensure WebSocket is connected\n if (!this.isConnected()) {\n console.log('[AriaSessionManager] WebSocket not connected, reconnecting...');\n this.connect();\n // Wait for WebSocket to connect (the session token request happens automatically)\n return; // handleSessionResponse will continue the flow\n }\n\n // Request new session token\n console.log('[AriaSessionManager] Requesting new session token for reconnect');\n this.requestSessionToken();\n \n // The handleSessionResponse will receive the token and we'll initialize from there\n } catch (err) {\n console.error('[AriaSessionManager] Auto-reconnect failed:', err);\n this.isReconnecting = false;\n this.emit({ type: 'reconnecting', data: { isReconnecting: false } });\n this.setStatus('error');\n this.updateSessionState({ lastError: 'Failed to reconnect session' });\n this.config.onError?.(err instanceof Error ? err : new Error('Failed to reconnect session'));\n }\n }\n\n /**\n * Clean up resources for reconnection (without sending session_end)\n */\n private async cleanupForReconnect(): Promise<void> {\n console.log('[AriaSessionManager] Cleaning up for reconnect');\n\n // Stop Anam client without sending session_end (connection already closed)\n if (this.anamClient) {\n try {\n await this.anamClient.stopStreaming();\n } catch (err) {\n // Ignore - connection already closed\n console.log('[AriaSessionManager] Anam stopStreaming error (expected):', err);\n }\n this.anamClient = null;\n }\n\n // Stop audio input\n if (this.audioInputStream) {\n this.audioInputStream.getTracks().forEach(track => track.stop());\n this.audioInputStream = null;\n }\n\n // Clear video stream\n this.videoStream = null;\n\n // Remove hidden elements (will be recreated)\n this.removeHiddenVideoElement();\n this.removeHiddenAudioElement();\n\n // Clear chat state for fresh session\n this.chatMessages = [];\n this.liveTranscript = '';\n this.lastMessageHistory = [];\n\n // Clear tool call state\n this.clearToolCallState();\n\n // Reset session state for new session (keep WebSocket connected)\n this.updateSessionState({\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n });\n\n this.isAnamInitializing = false;\n }\n\n /**\n * Clear stale session data when Anam disconnects while paused\n * This ensures a fresh session is created when the widget reopens\n */\n private clearStaleSessionForResume(): void {\n console.log('[AriaSessionManager] Clearing stale session for resume');\n\n // Clear Anam client reference (already disconnected)\n this.anamClient = null;\n\n // Clear video/audio streams\n this.videoStream = null;\n if (this.audioInputStream) {\n this.audioInputStream.getTracks().forEach(track => track.stop());\n this.audioInputStream = null;\n }\n\n // Remove hidden elements\n this.removeHiddenVideoElement();\n this.removeHiddenAudioElement();\n\n // Clear the stale token so a new one is requested on resume\n this.updateSessionState({\n session_id: null,\n token: null,\n isSessionReady: false,\n isPreloaded: false,\n });\n\n // Reset initialization flag\n this.isAnamInitializing = false;\n\n // Keep isPaused = true so resumeSession flow is triggered\n // Keep WebSocket connected for faster reconnection\n console.log('[AriaSessionManager] Stale session cleared, ready for fresh session on resume');\n }\n\n /**\n * End the current session but keep WebSocket connected for new session creation\n * This is called when widget closes without persistSession enabled\n * The next time the widget opens, a new session will be created\n */\n async endCurrentSession(): Promise<void> {\n console.log('[AriaSessionManager] Ending current session (keeping WebSocket alive)');\n \n // Mark as intentional disconnect to prevent auto-reconnect when Anam connection closes\n this.isIntentionalDisconnect = true;\n \n // Send session end event to backend\n this.sendSessionEnd();\n \n // Stop the Anam client and streaming\n if (this.anamClient) {\n try {\n await this.anamClient.stopStreaming();\n } catch (err) {\n console.error('[AriaSessionManager] Error stopping streaming:', err);\n }\n this.anamClient = null;\n }\n\n // Stop audio input\n if (this.audioInputStream) {\n this.audioInputStream.getTracks().forEach(track => track.stop());\n this.audioInputStream = null;\n }\n\n // Clear video stream\n this.videoStream = null;\n \n // Clear chat state\n this.chatMessages = [];\n this.liveTranscript = '';\n this.lastMessageHistory = [];\n \n // Clear tool call state\n this.clearToolCallState();\n \n // Reset session state but keep WebSocket connected\n // This allows a new session to be created when widget reopens\n this.updateSessionState({\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n });\n \n this.isPaused = false;\n this.isAnamInitializing = false;\n \n // Set status to connected (WebSocket is still alive) rather than idle\n // Don't request new token here - wait until widget reopens\n if (this.isConnected()) {\n this.setStatus('connected');\n console.log('[AriaSessionManager] Session ended, ready for new session when widget reopens');\n } else {\n this.setStatus('idle');\n }\n }\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n private clearTimers(): void {\n this.clearRefreshTimer();\n this.clearReconnectTimer();\n this.clearRetryTimer();\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n private clearRetryTimer(): void {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n }\n\n /**\n * Set callback for WebSocket trigger events\n */\n setWebSocketTriggerCallback(callback: ((event: WebSocketTriggerEvent) => void) | null): void {\n this.onWebSocketTrigger = callback;\n }\n\n /**\n * Destroy the session manager and clean up all resources\n */\n destroy(): void {\n console.log('[AriaSessionManager] Destroying instance');\n\n // Send session end if active\n if (this.sessionState.session_id) {\n this.sendSessionEnd();\n }\n\n // Stop streaming (this also removes hidden elements)\n this.stopStreaming();\n\n // Remove hidden elements (in case stopStreaming didn't run)\n this.removeHiddenVideoElement();\n this.removeHiddenAudioElement();\n\n // Clear timers\n this.clearTimers();\n\n // Disconnect WebSocket\n this.disconnect();\n\n // Remove visibility listener\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n // Remove beforeunload handler\n this.removeBeforeUnloadHandler();\n\n // Clear listeners\n this.listeners.clear();\n\n // Reset state\n this.resetSessionState();\n }\n}\n\nexport default AriaSessionManager;\n","/**\n * AriaCore - Main entry point for the Aria SDK\n * \n * This class provides a simple, function-based API for initializing and controlling\n * the Aria AI assistant. All session management is handled internally.\n * \n * @example\n * ```typescript\n * import { Aria } from '@centive/aria-sdk';\n * \n * // Initialize the SDK\n * Aria.init({\n * websocketUrl: 'wss://your-server.com/ws',\n * userId: 'user_123',\n * theme: 'light',\n * onError: (err) => console.error(err),\n * });\n * \n * // Programmatic control\n * Aria.open(); // Open the assistant\n * Aria.close(); // Close the assistant\n * Aria.destroy(); // Cleanup when done\n * ```\n */\n\nimport { AriaSessionManager } from './AriaSessionManager';\nimport type { AriaInitConfig, AriaSDKConfig, Theme } from '@/types';\n\n// ============================================================================\n// Internal State\n// ============================================================================\n\ninterface AriaCoreState {\n initialized: boolean;\n config: AriaInitConfig | null;\n sessionManager: AriaSessionManager | null;\n uiContainer: HTMLDivElement | null;\n reactRoot: unknown | null; // React root for rendering\n}\n\nconst state: AriaCoreState = {\n initialized: false,\n config: null,\n sessionManager: null,\n uiContainer: null,\n reactRoot: null,\n};\n\n// ============================================================================\n// AriaCore Class (Static Methods Only)\n// ============================================================================\n\nexport class AriaCore {\n /**\n * Initialize the Aria SDK with the given configuration.\n * This sets up the WebSocket connection, session management, and UI components.\n * \n * @param config - Configuration options for the SDK\n * @throws Error if already initialized (call destroy() first)\n * \n * @example\n * ```typescript\n * Aria.init({\n * websocketUrl: 'wss://your-server.com/ws',\n * userId: 'user_123',\n * theme: 'dark',\n * triggerLabel: 'Help',\n * onError: (err) => console.error('Aria error:', err),\n * });\n * ```\n */\n static init(config: AriaInitConfig): void {\n if (state.initialized) {\n console.warn('[AriaCore] Already initialized. Call Aria.destroy() before re-initializing.');\n return;\n }\n\n // Validate required fields\n if (!config.websocketUrl) {\n throw new Error('[AriaCore] websocketUrl is required');\n }\n if (!config.userId) {\n throw new Error('[AriaCore] userId is required');\n }\n\n console.log('[AriaCore] Initializing Aria SDK...');\n state.config = config;\n\n // Convert simplified config to full SDK config\n const fullConfig: AriaSDKConfig = AriaCore.buildFullConfig(config);\n\n // Initialize session manager (singleton)\n state.sessionManager = AriaSessionManager.getInstance(fullConfig);\n\n // Auto-connect WebSocket\n state.sessionManager.connect();\n\n // Mount UI components to DOM\n AriaCore.mountUI(config.theme || 'light', config.triggerLabel);\n\n state.initialized = true;\n console.log('[AriaCore] Aria SDK initialized successfully');\n }\n\n /**\n * Open the Aria assistant widget.\n * \n * @param mode - Optional trigger mode ('user' for bottom-right, 'websocket' for center)\n * \n * @example\n * ```typescript\n * Aria.open(); // Open in default position\n * Aria.open('websocket'); // Open in center (like incoming call)\n * ```\n */\n static open(mode: 'user' | 'websocket' = 'user'): void {\n if (!state.initialized) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n\n // Dispatch custom event that the mounted React component listens to\n const event = new CustomEvent('aria:open', { detail: { mode } });\n window.dispatchEvent(event);\n }\n\n /**\n * Close the Aria assistant widget.\n * \n * @example\n * ```typescript\n * Aria.close();\n * ```\n */\n static close(): void {\n if (!state.initialized) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n\n // Dispatch custom event that the mounted React component listens to\n const event = new CustomEvent('aria:close');\n window.dispatchEvent(event);\n }\n\n /**\n * Minimize the Aria assistant widget to a compact floating state.\n * \n * @example\n * ```typescript\n * Aria.minimize();\n * ```\n */\n static minimize(): void {\n if (!state.initialized) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n\n const event = new CustomEvent('aria:minimize');\n window.dispatchEvent(event);\n }\n\n /**\n * Maximize the Aria assistant widget from minimized state.\n * \n * @example\n * ```typescript\n * Aria.maximize();\n * ```\n */\n static maximize(): void {\n if (!state.initialized) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n\n const event = new CustomEvent('aria:maximize');\n window.dispatchEvent(event);\n }\n\n /**\n * Check if the Aria SDK is initialized.\n * \n * @returns true if initialized, false otherwise\n */\n static isInitialized(): boolean {\n return state.initialized;\n }\n\n /**\n * Check if the assistant widget is currently open.\n * \n * @returns true if open, false otherwise\n */\n static isOpen(): boolean {\n if (!state.initialized) return false;\n // Check via DOM attribute set by React component\n return state.uiContainer?.getAttribute('data-aria-open') === 'true';\n }\n\n /**\n * Get the current session ID if available.\n * \n * @returns Session ID or null if no active session\n */\n static getSessionId(): string | null {\n if (!state.sessionManager) return null;\n return state.sessionManager.getSessionState().session_id;\n }\n\n /**\n * Get the current connection status.\n * \n * @returns true if WebSocket is connected, false otherwise\n */\n static isConnected(): boolean {\n if (!state.sessionManager) return false;\n return state.sessionManager.isConnected();\n }\n\n /**\n * Manually refresh the session token.\n * Usually not needed as the SDK auto-refreshes before expiry.\n * \n * @example\n * ```typescript\n * await Aria.refreshSession();\n * ```\n */\n static async refreshSession(): Promise<void> {\n if (!state.sessionManager) {\n console.error('[AriaCore] Not initialized. Call Aria.init() first.');\n return;\n }\n await state.sessionManager.refreshSession();\n }\n\n /**\n * Destroy the Aria SDK instance and clean up all resources.\n * Call this when you want to completely remove Aria from your app.\n * \n * @example\n * ```typescript\n * Aria.destroy();\n * ```\n */\n static destroy(): void {\n if (!state.initialized) {\n console.log('[AriaCore] Not initialized, nothing to destroy.');\n return;\n }\n\n console.log('[AriaCore] Destroying Aria SDK...');\n\n // Unmount React UI\n AriaCore.unmountUI();\n\n // Destroy session manager singleton\n AriaSessionManager.destroyInstance();\n\n // Reset state\n state.initialized = false;\n state.config = null;\n state.sessionManager = null;\n state.uiContainer = null;\n state.reactRoot = null;\n\n console.log('[AriaCore] Aria SDK destroyed');\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Convert simplified AriaInitConfig to full AriaSDKConfig\n */\n private static buildFullConfig(config: AriaInitConfig): AriaSDKConfig {\n return {\n websocketUrl: config.websocketUrl,\n userId: config.userId,\n theme: config.theme || 'light',\n triggerLabel: config.triggerLabel,\n onError: config.onError,\n \n // Enable all automatic session management features\n preloadSession: true,\n sessionRefreshBuffer: 5, // 5 minutes before expiry\n persistSession: true, // Keep session alive when widget closes\n keepWebSocketAlive: true,\n \n // Internal callbacks for session management\n onSessionReady: () => {\n console.log('[AriaCore] Session ready');\n },\n onConnectionStateChange: (connected) => {\n console.log('[AriaCore] Connection state:', connected ? 'connected' : 'disconnected');\n },\n onSessionPreloaded: () => {\n console.log('[AriaCore] Session preloaded and ready');\n },\n onSessionRefresh: () => {\n console.log('[AriaCore] Session refreshed');\n },\n onSessionRefreshError: (error) => {\n console.error('[AriaCore] Session refresh error:', error);\n config.onError?.(error);\n },\n \n // UI options - SDK manages these internally\n showFloatingButton: true,\n showAssistant: true,\n };\n }\n\n /**\n * Mount the Aria UI components to the DOM\n */\n private static mountUI(theme: Theme, triggerLabel?: string): void {\n // Create container element\n const container = document.createElement('div');\n container.id = 'aria-sdk-root';\n container.setAttribute('data-aria-theme', theme);\n container.setAttribute('data-aria-open', 'false');\n document.body.appendChild(container);\n state.uiContainer = container;\n\n // Dynamically import React and render the component\n // This allows the SDK to work without requiring React in the consuming app's bundle\n AriaCore.renderReactUI(container, theme, triggerLabel);\n }\n\n /**\n * Render React UI components\n */\n private static async renderReactUI(\n container: HTMLElement, \n theme: Theme, \n triggerLabel?: string\n ): Promise<void> {\n try {\n // Dynamic imports to avoid bundling React if not needed\n const React = await import('react');\n const ReactDOM = await import('react-dom/client');\n const { AriaStandaloneUI } = await import('@/components/AriaStandaloneUI');\n\n const root = ReactDOM.createRoot(container);\n state.reactRoot = root;\n\n root.render(\n React.createElement(AriaStandaloneUI, {\n theme,\n triggerLabel,\n container,\n })\n );\n\n console.log('[AriaCore] React UI mounted');\n } catch (error) {\n console.error('[AriaCore] Failed to mount React UI:', error);\n state.config?.onError?.(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Unmount the Aria UI components from the DOM\n */\n private static unmountUI(): void {\n if (state.reactRoot && typeof (state.reactRoot as { unmount?: () => void }).unmount === 'function') {\n (state.reactRoot as { unmount: () => void }).unmount();\n }\n\n if (state.uiContainer) {\n state.uiContainer.remove();\n }\n }\n}\n\n// Export as default for convenient importing\nexport default AriaCore;\n","/**\n * Token Utilities for Aria SDK\n * \n * Provides functions to decode and extract session information from tokens.\n * Supports both JWT tokens (decodable) and opaque tokens (backend-provided session_id).\n * \n * @example\n * ```typescript\n * // Check if token is a JWT\n * const token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\";\n * if (isJWT(token)) {\n * const sessionId = extractSessionIdFromToken(token);\n * console.log('Session ID:', sessionId);\n * }\n * \n * // Decode full JWT payload\n * const decoded = decodeJWT(token);\n * if (decoded) {\n * console.log('Payload:', decoded);\n * }\n * ```\n */\n\n/**\n * Information extracted from a decoded token\n */\nexport interface TokenInfo {\n /** Session ID if found in token */\n sessionId: string | null;\n /** Full decoded payload */\n payload: Record<string, unknown> | null;\n /** Token expiration timestamp (Unix timestamp in seconds) */\n exp: number | null;\n /** Token issued at timestamp (Unix timestamp in seconds) */\n iat: number | null;\n}\n\n/**\n * Check if a token is in JWT format\n * \n * @param token - The token to check\n * @returns True if the token is a valid JWT format (3 parts separated by dots)\n * \n * @example\n * ```typescript\n * isJWT(\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U\")\n * // Returns: true\n * \n * isJWT(\"opaque-token-12345\")\n * // Returns: false\n * ```\n */\nexport function isJWT(token: string): boolean {\n if (!token || typeof token !== 'string') {\n return false;\n }\n \n const parts = token.split('.');\n return parts.length === 3;\n}\n\n/**\n * Decode a JWT token without verification\n * \n * **Note:** This function does NOT verify the token signature.\n * It only decodes the payload for client-side use.\n * \n * @param token - The JWT token to decode\n * @returns The decoded payload or null if decoding fails\n * \n * @example\n * ```typescript\n * const token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uX2lkIjoiMTIzNDU2In0.xxxxx\";\n * const payload = decodeJWT(token);\n * // Returns: { session_id: \"123456\" }\n * ```\n */\nexport function decodeJWT(token: string): Record<string, unknown> | null {\n if (!isJWT(token)) {\n return null;\n }\n \n try {\n // Get the payload part (second part of JWT)\n const parts = token.split('.');\n const payload = parts[1];\n \n // JWT uses base64url encoding, need to convert to standard base64\n // Replace URL-safe characters and add padding if needed\n const base64 = payload\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n \n // Add padding if needed\n const padded = base64.padEnd(base64.length + (4 - base64.length % 4) % 4, '=');\n \n // Decode base64\n const decoded = atob(padded);\n \n // Parse JSON\n return JSON.parse(decoded);\n } catch (error) {\n console.error('Failed to decode JWT:', error);\n return null;\n }\n}\n\n/**\n * Extract session ID from a token\n * \n * This function attempts to extract a session ID from a JWT token by checking\n * common claim names used for session identifiers.\n * \n * Checked claim names (in order):\n * - `session_id`\n * - `sessionId`\n * - `sid`\n * - `jti` (JWT ID)\n * - `sub` (Subject)\n * \n * @param token - The token to extract session ID from\n * @returns The session ID if found, null otherwise\n * \n * @example\n * ```typescript\n * const token = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uX2lkIjoiYWJjMTIzIn0.xxxxx\";\n * const sessionId = extractSessionIdFromToken(token);\n * // Returns: \"abc123\"\n * \n * const opaqueToken = \"opaque-token-12345\";\n * const result = extractSessionIdFromToken(opaqueToken);\n * // Returns: null (not a JWT)\n * ```\n */\nexport function extractSessionIdFromToken(token: string): string | null {\n const payload = decodeJWT(token);\n \n if (!payload) {\n return null;\n }\n \n // Check common session ID claim names\n const sessionIdClaims = [\n 'session_id',\n 'sessionId', \n 'sid',\n 'jti', // JWT ID\n 'sub', // Subject (sometimes used for session)\n ];\n \n for (const claim of sessionIdClaims) {\n if (claim in payload && typeof payload[claim] === 'string') {\n return payload[claim] as string;\n }\n }\n \n return null;\n}\n\n/**\n * Get comprehensive token information\n * \n * Decodes a JWT token and extracts session ID, expiration, and other metadata.\n * \n * @param token - The token to decode\n * @returns Token information object with session ID, payload, and timestamps\n * \n * @example\n * ```typescript\n * const tokenInfo = getTokenInfo(myToken);\n * if (tokenInfo.sessionId) {\n * console.log('Session ID:', tokenInfo.sessionId);\n * console.log('Expires at:', new Date(tokenInfo.exp * 1000));\n * }\n * ```\n */\nexport function getTokenInfo(token: string): TokenInfo {\n const payload = decodeJWT(token);\n \n if (!payload) {\n return {\n sessionId: null,\n payload: null,\n exp: null,\n iat: null,\n };\n }\n \n const sessionId = extractSessionIdFromToken(token);\n const exp = typeof payload.exp === 'number' ? payload.exp : null;\n const iat = typeof payload.iat === 'number' ? payload.iat : null;\n \n return {\n sessionId,\n payload,\n exp,\n iat,\n };\n}\n\n/**\n * Check if a JWT token is expired\n * \n * @param token - The JWT token to check\n * @returns True if the token is expired, false otherwise\n * \n * @example\n * ```typescript\n * if (isTokenExpired(myToken)) {\n * console.log('Token has expired, need to refresh');\n * }\n * ```\n */\nexport function isTokenExpired(token: string): boolean {\n const payload = decodeJWT(token);\n \n if (!payload || typeof payload.exp !== 'number') {\n // If we can't decode or no expiration, assume expired for safety\n return true;\n }\n \n const now = Math.floor(Date.now() / 1000); // Current time in seconds\n return payload.exp < now;\n}\n","import { useRef, useEffect, useState, type FC, type ReactNode, type CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface ShadowContainerProps {\n children: ReactNode;\n /** CSS string to inject into the shadow root */\n styles?: string;\n /** Optional class name for the shadow host element */\n className?: string;\n /** Optional inline styles for the shadow host element */\n style?: CSSProperties;\n /** Tag name for the shadow host element */\n as?: 'div' | 'span' | 'section' | 'article' | 'aside' | 'main' | 'nav' | 'header' | 'footer';\n}\n\n/**\n * ShadowContainer wraps children in a Shadow DOM boundary for complete CSS isolation.\n * \n * This component:\n * - Creates a shadow root on mount\n * - Injects provided CSS styles into the shadow root\n * - Renders children inside the shadow DOM via portal\n * - Prevents host app styles from affecting SDK components\n * - Prevents SDK styles from leaking to host app\n */\nexport const ShadowContainer: FC<ShadowContainerProps> = ({\n children,\n styles = '',\n className,\n style,\n as: Tag = 'div',\n}) => {\n const hostRef = useRef<HTMLDivElement>(null);\n const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n // Check if shadow root already exists (React strict mode double-mount)\n let shadow = host.shadowRoot;\n if (!shadow) {\n shadow = host.attachShadow({ mode: 'open' });\n }\n\n setShadowRoot(shadow);\n }, []);\n\n // Inject styles into shadow root\n useEffect(() => {\n if (!shadowRoot || !styles) return;\n\n // Check if style element already exists\n const existingStyle = shadowRoot.querySelector('style[data-aria-styles]');\n if (existingStyle) {\n existingStyle.textContent = styles;\n return;\n }\n\n // Create and inject style element\n const styleElement = document.createElement('style');\n styleElement.setAttribute('data-aria-styles', 'true');\n styleElement.textContent = styles;\n shadowRoot.prepend(styleElement);\n\n return () => {\n styleElement.remove();\n };\n }, [shadowRoot, styles]);\n\n // Create a container div inside shadow root for React portal\n const [portalContainer, setPortalContainer] = useState<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!shadowRoot) return;\n\n // Check if container already exists\n let container = shadowRoot.querySelector('.aria-shadow-content') as HTMLDivElement;\n if (!container) {\n container = document.createElement('div');\n container.className = 'aria-shadow-content';\n shadowRoot.appendChild(container);\n }\n\n setPortalContainer(container);\n }, [shadowRoot]);\n\n return (\n <Tag\n ref={hostRef as React.RefObject<HTMLDivElement>}\n className={className}\n style={style}\n >\n {portalContainer && createPortal(children, portalContainer)}\n </Tag>\n );\n};\n\nexport default ShadowContainer;\n","/**\n * CSS Loader for Shadow DOM injection\n * \n * This module provides the SDK's CSS as a string that can be injected\n * into Shadow DOM roots for complete style isolation.\n */\n\n// Import CSS as inline string using Vite's ?inline query\n// This imports the CSS file content as a string rather than injecting it into the document\nimport cssString from '../lib-styles.css?inline';\n\n/**\n * Get the SDK's CSS styles as a string for shadow DOM injection.\n * \n * @returns The complete CSS string for the Aria SDK\n * \n * @example\n * ```tsx\n * import { getAriaStyles } from '@centive/aria-sdk';\n * \n * // Use with ShadowContainer\n * <ShadowContainer styles={getAriaStyles()}>\n * <AriaWidget />\n * </ShadowContainer>\n * ```\n */\nexport function getAriaStyles(): string {\n return cssString;\n}\n\n/**\n * The raw CSS string for the Aria SDK.\n * Use this if you need direct access to the CSS string.\n */\nexport const ariaStyles = cssString;\n\nexport default cssString;\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Concatenates two arrays faster than the array spread operator.\n */\nconst concatArrays = (array1, array2) => {\n // Pre-allocate for better V8 optimization\n const combinedArray = new Array(array1.length + array2.length);\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i];\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i];\n }\n return combinedArray;\n};\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (classGroupId, validator) => ({\n classGroupId,\n validator\n});\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (nextPart = new Map(), validators = null, classGroupId) => ({\n nextPart,\n validators,\n classGroupId\n});\nconst CLASS_PART_SEPARATOR = '-';\nconst EMPTY_CONFLICTS = [];\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className);\n }\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0;\n return getGroupRecursive(classParts, startIndex, classMap);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId];\n const baseConflicts = conflictingClassGroups[classGroupId];\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts);\n }\n // Only modifier conflicts\n return modifierConflicts;\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS;\n }\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, startIndex, classPartObject) => {\n const classPathsLength = classParts.length - startIndex;\n if (classPathsLength === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[startIndex];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);\n if (result) return result;\n }\n const validators = classPartObject.validators;\n if (validators === null) {\n return undefined;\n }\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);\n const validatorsLength = validators.length;\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i];\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId;\n }\n }\n return undefined;\n};\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = className => className.slice(1, -1).indexOf(':') === -1 ? undefined : (() => {\n const content = className.slice(1, -1);\n const colonIndex = content.indexOf(':');\n const property = content.slice(0, colonIndex);\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined;\n})();\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n classGroups\n } = config;\n return processClassGroups(classGroups, theme);\n};\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (classGroups, theme) => {\n const classMap = createClassPartObject();\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId];\n processClassesRecursively(group, classMap, classGroupId, theme);\n }\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n const len = classGroup.length;\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i];\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme);\n }\n};\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId);\n return;\n }\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);\n return;\n }\n processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);\n};\nconst processStringDefinition = (classDefinition, classPartObject, classGroupId) => {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n};\nconst processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n if (classPartObject.validators === null) {\n classPartObject.validators = [];\n }\n classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));\n};\nconst processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n const entries = Object.entries(classDefinition);\n const len = entries.length;\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i];\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);\n }\n};\nconst getPart = (classPartObject, path) => {\n let current = classPartObject;\n const parts = path.split(CLASS_PART_SEPARATOR);\n const len = parts.length;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n let next = current.nextPart.get(part);\n if (!next) {\n next = createClassPartObject();\n current.nextPart.set(part, next);\n }\n current = next;\n }\n return current;\n};\n// Type guard maintains monomorphic check\nconst isThemeGetter = func => 'isThemeGetter' in func && func.isThemeGetter === true;\n\n// LRU cache implementation using plain objects for simplicity\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = Object.create(null);\n let previousCache = Object.create(null);\n const update = (key, value) => {\n cache[key] = value;\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = Object.create(null);\n }\n };\n return {\n get(key) {\n let value = cache[key];\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value;\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst MODIFIER_SEPARATOR = ':';\nconst EMPTY_MODIFIERS = [];\n// Pre-allocated result object shape for consistency\nconst createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal\n});\nconst createParseClassName = config => {\n const {\n prefix,\n experimentalParseClassName\n } = config;\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = className => {\n // Use simple array with push for better performance\n const modifiers = [];\n let bracketDepth = 0;\n let parenDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n const len = className.length;\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index];\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + 1;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') bracketDepth++;else if (currentCharacter === ']') bracketDepth--;else if (currentCharacter === '(') parenDepth++;else if (currentCharacter === ')') parenDepth--;\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier;\n let hasImportantModifier = false;\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1);\n hasImportantModifier = true;\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(1);\n hasImportantModifier = true;\n }\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);\n };\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR;\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true);\n }\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => experimentalParseClassName({\n className,\n parseClassName: parseClassNameOriginal\n });\n }\n return parseClassName;\n};\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst createSortModifiers = config => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map();\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index); // High weights for sensitive mods\n });\n return modifiers => {\n const result = [];\n let currentSegment = [];\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i];\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '[';\n const isOrderSensitive = modifierWeights.has(modifier);\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n currentSegment = [];\n }\n result.push(modifier);\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier);\n }\n }\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n }\n return result;\n };\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n let hasPostfixModifier = !!maybePostfixModifierPosition;\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n // Fast path: skip sorting for empty or single modifier\n const variantModifier = modifiers.length === 0 ? '' : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nconst twJoin = (...classLists) => {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < classLists.length) {\n if (argument = classLists[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst toValue = mix => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst createTailwindMerge = (createConfigFirst, ...createConfigRest) => {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall;\n const initTailwindMerge = classList => {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n };\n const tailwindMerge = classList => {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n };\n functionToCall = initTailwindMerge;\n return (...args) => functionToCall(twJoin(...args));\n};\nconst fallbackThemeArr = [];\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || fallbackThemeArr;\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i;\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isFraction = value => fractionRegex.test(value);\nconst isNumber = value => !!value && !Number.isNaN(Number(value));\nconst isInteger = value => !!value && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst isAny = () => true;\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);\nconst isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);\nconst isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);\nconst isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);\nconst isArbitraryVariable = value => arbitraryVariableRegex.test(value);\nconst isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);\nconst isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);\nconst isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);\nconst isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);\nconst isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);\nconst isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);\n// Helpers\nconst getIsArbitraryValue = (value, testLabel, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {\n const result = arbitraryVariableRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return shouldMatchNoLabel;\n }\n return false;\n};\n// Labels\nconst isLabelPosition = label => label === 'position' || label === 'percentage';\nconst isLabelImage = label => label === 'image' || label === 'url';\nconst isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';\nconst isLabelLength = label => label === 'length';\nconst isLabelNumber = label => label === 'number';\nconst isLabelFamilyName = label => label === 'family-name';\nconst isLabelShadow = label => label === 'shadow';\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isAnyNonArbitrary,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isFraction,\n isInteger,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n const themeColor = fromTheme('color');\n const themeFont = fromTheme('font');\n const themeText = fromTheme('text');\n const themeFontWeight = fromTheme('font-weight');\n const themeTracking = fromTheme('tracking');\n const themeLeading = fromTheme('leading');\n const themeBreakpoint = fromTheme('breakpoint');\n const themeContainer = fromTheme('container');\n const themeSpacing = fromTheme('spacing');\n const themeRadius = fromTheme('radius');\n const themeShadow = fromTheme('shadow');\n const themeInsetShadow = fromTheme('inset-shadow');\n const themeTextShadow = fromTheme('text-shadow');\n const themeDropShadow = fromTheme('drop-shadow');\n const themeBlur = fromTheme('blur');\n const themePerspective = fromTheme('perspective');\n const themeAspect = fromTheme('aspect');\n const themeEase = fromTheme('ease');\n const themeAnimate = fromTheme('animate');\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top', 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top', 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom', 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom'];\n const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const scaleOverscroll = () => ['auto', 'contain', 'none'];\n const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];\n const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartAndEnd = () => ['auto', {\n span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]\n }, isInteger, isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];\n const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];\n const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];\n const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];\n const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];\n const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {\n position: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleBgRepeat = () => ['no-repeat', {\n repeat: ['', 'x', 'y', 'space', 'round']\n }];\n const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {\n size: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];\n const scaleRadius = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];\n const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];\n const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];\n const scaleBlur = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': scaleBreak()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': scaleBreak()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: scalePositionWithArbitrary()\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: scaleOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': scaleOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': scaleOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: scaleOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': scaleOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': scaleOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: scaleInset()\n }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': scaleInset()\n }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': scaleInset()\n }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{\n start: scaleInset()\n }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{\n end: scaleInset()\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: scaleInset()\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: scaleInset()\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: scaleInset()\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: scaleInset()\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['nowrap', 'wrap', 'wrap-reverse']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': scaleGridAutoColsRows()\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': scaleGridAutoColsRows()\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: scaleUnambiguousSpacing()\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': scaleUnambiguousSpacing()\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': scaleUnambiguousSpacing()\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: [...scaleAlignPrimaryAxis(), 'normal']\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...scaleAlignPrimaryAxis()]\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: [...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', ...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': scaleAlignPrimaryAxis()\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: scaleUnambiguousSpacing()\n }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: scaleUnambiguousSpacing()\n }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: scaleUnambiguousSpacing()\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: scaleMargin()\n }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: scaleMargin()\n }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: scaleMargin()\n }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: scaleMargin()\n }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: scaleMargin()\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: scaleMargin()\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: scaleMargin()\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: scaleMargin()\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: scaleMargin()\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{\n 'space-x': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{\n 'space-y': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n // --------------\n // --- Sizing ---\n // --------------\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{\n size: scaleSizing()\n }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: [themeContainer, 'screen', ...scaleSizing()]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none', ...scaleSizing()]\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n {\n screen: [themeBreakpoint]\n }, ...scaleSizing()]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: ['screen', 'lh', ...scaleSizing()]\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': ['screen', 'lh', ...scaleSizing()]\n }],\n // ------------------\n // --- Typography ---\n // ------------------\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [{\n 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading, ...scaleUnambiguousSpacing()]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: scaleColor()\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: scaleColor()\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...scaleLineStyle(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: scaleColor()\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: scaleUnambiguousSpacing()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{\n wrap: ['break-word', 'anywhere', 'normal']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // -------------------\n // --- Backgrounds ---\n // -------------------\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: scaleBgPosition()\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: scaleBgRepeat()\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: scaleBgSize()\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n linear: [{\n to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isInteger, isArbitraryVariable, isArbitraryValue],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue]\n }, isArbitraryVariableImage, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: scaleColor()\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: scaleColor()\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: scaleColor()\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: scaleColor()\n }],\n // ---------------\n // --- Borders ---\n // ---------------\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: scaleRadius()\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': scaleRadius()\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': scaleRadius()\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': scaleRadius()\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': scaleRadius()\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': scaleRadius()\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': scaleRadius()\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': scaleRadius()\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': scaleRadius()\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': scaleRadius()\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': scaleRadius()\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': scaleRadius()\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': scaleRadius()\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': scaleRadius()\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': scaleRadius()\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: scaleBorderWidth()\n }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': scaleBorderWidth()\n }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': scaleBorderWidth()\n }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': scaleBorderWidth()\n }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': scaleBorderWidth()\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': scaleBorderWidth()\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': scaleBorderWidth()\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': scaleBorderWidth()\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': scaleBorderWidth()\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{\n 'divide-x': scaleBorderWidth()\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{\n 'divide-y': scaleBorderWidth()\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{\n divide: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: scaleColor()\n }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': scaleColor()\n }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': scaleColor()\n }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': scaleColor()\n }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': scaleColor()\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': scaleColor()\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': scaleColor()\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': scaleColor()\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': scaleColor()\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: scaleColor()\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: [...scaleLineStyle(), 'none', 'hidden']\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: scaleColor()\n }],\n // ---------------\n // --- Effects ---\n // ---------------\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{\n shadow: scaleColor()\n }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [{\n 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{\n 'inset-shadow': scaleColor()\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{\n ring: scaleBorderWidth()\n }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{\n ring: scaleColor()\n }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{\n 'ring-offset': [isNumber, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{\n 'ring-offset': scaleColor()\n }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{\n 'inset-ring': scaleBorderWidth()\n }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{\n 'inset-ring': scaleColor()\n }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [{\n 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{\n 'text-shadow': scaleColor()\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': scaleBlendMode()\n }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [{\n 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }, 'mask-no-clip'],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{\n mask: ['add', 'subtract', 'intersect', 'exclude']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{\n 'mask-linear': [isNumber]\n }],\n 'mask-image-linear-from-pos': [{\n 'mask-linear-from': scaleMaskImagePosition()\n }],\n 'mask-image-linear-to-pos': [{\n 'mask-linear-to': scaleMaskImagePosition()\n }],\n 'mask-image-linear-from-color': [{\n 'mask-linear-from': scaleColor()\n }],\n 'mask-image-linear-to-color': [{\n 'mask-linear-to': scaleColor()\n }],\n 'mask-image-t-from-pos': [{\n 'mask-t-from': scaleMaskImagePosition()\n }],\n 'mask-image-t-to-pos': [{\n 'mask-t-to': scaleMaskImagePosition()\n }],\n 'mask-image-t-from-color': [{\n 'mask-t-from': scaleColor()\n }],\n 'mask-image-t-to-color': [{\n 'mask-t-to': scaleColor()\n }],\n 'mask-image-r-from-pos': [{\n 'mask-r-from': scaleMaskImagePosition()\n }],\n 'mask-image-r-to-pos': [{\n 'mask-r-to': scaleMaskImagePosition()\n }],\n 'mask-image-r-from-color': [{\n 'mask-r-from': scaleColor()\n }],\n 'mask-image-r-to-color': [{\n 'mask-r-to': scaleColor()\n }],\n 'mask-image-b-from-pos': [{\n 'mask-b-from': scaleMaskImagePosition()\n }],\n 'mask-image-b-to-pos': [{\n 'mask-b-to': scaleMaskImagePosition()\n }],\n 'mask-image-b-from-color': [{\n 'mask-b-from': scaleColor()\n }],\n 'mask-image-b-to-color': [{\n 'mask-b-to': scaleColor()\n }],\n 'mask-image-l-from-pos': [{\n 'mask-l-from': scaleMaskImagePosition()\n }],\n 'mask-image-l-to-pos': [{\n 'mask-l-to': scaleMaskImagePosition()\n }],\n 'mask-image-l-from-color': [{\n 'mask-l-from': scaleColor()\n }],\n 'mask-image-l-to-color': [{\n 'mask-l-to': scaleColor()\n }],\n 'mask-image-x-from-pos': [{\n 'mask-x-from': scaleMaskImagePosition()\n }],\n 'mask-image-x-to-pos': [{\n 'mask-x-to': scaleMaskImagePosition()\n }],\n 'mask-image-x-from-color': [{\n 'mask-x-from': scaleColor()\n }],\n 'mask-image-x-to-color': [{\n 'mask-x-to': scaleColor()\n }],\n 'mask-image-y-from-pos': [{\n 'mask-y-from': scaleMaskImagePosition()\n }],\n 'mask-image-y-to-pos': [{\n 'mask-y-to': scaleMaskImagePosition()\n }],\n 'mask-image-y-from-color': [{\n 'mask-y-from': scaleColor()\n }],\n 'mask-image-y-to-color': [{\n 'mask-y-to': scaleColor()\n }],\n 'mask-image-radial': [{\n 'mask-radial': [isArbitraryVariable, isArbitraryValue]\n }],\n 'mask-image-radial-from-pos': [{\n 'mask-radial-from': scaleMaskImagePosition()\n }],\n 'mask-image-radial-to-pos': [{\n 'mask-radial-to': scaleMaskImagePosition()\n }],\n 'mask-image-radial-from-color': [{\n 'mask-radial-from': scaleColor()\n }],\n 'mask-image-radial-to-color': [{\n 'mask-radial-to': scaleColor()\n }],\n 'mask-image-radial-shape': [{\n 'mask-radial': ['circle', 'ellipse']\n }],\n 'mask-image-radial-size': [{\n 'mask-radial': [{\n closest: ['side', 'corner'],\n farthest: ['side', 'corner']\n }]\n }],\n 'mask-image-radial-pos': [{\n 'mask-radial-at': scalePosition()\n }],\n 'mask-image-conic-pos': [{\n 'mask-conic': [isNumber]\n }],\n 'mask-image-conic-from-pos': [{\n 'mask-conic-from': scaleMaskImagePosition()\n }],\n 'mask-image-conic-to-pos': [{\n 'mask-conic-to': scaleMaskImagePosition()\n }],\n 'mask-image-conic-from-color': [{\n 'mask-conic-from': scaleColor()\n }],\n 'mask-image-conic-to-color': [{\n 'mask-conic-to': scaleColor()\n }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{\n mask: ['alpha', 'luminance', 'match']\n }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [{\n 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{\n mask: scaleBgPosition()\n }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{\n mask: scaleBgRepeat()\n }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{\n mask: scaleBgSize()\n }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{\n 'mask-type': ['alpha', 'luminance']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{\n mask: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------\n // --- Filters ---\n // ---------------\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: scaleBlur()\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{\n 'drop-shadow': scaleColor()\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': scaleBlur()\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n // --------------\n // --- Tables ---\n // --------------\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': scaleUnambiguousSpacing()\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{\n transition: ['normal', 'discrete']\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------\n // --- Transforms ---\n // ------------------\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{\n backface: ['hidden', 'visible']\n }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [{\n perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{\n 'perspective-origin': scalePositionWithArbitrary()\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: scaleRotate()\n }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{\n 'rotate-x': scaleRotate()\n }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{\n 'rotate-y': scaleRotate()\n }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{\n 'rotate-z': scaleRotate()\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: scaleScale()\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': scaleScale()\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': scaleScale()\n }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{\n 'scale-z': scaleScale()\n }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{\n skew: scaleSkew()\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': scaleSkew()\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': scaleSkew()\n }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: scalePositionWithArbitrary()\n }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{\n transform: ['3d', 'flat']\n }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{\n translate: scaleTranslate()\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': scaleTranslate()\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': scaleTranslate()\n }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{\n 'translate-z': scaleTranslate()\n }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: scaleColor()\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: scaleColor()\n }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [{\n scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{\n 'field-sizing': ['fixed', 'content']\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['auto', 'none']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', '', 'y', 'x']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]\n }],\n // -----------\n // --- SVG ---\n // -----------\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: ['none', ...scaleColor()]\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: ['none', ...scaleColor()]\n }],\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n },\n orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n overrideConfigProperties(baseConfig.theme, override.theme);\n overrideConfigProperties(baseConfig.classGroups, override.classGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroupModifiers, override.conflictingClassGroupModifiers);\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers);\n mergeConfigProperties(baseConfig.theme, extend.theme);\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroupModifiers, extend.conflictingClassGroupModifiers);\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers');\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key);\n }\n }\n};\nconst mergeArrayProperties = (baseObject, mergeObject, key) => {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue;\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n","export default \"data:image/jpeg;base64,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\"","/**\n * AriaStandaloneUI - Standalone React component for Aria SDK\n * \n * This component is mounted by AriaCore.init() and manages its own state\n * independently of any parent React context. It listens to window events\n * dispatched by AriaCore for programmatic control.\n */\n\nimport { useState, useEffect, useCallback, useRef, type FC } from 'react';\nimport { \n Sparkles, \n MessageCircle, \n Mic, \n MicOff, \n X, \n Phone, \n RefreshCw, \n Minimize2, \n Maximize2, \n Wrench,\n Send,\n User,\n Bot,\n} from 'lucide-react';\nimport type { \n ChatMessage, \n TriggerMode, \n SessionState, \n SessionManagerStatus,\n SessionManagerEvent,\n ToolCallState,\n Theme,\n} from '@/types';\nimport { AriaSessionManager } from '@/lib/AriaSessionManager';\nimport { ShadowContainer } from './ShadowContainer';\nimport { getAriaStyles } from '@/lib/cssLoader';\nimport { cn } from '@/lib/utils';\nimport ariaAvatar from '@/assets/aria-avatar.jpg';\n\ninterface AriaStandaloneUIProps {\n theme: Theme;\n triggerLabel?: string;\n container: HTMLElement;\n}\n\nexport const AriaStandaloneUI: FC<AriaStandaloneUIProps> = ({\n theme,\n triggerLabel,\n container,\n}) => {\n // UI State\n const [isOpen, setIsOpen] = useState(false);\n const [isMinimized, setIsMinimized] = useState(false);\n const [isConnected, setIsConnected] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [chatMessages, setChatMessages] = useState<ChatMessage[]>([]);\n const [liveTranscript, setLiveTranscript] = useState('');\n const [isChatVisible, setIsChatVisible] = useState(false);\n const [isMuted, setIsMuted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [, setTriggerMode] = useState<TriggerMode>('user');\n const [displayMode, setDisplayMode] = useState<'center' | 'bottom-right'>('bottom-right');\n \n // Tool call state\n const [toolCallState, setToolCallState] = useState<ToolCallState>({\n isActive: false,\n toolName: null,\n toolData: null,\n });\n \n // Session State\n const [sessionState, setSessionState] = useState<SessionState>({\n session_id: null,\n token: null,\n expires_at: null,\n isSessionReady: false,\n lastError: null,\n isPreloaded: false,\n isRefreshing: false,\n });\n const [sessionManagerStatus, setSessionManagerStatus] = useState<SessionManagerStatus>('idle');\n const [, setIsSessionPaused] = useState(false);\n\n // Refs\n const managerRef = useRef<AriaSessionManager | null>(null);\n const videoElementRef = useRef<HTMLVideoElement | null>(null);\n const isOpenRef = useRef(isOpen); // Track isOpen in a ref for event callbacks\n \n // Keep the ref in sync with state\n isOpenRef.current = isOpen;\n\n // ============================================================================\n // Session Manager Event Handlers\n // ============================================================================\n\n const handleStatusChange = useCallback((event: SessionManagerEvent) => {\n const { newStatus } = event.data as { oldStatus: SessionManagerStatus; newStatus: SessionManagerStatus };\n setSessionManagerStatus(newStatus);\n \n // Use isOpenRef.current to get the latest value (avoids stale closure issue)\n if (newStatus === 'preloading' || newStatus === 'connecting') {\n if (isOpenRef.current) {\n setIsLoading(true);\n }\n } else if (newStatus === 'ready') {\n setIsLoading(false);\n setIsConnected(true);\n } else if (newStatus === 'error') {\n setIsLoading(false);\n }\n }, []); // Remove isOpen dependency since we use ref now\n\n const handleSessionReady = useCallback((event: SessionManagerEvent) => {\n const eventData = event.data as { \n sessionId?: string | null; \n tokenReady?: boolean; \n lazyInit?: boolean;\n streamReady?: boolean;\n } | undefined;\n console.log('[AriaStandaloneUI] Session ready event:', eventData, 'isOpen:', isOpenRef.current);\n \n if (managerRef.current) {\n const state = managerRef.current.getSessionState();\n setSessionState(state);\n \n // Check if this is a lazy init event (token ready but no stream yet)\n // vs a full session ready event (stream is available)\n const isLazyInit = eventData?.lazyInit === true;\n const isStreamReady = eventData?.streamReady === true;\n \n if (isStreamReady) {\n // Full session ready with video stream available\n // Attach video stream now that it's available\n if (videoElementRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after full session ready (streamReady=true)');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n \n setIsConnected(true);\n setIsLoading(false);\n setError(null);\n } else if (isLazyInit && eventData?.tokenReady) {\n // Lazy init - token is ready\n // If widget is open, initialize the Anam client now\n // Use isOpenRef.current to get the latest value (avoids stale closure issue)\n if (isOpenRef.current) {\n const isAnamReady = managerRef.current.isAnamClientInitialized();\n if (!isAnamReady) {\n console.log('[AriaStandaloneUI] Token received while widget is open, initializing Anam client');\n setIsLoading(true);\n managerRef.current.initializeSessionOnDemand()\n .then(() => {\n console.log('[AriaStandaloneUI] Anam client initialized after token received');\n setIsLoading(false);\n setIsConnected(true);\n setError(null);\n // Attach video stream now that it's ready\n if (videoElementRef.current && managerRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after lazy init');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n })\n .catch((err) => {\n console.error('[AriaStandaloneUI] Failed to initialize Anam client:', err);\n setIsLoading(false);\n setError(err instanceof Error ? err.message : 'Failed to initialize session');\n });\n }\n } else {\n // Widget not open - just log that token is ready\n console.log('[AriaStandaloneUI] Token ready (lazy init), button enabled');\n }\n } else {\n // Legacy event format without streamReady flag - try to attach anyway\n if (videoElementRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream (legacy event)');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n setIsConnected(true);\n setIsLoading(false);\n setError(null);\n }\n }\n }, []);\n\n const handleSessionError = useCallback((event: SessionManagerEvent) => {\n const errorMsg = event.error?.message || 'Session error';\n console.error('[AriaStandaloneUI] Session error:', errorMsg);\n setError(errorMsg);\n setIsLoading(false);\n \n if (managerRef.current) {\n const state = managerRef.current.getSessionState();\n setSessionState(state);\n }\n }, []);\n\n const handleConnectionChange = useCallback((event: SessionManagerEvent) => {\n const { connected } = event.data as { connected: boolean };\n setIsConnected(connected);\n \n if (!connected && managerRef.current) {\n const state = managerRef.current.getSessionState();\n setSessionState(state);\n }\n }, []);\n\n const handleMessageHistory = useCallback((event: SessionManagerEvent) => {\n const { messages } = event.data as { messages?: ChatMessage[] };\n if (messages) {\n setChatMessages(messages);\n }\n }, []);\n\n const handleMessageStream = useCallback((event: SessionManagerEvent) => {\n const { liveTranscript: transcript } = event.data as { liveTranscript?: string };\n if (transcript !== undefined) {\n setLiveTranscript(transcript);\n }\n }, []);\n\n const handleToolCall = useCallback((event: SessionManagerEvent) => {\n const data = event.data as { isActive: boolean; toolName: string | null; toolData: Record<string, unknown> | null };\n setToolCallState({\n isActive: data.isActive,\n toolName: data.toolName,\n toolData: data.toolData,\n });\n }, []);\n\n // ============================================================================\n // Video Element Management\n // ============================================================================\n\n const setVideoElement = useCallback((element: HTMLVideoElement | null) => {\n const previousElement = videoElementRef.current;\n videoElementRef.current = element;\n \n if (element && managerRef.current) {\n // Only attach if video stream is available (session is ready)\n // Otherwise, the stream will be attached when session_ready event fires\n const hasVideoStream = managerRef.current.getVideoStream() !== null;\n if (hasVideoStream) {\n console.log('[AriaStandaloneUI] Attaching video stream to element');\n managerRef.current.attachToVideoElement(element);\n } else {\n console.log('[AriaStandaloneUI] Video element registered, waiting for stream to be ready');\n }\n } else if (!element && previousElement && managerRef.current) {\n console.log('[AriaStandaloneUI] Detaching video stream from element');\n managerRef.current.detachFromVideoElement(previousElement);\n }\n }, []);\n\n // ============================================================================\n // Assistant Actions\n // ============================================================================\n\n const openAssistant = useCallback((mode: TriggerMode = 'user') => {\n setTriggerMode(mode);\n setDisplayMode(mode === 'websocket' ? 'center' : 'bottom-right');\n setIsOpen(true);\n setIsMinimized(false);\n setError(null);\n\n if (!managerRef.current) return;\n\n const isPaused = managerRef.current.isSessionPaused();\n console.log('[AriaStandaloneUI] openAssistant called, isPaused:', isPaused);\n \n if (isPaused) {\n setIsLoading(true);\n managerRef.current.resumeSession().then((resumed) => {\n setIsSessionPaused(false);\n \n if (resumed) {\n // Session was successfully resumed\n setIsLoading(false);\n setIsConnected(true);\n const state = managerRef.current!.getSessionState();\n setSessionState(state);\n setChatMessages(managerRef.current!.getChatMessages());\n // Re-attach video stream after resume\n if (videoElementRef.current && managerRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after resume');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n } else {\n // Session could not be resumed, start new session\n const hasToken = managerRef.current!.hasSessionToken();\n \n if (hasToken) {\n managerRef.current!.initializeSessionOnDemand()\n .then(() => {\n setIsLoading(false);\n setIsConnected(true);\n const state = managerRef.current!.getSessionState();\n setSessionState(state);\n // Attach video stream now that it's ready\n if (videoElementRef.current && managerRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after initialization (from resume)');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n })\n .catch((initErr) => {\n setIsLoading(false);\n setError(initErr instanceof Error ? initErr.message : 'Failed to start new session');\n });\n } else if (!managerRef.current!.isConnected()) {\n managerRef.current!.connect();\n }\n }\n }).catch((err) => {\n setIsLoading(false);\n setIsSessionPaused(false);\n setError(err instanceof Error ? err.message : 'Failed to resume session');\n });\n return;\n }\n\n const isAnamReady = managerRef.current.isAnamClientInitialized();\n const hasToken = managerRef.current.hasSessionToken();\n const status = managerRef.current.getStatus();\n \n console.log('[AriaStandaloneUI] openAssistant state check:', { isAnamReady, hasToken, status, isPaused: false });\n \n if (isAnamReady && status === 'ready') {\n console.log('[AriaStandaloneUI] Anam already ready, attaching video');\n setIsLoading(false);\n setIsConnected(true);\n // Re-attach video stream in case element was registered before\n if (videoElementRef.current) {\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n } else if (hasToken) {\n console.log('[AriaStandaloneUI] Has token, calling initializeSessionOnDemand');\n setIsLoading(true);\n \n managerRef.current.initializeSessionOnDemand()\n .then(() => {\n setIsLoading(false);\n setIsConnected(true);\n const state = managerRef.current!.getSessionState();\n setSessionState(state);\n // Attach video stream now that it's ready\n if (videoElementRef.current && managerRef.current) {\n console.log('[AriaStandaloneUI] Attaching video stream after initialization');\n managerRef.current.attachToVideoElement(videoElementRef.current);\n }\n })\n .catch((err) => {\n setIsLoading(false);\n setError(err instanceof Error ? err.message : 'Failed to initialize session');\n });\n } else {\n // No token yet - this shouldn't happen since button is disabled until ready\n // But handle it gracefully just in case\n console.warn('[AriaStandaloneUI] No token available, button should have been disabled');\n setError('Session not ready. Please wait and try again.');\n }\n }, []);\n\n const minimizeAssistant = useCallback(() => {\n setIsMinimized(true);\n }, []);\n\n const maximizeAssistant = useCallback(() => {\n setIsMinimized(false);\n }, []);\n\n const closeAssistant = useCallback(() => {\n setIsOpen(false);\n setIsMinimized(false);\n \n if (!managerRef.current) return;\n \n if (videoElementRef.current) {\n managerRef.current.detachFromVideoElement(videoElementRef.current);\n }\n \n // Clear live transcript display (but keep in memory)\n setLiveTranscript('');\n \n // Always pause session when closing widget - session only ends on logout or unmount\n console.log('[AriaStandaloneUI] Pausing session (widget closed)');\n managerRef.current.pauseSession();\n setIsSessionPaused(true);\n }, []);\n\n const handleWebSocketTrigger = useCallback(() => {\n console.log('[AriaStandaloneUI] WebSocket trigger event');\n openAssistant('websocket');\n }, [openAssistant]);\n\n // ============================================================================\n // Initialize Session Manager\n // ============================================================================\n\n useEffect(() => {\n // Get the existing singleton instance (created by AriaCore.init)\n if (!AriaSessionManager.hasInstance()) {\n console.error('[AriaStandaloneUI] AriaSessionManager not initialized');\n return;\n }\n\n const manager = AriaSessionManager.getInstance({} as never); // Get existing instance\n managerRef.current = manager;\n\n // Set up event listeners\n manager.addEventListener('status_change', handleStatusChange);\n manager.addEventListener('session_ready', handleSessionReady);\n manager.addEventListener('session_error', handleSessionError);\n manager.addEventListener('connection_change', handleConnectionChange);\n manager.addEventListener('message_history', handleMessageHistory);\n manager.addEventListener('message_stream', handleMessageStream);\n manager.addEventListener('tool_call', handleToolCall);\n manager.setWebSocketTriggerCallback(handleWebSocketTrigger);\n\n // Sync initial state from manager (deferred to avoid synchronous setState in effect)\n const syncInitialState = () => {\n setSessionState(manager.getSessionState());\n setSessionManagerStatus(manager.getStatus());\n setIsConnected(manager.isConnected());\n setChatMessages(manager.getChatMessages());\n setLiveTranscript(manager.getLiveTranscript());\n setIsMuted(manager.isMuted());\n setIsSessionPaused(manager.isSessionPaused());\n \n const toolState = manager.getToolCallState();\n setToolCallState(toolState);\n };\n \n // Use queueMicrotask to defer state sync and avoid cascading renders warning\n queueMicrotask(syncInitialState);\n\n return () => {\n manager.removeEventListener('status_change', handleStatusChange);\n manager.removeEventListener('session_ready', handleSessionReady);\n manager.removeEventListener('session_error', handleSessionError);\n manager.removeEventListener('connection_change', handleConnectionChange);\n manager.removeEventListener('message_history', handleMessageHistory);\n manager.removeEventListener('message_stream', handleMessageStream);\n manager.removeEventListener('tool_call', handleToolCall);\n manager.setWebSocketTriggerCallback(null);\n };\n }, [\n handleStatusChange,\n handleSessionReady,\n handleSessionError,\n handleConnectionChange,\n handleMessageHistory,\n handleMessageStream,\n handleToolCall,\n handleWebSocketTrigger,\n ]);\n\n // ============================================================================\n // Window Event Listeners (for AriaCore programmatic control)\n // ============================================================================\n\n useEffect(() => {\n const handleOpen = (e: Event) => {\n const customEvent = e as CustomEvent<{ mode?: TriggerMode }>;\n openAssistant(customEvent.detail?.mode || 'user');\n };\n\n const handleClose = () => {\n closeAssistant();\n };\n\n const handleMinimize = () => {\n minimizeAssistant();\n };\n\n const handleMaximize = () => {\n maximizeAssistant();\n };\n\n window.addEventListener('aria:open', handleOpen);\n window.addEventListener('aria:close', handleClose);\n window.addEventListener('aria:minimize', handleMinimize);\n window.addEventListener('aria:maximize', handleMaximize);\n\n return () => {\n window.removeEventListener('aria:open', handleOpen);\n window.removeEventListener('aria:close', handleClose);\n window.removeEventListener('aria:minimize', handleMinimize);\n window.removeEventListener('aria:maximize', handleMaximize);\n };\n }, [openAssistant, closeAssistant, minimizeAssistant, maximizeAssistant]);\n\n // Update container data attribute when open state changes\n useEffect(() => {\n container.setAttribute('data-aria-open', String(isOpen));\n }, [isOpen, container]);\n\n // ============================================================================\n // Chat Actions\n // ============================================================================\n\n const toggleChat = useCallback(() => {\n setIsChatVisible(prev => !prev);\n }, []);\n\n const sendMessage = useCallback(async (message: string) => {\n if (!managerRef.current || !isConnected) {\n throw new Error('Not connected to Aria');\n }\n\n await managerRef.current.sendMessage(message);\n }, [isConnected]);\n\n const toggleMute = useCallback(() => {\n if (!managerRef.current) return;\n const newMuteState = managerRef.current.toggleMute();\n setIsMuted(newMuteState);\n }, []);\n\n const refreshSession = useCallback(() => {\n if (!managerRef.current) return;\n setIsLoading(true);\n setError(null);\n managerRef.current.refreshSession().catch((err) => {\n setError(err instanceof Error ? err.message : 'Failed to refresh session');\n setIsLoading(false);\n });\n }, []);\n\n // ============================================================================\n // Render\n // ============================================================================\n\n return (\n <>\n {/* Floating Trigger Button - only shown when assistant is closed AND token received */}\n {!isOpen && sessionState.token !== null && (\n <AriaTriggerButtonStandalone \n showAvatar={true} \n label={triggerLabel}\n theme={theme}\n isReady={sessionState.isPreloaded || sessionManagerStatus === 'ready' || (sessionManagerStatus === 'connected' && sessionState.token !== null)}\n onClick={() => openAssistant('user')}\n />\n )}\n\n {/* Assistant Widget - render when open */}\n {isOpen && (\n <>\n {/* Backdrop overlay - only shown when widget is NOT minimized */}\n {!isMinimized && (\n <div \n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n minimizeAssistant();\n }}\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n backdropFilter: 'blur(1px)',\n WebkitBackdropFilter: 'blur(1px)',\n zIndex: 9998,\n cursor: 'pointer',\n }}\n aria-hidden=\"true\"\n />\n )}\n \n {/* Aria Widget wrapped in Shadow DOM */}\n <ShadowContainer \n styles={getAriaStyles()}\n style={{ \n position: 'fixed',\n zIndex: 9999,\n inset: 0,\n pointerEvents: 'none',\n }}\n >\n <div style={{ pointerEvents: 'auto' }}>\n <AriaWidgetStandalone\n onClose={closeAssistant}\n isMinimized={isMinimized}\n onMinimize={minimizeAssistant}\n onMaximize={maximizeAssistant}\n theme={theme}\n displayMode={displayMode}\n isConnected={isConnected}\n isLoading={isLoading}\n chatMessages={chatMessages}\n liveTranscript={liveTranscript}\n isChatVisible={isChatVisible}\n isMuted={isMuted}\n error={error}\n toolCallState={toolCallState}\n sessionState={sessionState}\n setVideoElement={setVideoElement}\n toggleChat={toggleChat}\n sendMessage={sendMessage}\n toggleMute={toggleMute}\n refreshSession={refreshSession}\n />\n </div>\n </ShadowContainer>\n </>\n )}\n </>\n );\n};\n\n// ============================================================================\n// Standalone Trigger Button (doesn't use context)\n// ============================================================================\n\ninterface AriaTriggerButtonStandaloneProps {\n showAvatar?: boolean;\n label?: string;\n theme: Theme;\n isReady?: boolean;\n onClick: () => void;\n}\n\nconst AriaTriggerButtonStandalone: FC<AriaTriggerButtonStandaloneProps> = ({\n showAvatar = true,\n label,\n theme,\n isReady = false,\n onClick,\n}) => {\n const isDark = theme === 'dark';\n const buttonLabel = label || 'Talk to Aria';\n \n return (\n <ShadowContainer \n styles={getAriaStyles()}\n style={{\n position: 'fixed',\n bottom: '1.5rem',\n right: '1.5rem',\n zIndex: 9997,\n }}\n >\n <div className={cn('aria-assistant-container', isDark && 'aria-dark')}>\n <button\n onClick={(e) => {\n e.preventDefault();\n if (isReady) {\n onClick();\n }\n }}\n disabled={!isReady}\n className={cn(\n \"group relative flex items-center gap-3 px-3.5 py-2.5 rounded-xl\",\n \"transition-all duration-200 ease-out\",\n \"aria-animate-slide-up\",\n \"border-none outline-none\",\n // Disabled state - more prominent visual feedback\n !isReady && \"opacity-50 pointer-events-none\",\n // Light mode styling\n !isDark && [\n \"bg-white shadow-[0_8px_30px_rgb(0,0,0,0.12)]\",\n isReady && \"hover:bg-gray-50 hover:shadow-[0_8px_30px_rgb(0,0,0,0.16)] hover:-translate-y-0.5\",\n ],\n // Dark mode styling\n isDark && [\n \"bg-gray-900 shadow-[0_8px_30px_rgb(0,0,0,0.3)]\",\n isReady && \"hover:bg-gray-850 hover:shadow-[0_8px_30px_rgb(0,0,0,0.4)] hover:-translate-y-0.5\",\n ],\n )}\n >\n {/* Avatar/Icon */}\n {showAvatar ? (\n <div className={cn(\n \"relative w-9 h-9 rounded-lg overflow-hidden shrink-0\",\n \"shadow-sm transition-all duration-200\",\n !isDark \n ? \"bg-gray-100\" \n : \"bg-gray-800\",\n // Grayscale when not ready\n !isReady && \"grayscale\"\n )}>\n <img \n src={ariaAvatar} \n alt={buttonLabel}\n className=\"w-full h-full object-cover\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n // Show sparkles as fallback\n const fallback = e.currentTarget.nextElementSibling as HTMLElement;\n if (fallback) fallback.style.display = 'flex';\n }}\n />\n <div \n className=\"hidden w-full h-full items-center justify-center aria-gradient-bg text-white\"\n >\n <Sparkles className=\"w-4 h-4\" />\n </div>\n {/* Online indicator - shows session readiness */}\n <span className={cn(\n \"absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full border-2\",\n !isDark ? \"border-white\" : \"border-gray-900\",\n isReady ? \"bg-emerald-500\" : \"bg-amber-500 animate-pulse\"\n )} />\n </div>\n ) : (\n <div className={cn(\n \"relative w-9 h-9 rounded-lg flex items-center justify-center shrink-0\",\n \"aria-gradient-bg text-white shadow-sm\",\n \"transition-transform duration-200\",\n isReady && \"group-hover:scale-105\",\n !isReady && \"grayscale\"\n )}>\n <Sparkles className=\"w-4 h-4\" />\n </div>\n )}\n \n {/* Text content */}\n <div className=\"relative flex flex-col items-start min-w-0 text-left\">\n <span className={cn(\n \"font-bold text-[13px] tracking-tight leading-none\",\n !isDark ? \"text-gray-900\" : \"text-white\"\n )}>\n {buttonLabel}\n </span>\n <span className={cn(\n \"text-[10px] font-medium mt-1 leading-none\",\n !isDark ? \"text-gray-500\" : \"text-gray-400\",\n !isReady && \"animate-pulse\"\n )}>\n {isReady ? \"I'm here to chat\" : \"Connecting...\"}\n </span>\n </div>\n </button>\n </div>\n </ShadowContainer>\n );\n};\n\n// ============================================================================\n// Standalone Widget (doesn't use context)\n// ============================================================================\n\ninterface AriaWidgetStandaloneProps {\n onClose: () => void;\n isMinimized: boolean;\n onMinimize: () => void;\n onMaximize: () => void;\n theme: Theme;\n displayMode: 'center' | 'bottom-right';\n isConnected: boolean;\n isLoading: boolean;\n chatMessages: ChatMessage[];\n liveTranscript: string;\n isChatVisible: boolean;\n isMuted: boolean;\n error: string | null;\n toolCallState: ToolCallState;\n sessionState: SessionState;\n setVideoElement: (element: HTMLVideoElement | null) => void;\n toggleChat: () => void;\n sendMessage: (message: string) => Promise<void>;\n toggleMute: () => void;\n refreshSession: () => void;\n}\n\nconst AriaWidgetStandalone: FC<AriaWidgetStandaloneProps> = ({\n onClose,\n isMinimized,\n onMinimize,\n onMaximize,\n theme,\n displayMode,\n isConnected,\n isLoading,\n chatMessages,\n liveTranscript,\n isChatVisible,\n isMuted,\n error,\n toolCallState,\n setVideoElement,\n toggleChat,\n sendMessage,\n toggleMute,\n refreshSession,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const transcriptRef = useRef<HTMLParagraphElement>(null);\n const [inputValue, setInputValue] = useState('');\n const [isSending, setIsSending] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const isDark = theme === 'dark';\n const isFloating = displayMode === 'bottom-right';\n const isCenter = displayMode === 'center';\n\n // Auto-scroll transcript to bottom when new content arrives\n useEffect(() => {\n if (transcriptRef.current) {\n transcriptRef.current.scrollTop = transcriptRef.current.scrollHeight;\n }\n }, [liveTranscript]);\n\n // Register the video element when it mounts\n useEffect(() => {\n if (videoRef.current) {\n console.log('[AriaWidgetStandalone] Registering video element, minimized:', isMinimized);\n setVideoElement(videoRef.current);\n }\n return () => {\n setVideoElement(null);\n };\n }, [setVideoElement, isMinimized]);\n\n // Auto-scroll chat messages\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [chatMessages]);\n\n const handleSendMessage = async () => {\n if (!inputValue.trim() || !isConnected || isSending) return;\n\n const messageToSend = inputValue.trim();\n setInputValue('');\n setIsSending(true);\n\n try {\n await sendMessage(messageToSend);\n } catch (err) {\n console.error('Failed to send message:', err);\n setInputValue(messageToSend);\n } finally {\n setIsSending(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSendMessage();\n }\n };\n\n const formatTimestamp = (timestamp: number) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n // Minimized state: smaller compact widget\n if (isMinimized) {\n return (\n <div\n className={cn(\n 'aria-assistant-container flex flex-col overflow-hidden aria-animate-scale-in',\n isDark && 'aria-dark',\n 'shadow-2xl rounded-xl',\n !isDark && 'bg-white/95 border border-gray-200/80',\n isDark && 'bg-gray-950/95 border border-gray-800/50',\n 'fixed bottom-6 right-6',\n 'w-[320px] h-[240px]'\n )}\n style={{\n zIndex: 9999,\n backdropFilter: 'blur(8px)',\n WebkitBackdropFilter: 'blur(8px)',\n }}\n >\n <div className={cn(\n 'relative flex-1 flex items-center justify-center overflow-hidden',\n !isDark ? 'bg-gradient-to-br from-gray-100 to-gray-50' : 'bg-gradient-to-br from-gray-900 to-black'\n )}>\n <video\n ref={videoRef}\n autoPlay\n playsInline\n className=\"w-full h-full object-cover\"\n />\n\n {/* Tool Call Indicator */}\n {toolCallState.isActive && isConnected && (\n <div className={cn(\n 'absolute top-3 left-3 aria-animate-fade-in z-20',\n 'flex items-center gap-2 px-3 py-2 rounded-lg',\n 'shadow-lg',\n !isDark \n ? 'bg-amber-50 border border-amber-200' \n : 'bg-amber-900/30 border border-amber-700/50'\n )}\n style={{ backdropFilter: 'blur(8px)' }}\n >\n <div className={cn(\n 'w-5 h-5 rounded-full flex items-center justify-center',\n !isDark ? 'bg-amber-100' : 'bg-amber-800/50'\n )}>\n <Wrench className={cn(\n 'w-3 h-3 animate-pulse',\n !isDark ? 'text-amber-600' : 'text-amber-400'\n )} />\n </div>\n <span className={cn(\n 'text-[10px] font-semibold',\n !isDark ? 'text-amber-800' : 'text-amber-200'\n )}>\n {toolCallState.toolName \n ? toolCallState.toolName.replace(/_/g, ' ')\n : 'Processing...'\n }\n </span>\n </div>\n )}\n\n {/* Control Bar */}\n {isConnected && !error && (\n <div className={cn(\n 'absolute bottom-3 left-1/2 transform -translate-x-1/2 z-20',\n 'flex items-center gap-1 p-1 rounded-full',\n 'shadow-xl',\n !isDark \n ? 'bg-white/90' \n : 'bg-gray-900/90'\n )}\n style={{ backdropFilter: 'blur(12px)' }}\n >\n <button\n onClick={toggleMute}\n className={cn(\n 'w-8 h-8 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n isMuted \n ? 'bg-red-500 hover:bg-red-600 text-white' \n : !isDark\n ? 'bg-gray-100/80 hover:bg-gray-200 text-gray-600'\n : 'bg-gray-800/80 hover:bg-gray-700 text-gray-300'\n )}\n title={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <MicOff className=\"h-3.5 w-3.5\" /> : <Mic className=\"h-3.5 w-3.5\" />}\n </button>\n\n <button\n onClick={onMaximize}\n className={cn(\n 'w-8 h-8 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n !isDark\n ? 'bg-indigo-500 hover:bg-indigo-600 text-white'\n : 'bg-indigo-600 hover:bg-indigo-700 text-white'\n )}\n title=\"Maximize\"\n >\n <Maximize2 className=\"h-3.5 w-3.5\" />\n </button>\n \n <button\n onClick={onClose}\n className=\"w-8 h-8 rounded-full bg-red-500 hover:bg-red-600 flex items-center justify-center transition-all duration-200 text-white border-0 outline-none focus:outline-none shadow-sm\"\n title=\"End Call\"\n >\n <Phone className=\"h-3.5 w-3.5 rotate-[135deg]\" />\n </button>\n </div>\n )}\n\n {/* Loading State */}\n {isLoading && (\n <div className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center z-10',\n !isDark ? 'bg-gradient-to-br from-gray-50 to-white' : 'bg-gradient-to-br from-gray-900 to-gray-950'\n )}>\n <div className=\"relative mb-3\">\n <div className={cn(\n 'absolute -inset-2 rounded-full animate-spin',\n !isDark \n ? 'bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500' \n : 'bg-gradient-to-r from-indigo-400 via-purple-400 to-pink-400'\n )} style={{ animationDuration: '3s' }}>\n <div className={cn(\n 'absolute inset-[2px] rounded-full',\n !isDark ? 'bg-white' : 'bg-gray-900'\n )} />\n </div>\n <div className={cn(\n 'relative w-12 h-12 rounded-full overflow-hidden shadow-lg',\n !isDark ? 'bg-gray-100 ring-2 ring-white' : 'bg-gray-800 ring-2 ring-gray-900'\n )}>\n <img \n src={ariaAvatar} \n alt=\"Aria\" \n className=\"w-full h-full object-cover\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n </div>\n </div>\n <p className={cn(\n 'text-xs font-medium',\n !isDark ? 'text-gray-600' : 'text-gray-400'\n )}>\n Connecting...\n </p>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <div className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center z-10 p-4',\n !isDark ? 'bg-white/90' : 'bg-gray-950/90'\n )}>\n <div className=\"w-10 h-10 rounded-full bg-red-500/10 flex items-center justify-center mb-2\">\n <X className=\"w-5 h-5 text-red-500\" />\n </div>\n <p className={cn(\n 'text-xs font-medium text-center mb-2',\n !isDark ? 'text-red-700' : 'text-red-300'\n )}>\n Connection error\n </p>\n <button\n onClick={refreshSession}\n className={cn(\n 'inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-medium',\n 'transition-all duration-200',\n !isDark \n ? 'bg-indigo-500 hover:bg-indigo-600 text-white' \n : 'bg-indigo-600 hover:bg-indigo-700 text-white'\n )}\n >\n <RefreshCw className=\"w-3 h-3\" />\n Retry\n </button>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Full size widget\n return (\n <div\n className={cn(\n 'aria-assistant-container flex flex-col overflow-hidden aria-animate-scale-in',\n isDark && 'aria-dark',\n 'shadow-2xl',\n !isDark && 'bg-white/95 border border-gray-200/80',\n isDark && 'bg-gray-950/95 border border-gray-800/50',\n isFloating && 'fixed bottom-6 right-6 rounded-xl',\n isFloating && (isChatVisible ? 'w-[960px]' : 'w-[640px]'),\n isFloating && 'h-[500px]',\n isCenter && 'fixed inset-8 md:inset-16 lg:inset-20 rounded-2xl'\n )}\n style={{\n zIndex: 9999,\n backdropFilter: 'blur(8px)',\n WebkitBackdropFilter: 'blur(8px)',\n }}\n >\n <div className=\"flex-1 flex overflow-hidden min-h-0\">\n {/* Video Section */}\n <div className={cn(\n 'relative flex items-center justify-center overflow-hidden',\n !isDark ? 'bg-gradient-to-br from-gray-100 to-gray-50' : 'bg-gradient-to-br from-gray-900 to-black',\n isChatVisible ? 'flex-1' : 'w-full'\n )}>\n {/* Loading State */}\n {isLoading && (\n <div className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center z-10',\n !isDark ? 'bg-gradient-to-br from-gray-50 to-white' : 'bg-gradient-to-br from-gray-900 to-gray-950'\n )}>\n <div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div className={cn(\n 'absolute w-96 h-96 rounded-full opacity-20 blur-3xl',\n 'animate-pulse',\n !isDark ? 'bg-indigo-300' : 'bg-indigo-900'\n )} style={{ top: '20%', left: '10%', animationDuration: '3s' }} />\n <div className={cn(\n 'absolute w-64 h-64 rounded-full opacity-20 blur-3xl',\n 'animate-pulse',\n !isDark ? 'bg-purple-300' : 'bg-purple-900'\n )} style={{ bottom: '20%', right: '10%', animationDuration: '4s', animationDelay: '1s' }} />\n </div>\n \n <div className=\"relative flex flex-col items-center\">\n <div className=\"relative mb-6\">\n <div className={cn(\n 'absolute -inset-3 rounded-full',\n 'animate-spin',\n !isDark \n ? 'bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500' \n : 'bg-gradient-to-r from-indigo-400 via-purple-400 to-pink-400'\n )} style={{ animationDuration: '3s' }}>\n <div className={cn(\n 'absolute inset-[3px] rounded-full',\n !isDark ? 'bg-white' : 'bg-gray-900'\n )} />\n </div>\n \n <div className={cn(\n 'absolute -inset-1.5 rounded-full opacity-60 animate-pulse',\n !isDark \n ? 'bg-gradient-to-r from-indigo-400 to-purple-400' \n : 'bg-gradient-to-r from-indigo-500 to-purple-500'\n )} />\n \n <div className={cn(\n 'relative w-20 h-20 rounded-full overflow-hidden',\n 'shadow-xl',\n !isDark ? 'bg-gray-100 ring-4 ring-white' : 'bg-gray-800 ring-4 ring-gray-900'\n )}>\n <img \n src={ariaAvatar} \n alt=\"Aria\" \n className=\"w-full h-full object-cover\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n </div>\n </div>\n \n <h3 className={cn(\n 'text-2xl font-bold tracking-tight mb-2',\n !isDark ? 'text-gray-900' : 'text-white'\n )}>\n Aria is joining...\n </h3>\n \n <div className=\"flex items-center gap-1.5 mb-6\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={cn(\n 'w-2.5 h-2.5 rounded-full',\n !isDark ? 'bg-indigo-500' : 'bg-indigo-400'\n )}\n style={{\n animation: 'aria-loading-bounce 1.4s ease-in-out infinite',\n animationDelay: `${i * 0.15}s`,\n }}\n />\n ))}\n </div>\n \n <p className={cn(\n 'text-sm font-medium px-4 py-2 rounded-full',\n !isDark \n ? 'bg-gray-100 text-gray-600' \n : 'bg-gray-800 text-gray-400'\n )}>\n Get ready to chat\n </p>\n </div>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <div className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center z-10 p-6',\n !isDark ? 'bg-white/80' : 'bg-gray-950/80'\n )}\n style={{ backdropFilter: 'blur(4px)' }}\n >\n <div className={cn(\n 'rounded-lg p-6 max-w-sm w-full shadow-lg border',\n !isDark ? 'bg-white border-red-100' : 'bg-gray-900 border-red-900/30'\n )}>\n <div className=\"flex flex-col items-center text-center gap-3\">\n <div className=\"w-12 h-12 rounded-full bg-red-500/10 flex items-center justify-center\">\n <X className=\"w-6 h-6 text-red-500\" />\n </div>\n <div>\n <p className={cn(\n 'text-base font-bold mb-2',\n !isDark ? 'text-red-900' : 'text-red-200'\n )}>\n Couldn't reach Aria\n </p>\n <p className={cn(\n 'text-sm leading-relaxed mb-4',\n !isDark ? 'text-red-600' : 'text-red-400'\n )}>\n {error}\n </p>\n <button\n onClick={refreshSession}\n className={cn(\n 'inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium',\n 'transition-all duration-200',\n !isDark \n ? 'bg-indigo-500 hover:bg-indigo-600 text-white' \n : 'bg-indigo-600 hover:bg-indigo-700 text-white'\n )}\n >\n <RefreshCw className=\"w-4 h-4\" />\n Try Again\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Video Element */}\n <video\n ref={videoRef}\n autoPlay\n playsInline\n className=\"w-full h-full object-contain\"\n />\n\n {/* Tool Call Indicator */}\n {toolCallState.isActive && isConnected && (\n <div className={cn(\n 'absolute top-3 left-3 aria-animate-fade-in z-20',\n 'flex items-center gap-2 px-3 py-2 rounded-lg',\n 'shadow-lg',\n !isDark \n ? 'bg-amber-50 border border-amber-200' \n : 'bg-amber-900/30 border border-amber-700/50'\n )}\n style={{ backdropFilter: 'blur(8px)' }}\n >\n <div className={cn(\n 'w-6 h-6 rounded-full flex items-center justify-center',\n !isDark ? 'bg-amber-100' : 'bg-amber-800/50'\n )}>\n <Wrench className={cn(\n 'w-3.5 h-3.5 animate-pulse',\n !isDark ? 'text-amber-600' : 'text-amber-400'\n )} />\n </div>\n <div className=\"flex flex-col\">\n <span className={cn(\n 'text-xs font-semibold',\n !isDark ? 'text-amber-800' : 'text-amber-200'\n )}>\n {toolCallState.toolName \n ? `Running: ${toolCallState.toolName.replace(/_/g, ' ')}`\n : 'Processing...'\n }\n </span>\n <span className={cn(\n 'text-[10px]',\n !isDark ? 'text-amber-600' : 'text-amber-400'\n )}>\n Please wait...\n </span>\n </div>\n <div className=\"flex items-center gap-0.5 ml-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={cn(\n 'w-1.5 h-1.5 rounded-full',\n !isDark ? 'bg-amber-500' : 'bg-amber-400'\n )}\n style={{\n animation: 'aria-loading-bounce 1.4s ease-in-out infinite',\n animationDelay: `${i * 0.15}s`,\n }}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Live Transcript Overlay */}\n {liveTranscript && isConnected && !toolCallState.isActive && (\n <div className={cn(\n 'absolute top-0 left-0 right-0 aria-animate-fade-in',\n 'px-4 py-2',\n !isDark \n ? 'bg-gradient-to-b from-black/60 to-transparent text-white' \n : 'bg-gradient-to-b from-white/60 to-transparent text-gray-900'\n )}\n style={{ backdropFilter: 'blur(4px)' }}\n >\n <div className=\"flex items-start gap-2 max-w-full\">\n <div className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse shrink-0 mt-1\" />\n <p ref={transcriptRef} className=\"text-xs leading-relaxed flex-1 max-h-[3.5em] overflow-y-auto scrollbar-hide\">\n {liveTranscript}\n </p>\n </div>\n </div>\n )}\n\n {/* Control Bar */}\n {isConnected && !error && (\n <div className={cn(\n 'absolute bottom-4 left-1/2 transform -translate-x-1/2 z-20',\n 'flex items-center gap-1.5 p-1 rounded-full',\n 'shadow-xl',\n !isDark \n ? 'bg-white/90' \n : 'bg-gray-900/90'\n )}\n style={{ backdropFilter: 'blur(12px)' }}\n >\n <button\n onClick={toggleChat}\n className={cn(\n 'w-9 h-9 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n isChatVisible\n ? !isDark\n ? 'bg-indigo-500 hover:bg-indigo-600 text-white'\n : 'bg-indigo-600 hover:bg-indigo-700 text-white'\n : !isDark\n ? 'bg-gray-100/80 hover:bg-gray-200 text-gray-600'\n : 'bg-gray-800/80 hover:bg-gray-700 text-gray-300'\n )}\n title={isChatVisible ? 'Hide Chat' : 'Show Chat'}\n >\n <MessageCircle className=\"h-4 w-4\" />\n </button>\n \n <button\n onClick={toggleMute}\n className={cn(\n 'w-9 h-9 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n isMuted \n ? 'bg-red-500 hover:bg-red-600 text-white' \n : !isDark\n ? 'bg-gray-100/80 hover:bg-gray-200 text-gray-600'\n : 'bg-gray-800/80 hover:bg-gray-700 text-gray-300'\n )}\n title={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <MicOff className=\"h-4 w-4\" /> : <Mic className=\"h-4 w-4\" />}\n </button>\n\n <button\n onClick={onMinimize}\n className={cn(\n 'w-9 h-9 rounded-full flex items-center justify-center transition-all duration-200',\n 'border-0 outline-none focus:outline-none shadow-sm',\n !isDark\n ? 'bg-gray-100/80 hover:bg-gray-200 text-gray-600'\n : 'bg-gray-800/80 hover:bg-gray-700 text-gray-300'\n )}\n title=\"Minimize\"\n >\n <Minimize2 className=\"h-4 w-4\" />\n </button>\n \n <button\n onClick={onClose}\n className=\"w-10 h-9 rounded-full bg-red-500 hover:bg-red-600 flex items-center justify-center transition-all duration-200 text-white border-0 outline-none focus:outline-none shadow-sm\"\n title=\"End Call\"\n >\n <Phone className=\"h-4 w-4 rotate-[135deg]\" />\n </button>\n </div>\n )}\n </div>\n\n {/* Chat Panel - Inline implementation */}\n {isChatVisible && (\n <div className={cn(\n 'flex flex-col shrink-0 border-l',\n isFloating ? 'w-[320px]' : 'w-[360px]',\n !isDark ? 'bg-white border-gray-100' : 'bg-gray-900 border-gray-800'\n )}>\n {/* Chat Header */}\n <div className={cn(\n 'px-4 py-3 border-b',\n !isDark ? 'border-gray-100 bg-white' : 'border-gray-800 bg-gray-900'\n )}>\n <div className=\"flex items-center gap-2\">\n <div className={cn(\n 'w-7 h-7 rounded-lg flex items-center justify-center',\n !isDark ? 'bg-indigo-100' : 'bg-indigo-900/30'\n )}>\n <MessageCircle className={cn(\n 'w-4 h-4',\n !isDark ? 'text-indigo-600' : 'text-indigo-400'\n )} />\n </div>\n <h3 className={cn(\n 'font-bold text-sm',\n !isDark ? 'text-gray-900' : 'text-white'\n )}>\n Chat with Aria\n </h3>\n </div>\n </div>\n\n {/* Messages Container */}\n <div className={cn(\n 'flex-1 overflow-y-auto p-4 space-y-4',\n !isDark ? 'bg-gray-50/30' : 'bg-gray-900/30'\n )}>\n {chatMessages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full text-center px-4 aria-animate-fade-in\">\n <div className={cn(\n 'rounded-2xl p-6 mb-4',\n !isDark \n ? 'bg-gradient-to-br from-indigo-50 to-purple-50' \n : 'bg-gradient-to-br from-indigo-900/20 to-purple-900/20'\n )}>\n <Sparkles className={cn(\n 'h-8 w-8',\n !isDark ? 'text-indigo-500' : 'text-indigo-400'\n )} />\n </div>\n <p className={cn(\n 'text-sm font-bold mb-1',\n !isDark ? 'text-gray-900' : 'text-white'\n )}>\n Let's talk!\n </p>\n <p className={cn(\n 'text-xs',\n !isDark ? 'text-gray-500' : 'text-gray-400'\n )}>\n Aria is here to chat with you\n </p>\n </div>\n ) : (\n chatMessages\n .filter((message) => message.content && message.content.trim() !== '')\n .map((message, index) => (\n <div\n key={index}\n className={cn(\n 'flex gap-2 aria-animate-fade-in',\n message.role === 'user' ? 'flex-row-reverse' : 'flex-row'\n )}\n style={{ animationDelay: `${index * 50}ms` }}\n >\n <div\n className={cn(\n 'shrink-0 w-6 h-6 rounded-full flex items-center justify-center',\n message.role === 'user'\n ? 'bg-indigo-500 text-white'\n : !isDark\n ? 'bg-gray-200 text-gray-600'\n : 'bg-gray-700 text-gray-300'\n )}\n >\n {message.role === 'user' ? (\n <User className=\"h-3 w-3\" />\n ) : (\n <Bot className=\"h-3 w-3\" />\n )}\n </div>\n\n <div\n className={cn(\n 'flex flex-col max-w-[80%]',\n message.role === 'user' ? 'items-end' : 'items-start'\n )}\n >\n <div\n className={cn(\n 'px-3 py-2 rounded-2xl',\n message.role === 'user'\n ? 'bg-indigo-500 text-white rounded-br-md'\n : !isDark\n ? 'bg-white shadow-sm text-gray-800 rounded-bl-md'\n : 'bg-gray-800 text-gray-100 rounded-bl-md'\n )}\n >\n <p className={cn(\n 'text-xs leading-relaxed break-words',\n message.role === 'user' && 'text-white'\n )}>\n {message.content}\n </p>\n </div>\n <span className={cn(\n 'text-[9px] mt-1 px-1',\n !isDark ? 'text-gray-400' : 'text-gray-500'\n )}>\n {formatTimestamp(message.timestamp)}\n </span>\n </div>\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <div className={cn(\n 'p-3 border-t',\n !isDark ? 'border-gray-100 bg-white' : 'border-gray-800 bg-gray-900'\n )}>\n <div className={cn(\n 'flex gap-2 p-1 rounded-lg border transition-all duration-200',\n !isDark \n ? 'bg-gray-50 border-gray-200 focus-within:border-indigo-500/50 focus-within:bg-white' \n : 'bg-gray-850 border-gray-700 focus-within:border-indigo-500/50'\n )}>\n <input\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={isConnected ? 'Message Aria...' : 'Connecting...'}\n disabled={!isConnected || isSending}\n className={cn(\n 'flex-1 border-0 bg-transparent shadow-none focus:outline-none px-2 h-8 text-xs',\n !isDark ? 'placeholder:text-gray-400 text-gray-900' : 'placeholder:text-gray-500 text-white'\n )}\n />\n <button\n onClick={handleSendMessage}\n disabled={!isConnected || !inputValue.trim() || isSending}\n className={cn(\n 'h-7 w-7 rounded-md shrink-0 transition-all duration-200 flex items-center justify-center',\n 'bg-indigo-500 hover:bg-indigo-600 disabled:opacity-40 text-white'\n )}\n >\n <Send className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default AriaStandaloneUI;\n"],"names":["isSessionResponse","msg","isMessageHistoryAck","isMessageStreamAck","isSessionEndAck","isSessionEndError","isWebSocketTriggerEvent","isGenericAck","isMissingFieldsError","DEFAULT_REFRESH_CONFIG","AriaSessionManager","config","previousUserId","type","listener","event","typeListeners","err","newStatus","oldStatus","updates","error","errorMessage","enabled","delay","expiresAt","remaining","parsedData","errorMsg","response","isRefreshing","sessionToken","shouldSkipGreeting","message","userTrigger","createClient","AnamEvent","client","anamSessionId","messages","anamMessages","anamMessage","toolEvent","streams","videoStream","audioStream","element","tracks","activeTracks","track","audioTracks","force","payload","is_final","now","bufferMs","refreshAt","timeToExpiry","resetGreeting","callback","state","AriaCore","fullConfig","mode","connected","theme","triggerLabel","container","React","ReactDOM","AriaStandaloneUI","AriaStandaloneUI$1","root","isJWT","token","decodeJWT","base64","padded","decoded","extractSessionIdFromToken","sessionIdClaims","claim","getTokenInfo","sessionId","exp","iat","isTokenExpired","ShadowContainer","children","styles","className","style","Tag","hostRef","useRef","shadowRoot","setShadowRoot","useState","useEffect","host","shadow","existingStyle","styleElement","portalContainer","setPortalContainer","jsx","createPortal","getAriaStyles","cssString","r","e","t","f","n","o","clsx","concatArrays","array1","array2","combinedArray","i","createClassValidatorObject","classGroupId","validator","createClassPartObject","nextPart","validators","CLASS_PART_SEPARATOR","EMPTY_CONFLICTS","ARBITRARY_PROPERTY_PREFIX","createClassGroupUtils","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getGroupIdForArbitraryProperty","classParts","startIndex","getGroupRecursive","hasPostfixModifier","modifierConflicts","baseConflicts","classPartObject","currentClassPart","nextClassPartObject","result","classRest","validatorsLength","validatorObj","content","colonIndex","property","classGroups","processClassGroups","group","processClassesRecursively","classGroup","len","classDefinition","processClassDefinition","processStringDefinition","processFunctionDefinition","processObjectDefinition","classPartObjectToEdit","getPart","isThemeGetter","entries","key","value","path","current","parts","part","next","func","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR","EMPTY_MODIFIERS","createResultObject","modifiers","hasImportantModifier","baseClassName","maybePostfixModifierPosition","isExternal","createParseClassName","prefix","experimentalParseClassName","parseClassName","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","fullPrefix","parseClassNameOriginal","createSortModifiers","modifierWeights","mod","currentSegment","modifier","isArbitrary","isOrderSensitive","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","getClassGroupId","getConflictingClassGroupIds","sortModifiers","classGroupsInConflict","classNames","originalClassName","variantModifier","modifierId","classId","conflictGroups","twJoin","classLists","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","args","fallbackThemeArr","fromTheme","themeGetter","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","isNumber","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitraryValue","isArbitraryVariable","isArbitrarySize","getIsArbitraryValue","isLabelSize","isArbitraryLength","isLabelLength","isArbitraryNumber","isLabelNumber","isArbitraryPosition","isLabelPosition","isArbitraryImage","isLabelImage","isArbitraryShadow","isLabelShadow","isArbitraryVariableLength","getIsArbitraryVariable","isArbitraryVariableFamilyName","isLabelFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","testLabel","testValue","shouldMatchNoLabel","label","getDefaultConfig","themeColor","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","scaleGridTemplateColsRows","scaleGridColRowStartAndEnd","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleColor","scaleBgPosition","scaleBgRepeat","scaleBgSize","scaleGradientStopPosition","scaleRadius","scaleBorderWidth","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","twMerge","cn","inputs","ariaAvatar","isOpen","setIsOpen","isMinimized","setIsMinimized","isConnected","setIsConnected","isLoading","setIsLoading","chatMessages","setChatMessages","liveTranscript","setLiveTranscript","isChatVisible","setIsChatVisible","isMuted","setIsMuted","setError","setTriggerMode","displayMode","setDisplayMode","toolCallState","setToolCallState","sessionState","setSessionState","sessionManagerStatus","setSessionManagerStatus","setIsSessionPaused","managerRef","videoElementRef","isOpenRef","handleStatusChange","useCallback","handleSessionReady","eventData","isLazyInit","handleSessionError","handleConnectionChange","handleMessageHistory","handleMessageStream","transcript","handleToolCall","data","setVideoElement","previousElement","openAssistant","isPaused","resumed","initErr","isAnamReady","hasToken","status","minimizeAssistant","maximizeAssistant","closeAssistant","handleWebSocketTrigger","manager","toolState","handleOpen","handleClose","handleMinimize","handleMaximize","toggleChat","prev","sendMessage","toggleMute","newMuteState","refreshSession","jsxs","Fragment","AriaTriggerButtonStandalone","AriaWidgetStandalone","showAvatar","isReady","onClick","isDark","buttonLabel","fallback","Sparkles","onClose","onMinimize","onMaximize","videoRef","transcriptRef","inputValue","setInputValue","isSending","setIsSending","messagesEndRef","isFloating","isCenter","handleSendMessage","messageToSend","handleKeyDown","formatTimestamp","timestamp","Wrench","MicOff","Mic","Maximize2","Phone","X","RefreshCw","MessageCircle","Minimize2","User","Bot","Send"],"mappings":"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","x_google_ignoreList":[5,6]}