@agentiffai/design 0.1.7 → 0.1.8

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.
Files changed (47) hide show
  1. package/dist/{StreamStatusIndicator-DM5n4MI1.d.cts → Window-CF5y1_Og.d.cts} +111 -106
  2. package/dist/{StreamStatusIndicator-DM5n4MI1.d.ts → Window-CF5y1_Og.d.ts} +111 -106
  3. package/dist/copilotkit/index.cjs +2465 -2276
  4. package/dist/copilotkit/index.cjs.map +1 -1
  5. package/dist/copilotkit/index.d.cts +63 -46
  6. package/dist/copilotkit/index.d.ts +63 -46
  7. package/dist/copilotkit/index.js +2463 -2275
  8. package/dist/copilotkit/index.js.map +1 -1
  9. package/dist/icons/index.cjs +68 -167
  10. package/dist/icons/index.cjs.map +1 -1
  11. package/dist/icons/index.d.cts +25 -20
  12. package/dist/icons/index.d.ts +25 -20
  13. package/dist/icons/index.js +68 -167
  14. package/dist/icons/index.js.map +1 -1
  15. package/dist/index.cjs +5837 -3633
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +332 -4
  18. package/dist/index.d.ts +332 -4
  19. package/dist/index.js +5786 -3603
  20. package/dist/index.js.map +1 -1
  21. package/dist/layout/index.cjs +1000 -525
  22. package/dist/layout/index.cjs.map +1 -1
  23. package/dist/layout/index.d.cts +70 -8
  24. package/dist/layout/index.d.ts +70 -8
  25. package/dist/layout/index.js +997 -523
  26. package/dist/layout/index.js.map +1 -1
  27. package/dist/theme/index.cjs +345 -24
  28. package/dist/theme/index.cjs.map +1 -1
  29. package/dist/theme/index.d.cts +524 -65
  30. package/dist/theme/index.d.ts +524 -65
  31. package/dist/theme/index.js +345 -24
  32. package/dist/theme/index.js.map +1 -1
  33. package/dist/workflow/index.cjs +870 -575
  34. package/dist/workflow/index.cjs.map +1 -1
  35. package/dist/workflow/index.d.cts +93 -57
  36. package/dist/workflow/index.d.ts +93 -57
  37. package/dist/workflow/index.js +866 -572
  38. package/dist/workflow/index.js.map +1 -1
  39. package/package.json +1 -1
  40. package/public/assets/icon-set/Icon-contacts-fill.svg +3 -0
  41. package/public/assets/icon-set/Icon-mail-open-fill.svg +3 -0
  42. package/public/assets/icon-set/Icon-p2p-fill.svg +3 -0
  43. package/public/assets/icon-set/Icon-robot-2-fill.svg +3 -0
  44. package/public/assets/icon-set/Icon-send-plane-fill.svg +3 -0
  45. package/public/assets/icon-set/Notion.svg +41 -0
  46. package/public/assets/icon-set/Postiz.svg +1 -0
  47. package/public/assets/avatar-transparent-bg.png +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/copilotkit/Button/Button.styles.ts","../../src/components/copilotkit/Button/Button.tsx","../../src/components/copilotkit/Actions/Actions.styles.ts","../../src/components/copilotkit/Actions/Actions.tsx","../../src/components/copilotkit/Response/Response.styles.ts","../../src/components/copilotkit/Response/Response.tsx","../../src/components/copilotkit/AgentState/AgentState.styles.ts","../../src/components/copilotkit/AgentState/AgentState.tsx","../../src/components/copilotkit/Messages/AssistantMessage.styles.ts","../../src/components/copilotkit/Messages/FileAttachment.styles.ts","../../src/components/copilotkit/Messages/FileAttachment.tsx","../../src/components/copilotkit/StreamingText.tsx","../../src/components/copilotkit/Messages/AssistantMessage.tsx","../../src/components/AssistantThinking/AssistantThinking.styles.ts","../../src/components/AssistantThinking/AssistantThinking.tsx","../../src/components/copilotkit/adapters/AssistantMessageAdapter.tsx","../../src/components/UserMessage/UserMessage.styles.ts","../../src/components/UserMessage/UserMessage.tsx","../../src/components/copilotkit/adapters/UserMessageAdapter.tsx","../../src/components/ChatInput/ChatInput.styles.ts","../../src/components/ChatInput/ChatInput.tsx","../../src/components/copilotkit/adapters/InputAdapter.tsx","../../src/components/copilotkit/Header/Header.styles.ts","../../src/components/copilotkit/Header/Header.tsx","../../src/components/copilotkit/Window/Window.styles.ts","../../src/components/copilotkit/Window/Window.tsx","../../src/components/copilotkit/CustomCopilotSidebar/CustomCopilotSidebar.tsx","../../src/components/copilotkit/Footer/Footer.styles.ts","../../src/components/copilotkit/Footer/Footer.tsx","../../src/components/copilotkit/Input/Input.styles.ts","../../src/components/copilotkit/Input/Input.tsx","../../src/components/copilotkit/Messages/Messages.styles.ts","../../src/components/copilotkit/Messages/Messages.tsx","../../src/components/copilotkit/Messages/MessagesList.styles.ts","../../src/components/copilotkit/Messages/MessagesList.tsx","../../src/components/copilotkit/Messages/UserMessage.styles.ts","../../src/components/copilotkit/Messages/UserMessage.tsx","../../src/components/copilotkit/Suggestions/Suggestions.styles.ts","../../src/components/copilotkit/Suggestions/Suggestions.tsx","../../src/components/copilotkit/StreamErrorMessage.tsx","../../src/components/copilotkit/StreamStatusIndicator.tsx","../../src/components/copilotkit/CopilotSidebarIntegration.tsx"],"names":["css","styled","useRef","useButton","jsx","jsxs","keyframes","dotPulse","LoadingDots","StreamingText","useState","useEffect","ActionsContainer","Fragment","Container","Avatar","Dot","Message","useTextField","ActionButton","createGlobalStyle","useChatContext","CopilotSidebar","InputWrapper","StyledUserMessage","MessageContent","MessageTime","StreamingIndicator","UserMessage","Content","Actions","Button","pulse","GlobalSidebarStyles","StyledChatButton","CustomCopilotSidebar"],"mappings":"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","file":"index.cjs","sourcesContent":["import styled, { css } from 'styled-components';\nimport type { ButtonSize, ButtonVariant } from './Button.types';\n\ninterface StyledButtonProps {\n $variant: ButtonVariant;\n $size: ButtonSize;\n $isPressed: boolean;\n $isLoading: boolean;\n}\n\nconst variantStyles = {\n primary: css`\n background-color: ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n color: white;\n border: none;\n\n &:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n }\n\n &:active:not(:disabled) {\n opacity: 0.8;\n transform: translateY(0);\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n outline-offset: 2px;\n }\n `,\n secondary: css`\n background-color: transparent;\n color: ${({ theme }) => theme?.colors?.text ?? '#000000'};\n border: 1px solid ${({ theme }) => theme?.colors?.border ?? '#E0E0E0'};\n\n &:hover:not(:disabled) {\n background-color: ${({ theme }) => theme?.colors?.surface ?? '#ffffff'};\n border-color: ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n }\n\n &:active:not(:disabled) {\n background-color: ${({ theme }) => theme?.colors?.border ?? '#E0E0E0'};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n outline-offset: 2px;\n }\n `,\n icon: css`\n background-color: transparent;\n color: ${({ theme }) => theme?.colors?.text ?? '#000000'};\n border: none;\n padding: ${({ theme }) => theme?.spacing?.sm ?? '8px'};\n min-width: auto;\n\n &:hover:not(:disabled) {\n background-color: ${({ theme }) => theme?.colors?.border ?? '#E0E0E0'};\n opacity: 0.8;\n }\n\n &:active:not(:disabled) {\n opacity: 0.6;\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n outline-offset: 2px;\n }\n `,\n};\n\nconst sizeStyles = {\n small: css`\n padding: ${({ theme }) => theme?.spacing?.xs ?? '4px'} ${({ theme }) => theme?.spacing?.sm ?? '8px'};\n font-size: 0.875rem;\n min-width: 60px;\n height: 28px;\n `,\n medium: css`\n padding: ${({ theme }) => theme?.spacing?.sm ?? '8px'} ${({ theme }) => theme?.spacing?.md ?? '16px'};\n font-size: 1rem;\n min-width: 80px;\n height: 36px;\n `,\n large: css`\n padding: ${({ theme }) => theme?.spacing?.md ?? '16px'} ${({ theme }) => theme?.spacing?.lg ?? '24px'};\n font-size: 1.125rem;\n min-width: 100px;\n height: 44px;\n `,\n};\n\nexport const StyledButton = styled.button<StyledButtonProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: ${({ theme }) => theme?.spacing?.xs ?? '4px'};\n font-family: ${({ theme }) => theme?.fonts?.body ?? 'system-ui, sans-serif'};\n font-weight: 500;\n border-radius: ${({ theme }) => theme?.radii?.md ?? '8px'};\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n white-space: nowrap;\n user-select: none;\n\n /* Variant styles */\n ${({ $variant }) => variantStyles[$variant]}\n\n /* Size styles */\n ${({ $size, $variant }) => $variant !== 'icon' && sizeStyles[$size]}\n\n /* Icon variant size overrides */\n ${({ $variant, $size }) =>\n $variant === 'icon' &&\n css`\n width: ${$size === 'small' ? '28px' : $size === 'large' ? '44px' : '36px'};\n height: ${$size === 'small' ? '28px' : $size === 'large' ? '44px' : '36px'};\n border-radius: ${({ theme }) => theme?.radii?.sm ?? '4px'};\n `}\n\n /* Pressed state */\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: scale(0.98);\n `}\n\n /* Loading state */\n ${({ $isLoading }) =>\n $isLoading &&\n css`\n cursor: wait;\n opacity: 0.7;\n `}\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n }\n\n /* Remove default focus outline, using focus-visible instead */\n &:focus {\n outline: none;\n }\n`;\n","import type { AriaButtonProps } from '@react-aria/button';\nimport { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledButton } from './Button.styles';\nimport type { ButtonVariant, ButtonSize } from './Button.types';\n\n// Re-export types for public API\nexport type { ButtonVariant, ButtonSize } from './Button.types';\n\nexport interface ButtonProps extends AriaButtonProps {\n variant?: ButtonVariant;\n size?: ButtonSize;\n children: React.ReactNode;\n className?: string;\n disabled?: boolean;\n isLoading?: boolean;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'medium',\n children,\n className,\n disabled = false,\n isLoading = false,\n ...ariaProps\n}: ButtonProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps, isPressed } = useButton(\n {\n ...ariaProps,\n isDisabled: disabled || isLoading,\n },\n ref\n );\n\n return (\n <StyledButton\n {...buttonProps}\n ref={ref}\n className={className}\n $variant={variant}\n $size={size}\n $isPressed={isPressed}\n $isLoading={isLoading}\n disabled={disabled || isLoading}\n >\n {isLoading ? (\n <span aria-live=\"polite\" aria-busy=\"true\">\n Loading...\n </span>\n ) : (\n children\n )}\n </StyledButton>\n );\n}\n\nButton.displayName = 'Button';\n","import styled, { css } from 'styled-components';\nimport type { ActionsLayout } from './Actions.types';\n\ninterface ActionsContainerProps {\n $layout: ActionsLayout;\n}\n\nexport const ActionsContainer = styled.div<ActionsContainerProps>`\n display: flex;\n gap: ${({ theme }) => theme?.spacing?.sm ?? '8px'};\n align-items: center;\n\n ${({ $layout }) =>\n $layout === 'horizontal'\n ? css`\n flex-direction: row;\n flex-wrap: wrap;\n `\n : css`\n flex-direction: column;\n align-items: stretch;\n\n button {\n width: 100%;\n }\n `}\n`;\n","import { Button } from '../Button';\nimport { ActionsContainer } from './Actions.styles';\nimport type { Action, ActionsLayout } from './Actions.types';\n\n// Re-export types for public API\nexport type { Action, ActionVariant, ActionsLayout } from './Actions.types';\n\nexport interface ActionsProps {\n actions: Action[];\n layout?: ActionsLayout;\n className?: string;\n}\n\nexport function Actions({ actions, layout = 'horizontal', className }: ActionsProps) {\n return (\n <ActionsContainer $layout={layout} className={className}>\n {actions.map((action) => (\n <Button\n key={action.id}\n variant={action.variant || 'secondary'}\n onPress={action.onClick}\n isDisabled={action.disabled}\n aria-label={action.label}\n >\n {action.icon && <span aria-hidden=\"true\">{action.icon}</span>}\n {action.variant !== 'icon' && action.label}\n </Button>\n ))}\n </ActionsContainer>\n );\n}\n\nActions.displayName = 'Actions';\n","import styled, { keyframes } from 'styled-components';\n\n// Pulse animation matching AssistantThinking\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Fade in animation for streaming text\nconst fadeIn = keyframes`\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n`;\n\n// Cursor blink animation for streaming\nconst blink = keyframes`\n 0%, 49% {\n opacity: 1;\n }\n 50%, 100% {\n opacity: 0;\n }\n`;\n\nexport const ResponseContainer = styled.div`\n display: inline-flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background-color: #2c2c2e;\n border-radius: 16px;\n box-shadow: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const LoadingDots = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 0 4px;\n`;\n\nexport const Dot = styled.span<{ delay: number }>`\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #8e8e93;\n animation: ${dotPulse} 1.4s ease-in-out infinite;\n animation-delay: ${(props) => props.delay}s;\n`;\n\nexport const TypingIndicator = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 0 4px;\n\n ${Dot} {\n width: 6px;\n height: 6px;\n background-color: #8e8e93;\n animation: ${dotPulse} 1.4s ease-in-out infinite;\n }\n`;\n\nexport const Message = styled.span`\n font-size: 14px;\n color: #e5e5e7;\n font-weight: 400;\n line-height: 1.5;\n white-space: nowrap;\n`;\n\nexport const StreamingText = styled.div`\n font-size: 14px;\n line-height: 1.5;\n color: #e5e5e7;\n animation: ${fadeIn} 0.3s ease-in;\n position: relative;\n font-weight: 400;\n white-space: nowrap;\n\n /* Blinking cursor effect */\n &::after {\n content: '|';\n margin-left: 0.125rem;\n animation: ${blink} 1s infinite;\n color: #8e8e93;\n font-weight: 400;\n }\n`;\n","import {\n Dot,\n LoadingDots,\n Message,\n ResponseContainer,\n StreamingText,\n TypingIndicator,\n} from './Response.styles';\n\nexport interface ResponseProps {\n /** Loading state - shows animated dots */\n isLoading?: boolean;\n /** Typing state - shows typing indicator */\n isTyping?: boolean;\n /** Streaming state - shows text being typed */\n isStreaming?: boolean;\n /** Content to display when streaming */\n streamingContent?: string;\n /** Message to display with loading/typing state */\n message?: string;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Response component for displaying loading and streaming states\n * Shows animated loading dots, typing indicators, and streaming text\n */\nexport const Response = ({\n isLoading = false,\n isTyping = false,\n isStreaming = false,\n streamingContent = '',\n message = 'Thinking...',\n className,\n}: ResponseProps) => {\n // Show loading dots\n if (isLoading) {\n return (\n <ResponseContainer className={className} data-testid=\"response-loading\">\n <LoadingDots aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </LoadingDots>\n <Message>{message}</Message>\n </ResponseContainer>\n );\n }\n\n // Show typing indicator\n if (isTyping) {\n return (\n <ResponseContainer className={className} data-testid=\"response-typing\">\n <TypingIndicator aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </TypingIndicator>\n <Message>{message}</Message>\n </ResponseContainer>\n );\n }\n\n // Show streaming text\n if (isStreaming && streamingContent) {\n return (\n <ResponseContainer className={className} data-testid=\"response-streaming\">\n <StreamingText>{streamingContent}</StreamingText>\n </ResponseContainer>\n );\n }\n\n // Empty state\n return null;\n};\n","import styled, { keyframes } from 'styled-components';\n\n// Pulse animation matching AssistantThinking\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Shake animation for error indicator\nconst shake = keyframes`\n 0%, 100% {\n transform: translateX(0);\n }\n 25% {\n transform: translateX(-5px);\n }\n 75% {\n transform: translateX(5px);\n }\n`;\n\nexport const AgentStateContainer = styled.div<{ isError?: boolean }>`\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background-color: ${(props) => (props.isError ? '#3a1f1f' : '#2c2c2e')};\n border-radius: 16px;\n border: ${(props) => (props.isError ? '1px solid #7f1d1d' : 'none')};\n box-shadow: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const StateContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n width: 100%;\n`;\n\nexport const IdleIndicator = styled.div`\n width: 6px;\n height: 6px;\n background-color: #8e8e93;\n border-radius: 50%;\n animation: ${dotPulse} 2s infinite ease-in-out;\n`;\n\nexport const ErrorIndicator = styled.div`\n width: 6px;\n height: 6px;\n background-color: #ff6b6b;\n border-radius: 50%;\n animation: ${shake} 0.5s ease-in-out;\n`;\n\nexport const StateLabel = styled.span`\n font-size: 14px;\n font-weight: 400;\n color: #e5e5e7;\n line-height: 1.5;\n white-space: nowrap;\n`;\n\nexport const MessageText = styled.p`\n font-size: 14px;\n color: #8e8e93;\n line-height: 1.5;\n margin: 0;\n text-align: center;\n white-space: nowrap;\n`;\n\nexport const ProgressBar = styled.div`\n width: 100%;\n height: 4px;\n background-color: #3a3a3c;\n border-radius: 2px;\n overflow: hidden;\n margin-top: 4px;\n`;\n\nexport const ProgressBarFill = styled.div<{ progress: number }>`\n height: 100%;\n width: ${(props) => Math.min(Math.max(props.progress, 0), 100)}%;\n background: linear-gradient(135deg, #8B5CF6 0%, #EC4899 100%);\n border-radius: 2px;\n transition: width 0.3s ease-in-out;\n`;\n","import { Response } from '../Response';\nimport {\n AgentStateContainer,\n ErrorIndicator,\n IdleIndicator,\n ProgressBar,\n ProgressBarFill,\n StateContent,\n StateLabel,\n} from './AgentState.styles';\n\nexport interface AgentStateProps {\n /** Current agent state */\n state: 'idle' | 'thinking' | 'responding' | 'error';\n /** Optional message to display */\n message?: string;\n /** Optional progress percentage (0-100) */\n progress?: number;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * AgentState component for displaying agent status\n * Styled to match AssistantThinking and Response components with dark theme\n */\nexport const AgentState = ({ state, message, progress, className }: AgentStateProps) => {\n // Idle state - show pulsing indicator\n if (state === 'idle') {\n return (\n <AgentStateContainer className={className} data-testid=\"agent-state-idle\">\n <StateContent>\n <IdleIndicator />\n <StateLabel>{message || 'Agent is idle'}</StateLabel>\n {progress !== undefined && (\n <ProgressBar>\n <ProgressBarFill progress={progress} />\n </ProgressBar>\n )}\n </StateContent>\n </AgentStateContainer>\n );\n }\n\n // Error state - show error indicator\n if (state === 'error') {\n return (\n <AgentStateContainer className={className} data-testid=\"agent-state-error\" isError>\n <StateContent>\n <ErrorIndicator />\n <StateLabel>{message || 'Error occurred'}</StateLabel>\n </StateContent>\n </AgentStateContainer>\n );\n }\n\n // Thinking state - use Response component with loading dots\n if (state === 'thinking') {\n return (\n <Response\n isLoading\n message={message || 'Agent is thinking...'}\n className={className}\n />\n );\n }\n\n // Responding state - use Response component with typing indicator\n if (state === 'responding') {\n return (\n <Response\n isTyping\n message={message || 'Agent is responding...'}\n className={className}\n />\n );\n }\n\n return null;\n};\n","import styled, { keyframes } from 'styled-components';\n\nexport const MessageContainer = styled.div`\n display: flex;\n gap: 12px;\n align-items: flex-start;\n padding: 8px 0;\n max-width: 100%;\n\n /* Fade in and slide up animation */\n animation: fadeInSlideUp 0.4s ease-out;\n\n @keyframes fadeInSlideUp {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n`;\n\nexport const AvatarContainer = styled.div`\n flex-shrink: 0;\n`;\n\nexport const Avatar = styled.img`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n object-fit: cover;\n background-color: transparent;\n`;\n\nexport const AvatarInitials = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: #1e3a5f; /* Dark blue background */\n padding: 4px; /* Make the avatar image smaller inside the circle */\n box-sizing: border-box;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n`;\n\nexport const ContentContainer = styled.div`\n flex: 1;\n min-width: 0;\n`;\n\nexport const MessageContent = styled.div`\n background-color: rgba(45, 45, 61, 0.7); /* Semi-transparent dark gray with 70% opacity */\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n padding: 12px 16px;\n border-radius: 12px; /* Match design tokens */\n border-top-left-radius: 4px;\n color: #FFFFFF; /* White text from design tokens */\n font-size: 14px;\n line-height: 1.5;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n word-wrap: break-word;\n white-space: pre-wrap;\n`;\n\nexport const LoadingDots = styled.div`\n display: flex;\n gap: 6px;\n padding: 12px 16px;\n background-color: rgba(45, 45, 61, 0.7); /* Match MessageContent with transparency */\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-radius: 12px; /* Match design tokens */\n border-top-left-radius: 4px;\n width: fit-content;\n`;\n\nconst bounce = keyframes`\n 0%, 60%, 100% {\n transform: translateY(0);\n }\n 30% {\n transform: translateY(-8px);\n }\n`;\n\nexport const LoadingDot = styled.div<{ delay: number }>`\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: #8e8e93;\n animation: ${bounce} 1.4s ease-in-out infinite;\n animation-delay: ${(props) => props.delay}s;\n`;\n","import styled from 'styled-components';\n\ninterface FileAttachmentContainerProps {\n $isInteractive?: boolean;\n}\n\nexport const FileAttachmentContainer = styled.div<FileAttachmentContainerProps>`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background-color: #3a3a3c;\n border: 1px solid #48484a;\n border-radius: 8px;\n max-width: 320px;\n cursor: ${(props) => (props.$isInteractive ? 'pointer' : 'default')};\n transition: border-color 0.15s ease;\n\n /* Remove default button styles when used as button */\n ${(props) =>\n props.$isInteractive &&\n `\n font: inherit;\n color: inherit;\n text-align: left;\n appearance: none;\n -webkit-appearance: none;\n\n &:hover {\n border-color: #5a5a5c;\n background-color: #48484a;\n }\n\n &:focus-visible {\n outline: 2px solid #5B9FFF;\n outline-offset: 2px;\n border-color: #5B9FFF;\n }\n\n &:active {\n border-color: #6a6a6c;\n }\n `}\n`;\n\nexport const FileIconContainer = styled.div`\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n line-height: 1;\n`;\n\nexport const FileInfo = styled.div`\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nexport const FileTitle = styled.div`\n font-size: 14px;\n font-weight: 500;\n color: #e5e5e7;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n line-height: 1.4;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const FileMetadata = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #8e8e93;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n line-height: 1.4;\n overflow: hidden;\n`;\n\nexport const FileSubtitle = styled.span`\n color: #8e8e93;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:last-child {\n flex-shrink: 0;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type { AriaButtonProps } from '@react-types/button';\nimport type { PressEvent } from '@react-types/shared';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport {\n FileAttachmentContainer,\n FileIconContainer,\n FileInfo,\n FileMetadata,\n FileSubtitle,\n FileTitle,\n} from './FileAttachment.styles';\n\nexport interface FileAttachmentProps extends Omit<AriaButtonProps, 'children'> {\n /** File name/title */\n title: string;\n /** File subtitle/category (e.g., \"Downloads\", \"Documents\") */\n subtitle?: string;\n /** File size in human-readable format (e.g., \"500 KB\", \"2.5 MB\") */\n size?: string;\n /** File icon emoji or Unicode character */\n icon?: string;\n /** Click handler for file interaction */\n onClick?: () => void;\n /** Custom className for styling */\n className?: string;\n}\n\n/**\n * FileAttachment component displays file information in assistant messages\n *\n * Features:\n * - File icon display (emoji or Unicode)\n * - File metadata (title, subtitle, size)\n * - Accessible keyboard navigation via React ARIA\n * - Clean, minimal card-based design\n * - WCAG 2.1 AA compliant\n *\n * @example\n * ```tsx\n * <FileAttachment\n * title=\"Example File\"\n * subtitle=\"Downloads\"\n * size=\"500 KB\"\n * icon=\"📄\"\n * onPress={() => console.log('File clicked')}\n * />\n * ```\n */\nexport const FileAttachment: React.FC<FileAttachmentProps> = ({\n title,\n subtitle,\n size,\n icon = '📄',\n onClick,\n onPress,\n className,\n ...ariaProps\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const isInteractive = !!(onClick || onPress);\n\n // Combine onClick and onPress handlers\n const handlePress = (e: PressEvent) => {\n if (onClick) onClick();\n if (onPress) onPress(e);\n };\n\n const { buttonProps } = useButton(\n {\n ...ariaProps,\n onPress: isInteractive ? handlePress : undefined,\n isDisabled: !isInteractive,\n },\n ref\n );\n\n return (\n <FileAttachmentContainer\n {...(isInteractive ? buttonProps : {})}\n ref={isInteractive ? ref : undefined}\n className={className}\n $isInteractive={isInteractive}\n as={isInteractive ? 'button' : 'div'}\n >\n <FileIconContainer>{icon}</FileIconContainer>\n <FileInfo>\n <FileTitle>{title}</FileTitle>\n <FileMetadata>\n {subtitle && <FileSubtitle>{subtitle}</FileSubtitle>}\n {size && subtitle && <FileSubtitle aria-hidden=\"true\"> • </FileSubtitle>}\n {size && <FileSubtitle>{size}</FileSubtitle>}\n </FileMetadata>\n </FileInfo>\n </FileAttachmentContainer>\n );\n};\n\nexport default FileAttachment;\n","/**\n * StreamingText Component\n *\n * Provides typewriter animation for streaming AI responses.\n *\n * @see specs/015-restyle-ai-chat/spec.md:FR-031, FR-042\n * @see UI_COMPONENTS_SSE.md:548-595\n */\n\nimport { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\nexport interface StreamingTextProps {\n /** The text content to display */\n content: string;\n /** Whether text is currently streaming */\n isStreaming?: boolean;\n /** Typing speed in milliseconds per character */\n typingSpeed?: number;\n /** Whether to show blinking cursor */\n cursor?: boolean;\n /** Visual variant */\n variant?: 'default' | 'code' | 'markdown';\n /** Callback when streaming completes */\n onStreamComplete?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\nconst Container = styled.div<{ variant: 'default' | 'code' | 'markdown' }>`\n font-family: ${(props) =>\n props.variant === 'code'\n ? '\"SF Mono\", Monaco, \"Cascadia Code\", \"Roboto Mono\", Consolas, \"Courier New\", monospace'\n : '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif'};\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n`;\n\nconst Cursor = styled.span`\n display: inline-block;\n width: 2px;\n height: 1em;\n background-color: currentColor;\n margin-left: 2px;\n vertical-align: text-bottom;\n animation: blink 1s infinite;\n\n @keyframes blink {\n 0%,\n 49% {\n opacity: 1;\n }\n 50%,\n 100% {\n opacity: 0;\n }\n }\n`;\n\n/**\n * StreamingText component with typewriter animation\n *\n * Features:\n * - Character-by-character streaming animation\n * - Configurable typing speed\n * - Optional blinking cursor\n * - Code and markdown variants\n * - Completion callback\n */\nexport const StreamingText: React.FC<StreamingTextProps> = ({\n content,\n isStreaming = false,\n typingSpeed: _typingSpeed = 50, // Not used - streaming shows chunks as they arrive\n cursor = true,\n variant = 'default',\n onStreamComplete,\n className,\n}) => {\n const [displayedText, setDisplayedText] = useState('');\n\n useEffect(() => {\n // If streaming, show content as chunks arrive (CopilotKit streams in chunks, not chars)\n if (isStreaming) {\n setDisplayedText(content);\n return;\n }\n\n // When streaming stops, show final content and trigger completion\n if (!isStreaming && displayedText !== content) {\n setDisplayedText(content);\n if (onStreamComplete) {\n onStreamComplete();\n }\n }\n }, [content, isStreaming, onStreamComplete, displayedText]);\n\n const showCursor = isStreaming && cursor;\n\n return (\n <Container variant={variant} className={className}>\n {displayedText}\n {showCursor && <Cursor />}\n </Container>\n );\n};\n\nStreamingText.displayName = 'StreamingText';\n","import type React from 'react';\nimport styled from 'styled-components';\nimport {\n Avatar,\n AvatarContainer,\n AvatarInitials,\n ContentContainer,\n LoadingDot,\n LoadingDots,\n MessageContainer,\n MessageContent,\n} from './AssistantMessage.styles';\nimport { FileAttachment, type FileAttachmentProps } from './FileAttachment';\nimport { StreamingText } from '../StreamingText';\n\nconst AttachmentsContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 12px;\n`;\n\nconst ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n font-size: 12px;\n font-weight: 500;\n color: #9CA3AF;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease-in-out;\n\n &:hover {\n background: rgba(255, 255, 255, 0.1);\n border-color: rgba(255, 255, 255, 0.2);\n color: #FFFFFF;\n }\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n margin-top: 8px;\n`;\n\nconst MessageTime = styled.time`\n font-size: 11px;\n color: #6B7280;\n margin-top: 4px;\n display: block;\n`;\n\nconst StreamingIndicator = styled.span`\n display: inline-block;\n width: 4px;\n height: 4px;\n margin-left: 4px;\n background-color: #459FB9;\n border-radius: 50%;\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n }\n`;\n\nexport interface ActionButtonType {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n}\n\nexport interface AssistantMessageProps {\n /** Message content to display */\n content?: string;\n /** Avatar image URL */\n avatarUrl?: string;\n /** Avatar initials when no image is provided */\n avatarInitials?: string;\n /** Whether to show loading state */\n isLoading?: boolean;\n /** Whether message is currently streaming */\n isStreaming?: boolean;\n /** Custom className for styling */\n className?: string;\n /** Support for markdown rendering (future enhancement) */\n enableMarkdown?: boolean;\n /** File attachments to display below the message */\n attachments?: FileAttachmentProps[];\n /** Optional timestamp */\n timestamp?: string;\n /** Action buttons to display */\n actions?: ActionButtonType[];\n}\n\n/**\n * AssistantMessage component displays AI assistant messages with avatar\n *\n * Features:\n * - Avatar with image or initials fallback\n * - Loading state with animated dots\n * - Streaming state indicator\n * - Markdown support (optional)\n * - Dark gray bubble (#2D2D3D) from Figma design\n * - Left-aligned layout\n * - Action buttons support\n * - Timestamp display\n */\nexport const AssistantMessage: React.FC<AssistantMessageProps> = ({\n content = '',\n avatarUrl,\n avatarInitials: _avatarInitials = 'AI',\n isLoading = false,\n isStreaming = false,\n className,\n attachments = [],\n enableMarkdown = false,\n timestamp,\n actions = [],\n}) => {\n const renderContent = () => {\n if (isLoading) {\n return (\n <LoadingDots>\n <LoadingDot delay={0} />\n <LoadingDot delay={0.2} />\n <LoadingDot delay={0.4} />\n </LoadingDots>\n );\n }\n\n // Use StreamingText for typewriter effect\n return (\n <>\n {content && (\n <MessageContent>\n <StreamingText\n content={content}\n isStreaming={isStreaming}\n typingSpeed={30}\n cursor={false}\n variant={enableMarkdown ? 'markdown' : 'default'}\n />\n {isStreaming && <StreamingIndicator />}\n </MessageContent>\n )}\n {attachments.length > 0 && (\n <AttachmentsContainer>\n {attachments.map((attachment, index) => (\n <FileAttachment key={`${attachment.title}-${index}`} {...attachment} />\n ))}\n </AttachmentsContainer>\n )}\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n {actions.length > 0 && (\n <ActionsContainer>\n {actions.map((action, index) => (\n <ActionButton key={index} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ActionButton>\n ))}\n </ActionsContainer>\n )}\n </>\n );\n };\n\n return (\n <MessageContainer className={className}>\n <AvatarContainer>\n {avatarUrl ? (\n <Avatar src={avatarUrl} alt=\"Assistant avatar\" />\n ) : (\n <AvatarInitials>\n <Avatar src=\"/assets/avatar-transparent-bg.png\" alt=\"AI Assistant\" />\n </AvatarInitials>\n )}\n </AvatarContainer>\n <ContentContainer>{renderContent()}</ContentContainer>\n </MessageContainer>\n );\n};\n\nexport default AssistantMessage;\n","import styled, { keyframes } from 'styled-components';\n\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 0.5;\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n`;\n\nconst wave = keyframes`\n 0%, 40%, 100% {\n transform: translateY(0);\n }\n 20% {\n transform: translateY(-8px);\n }\n`;\n\ninterface SizeProps {\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst getSizeValue = (size: 'sm' | 'md' | 'lg' = 'md') => {\n switch (size) {\n case 'sm':\n return { padding: '8px 12px', avatar: '32px', icon: '16px', fontSize: '12px', dotSize: '4px' };\n case 'lg':\n return { padding: '16px 20px', avatar: '48px', icon: '24px', fontSize: '16px', dotSize: '8px' };\n case 'md':\n default:\n return { padding: '12px 16px', avatar: '40px', icon: '20px', fontSize: '14px', dotSize: '6px' };\n }\n};\n\nexport const Container = styled.div<SizeProps>`\n display: inline-flex;\n align-items: center;\n gap: 12px;\n padding: ${(props) => getSizeValue(props.size).padding};\n background-color: #2c2c2e;\n border-radius: 16px;\n box-shadow: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const Avatar = styled.div<SizeProps>`\n width: ${(props) => getSizeValue(props.size).avatar};\n height: ${(props) => getSizeValue(props.size).avatar};\n border-radius: 50%;\n background: linear-gradient(135deg, #1e5a6b 0%, #2a7a8f 100%); /* Darker teal gradient */\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-shadow: 0 2px 8px rgba(44, 176, 171, 0.3); /* Teal shadow */\n`;\n\nexport const HeadphonesIcon = styled.svg<SizeProps>`\n width: ${(props) => getSizeValue(props.size).icon};\n height: ${(props) => getSizeValue(props.size).icon};\n color: #FFFFFF;\n`;\n\nexport const Content = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\ninterface LoadingDotsProps extends SizeProps {\n variant?: 'dots' | 'pulse' | 'wave';\n}\n\nexport const LoadingDots = styled.div<LoadingDotsProps>`\n display: flex;\n align-items: center;\n gap: ${(props) => (props.variant === 'wave' ? '2px' : '4px')};\n padding: 0 4px;\n`;\n\ninterface DotProps extends SizeProps {\n variant?: 'dots' | 'pulse' | 'wave';\n}\n\nexport const Dot = styled.span<DotProps>`\n width: ${(props) => getSizeValue(props.size).dotSize};\n height: ${(props) => getSizeValue(props.size).dotSize};\n border-radius: 50%;\n background-color: #8e8e93;\n animation: ${(props) => {\n switch (props.variant) {\n case 'pulse':\n return pulse;\n case 'wave':\n return wave;\n case 'dots':\n default:\n return dotPulse;\n }\n }}\n 1.4s ease-in-out infinite;\n`;\n\nexport const Message = styled.span<SizeProps>`\n font-size: ${(props) => getSizeValue(props.size).fontSize};\n color: #e5e5e7;\n font-weight: 400;\n line-height: 1.5;\n white-space: nowrap;\n`;\n","import { useRef } from 'react';\nimport {\n Avatar,\n Container,\n Content,\n Dot,\n HeadphonesIcon,\n LoadingDots,\n Message,\n} from './AssistantThinking.styles';\n\nexport interface AssistantThinkingProps {\n message?: string;\n className?: string;\n ariaLabel?: string;\n /** Visual variant for the loading indicator */\n variant?: 'dots' | 'pulse' | 'wave' | 'text';\n /** Size of the component */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport function AssistantThinking({\n message = 'Analyzing data, please wait...',\n className,\n ariaLabel = 'Assistant is thinking',\n variant = 'dots',\n size = 'md',\n}: AssistantThinkingProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const renderLoadingIndicator = () => {\n switch (variant) {\n case 'dots':\n return (\n <LoadingDots aria-hidden=\"true\" size={size}>\n <Dot style={{ animationDelay: '0ms' }} size={size} />\n <Dot style={{ animationDelay: '150ms' }} size={size} />\n <Dot style={{ animationDelay: '300ms' }} size={size} />\n </LoadingDots>\n );\n case 'pulse':\n return (\n <LoadingDots aria-hidden=\"true\" size={size} variant=\"pulse\">\n <Dot style={{ animationDelay: '0ms' }} size={size} variant=\"pulse\" />\n </LoadingDots>\n );\n case 'wave':\n return (\n <LoadingDots aria-hidden=\"true\" size={size} variant=\"wave\">\n <Dot style={{ animationDelay: '0ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '100ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '200ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '300ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '400ms' }} size={size} variant=\"wave\" />\n </LoadingDots>\n );\n case 'text':\n return null; // Just show the message with no indicator\n default:\n return null;\n }\n };\n\n return (\n <Container\n ref={containerRef}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={ariaLabel}\n size={size}\n >\n <Avatar aria-hidden=\"true\" size={size}>\n <HeadphonesIcon viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 13a4 4 0 0 1 0 8c-2.142 0-4-1.79-4-4h-2a4 4 0 1 1-.535-2h3.07A4 4 0 0 1 17 13M2 12v-2h2V7a4 4 0 0 1 4-4h8a4 4 0 0 1 4 4v3h2v2z\" />\n </HeadphonesIcon>\n </Avatar>\n <Content>\n {renderLoadingIndicator()}\n <Message size={size}>{message}</Message>\n </Content>\n </Container>\n );\n}\n\nAssistantThinking.displayName = 'AssistantThinking';\n","/**\n * Adapter component that bridges custom AssistantMessage with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's AssistantMessageProps to our custom component props\n * 2. Handles loading states by showing AssistantThinking component\n * 3. Extracts message content and renders with our styled component\n */\n\nimport type React from 'react';\nimport type { AssistantMessageProps as CopilotAssistantMessageProps } from '@copilotkit/react-ui';\nimport { AssistantMessage } from '../Messages/AssistantMessage';\nimport { AssistantThinking } from '../../AssistantThinking/AssistantThinking';\n\n/**\n * Adapter that converts CopilotKit's AssistantMessageProps to our custom component\n */\nexport const AssistantMessageAdapter: React.FC<CopilotAssistantMessageProps> = ({\n message,\n isLoading,\n isGenerating,\n // These are available but not used in our current implementation:\n // isCurrentMessage,\n // onRegenerate,\n // onCopy,\n // onThumbsUp,\n // onThumbsDown,\n // markdownTagRenderers,\n // ImageRenderer,\n}) => {\n // Show thinking state ONLY when truly loading (no content yet)\n if (isLoading || (isGenerating && !message?.content)) {\n return <AssistantThinking message=\"Thinking...\" />;\n }\n\n // Extract content from the message\n const content = message?.content || '';\n\n // Parse attachments if present in the message\n // TODO: Implement attachments parsing from CopilotKit message data\n const attachments: any[] = [];\n\n return (\n <AssistantMessage\n content={content}\n avatarInitials=\"AI\"\n isLoading={false} // Don't show loading dots when we have content\n isStreaming={isGenerating} // Show streaming indicator while generating\n attachments={attachments}\n enableMarkdown={true}\n />\n );\n};\n\nAssistantMessageAdapter.displayName = 'AssistantMessageAdapter';\n","import styled, { css } from 'styled-components';\n\ninterface StyledUserMessageProps {\n $isPressed: boolean;\n}\n\nexport const StyledUserMessage = styled.button<StyledUserMessageProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 12px 20px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n border: none;\n cursor: default;\n user-select: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n position: relative;\n text-align: left;\n\n /* Force override CopilotKit's default user message styles */\n && {\n background: #1C3A4E !important; /* Darker brand blue - darker than secondary */\n color: #FFFFFF !important; /* White text on dark blue background */\n border-radius: 999px !important; /* Pill shape - fully rounded ends */\n }\n\n /* Subtle shadow and glow effect - darker blue */\n box-shadow:\n 0 2px 8px rgba(28, 58, 78, 0.25),\n 0 1px 3px rgba(28, 58, 78, 0.15);\n\n /* Smooth transitions */\n transition: all 0.2s ease-in-out;\n\n /* Speech bubble tail - darker blue to match bubble */\n &::after {\n content: '';\n position: absolute;\n bottom: -6px;\n right: 12px;\n width: 14px;\n height: 14px;\n background: #1C3A4E !important; /* Force override - darker blue */\n transform: rotate(45deg);\n border-radius: 0 0 4px 0;\n clip-path: polygon(0 0, 100% 100%, 0 100%);\n box-shadow:\n 2px 2px 4px rgba(28, 58, 78, 0.15);\n transition: all 0.2s ease-in-out;\n z-index: -1;\n }\n\n /* Hover state - only for button elements */\n &[role=\"button\"]:hover:not(:disabled) {\n transform: translateY(-1px);\n cursor: pointer;\n box-shadow:\n 0 4px 12px rgba(28, 58, 78, 0.35),\n 0 2px 6px rgba(28, 58, 78, 0.25);\n\n &::after {\n box-shadow:\n 3px 3px 6px rgba(28, 58, 78, 0.2);\n }\n }\n\n /* Active/Pressed state - only for button elements */\n &[role=\"button\"]:active:not(:disabled) {\n transform: translateY(0);\n box-shadow:\n 0 1px 4px rgba(28, 58, 78, 0.2),\n 0 1px 2px rgba(28, 58, 78, 0.1);\n\n &::after {\n box-shadow:\n 1px 1px 2px rgba(28, 58, 78, 0.1);\n }\n }\n\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: translateY(0) scale(0.98);\n box-shadow:\n 0 1px 4px rgba(28, 58, 78, 0.2),\n 0 1px 2px rgba(28, 58, 78, 0.1);\n\n &::after {\n box-shadow:\n 1px 1px 2px rgba(28, 58, 78, 0.1);\n }\n `}\n\n /* Focus state for accessibility */\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: 2px solid #1C3A4E;\n outline-offset: 3px;\n box-shadow:\n 0 4px 12px rgba(28, 58, 78, 0.35),\n 0 2px 6px rgba(28, 58, 78, 0.25),\n 0 0 0 3px rgba(28, 58, 78, 0.1);\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n box-shadow: none;\n\n &::after {\n opacity: 0.5;\n box-shadow: none;\n }\n }\n`;\n","import type { AriaButtonProps } from '@react-aria/button';\nimport { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledUserMessage } from './UserMessage.styles';\n\nexport interface UserMessageProps extends AriaButtonProps {\n /**\n * The message text to display\n */\n children: React.ReactNode;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * Whether the message is in a pressed state\n */\n isPressed?: boolean;\n /**\n * Optional click handler\n */\n onPress?: () => void;\n}\n\n/**\n * UserMessage component - Displays a user message in a gradient pill\n *\n * This component renders a user message with a purple-to-blue gradient background,\n * pill-shaped design with fully rounded ends, and white text. It uses React ARIA\n * for accessibility and supports keyboard navigation.\n *\n * @example\n * ```tsx\n * <UserMessage onPress={() => console.log('clicked')}>\n * Can you export this as a CSV?\n * </UserMessage>\n * ```\n */\nexport function UserMessage({\n children,\n className,\n isPressed = false,\n onPress,\n ...ariaProps\n}: UserMessageProps) {\n const ref = useRef<HTMLButtonElement>(null);\n\n // If no onPress handler, render as non-interactive div\n if (!onPress) {\n return (\n <StyledUserMessage\n as=\"div\"\n className={className}\n $isPressed={isPressed}\n role=\"presentation\"\n >\n {children}\n </StyledUserMessage>\n );\n }\n\n // Otherwise render as interactive button with React ARIA\n const { buttonProps, isPressed: ariaPressedState } = useButton(\n {\n ...ariaProps,\n onPress,\n },\n ref\n );\n\n return (\n <StyledUserMessage\n {...buttonProps}\n ref={ref}\n className={className}\n $isPressed={isPressed || ariaPressedState}\n role=\"button\"\n tabIndex={0}\n >\n {children}\n </StyledUserMessage>\n );\n}\n\nUserMessage.displayName = 'UserMessage';\n","/**\n * Adapter component that bridges custom UserMessage with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's UserMessageProps to our custom component props\n * 2. Extracts message content from CopilotKit's message object\n * 3. Handles image messages appropriately\n */\n\nimport type React from 'react';\nimport type { UserMessageProps as CopilotUserMessageProps } from '@copilotkit/react-ui';\nimport styled from 'styled-components';\nimport { UserMessage } from '../../UserMessage/UserMessage';\n\n// Wrapper to align user messages to the right with fade-in animation\nconst UserMessageWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n width: 100%;\n padding: 8px 0;\n\n /* Fade in and slide up animation */\n animation: fadeInSlideUp 0.3s ease-out;\n\n @keyframes fadeInSlideUp {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n`;\n\n/**\n * Adapter that converts CopilotKit's UserMessageProps to our custom component\n */\nexport const UserMessageAdapter: React.FC<CopilotUserMessageProps> = ({\n message,\n ImageRenderer,\n}) => {\n // Handle image messages\n if (message?.image) {\n return (\n <ImageRenderer\n image={message.image}\n content={message.content}\n />\n );\n }\n\n // Extract text content\n const content = message?.content || '';\n\n // Our UserMessage is a button-like component with React ARIA\n // In the chat context, it's not interactive, so we don't provide onPress\n return (\n <UserMessageWrapper>\n <UserMessage>\n {content}\n </UserMessage>\n </UserMessageWrapper>\n );\n};\n\nUserMessageAdapter.displayName = 'UserMessageAdapter';\n","import styled from 'styled-components';\n\n/**\n * Main container for the chat input component with dark theme\n * Matches header style with backdrop blur\n */\nexport const ChatInputContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 8px;\n background-color: rgba(25, 25, 25, 0.6);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-radius: 0;\n box-shadow: none;\n box-sizing: border-box;\n\n @media (min-width: 640px) {\n padding: 12px;\n }\n`;\n\n/**\n * Container for suggestion buttons - horizontal layout with wrapping\n */\nexport const SuggestionsWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 12px;\n width: 100%;\n box-sizing: border-box;\n`;\n\n/**\n * Minimal pill-shaped suggestion button - Dark theme\n */\nexport const SuggestionButton = styled.button`\n padding: 8px 16px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n font-size: 13px;\n font-weight: 400;\n text-align: center;\n border: 1px solid #3a3a3c;\n border-radius: 20px;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n\n /* Dark theme colors */\n background-color: #2c2c2e;\n color: #e5e5e7;\n\n /* Hover state */\n &:hover:not(:disabled) {\n background-color: #3a3a3c;\n border-color: #48484a;\n }\n\n /* Active state */\n &:active:not(:disabled) {\n background-color: #48484a;\n }\n\n /* Focus state */\n &:focus-visible {\n outline: 2px solid #5B9FFF;\n outline-offset: 2px;\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n`;\n\n/**\n * Input wrapper with dark theme\n */\nexport const InputWrapper = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background-color: rgba(25, 25, 25, 0.4);\n border: 1px solid rgba(58, 58, 60, 0.3);\n border-radius: 12px;\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n\n &:focus-within {\n /* Subtle focus indication without bold colored border */\n border-color: rgba(255, 255, 255, 0.3);\n background-color: rgba(50, 50, 52, 0.6);\n }\n`;\n\n/**\n * Text input field - Dark theme\n */\nexport const InputField = styled.input`\n flex: 1;\n border: none;\n outline: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n font-size: 14px;\n color: #e5e5e7;\n background: transparent;\n\n &::placeholder {\n color: #6e6e73;\n }\n\n &:disabled {\n color: #6e6e73;\n cursor: not-allowed;\n }\n`;\n\n/**\n * Circular submit button with arrow icon\n */\ninterface SubmitButtonProps {\n disabled?: boolean;\n}\n\nexport const SubmitButton = styled.button<SubmitButtonProps>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background-color: ${(props) => (props.disabled ? '#3a3a3c' : '#5B9FFF')};\n color: ${(props) => (props.disabled ? '#6e6e73' : '#ffffff')};\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n transition: all 0.2s ease;\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: #4A8FEF;\n transform: scale(1.05);\n }\n\n &:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n &:focus-visible {\n outline: 2px solid #5B9FFF;\n outline-offset: 2px;\n }\n\n svg {\n width: 18px;\n height: 18px;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type { AriaTextFieldProps } from '@react-aria/textfield';\nimport { useTextField } from '@react-aria/textfield';\nimport React, { type KeyboardEvent, useRef, useState } from 'react';\nimport {\n ChatInputContainer,\n InputField,\n InputWrapper,\n SubmitButton,\n SuggestionButton,\n SuggestionsWrapper,\n} from './ChatInput.styles';\n\nexport interface Suggestion {\n /** The text content of the suggestion */\n text: string;\n}\n\nexport interface ChatInputProps extends Omit<AriaTextFieldProps, 'onChange'> {\n /** Array of suggestion items to display above the input */\n suggestions?: Suggestion[];\n /** Callback when a suggestion is selected */\n onSuggestionSelect?: (suggestion: string) => void;\n /** Current message value */\n value?: string;\n /** Callback when message value changes */\n onChange?: (value: string) => void;\n /** Callback when message is submitted */\n onSubmit?: (message: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input is read-only */\n isReadOnly?: boolean;\n /** Whether to auto-focus the input */\n autoFocus?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for the input */\n 'aria-label'?: string;\n}\n\n/**\n * ChatInput component with minimal pill-shaped suggestion buttons\n *\n * Features:\n * - Horizontal pill-shaped suggestion buttons with minimal design\n * - Single-line input with submit button\n * - React ARIA for accessibility\n * - Keyboard navigation support\n * - Clean, modern design matching vendor image\n *\n * @example\n * ```tsx\n * <ChatInput\n * suggestions={[\n * { text: \"Create in-depth analysis\" },\n * { text: \"Identify actionable tasks\" }\n * ]}\n * placeholder=\"Ask, write or search for anything...\"\n * onSubmit={(message) => console.log(message)}\n * onSuggestionSelect={(suggestion) => console.log(suggestion)}\n * />\n * ```\n */\nexport const ChatInput: React.FC<ChatInputProps> = ({\n suggestions = [],\n onSuggestionSelect,\n value = '',\n onChange,\n onSubmit,\n placeholder = 'Ask, write or search for anything...',\n isDisabled = false,\n isReadOnly = false,\n autoFocus = false,\n className,\n 'aria-label': ariaLabel = 'Chat message input',\n ...ariaProps\n}) => {\n const [internalValue, setInternalValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Use controlled value if provided, otherwise use internal state\n const currentValue = value !== undefined ? value : internalValue;\n const setValue = onChange || setInternalValue;\n\n // React ARIA hook for accessibility\n const { inputProps } = useTextField(\n {\n ...ariaProps,\n 'aria-label': ariaLabel,\n value: currentValue,\n onChange: (newValue: string) => {\n setValue(newValue);\n },\n isDisabled,\n isReadOnly,\n },\n inputRef\n );\n\n // Direct onChange handler as backup\n const handleDirectChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value);\n };\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n // Submit on Enter\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n // Handle submit\n const handleSubmit = () => {\n if (currentValue.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(currentValue.trim());\n setValue('');\n // Refocus the input after sending\n inputRef.current?.focus();\n }\n };\n\n // Handle suggestion selection\n const handleSuggestionClick = (suggestionText: string) => {\n if (onSuggestionSelect && !isDisabled && !isReadOnly) {\n onSuggestionSelect(suggestionText);\n }\n };\n\n const canSubmit = currentValue.trim().length > 0 && !isDisabled && !isReadOnly;\n\n return (\n <ChatInputContainer className={className}>\n {/* Suggestions */}\n {suggestions.length > 0 && (\n <SuggestionsWrapper role=\"list\" aria-label=\"Suggested prompts\">\n {suggestions.map((suggestion, index) => (\n <SuggestionButtonComponent\n key={`${suggestion.text}-${index}`}\n suggestion={suggestion}\n onSelect={handleSuggestionClick}\n isDisabled={isDisabled || isReadOnly}\n />\n ))}\n </SuggestionsWrapper>\n )}\n\n {/* Input field */}\n <InputWrapper>\n <InputField\n {...inputProps}\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n onKeyDown={handleKeyDown}\n onChange={handleDirectChange}\n autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n value={currentValue}\n />\n <SubmitButtonComponent\n onPress={handleSubmit}\n isDisabled={!canSubmit}\n ariaLabel=\"Send message\"\n />\n </InputWrapper>\n </ChatInputContainer>\n );\n};\n\n/**\n * Individual suggestion button component\n */\ninterface SuggestionButtonComponentProps {\n suggestion: Suggestion;\n onSelect: (text: string) => void;\n isDisabled?: boolean;\n}\n\nconst SuggestionButtonComponent: React.FC<SuggestionButtonComponentProps> = ({\n suggestion,\n onSelect,\n isDisabled = false,\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress: () => onSelect(suggestion.text),\n isDisabled,\n 'aria-label': `Select suggestion: ${suggestion.text}`,\n },\n ref\n );\n\n return (\n <SuggestionButton {...buttonProps} ref={ref} role=\"listitem\">\n {suggestion.text}\n </SuggestionButton>\n );\n};\n\n/**\n * Submit button component with arrow icon\n */\ninterface SubmitButtonComponentProps {\n onPress: () => void;\n isDisabled?: boolean;\n ariaLabel?: string;\n}\n\nconst SubmitButtonComponent: React.FC<SubmitButtonComponentProps> = ({\n onPress,\n isDisabled = false,\n ariaLabel = 'Send message',\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress,\n isDisabled,\n 'aria-label': ariaLabel,\n },\n ref\n );\n\n return (\n <SubmitButton {...buttonProps} ref={ref} disabled={isDisabled} title={ariaLabel}>\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Arrow Right Icon</title>\n <path\n d=\"M4 10H16M16 10L10 4M16 10L10 16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </SubmitButton>\n );\n};\n\nChatInput.displayName = 'ChatInput';\n","/**\n * Adapter component that bridges custom Input with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's InputProps to our custom component props\n * 2. Handles the onSend callback to work with CopilotKit's message system\n * 3. Manages input state and submission\n */\n\nimport { useState } from 'react';\nimport type React from 'react';\nimport type { InputProps as CopilotInputProps } from '@copilotkit/react-ui';\nimport { ChatInput } from '../../ChatInput/ChatInput';\n\n/**\n * Adapter that converts CopilotKit's InputProps to our custom component\n */\nexport const InputAdapter: React.FC<CopilotInputProps> = ({\n inProgress,\n onSend,\n isVisible = true,\n}) => {\n const [value, setValue] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = async (message: string) => {\n if (!message.trim()) {\n console.log('[InputAdapter] handleSubmit: empty message, ignoring');\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n // Call CopilotKit's onSend which returns a Promise<Message>\n await onSend(message);\n setValue(''); // Clear input after sending\n } catch (error) {\n console.error('[InputAdapter] Error sending message:', error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleSuggestionSelect = async (suggestion: string) => {\n // Directly call onSend with the suggestion text without setting value first\n // This avoids potential race conditions and ensures the message is sent\n if (!suggestion.trim()) {\n return;\n }\n\n if (inProgress || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n await onSend(suggestion);\n // Don't set value since we're submitting directly\n } catch (error) {\n console.error('[InputAdapter] Error sending suggestion:', error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // TODO: Add support for stop button and file upload if needed\n const shouldDisableInput = isSubmitting;\n\n return (\n <ChatInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n placeholder=\"Ask, write or search for anything...\"\n isDisabled={shouldDisableInput}\n autoFocus={isVisible}\n aria-label=\"Chat message input\"\n suggestions={[\n { text: 'Explore workflows' },\n ]}\n onSuggestionSelect={handleSuggestionSelect}\n />\n );\n};\n\nInputAdapter.displayName = 'InputAdapter';\n","import styled from 'styled-components';\n\nexport const HeaderContainer = styled.header`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 8px;\n background-color: rgba(25, 25, 25, 0.6);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-bottom: 1px solid rgba(58, 58, 60, 0.3);\n min-height: 44px;\n box-sizing: border-box;\n\n @media (min-width: 640px) {\n padding: 8px 12px;\n }\n`;\n\nexport const HeaderContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme?.spacing?.xs ?? '4px'};\n flex: 1;\n min-width: 0;\n`;\n\nexport const HeaderTitle = styled.h1`\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: #e5e5e7;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n line-height: 1.5;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const HeaderSubtitle = styled.p`\n margin: 0;\n font-size: 0.875rem;\n color: #8e8e93;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n line-height: 1.4;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const HeaderActions = styled.div`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme?.spacing?.xs ?? '4px'};\n margin-left: ${({ theme }) => theme?.spacing?.md ?? '16px'};\n`;\n\nexport const ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n background-color: transparent;\n border: none;\n border-radius: 6px;\n color: #e5e5e7;\n cursor: pointer;\n transition: all 150ms ease;\n\n &:hover:not(:disabled) {\n background-color: #3a3a3c;\n }\n\n &:active:not(:disabled) {\n transform: scale(0.95);\n background-color: #48484a;\n }\n\n &:focus-visible {\n outline: 2px solid #5B9FFF;\n outline-offset: 2px;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.3;\n }\n\n svg {\n width: 16px;\n height: 16px;\n display: block;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport {\n ActionButton,\n HeaderActions,\n HeaderContainer,\n HeaderContent,\n HeaderSubtitle,\n HeaderTitle,\n} from './Header.styles';\n\nexport interface HeaderProps {\n /**\n * The main title text displayed in the header\n */\n title: string;\n\n /**\n * Optional subtitle text displayed below the title\n */\n subtitle?: string;\n\n /**\n * Callback function triggered when the close button is clicked\n */\n onClose?: () => void;\n\n /**\n * Callback function triggered when the minimize button is clicked\n */\n onMinimize?: () => void;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n}\n\n/**\n * Header Component\n *\n * A chat header component that displays a title, optional subtitle, and action buttons.\n * Built with React ARIA for accessibility and Styled Components for theming.\n *\n * @example\n * ```tsx\n * <Header\n * title=\"AI Assistant\"\n * subtitle=\"How can I help you today?\"\n * onClose={() => console.log('Close clicked')}\n * onMinimize={() => console.log('Minimize clicked')}\n * />\n * ```\n */\nexport const Header: React.FC<HeaderProps> = ({\n title,\n subtitle,\n onClose,\n onMinimize,\n className,\n}) => {\n const minimizeRef = useRef<HTMLButtonElement>(null);\n const closeRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: minimizeProps } = useButton(\n {\n onPress: onMinimize,\n 'aria-label': 'Minimize',\n isDisabled: !onMinimize,\n },\n minimizeRef\n );\n\n const { buttonProps: closeProps } = useButton(\n {\n onPress: onClose,\n 'aria-label': 'Close',\n isDisabled: !onClose,\n },\n closeRef\n );\n\n return (\n <HeaderContainer className={className}>\n <HeaderContent>\n <HeaderTitle>{title}</HeaderTitle>\n {subtitle && <HeaderSubtitle>{subtitle}</HeaderSubtitle>}\n </HeaderContent>\n\n <HeaderActions>\n {onMinimize && (\n <ActionButton ref={minimizeRef} {...minimizeProps} data-action=\"minimize\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <title>Minimize</title>\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </ActionButton>\n )}\n\n {onClose && (\n <ActionButton ref={closeRef} {...closeProps} data-action=\"close\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <title>Close</title>\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </ActionButton>\n )}\n </HeaderActions>\n </HeaderContainer>\n );\n};\n\nHeader.displayName = 'Header';\n","import styled, { css } from 'styled-components';\n\ninterface WindowContainerProps {\n $isMinimized: boolean;\n $isFullscreen: boolean;\n $width: string;\n $height: string;\n}\n\nexport const WindowContainer = styled.div<WindowContainerProps>`\n display: flex;\n flex-direction: column;\n /* Glassmorphism effect */\n background: transparent;\n backdrop-filter: blur(3.8px);\n -webkit-backdrop-filter: blur(3.8px);\n border: 1px solid rgba(255, 255, 255, 0.25);\n border-radius: 16px;\n box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n\n /* Default dimensions */\n width: ${({ $width }) => $width};\n height: ${({ $height }) => $height};\n\n /* Fullscreen state */\n ${({ $isFullscreen }) =>\n $isFullscreen &&\n css`\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n box-shadow: none;\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1000;\n `}\n\n /* Minimized state */\n ${({ $isMinimized }) =>\n $isMinimized &&\n css`\n height: 60px;\n width: 300px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n\n /* Hide all content except header when minimized */\n > *:not(:first-child) {\n display: none;\n }\n\n /* Keep header visible but adjust styling */\n > *:first-child {\n border-bottom: none;\n }\n `}\n\n /* Responsive behavior for smaller screens */\n @media (max-width: 768px) {\n ${({ $isFullscreen, $isMinimized }) =>\n !$isFullscreen &&\n !$isMinimized &&\n css`\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n max-width: 100%;\n max-height: 100%;\n `}\n }\n\n /* Focus states for accessibility */\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n outline-offset: 2px;\n }\n\n /* Ensure proper stacking context */\n z-index: ${({ $isFullscreen }) => ($isFullscreen ? 1000 : 100)};\n`;\n","import type React from 'react';\nimport { WindowContainer } from './Window.styles';\n\nexport interface WindowProps {\n /**\n * Whether the window is minimized to a small bar\n */\n isMinimized?: boolean;\n\n /**\n * Whether the window is fullscreen (100vw x 100vh)\n */\n isFullscreen?: boolean;\n\n /**\n * Custom width for the window (e.g., \"400px\", \"50vw\")\n * @default \"400px\"\n */\n width?: string;\n\n /**\n * Custom height for the window (e.g., \"600px\", \"80vh\")\n * @default \"600px\"\n */\n height?: string;\n\n /**\n * Children elements to be rendered inside the window\n */\n children: React.ReactNode;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n\n /**\n * ARIA label for the window\n */\n ariaLabel?: string;\n}\n\n/**\n * Window Component\n *\n * Main container/window wrapper for the CopilotKit chat interface.\n * This component holds the Header, Messages, Input, and Footer components.\n *\n * Features:\n * - Default: 400px width x 600px height with rounded corners and shadow\n * - Minimized: Collapsed to a small bar\n * - Fullscreen: Takes full viewport (100vw x 100vh)\n * - Smooth transitions between states\n * - Customizable dimensions via width/height props\n *\n * @example\n * ```tsx\n * // Default window\n * <Window>\n * <Header title=\"AI Assistant\" />\n * <Messages>...</Messages>\n * <MessageInput />\n * <Footer />\n * </Window>\n *\n * // Minimized window\n * <Window isMinimized>\n * <Header title=\"AI Assistant\" />\n * </Window>\n *\n * // Fullscreen window\n * <Window isFullscreen>\n * <Header title=\"AI Assistant\" />\n * <Messages>...</Messages>\n * <MessageInput />\n * </Window>\n *\n * // Custom dimensions\n * <Window width=\"500px\" height=\"700px\">\n * ...\n * </Window>\n * ```\n */\nexport const Window: React.FC<WindowProps> = ({\n isMinimized = false,\n isFullscreen = false,\n width = '400px',\n height = '600px',\n children,\n className,\n ariaLabel = 'Chat window',\n}) => {\n return (\n <WindowContainer\n className={className}\n $isMinimized={isMinimized}\n $isFullscreen={isFullscreen}\n $width={width}\n $height={height}\n role=\"dialog\"\n aria-label={ariaLabel}\n aria-modal=\"false\"\n >\n {children}\n </WindowContainer>\n );\n};\n\nWindow.displayName = 'Window';\n","import type {\n ButtonProps as CopilotButtonProps,\n HeaderProps as CopilotHeaderProps,\n WindowProps as CopilotWindowProps,\n} from '@copilotkit/react-ui';\nimport { CopilotSidebar, useChatContext } from '@copilotkit/react-ui';\nimport type { CSSProperties, ReactNode } from 'react';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport {\n AssistantMessageAdapter,\n UserMessageAdapter,\n InputAdapter,\n} from '../adapters';\nimport { Header } from '../Header/Header';\nimport { Window } from '../Window/Window';\n\n// Global styles to ensure sidebar starts hidden and button visibility\nconst GlobalSidebarStyles = createGlobalStyle`\n /* Override CopilotKit's default positioning - keep sidebar container in place */\n .copilotKitSidebar {\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n width: 100vw !important;\n height: 100vh !important;\n pointer-events: none !important;\n z-index: 1001 !important;\n }\n\n /* Keep sidebar container always visible (the window inside will animate) */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar {\n pointer-events: auto !important;\n }\n\n /* Mobile-first: Glassmorphism sidebar with rounded corners */\n /* Target the actual dialog element that gets rendered */\n .copilotKitSidebar [role=\"dialog\"] {\n /* Override CopilotKit defaults for mobile */\n position: fixed !important;\n top: 10px !important;\n right: 10px !important;\n /* Reserve space for Android nav buttons - matches NavHorizontal approach */\n bottom: max(90px, env(safe-area-inset-bottom, 90px)) !important;\n left: 10px !important;\n width: calc(100vw - 20px) !important;\n /* Adjust height to account for bottom safe area */\n height: calc(100vh - 20px - max(80px, env(safe-area-inset-bottom, 80px))) !important;\n max-width: calc(100vw - 20px) !important;\n max-height: calc(100vh - 20px - max(80px, env(safe-area-inset-bottom, 80px))) !important;\n margin: 0 !important;\n border-radius: 16px !important;\n z-index: 1001 !important;\n\n /* Glassmorphism effect */\n background: rgba(255, 255, 255, 0.26) !important;\n box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1) !important;\n backdrop-filter: blur(11.1px) !important;\n -webkit-backdrop-filter: blur(11.1px) !important;\n border: 1px solid rgba(255, 255, 255, 0.3) !important;\n\n /* Smooth slide transition */\n transition: transform 0.3s ease, visibility 0.3s ease, opacity 0.3s ease !important;\n }\n\n /* Hidden by default */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) .copilotKitSidebar [role=\"dialog\"] {\n transform: translateX(100%) !important;\n visibility: hidden !important;\n pointer-events: none !important;\n opacity: 0 !important;\n }\n\n /* Visible when expanded */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar [role=\"dialog\"] {\n transform: translateX(0) !important;\n visibility: visible !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n }\n\n /* Desktop: Sidebar panel on the right with glassmorphism (640px = CopilotKit's breakpoint) */\n @media (min-width: 640px) {\n .copilotKitSidebar [role=\"dialog\"] {\n inset: auto !important;\n top: 10px !important;\n right: 10px !important;\n /* Reserve space for Android nav buttons on desktop too */\n bottom: max(90px, env(safe-area-inset-bottom, 90px)) !important;\n left: auto !important;\n width: 28rem !important;\n /* Adjust height to account for bottom safe area */\n height: calc(100vh - 20px - max(80px, env(safe-area-inset-bottom, 80px))) !important;\n max-width: 28rem !important;\n max-height: calc(100vh - 20px - max(80px, env(safe-area-inset-bottom, 80px))) !important;\n }\n }\n\n /* Hide button when sidebar is open */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: none !important;\n }\n }\n\n /* Show button when sidebar is closed */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: flex !important;\n }\n }\n\n /* Fix messages container background */\n .copilotKitMessages {\n background-color: transparent !important;\n }\n\n /* Fade-in animation for new messages */\n @keyframes messagesFadeIn {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .copilotKitMessage {\n animation: messagesFadeIn 0.3s ease-out;\n }\n\n /* Override CopilotKit suggestions to be single-row with horizontal scroll */\n div[role=\"list\"][aria-label*=\"Suggested\"] {\n display: flex !important;\n flex-wrap: nowrap !important; /* Force single row */\n gap: 8px !important;\n padding: 4px 0 !important;\n\n /* Horizontal scrolling */\n overflow-x: auto !important;\n overflow-y: hidden !important;\n\n /* Smooth scrolling */\n -webkit-overflow-scrolling: touch;\n scroll-behavior: smooth;\n\n /* Fixed height for one suggestion */\n max-height: 40px !important;\n min-height: 40px !important;\n align-items: center !important;\n\n /* Hide scrollbar */\n scrollbar-width: none !important;\n -ms-overflow-style: none !important;\n\n &::-webkit-scrollbar {\n display: none !important;\n }\n }\n\n /* Ensure suggestion buttons don't wrap or shrink */\n div[role=\"list\"][aria-label*=\"Suggested\"] button {\n flex-shrink: 0 !important;\n white-space: nowrap !important;\n }\n\n /* Remove teal/cyan outline from all inputs */\n .copilotKitSidebar input,\n .copilotKitSidebar input:focus,\n .copilotKitSidebar input:focus-visible,\n .copilotKitSidebar textarea,\n .copilotKitSidebar textarea:focus,\n .copilotKitSidebar textarea:focus-visible {\n outline: none !important;\n outline-color: transparent !important;\n box-shadow: none !important;\n }\n`;\n\n// Styled button positioned in the bottom-right corner\nconst StyledChatButton = styled.button`\n position: fixed;\n bottom: 8px;\n right: 8px;\n width: 36px;\n height: 36px;\n border-radius: 18px;\n border: none;\n background: linear-gradient(135deg, #2CB0AB 0%, #459FB9 100%);\n box-shadow: 0 4px 12px rgba(44, 176, 171, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1000;\n transition: all 0.2s ease;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 16px rgba(44, 176, 171, 0.5);\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n svg {\n width: 20px;\n height: 20px;\n fill: white;\n }\n`;\n\nexport interface CustomCopilotSidebarProps {\n children: ReactNode;\n defaultOpen?: boolean;\n onSetOpen?: (open: boolean) => void;\n instructions?: string;\n className?: string;\n /**\n * When true, disables the chat button and prevents opening the sidebar.\n */\n disabled?: boolean;\n /**\n * Message to display as tooltip when disabled.\n */\n disabledReason?: string;\n}\n\n/**\n * CustomCopilotSidebar - A CopilotSidebar wrapper using our custom components\n *\n * This component wraps CopilotKit's CopilotSidebar and provides our custom\n * design system components for a consistent look and feel.\n *\n * @example\n * ```tsx\n * <CustomCopilotSidebar defaultOpen={false} onSetOpen={(open) => console.log(open)}>\n * <YourApp />\n * </CustomCopilotSidebar>\n * ```\n */\nexport function CustomCopilotSidebar({\n children,\n defaultOpen = false,\n onSetOpen,\n instructions,\n className,\n disabled = false,\n disabledReason = 'Start a free trial to enable AI chat',\n}: CustomCopilotSidebarProps) {\n // Header adapter with close handler\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const HeaderAdapterWithClose = (_props: CopilotHeaderProps) => {\n const { setOpen } = useChatContext();\n\n const handleClose = () => {\n setOpen(false);\n onSetOpen?.(false);\n };\n\n return (\n <Header title=\"AI Assistant\" onClose={handleClose} />\n );\n };\n\n // Window adapter - wraps our custom Window component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const WindowAdapterLocal = (props: CopilotWindowProps) => {\n return <Window>{props.children}</Window>;\n };\n\n // Don't override Messages - let CopilotKit handle rendering with our custom message components\n // Overriding Messages breaks the adapter chain because props.RenderMessage uses default components\n\n // Custom Button component that uses CopilotKit's ChatContext\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const CustomButton = (_props: CopilotButtonProps) => {\n const { open, setOpen } = useChatContext();\n\n const handleClick = () => {\n if (disabled) return;\n const newOpenState = !open;\n setOpen(newOpenState);\n onSetOpen?.(newOpenState);\n };\n\n // Inline styles for disabled state to avoid affecting positioning\n const disabledStyles: CSSProperties = disabled ? {\n background: 'rgba(100, 100, 100, 0.5)',\n boxShadow: 'none',\n cursor: 'not-allowed',\n opacity: 0.6,\n } : {};\n\n return (\n <StyledChatButton\n onClick={handleClick}\n aria-label={disabled ? disabledReason : (open ? 'Close chat' : 'Open chat')}\n aria-disabled={disabled}\n title={disabled ? disabledReason : undefined}\n type=\"button\"\n style={disabledStyles}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n style={disabled ? { fill: 'rgba(255, 255, 255, 0.5)' } : undefined}\n >\n <title>Chat</title>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n </StyledChatButton>\n );\n };\n\n return (\n <>\n <GlobalSidebarStyles />\n <CopilotSidebar\n // Pass through custom components via adapters\n AssistantMessage={AssistantMessageAdapter}\n UserMessage={UserMessageAdapter}\n Input={InputAdapter}\n Header={HeaderAdapterWithClose}\n Window={WindowAdapterLocal}\n // Don't override Messages - it breaks the adapter chain\n Button={CustomButton}\n\n // Configuration\n instructions={instructions}\n labels={{\n title: 'AI Assistant',\n initial: 'Hi! How can I help you today?',\n }}\n\n // Behavior\n defaultOpen={defaultOpen}\n clickOutsideToClose={true}\n hitEscapeToClose={true}\n onSetOpen={onSetOpen}\n\n // Styling\n className={className}\n >\n {children}\n </CopilotSidebar>\n </>\n );\n}\n\nCustomCopilotSidebar.displayName = 'CustomCopilotSidebar';\n","import styled from 'styled-components';\n\nexport const FooterContainer = styled.footer`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${({ theme }) => theme?.spacing?.sm ?? '8px'} ${({ theme }) => theme?.spacing?.md ?? '16px'};\n background-color: ${({ theme }) => theme?.colors?.surface ?? '#ffffff'};\n border-top: 1px solid ${({ theme }) => theme?.colors?.border ?? '#E0E0E0'};\n min-height: 44px;\n`;\n\nexport const FooterContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ${({ theme }) => theme?.spacing?.md ?? '16px'};\n width: 100%;\n max-width: 100%;\n font-size: 0.75rem;\n color: ${({ theme }) => theme?.colors?.text ?? '#000000'};\n opacity: 0.6;\n font-family: ${({ theme }) => theme?.fonts?.body ?? 'system-ui, sans-serif'};\n line-height: 1.4;\n`;\n\nexport const FooterBranding = styled.div`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme?.spacing?.xs ?? '4px'};\n flex-shrink: 0;\n`;\n\nexport const FooterStatus = styled.div`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme?.spacing?.xs ?? '4px'};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.75rem;\n opacity: 0.8;\n`;\n\nexport const FooterLink = styled.a`\n color: ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n text-decoration: none;\n transition: opacity 150ms ease;\n cursor: pointer;\n\n &:hover {\n opacity: 0.8;\n text-decoration: underline;\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n outline-offset: 2px;\n border-radius: ${({ theme }) => theme?.radii?.sm ?? '4px'};\n }\n`;\n","import type React from 'react';\nimport {\n FooterBranding,\n FooterContainer,\n FooterContent,\n FooterLink,\n FooterStatus,\n} from './Footer.styles';\n\nexport interface FooterProps {\n /**\n * Branding text to display (e.g., \"Powered by CopilotKit\")\n */\n branding?: string;\n\n /**\n * Optional status text (e.g., \"Connected\", \"Typing...\", \"3 tokens remaining\")\n */\n status?: string;\n\n /**\n * Optional link URL for the branding text\n */\n brandingUrl?: string;\n\n /**\n * Callback when branding link is clicked\n */\n onBrandingClick?: () => void;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n}\n\n/**\n * Footer Component\n *\n * A chat footer component that displays branding, status information, and optional links.\n * Typically used at the bottom of a chat interface to show provider information or connection status.\n *\n * @example\n * ```tsx\n * <Footer\n * branding=\"Powered by CopilotKit\"\n * status=\"Connected\"\n * brandingUrl=\"https://copilotkit.ai\"\n * />\n * ```\n */\nexport const Footer: React.FC<FooterProps> = ({\n branding,\n status,\n brandingUrl,\n onBrandingClick,\n className,\n}) => {\n // If no content, don't render\n if (!branding && !status) {\n return null;\n }\n\n const handleBrandingClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (onBrandingClick) {\n e.preventDefault();\n onBrandingClick();\n }\n };\n\n return (\n <FooterContainer className={className}>\n <FooterContent>\n {branding && (\n <FooterBranding>\n {brandingUrl ? (\n <FooterLink\n href={brandingUrl}\n onClick={handleBrandingClick}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {branding}\n </FooterLink>\n ) : (\n branding\n )}\n </FooterBranding>\n )}\n\n {status && <FooterStatus>{status}</FooterStatus>}\n </FooterContent>\n </FooterContainer>\n );\n};\n\nFooter.displayName = 'Footer';\n","import styled from 'styled-components';\n\nexport const InputContainer = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 100%;\n\tposition: relative;\n`;\n\nexport const InputWrapper = styled.div`\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: 8px;\n\tpadding: 12px;\n\tbackground-color: rgba(25, 25, 25, 0.6);\n\tbackdrop-filter: blur(10px);\n\t-webkit-backdrop-filter: blur(10px);\n\tborder: 1px solid rgba(58, 58, 60, 0.3);\n\tborder-radius: 12px;\n\ttransition: all 0.2s ease;\n\n\t&:focus-within {\n\t\t/* Subtle focus indication without bold colored border */\n\t\tborder-color: rgba(255, 255, 255, 0.3);\n\t}\n\n\t&:hover:not(:focus-within) {\n\t\tborder-color: rgba(58, 58, 60, 0.5);\n\t}\n`;\n\ninterface TextAreaProps {\n $maxRows?: number;\n disabled?: boolean;\n readOnly?: boolean;\n}\n\nexport const TextArea = styled.textarea<TextAreaProps>`\n\tflex: 1;\n\tmin-height: 24px;\n\tmax-height: ${(props) => `${(props.$maxRows || 5) * 24}px`};\n\tpadding: 0;\n\tborder: none;\n\toutline: none;\n\tresize: none;\n\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n\t\t'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n\tfont-size: 14px;\n\tline-height: 24px;\n\tcolor: #FFFFFF;\n\tbackground: transparent;\n\toverflow-y: auto;\n\n\t&::placeholder {\n\t\tcolor: #8e8e93;\n\t}\n\n\t&:disabled {\n\t\tcolor: #9ca3af;\n\t\tcursor: not-allowed;\n\t}\n\n\t&:read-only {\n\t\tcursor: default;\n\t}\n\n\t/* Custom scrollbar */\n\t&::-webkit-scrollbar {\n\t\twidth: 6px;\n\t}\n\n\t&::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n\n\t&::-webkit-scrollbar-thumb {\n\t\tbackground: #d1d5db;\n\t\tborder-radius: 3px;\n\t}\n\n\t&::-webkit-scrollbar-thumb:hover {\n\t\tbackground: #9ca3af;\n\t}\n`;\n\ninterface SendButtonProps {\n disabled?: boolean;\n}\n\nexport const SendButton = styled.button<SendButtonProps>`\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 36px;\n\theight: 36px;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: 8px;\n\tbackground-color: ${(props) => (props.disabled ? 'rgba(229, 231, 235, 0.3)' : '#2CB0AB')};\n\tcolor: ${(props) => (props.disabled ? '#6B7280' : '#ffffff')};\n\tcursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n\ttransition: all 0.2s ease;\n\tflex-shrink: 0;\n\n\t&:hover:not(:disabled) {\n\t\tbackground-color: #459FB9;\n\t\ttransform: translateY(-1px);\n\t}\n\n\t&:active:not(:disabled) {\n\t\ttransform: translateY(0);\n\t}\n\n\t&:focus-visible {\n\t\toutline: none;\n\t}\n\n\tsvg {\n\t\twidth: 20px;\n\t\theight: 20px;\n\t}\n`;\n","import type { AriaTextFieldProps } from '@react-aria/textfield';\nimport { useTextField } from '@react-aria/textfield';\nimport React, { type KeyboardEvent, useRef } from 'react';\nimport { InputContainer, InputWrapper, SendButton, TextArea } from './Input.styles';\n\nexport interface InputProps\n extends Omit<AriaTextFieldProps, 'onChange' | 'onFocus' | 'onBlur' | 'onKeyDown' | 'onKeyUp'> {\n /** Current message value */\n value?: string;\n /** Callback when message value changes */\n onChange?: (value: string) => void;\n /** Callback when message is submitted */\n onSubmit?: (message: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input is read-only */\n isReadOnly?: boolean;\n /** Maximum number of rows before scrolling */\n maxRows?: number;\n /** Whether to auto-focus the input */\n autoFocus?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for the input */\n 'aria-label'?: string;\n}\n\n/**\n * Input component for chat interfaces\n * Features:\n * - Multi-line text support\n * - Submit on Enter, Shift+Enter for new line\n * - React ARIA for accessibility\n * - Auto-growing textarea\n * - Integrated send button\n */\nexport const Input: React.FC<InputProps> = ({\n value = '',\n onChange,\n onSubmit,\n placeholder = 'Type a message...',\n isDisabled = false,\n isReadOnly = false,\n maxRows = 5,\n autoFocus = false,\n className,\n 'aria-label': ariaLabel = 'Message input',\n ...ariaProps\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // React ARIA hook for accessibility\n const { inputProps } = useTextField(\n {\n ...ariaProps,\n 'aria-label': ariaLabel,\n value,\n onChange: (newValue: string) => {\n onChange?.(newValue);\n },\n isDisabled,\n isReadOnly,\n inputElementType: 'textarea',\n },\n textareaRef\n );\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (value.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(value.trim());\n // Clear the input after submission\n onChange?.('');\n }\n }\n // Shift+Enter adds a new line (default behavior)\n };\n\n // Handle send button click\n const handleSend = () => {\n if (value.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(value.trim());\n onChange?.('');\n // Refocus the textarea after sending\n textareaRef.current?.focus();\n }\n };\n\n const canSend = value.trim().length > 0 && !isDisabled && !isReadOnly;\n\n return (\n <InputContainer className={className}>\n <InputWrapper>\n <TextArea\n {...inputProps}\n ref={textareaRef}\n placeholder={placeholder}\n onKeyDown={handleKeyDown}\n $maxRows={maxRows}\n autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n />\n <SendButton\n type=\"button\"\n onClick={handleSend}\n disabled={!canSend}\n aria-label=\"Send message\"\n title=\"Send message (Enter)\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Send Icon</title>\n <path\n d=\"M2.5 10L17.5 3.75L11.25 18.75L10 12.5L2.5 10Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </SendButton>\n </InputWrapper>\n </InputContainer>\n );\n};\n","import styled from 'styled-components';\n\n/**\n * Styled container for the messages area\n * Provides flexible layout and responsive spacing\n */\nexport const MessagesContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n /* Gradient background with subtle purple accent */\n background-image: linear-gradient(to right bottom, #302c4c, #26273d, #1e202d, #191a1e, #171a21, #141a24, #0f1b27, #081b2a, #081b2a, #081b2a);\n padding: 8px;\n gap: 12px;\n box-sizing: border-box;\n\n /* Ensure proper scrolling behavior for child components */\n position: relative;\n min-height: 0;\n\n /* Desktop padding */\n @media (min-width: 640px) {\n padding: 12px;\n }\n`;\n","import type React from 'react';\nimport { MessagesContainer } from './Messages.styles';\n\nexport interface MessagesProps {\n /**\n * Children elements to be rendered inside the messages container\n */\n children?: React.ReactNode;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * ARIA label for accessibility\n */\n ariaLabel?: string;\n}\n\n/**\n * Messages component - Container for message list\n *\n * This component serves as a wrapper for the messages area,\n * providing consistent spacing and layout for chat messages.\n *\n * @example\n * ```tsx\n * <Messages ariaLabel=\"Chat messages\">\n * <MessagesList messages={messages} />\n * </Messages>\n * ```\n */\nexport const Messages: React.FC<MessagesProps> = ({\n children,\n className,\n ariaLabel = 'Messages',\n}) => {\n return (\n <MessagesContainer className={className} role=\"region\" aria-label={ariaLabel}>\n {children}\n </MessagesContainer>\n );\n};\n\nMessages.displayName = 'Messages';\n","import styled from 'styled-components';\n\nexport const MessagesListContainer = styled.div<{ $maxHeight: string }>`\n display: flex;\n flex-direction: column;\n width: 100%;\n max-height: ${(props) => props.$maxHeight};\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n background: #ffffff;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n scroll-behavior: smooth;\n\n /* Custom scrollbar styling */\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: #f1f5f9;\n border-radius: 4px;\n }\n\n &::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 4px;\n transition: background 0.2s ease;\n }\n\n &::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n }\n\n /* Firefox scrollbar styling */\n scrollbar-width: thin;\n scrollbar-color: #cbd5e1 #f1f5f9;\n\n /* Ensure proper rendering on mobile */\n -webkit-overflow-scrolling: touch;\n`;\n\nexport const MessagesListContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n min-height: min-content;\n\n /* Message styling */\n .message {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 12px 16px;\n border-radius: 8px;\n max-width: 85%;\n word-wrap: break-word;\n animation: messageSlideIn 0.2s ease-out;\n }\n\n @keyframes messageSlideIn {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Role-specific message styling */\n .message--user {\n align-self: flex-end;\n background: #3b82f6;\n color: #ffffff;\n border-bottom-right-radius: 4px;\n }\n\n .message--assistant {\n align-self: flex-start;\n background: #f1f5f9;\n color: #1e293b;\n border-bottom-left-radius: 4px;\n }\n\n .message--system {\n align-self: center;\n background: #fef3c7;\n color: #92400e;\n font-size: 0.875rem;\n font-style: italic;\n max-width: 100%;\n text-align: center;\n }\n`;\n","import { type ReactNode, useEffect, useRef } from 'react';\nimport { MessagesListContainer, MessagesListContent } from './MessagesList.styles';\n\nexport interface Message {\n id: string;\n content: ReactNode;\n role: 'user' | 'assistant' | 'system';\n timestamp?: Date;\n}\n\nexport interface MessagesListProps {\n /** Array of messages to display */\n messages: Message[];\n /** Whether to automatically scroll to the bottom when new messages arrive */\n autoScroll?: boolean;\n /** Custom class name for the container */\n className?: string;\n /** Custom render function for individual messages */\n renderMessage?: (message: Message) => ReactNode;\n /** Callback when scroll reaches the top (for loading more messages) */\n onScrollTop?: () => void;\n /** Maximum height of the messages list */\n maxHeight?: string;\n}\n\n/**\n * MessagesList Component\n *\n * A scrollable message list component with auto-scroll functionality.\n * Designed for chat interfaces where messages need to be displayed\n * in a scrollable container with automatic scrolling to the latest message.\n *\n * Features:\n * - Auto-scroll to bottom on new messages\n * - Overflow handling with custom scrollbar\n * - Flexible message rendering\n * - Scroll event handling for pagination\n */\nexport const MessagesList = ({\n messages,\n autoScroll = true,\n className,\n renderMessage,\n onScrollTop,\n maxHeight = '600px',\n}: MessagesListProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const isUserScrollingRef = useRef(false);\n const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Auto-scroll to bottom when new messages arrive\n // biome-ignore lint/correctness/useExhaustiveDependencies: We need messages.length to trigger scroll on new messages\n useEffect(() => {\n if (autoScroll && !isUserScrollingRef.current && containerRef.current) {\n const container = containerRef.current;\n container.scrollTop = container.scrollHeight;\n }\n }, [messages.length, autoScroll]);\n\n // Handle scroll events\n const handleScroll = () => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const isAtBottom = container.scrollHeight - container.scrollTop - container.clientHeight < 10;\n\n // User is scrolling manually\n isUserScrollingRef.current = !isAtBottom;\n\n // Clear existing timeout\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n // Reset user scrolling flag after 1 second of no scrolling\n scrollTimeoutRef.current = setTimeout(() => {\n isUserScrollingRef.current = false;\n }, 1000);\n\n // Check if scrolled to top\n if (container.scrollTop === 0 && onScrollTop) {\n onScrollTop();\n }\n };\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, []);\n\n // Default message renderer\n const defaultRenderMessage = (message: Message) => (\n <div\n key={message.id}\n className={`message message--${message.role}`}\n data-message-id={message.id}\n data-role={message.role}\n >\n {message.content}\n </div>\n );\n\n return (\n <MessagesListContainer\n ref={containerRef}\n onScroll={handleScroll}\n className={className}\n $maxHeight={maxHeight}\n >\n <MessagesListContent ref={contentRef}>\n {messages.map(renderMessage || defaultRenderMessage)}\n </MessagesListContent>\n </MessagesListContainer>\n );\n};\n","import styled from 'styled-components';\n\n/**\n * Container for the user message, aligned to the right\n */\nexport const StyledUserMessage = styled.div`\n display: flex;\n justify-content: flex-end;\n align-items: flex-start;\n margin: 8px 0;\n padding: 0 16px;\n width: 100%;\n`;\n\n/**\n * The message bubble containing the user's text\n */\nexport const MessageBubble = styled.div`\n display: flex;\n flex-direction: column;\n max-width: 70%;\n padding: 12px 16px;\n border-radius: 12px; /* Consistent rounded corners, no tail */\n\n /* User message colors - dark blue from brand */\n background: #264E68; /* Deep Blue from brand tokens */\n color: #FFFFFF; /* White text for better contrast on dark background */\n\n /* Smooth transitions */\n transition: all 0.2s ease-in-out;\n\n /* Username styling */\n strong {\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 4px;\n opacity: 0.9;\n }\n`;\n\n/**\n * The actual message text content\n */\nexport const MessageContent = styled.p`\n margin: 0;\n font-size: 14px;\n line-height: 1.5;\n word-wrap: break-word;\n white-space: pre-wrap;\n`;\n\n/**\n * Optional timestamp display\n */\nexport const MessageTime = styled.time`\n font-size: 11px;\n opacity: 0.7;\n margin-top: 4px;\n text-align: right;\n`;\n","import type React from 'react';\nimport styled from 'styled-components';\nimport {\n MessageBubble,\n MessageContent,\n MessageTime,\n StyledUserMessage,\n} from './UserMessage.styles';\n\nconst ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n margin-top: 8px;\n font-size: 12px;\n font-weight: 500;\n color: rgba(0, 0, 0, 0.7);\n background: rgba(255, 255, 255, 0.3);\n border: 1px solid rgba(0, 0, 0, 0.1);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease-in-out;\n\n &:hover {\n background: rgba(255, 255, 255, 0.5);\n border-color: rgba(0, 0, 0, 0.2);\n }\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n`;\n\nconst StreamingIndicator = styled.span`\n display: inline-block;\n width: 4px;\n height: 4px;\n margin-left: 4px;\n background-color: rgba(0, 0, 0, 0.5);\n border-radius: 50%;\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n }\n`;\n\nconst Avatar = styled.img`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n margin-left: 8px;\n object-fit: cover;\n border: 2px solid rgba(216, 180, 254, 0.3);\n`;\n\nexport interface ActionButtonType {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n}\n\nexport interface UserMessageProps {\n /** The message content to display */\n content: string;\n /** Optional timestamp for the message */\n timestamp?: string;\n /** Optional CSS class name */\n className?: string;\n /** Optional avatar URL */\n avatarUrl?: string;\n /** Optional username */\n username?: string;\n /** Whether the message is currently streaming */\n isStreaming?: boolean;\n /** Action buttons to display below the message */\n actions?: ActionButtonType[];\n}\n\n/**\n * UserMessage component displays a user's message in a chat interface.\n * Styled with right alignment and pink/purple gradient from Figma design.\n *\n * Features:\n * - Right-aligned layout\n * - Pink/purple gradient background (#D8B4FE)\n * - Support for streaming state\n * - Optional timestamp display\n * - Action buttons support\n * - Avatar display\n */\nexport const UserMessage = ({\n content,\n timestamp,\n className,\n avatarUrl,\n username,\n isStreaming = false,\n actions = [],\n}: UserMessageProps) => {\n return (\n <StyledUserMessage className={className}>\n <MessageBubble>\n {username && <strong>{username}</strong>}\n <MessageContent>\n {content}\n {isStreaming && <StreamingIndicator />}\n </MessageContent>\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n {actions.length > 0 && (\n <ActionsContainer>\n {actions.map((action, index) => (\n <ActionButton key={index} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ActionButton>\n ))}\n </ActionsContainer>\n )}\n </MessageBubble>\n {avatarUrl && <Avatar src={avatarUrl} alt={username || 'User'} />}\n </StyledUserMessage>\n );\n};\n","import styled, { css } from 'styled-components';\n\nexport const SuggestionsContainer = styled.div`\n display: flex;\n flex-wrap: nowrap; /* Single row */\n gap: ${({ theme }) => theme?.spacing?.sm ?? '8px'};\n\n /* Reduced padding for tighter height */\n padding: ${({ theme }) => theme?.spacing?.xs ?? '4px'} 0;\n\n /* Horizontal scrolling */\n overflow-x: auto;\n overflow-y: hidden;\n\n /* Smooth scrolling on mobile */\n -webkit-overflow-scrolling: touch;\n scroll-behavior: smooth;\n\n /* Align items to ensure single-row height */\n align-items: center;\n\n /* Constrain to exact height of buttons + minimal padding */\n /* Button height: ~14px font + 16px padding + 2px border = ~32px */\n /* Add small padding: 8px total = 40px */\n max-height: 40px;\n min-height: 40px;\n\n /* Hide scrollbar but keep functionality */\n scrollbar-width: none; /* Firefox */\n -ms-overflow-style: none; /* IE/Edge */\n\n &::-webkit-scrollbar {\n display: none; /* Chrome/Safari/Opera */\n }\n`;\n\ninterface StyledSuggestionProps {\n $isPressed: boolean;\n}\n\nexport const StyledSuggestion = styled.button<StyledSuggestionProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${({ theme }) => theme?.spacing?.sm ?? '8px'} ${({ theme }) => theme?.spacing?.md ?? '16px'};\n font-family: ${({ theme }) => theme?.fonts?.body ?? 'system-ui, sans-serif'};\n font-size: 0.875rem;\n font-weight: 500;\n color: ${({ theme }) => theme?.colors?.text ?? '#000000'};\n background-color: ${({ theme }) => theme?.colors?.surface ?? '#ffffff'};\n border: 1px solid ${({ theme }) => theme?.colors?.border ?? '#E0E0E0'};\n border-radius: ${({ theme }) => theme?.radii?.lg ?? '12px'};\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n white-space: nowrap;\n user-select: none;\n flex-shrink: 0; /* Prevent shrinking to maintain size */\n\n /* Hover state */\n &:hover:not(:disabled) {\n background-color: ${({ theme }) => theme?.colors?.border ?? '#E0E0E0'};\n border-color: ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n /* Active/Pressed state */\n &:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: none;\n }\n\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: scale(0.98);\n `}\n\n /* Focus state */\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme?.colors?.primary ?? '#0066FF'};\n outline-offset: 2px;\n }\n\n /* Remove default focus outline */\n &:focus {\n outline: none;\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledSuggestion, SuggestionsContainer } from './Suggestions.styles';\n\nexport interface SuggestionsProps {\n suggestions: string[];\n onSelect: (suggestion: string) => void;\n className?: string;\n}\n\nexport function Suggestions({ suggestions, onSelect, className }: SuggestionsProps) {\n if (suggestions.length === 0) {\n return null;\n }\n\n return (\n <SuggestionsContainer className={className} role=\"list\" aria-label=\"Suggested prompts\">\n {suggestions.map((suggestion) => (\n <SuggestionChip key={suggestion} suggestion={suggestion} onSelect={onSelect} />\n ))}\n </SuggestionsContainer>\n );\n}\n\ninterface SuggestionChipProps {\n suggestion: string;\n onSelect: (suggestion: string) => void;\n}\n\nfunction SuggestionChip({ suggestion, onSelect }: SuggestionChipProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps, isPressed } = useButton(\n {\n onPress: () => onSelect(suggestion),\n 'aria-label': `Select suggestion: ${suggestion}`,\n },\n ref\n );\n\n return (\n <StyledSuggestion {...buttonProps} ref={ref} $isPressed={isPressed} role=\"listitem\">\n {suggestion}\n </StyledSuggestion>\n );\n}\n\nSuggestions.displayName = 'Suggestions';\n","/**\n * StreamErrorMessage Component\n *\n * Displays inline chat errors with retry support.\n *\n * @see specs/015-restyle-ai-chat/spec.md\n */\n\nimport type React from 'react';\nimport styled from 'styled-components';\n\nconst ErrorContainer = styled.div<{ variant: 'inline' | 'banner' }>`\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: ${(props) => (props.variant === 'banner' ? '16px' : '12px 16px')};\n background-color: ${(props) =>\n props.variant === 'banner' ? 'rgba(239, 68, 68, 0.1)' : 'rgba(239, 68, 68, 0.05)'};\n border: 1px solid rgba(239, 68, 68, 0.3);\n border-radius: ${(props) => (props.variant === 'banner' ? '8px' : '12px')};\n color: #FFFFFF;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n margin: 8px 0;\n width: ${(props) => (props.variant === 'banner' ? '100%' : 'auto')};\n max-width: ${(props) => (props.variant === 'banner' ? '100%' : '600px')};\n`;\n\nconst IconContainer = styled.div`\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: #EF4444;\n`;\n\nconst ErrorIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n width=\"20\"\n height=\"20\"\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\n </svg>\n);\n\nconst Content = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n`;\n\nconst ErrorMessage = styled.div`\n font-size: 14px;\n line-height: 1.5;\n color: #FFFFFF;\n`;\n\nconst ErrorDetails = styled.div`\n font-size: 12px;\n line-height: 1.4;\n color: #9CA3AF;\n margin-top: 4px;\n`;\n\nconst Actions = styled.div`\n display: flex;\n gap: 8px;\n margin-top: 8px;\n`;\n\nconst Button = styled.button<{ variant: 'primary' | 'secondary' }>`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 500;\n color: ${(props) => (props.variant === 'primary' ? '#FFFFFF' : '#9CA3AF')};\n background: ${(props) =>\n props.variant === 'primary' ? '#EF4444' : 'rgba(255, 255, 255, 0.05)'};\n border: 1px solid\n ${(props) => (props.variant === 'primary' ? '#EF4444' : 'rgba(255, 255, 255, 0.1)')};\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease-in-out;\n\n &:hover {\n background: ${(props) =>\n props.variant === 'primary' ? '#DC2626' : 'rgba(255, 255, 255, 0.1)'};\n border-color: ${(props) =>\n props.variant === 'primary' ? '#DC2626' : 'rgba(255, 255, 255, 0.2)'};\n }\n\n &:active {\n transform: scale(0.98);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst CloseButton = styled.button`\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: #9CA3AF;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease-in-out;\n\n &:hover {\n background: rgba(255, 255, 255, 0.1);\n color: #FFFFFF;\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"16\" height=\"16\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nexport interface StreamErrorMessageProps {\n /** Error message to display */\n error: string | Error;\n /** Visual variant */\n variant?: 'inline' | 'banner';\n /** Whether the error can be retried */\n retryable?: boolean;\n /** Callback when retry is clicked */\n onRetry?: () => void;\n /** Callback when dismiss is clicked */\n onDismiss?: () => void;\n /** Additional error details */\n details?: string;\n /** Custom className */\n className?: string;\n}\n\n/**\n * StreamErrorMessage component for inline chat errors\n *\n * Features:\n * - Inline and banner variants\n * - Retry support for recoverable errors\n * - Dismissible errors\n * - Error details display\n * - Accessible error reporting\n */\nexport const StreamErrorMessage: React.FC<StreamErrorMessageProps> = ({\n error,\n variant = 'inline',\n retryable = false,\n onRetry,\n onDismiss,\n details,\n className,\n}) => {\n const errorMessage = typeof error === 'string' ? error : error.message;\n\n return (\n <ErrorContainer variant={variant} className={className} role=\"alert\" aria-live=\"assertive\">\n <IconContainer aria-hidden=\"true\">\n <ErrorIcon />\n </IconContainer>\n <Content>\n <ErrorMessage>{errorMessage}</ErrorMessage>\n {details && <ErrorDetails>{details}</ErrorDetails>}\n {(retryable || onDismiss) && (\n <Actions>\n {retryable && onRetry && (\n <Button variant=\"primary\" onClick={onRetry}>\n Retry\n </Button>\n )}\n {onDismiss && (\n <Button variant=\"secondary\" onClick={onDismiss}>\n Dismiss\n </Button>\n )}\n </Actions>\n )}\n </Content>\n {onDismiss && (\n <CloseButton onClick={onDismiss} aria-label=\"Dismiss error\">\n <CloseIcon />\n </CloseButton>\n )}\n </ErrorContainer>\n );\n};\n\nStreamErrorMessage.displayName = 'StreamErrorMessage';\n","/**\n * StreamStatusIndicator Component\n *\n * Displays connection status for streaming chat (SSE).\n *\n * @see specs/015-restyle-ai-chat/spec.md\n */\n\nimport type React from 'react';\nimport styled, { keyframes } from 'styled-components';\n\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.6;\n transform: scale(1.1);\n }\n`;\n\nconst Container = styled.div<{ size: 'sm' | 'md' | 'lg' }>`\n display: inline-flex;\n align-items: center;\n gap: ${(props) => {\n switch (props.size) {\n case 'sm':\n return '4px';\n case 'lg':\n return '8px';\n case 'md':\n default:\n return '6px';\n }\n }};\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n`;\n\nconst StatusDot = styled.div<{\n status: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n size: 'sm' | 'md' | 'lg';\n variant: 'dot' | 'badge';\n}>`\n width: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return '6px';\n case 'lg':\n return '10px';\n case 'md':\n default:\n return '8px';\n }\n }\n switch (props.size) {\n case 'sm':\n return '6px';\n case 'lg':\n return '12px';\n case 'md':\n default:\n return '8px';\n }\n }};\n height: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return '6px';\n case 'lg':\n return '10px';\n case 'md':\n default:\n return '8px';\n }\n }\n switch (props.size) {\n case 'sm':\n return '6px';\n case 'lg':\n return '12px';\n case 'md':\n default:\n return '8px';\n }\n }};\n border-radius: 50%;\n background-color: ${(props) => {\n switch (props.status) {\n case 'connected':\n return '#10B981'; // Green\n case 'streaming':\n return '#3B82F6'; // Blue\n case 'disconnected':\n return '#EF4444'; // Red\n case 'reconnecting':\n return '#F59E0B'; // Yellow/Orange\n }\n }};\n animation: ${(props) => (props.status === 'streaming' ? pulse : 'none')} 2s ease-in-out infinite;\n flex-shrink: 0;\n`;\n\nconst Label = styled.span<{ size: 'sm' | 'md' | 'lg'; variant: 'dot' | 'badge' }>`\n font-size: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return '11px';\n case 'lg':\n return '15px';\n case 'md':\n default:\n return '13px';\n }\n }\n switch (props.size) {\n case 'sm':\n return '12px';\n case 'lg':\n return '16px';\n case 'md':\n default:\n return '14px';\n }\n }};\n font-weight: ${(props) => (props.variant === 'badge' ? '500' : '400')};\n color: #9CA3AF;\n line-height: 1.4;\n`;\n\nconst BadgeContainer = styled.div<{ size: 'sm' | 'md' | 'lg' }>`\n display: inline-flex;\n align-items: center;\n gap: ${(props) => {\n switch (props.size) {\n case 'sm':\n return '4px';\n case 'lg':\n return '8px';\n case 'md':\n default:\n return '6px';\n }\n }};\n padding: ${(props) => {\n switch (props.size) {\n case 'sm':\n return '4px 8px';\n case 'lg':\n return '8px 16px';\n case 'md':\n default:\n return '6px 12px';\n }\n }};\n background-color: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n border-radius: ${(props) => {\n switch (props.size) {\n case 'sm':\n return '4px';\n case 'lg':\n return '8px';\n case 'md':\n default:\n return '6px';\n }\n }};\n`;\n\nexport interface StreamStatusIndicatorProps {\n /** Connection status */\n status: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n /** Visual variant */\n variant?: 'dot' | 'badge';\n /** Size of the indicator */\n size?: 'sm' | 'md' | 'lg';\n /** Whether to show text label */\n showLabel?: boolean;\n /** Custom className */\n className?: string;\n}\n\nconst getStatusLabel = (status: StreamStatusIndicatorProps['status']): string => {\n switch (status) {\n case 'connected':\n return 'Connected';\n case 'streaming':\n return 'Streaming';\n case 'disconnected':\n return 'Disconnected';\n case 'reconnecting':\n return 'Reconnecting...';\n }\n};\n\n/**\n * StreamStatusIndicator component for showing connection status\n *\n * Features:\n * - Visual status indicators (connected/streaming/disconnected/reconnecting)\n * - Color-coded status (green/blue/red/yellow)\n * - Pulsing animation for streaming state\n * - Dot and badge variants\n * - Size options (sm/md/lg)\n * - Optional text labels\n */\nexport const StreamStatusIndicator: React.FC<StreamStatusIndicatorProps> = ({\n status,\n variant = 'dot',\n size = 'md',\n showLabel = false,\n className,\n}) => {\n const content = (\n <>\n <StatusDot status={status} size={size} variant={variant} aria-hidden=\"true\" />\n {showLabel && (\n <Label size={size} variant={variant}>\n {getStatusLabel(status)}\n </Label>\n )}\n </>\n );\n\n if (variant === 'badge') {\n return (\n <BadgeContainer size={size} className={className} role=\"status\" aria-label={getStatusLabel(status)}>\n {content}\n </BadgeContainer>\n );\n }\n\n return (\n <Container size={size} className={className} role=\"status\" aria-label={getStatusLabel(status)}>\n {content}\n </Container>\n );\n};\n\nStreamStatusIndicator.displayName = 'StreamStatusIndicator';\n","/**\n * Complete CopilotSidebar Integration Example\n *\n * This file demonstrates how to integrate custom-designed components\n * (AssistantMessage, UserMessage, AssistantThinking, Input) with CopilotKit's\n * CopilotSidebar component using adapter components.\n *\n * Usage:\n * ```tsx\n * import { CopilotKit } from \"@copilotkit/react-core\";\n * import { CustomCopilotSidebar } from \"./CopilotSidebarIntegration\";\n *\n * function App() {\n * return (\n * <CopilotKit runtimeUrl=\"/api/copilotkit\">\n * <CustomCopilotSidebar>\n * <YourApp />\n * </CustomCopilotSidebar>\n * </CopilotKit>\n * );\n * }\n * ```\n */\n\nimport type React from 'react';\nimport { CopilotSidebar, useChatContext } from '@copilotkit/react-ui';\nimport type {\n ButtonProps as CopilotButtonProps,\n HeaderProps as CopilotHeaderProps,\n WindowProps as CopilotWindowProps,\n MessagesProps as CopilotMessagesProps,\n} from '@copilotkit/react-ui';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport {\n AssistantMessageAdapter,\n UserMessageAdapter,\n InputAdapter,\n} from './adapters';\nimport { Header } from './Header/Header';\nimport { Window } from './Window/Window';\nimport { Messages } from './Messages/Messages';\n\n// Global styles to ensure sidebar starts hidden and button visibility\nconst GlobalSidebarStyles = createGlobalStyle`\n /* Override CopilotKit's default positioning - start off-screen */\n .copilotKitSidebar {\n position: fixed !important;\n right: -100vw !important;\n bottom: 0 !important;\n transition: right 0.3s ease !important;\n }\n\n /* Move sidebar container into view when expanded */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar {\n right: 0 !important;\n }\n\n /* Mobile-first: Full viewport sidebar */\n .copilotKitSidebar .copilotKitWindow {\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: auto !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n margin: 0 !important;\n border-radius: 0 !important;\n z-index: 1001 !important;\n\n transform: translateX(100%) !important;\n visibility: hidden !important;\n pointer-events: none !important;\n opacity: 0 !important;\n display: none !important;\n\n transition: transform 0.3s ease, visibility 0.3s ease, opacity 0.3s ease !important;\n }\n\n /* When window has .open class (CopilotKit's native class), show it */\n .copilotKitSidebar .copilotKitWindow.open {\n display: flex !important;\n transform: translateX(0) !important;\n visibility: visible !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n }\n\n /* Desktop: Sidebar panel on the right (640px = CopilotKit's breakpoint) */\n @media (min-width: 640px) {\n .copilotKitSidebar .copilotKitWindow {\n inset: auto !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: auto !important;\n width: 28rem !important;\n height: 100vh !important;\n max-width: 28rem !important;\n max-height: 100vh !important;\n }\n }\n\n /* Hide button when sidebar is open */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: none !important;\n }\n }\n\n /* Show button when sidebar is closed */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: flex !important;\n }\n }\n\n /* Override CopilotKit's default message styles with our custom components */\n .copilotKitSidebar {\n /* Reset all default CopilotKit message styling */\n [class*=\"copilotKitMessage\"],\n [class*=\"Message-module\"] {\n all: unset !important;\n display: contents !important;\n }\n\n /* Ensure our custom UserMessage gradient pill shows through */\n button[role=\"presentation\"] {\n all: revert !important;\n display: inline-flex !important;\n }\n\n /* Reset input styles to allow our custom ChatInput */\n [class*=\"Input-module\"],\n [class*=\"copilotKitInput\"] {\n all: unset !important;\n display: contents !important;\n }\n\n /* Reset header styles */\n [class*=\"Header-module\"],\n [class*=\"copilotKitHeader\"] {\n all: unset !important;\n display: contents !important;\n }\n }\n`;\n\n// Styled button positioned in the bottom-right corner\nconst StyledChatButton = styled.button`\n position: fixed;\n bottom: 8px;\n right: 8px;\n width: 36px;\n height: 36px;\n border-radius: 18px;\n border: none;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1000;\n transition: all 0.2s ease;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 16px rgba(102, 126, 234, 0.5);\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n svg {\n width: 20px;\n height: 20px;\n fill: white;\n }\n`;\n\nexport interface CustomCopilotSidebarProps {\n /**\n * Children to render alongside the sidebar\n */\n children?: React.ReactNode;\n /**\n * Instructions for the AI assistant\n */\n instructions?: string;\n /**\n * Custom labels for the UI\n */\n labels?: Record<string, string>;\n /**\n * Custom icons for the UI\n */\n icons?: Record<string, React.ReactNode>;\n /**\n * Whether the sidebar should be open by default\n */\n defaultOpen?: boolean;\n /**\n * Whether clicking outside should close the sidebar\n */\n clickOutsideToClose?: boolean;\n /**\n * Whether hitting escape should close the sidebar\n */\n hitEscapeToClose?: boolean;\n /**\n * Keyboard shortcut to open the sidebar\n */\n shortcut?: string;\n /**\n * Callback when the sidebar open state changes\n */\n onSetOpen?: (open: boolean) => void;\n /**\n * Additional CSS class name\n */\n className?: string;\n}\n\n/**\n * CopilotSidebar with custom-designed components\n *\n * This component wraps CopilotKit's CopilotSidebar and injects our\n * custom components via adapter components.\n *\n * Features:\n * - Custom AssistantMessage with avatar and loading states\n * - AssistantThinking component shown during loading\n * - Custom UserMessage with gradient pill design\n * - Custom Input with React ARIA accessibility\n * - Styled chat button with gradient\n */\nexport const CustomCopilotSidebar: React.FC<CustomCopilotSidebarProps> = ({\n children,\n instructions = \"You are a helpful AI assistant.\",\n labels,\n icons,\n defaultOpen = false,\n clickOutsideToClose = true,\n hitEscapeToClose = true,\n shortcut = '/',\n onSetOpen,\n className,\n}) => {\n // Header adapter with close handler\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const HeaderAdapter = (_props: CopilotHeaderProps) => {\n const { setOpen } = useChatContext();\n\n const handleClose = () => {\n setOpen(false);\n onSetOpen?.(false);\n };\n\n return (\n <Header title=\"AI Assistant\" subtitle=\"How can I help you today?\" onClose={handleClose} />\n );\n };\n\n // Window adapter - wraps our custom Window component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const WindowAdapter = (props: CopilotWindowProps) => {\n return <Window>{props.children}</Window>;\n };\n\n // Messages adapter - wraps our custom Messages component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const MessagesAdapter = (props: CopilotMessagesProps) => {\n return (\n <Messages>\n {props.messages.map((message, index) => (\n <props.RenderMessage\n key={message.id || `message-${index}`}\n message={message}\n inProgress={props.inProgress}\n index={index}\n isCurrentMessage={index === props.messages.length - 1}\n />\n ))}\n </Messages>\n );\n };\n\n // Custom Button component that uses CopilotKit's ChatContext\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const CustomButton = (_props: CopilotButtonProps) => {\n const { open, setOpen } = useChatContext();\n\n const handleClick = () => {\n const newOpenState = !open;\n setOpen(newOpenState);\n onSetOpen?.(newOpenState);\n };\n\n return (\n <StyledChatButton\n onClick={handleClick}\n aria-label={open ? 'Close chat' : 'Open chat'}\n type=\"button\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Chat icon\"\n >\n <title>Chat</title>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n </StyledChatButton>\n );\n };\n\n return (\n <>\n <GlobalSidebarStyles />\n <CopilotSidebar\n // Pass through custom components via adapters\n AssistantMessage={AssistantMessageAdapter}\n UserMessage={UserMessageAdapter}\n Input={InputAdapter}\n Header={HeaderAdapter}\n Window={WindowAdapter}\n Messages={MessagesAdapter}\n Button={CustomButton}\n\n // Configuration\n instructions={instructions}\n labels={{\n title: \"AI Assistant\",\n initial: \"Hi! How can I help you today?\",\n ...labels,\n }}\n icons={icons}\n\n // Behavior\n defaultOpen={defaultOpen}\n clickOutsideToClose={clickOutsideToClose}\n hitEscapeToClose={hitEscapeToClose}\n shortcut={shortcut}\n onSetOpen={onSetOpen}\n\n // Styling\n className={className}\n >\n {children}\n </CopilotSidebar>\n </>\n );\n};\n\nCustomCopilotSidebar.displayName = 'CustomCopilotSidebar';\n"]}
1
+ {"version":3,"sources":["../../src/theme/tokens.ts","../../src/components/copilotkit/Button/Button.styles.ts","../../src/components/copilotkit/Button/Button.tsx","../../src/components/copilotkit/Actions/Actions.styles.ts","../../src/components/copilotkit/Actions/Actions.tsx","../../src/components/copilotkit/Response/Response.styles.ts","../../src/components/copilotkit/Response/Response.tsx","../../src/components/copilotkit/AgentState/AgentState.styles.ts","../../src/components/copilotkit/AgentState/AgentState.tsx","../../src/components/copilotkit/adapters/ActionExecutionAdapter.tsx","../../src/components/AssistantThinking/AssistantThinking.styles.ts","../../src/components/AssistantThinking/AssistantThinking.tsx","../../src/components/copilotkit/StreamingText.tsx","../../src/components/copilotkit/Messages/AssistantMessage.styles.ts","../../src/components/copilotkit/Messages/FileAttachment.styles.ts","../../src/components/copilotkit/Messages/FileAttachment.tsx","../../src/components/copilotkit/Messages/AssistantMessage.tsx","../../src/components/copilotkit/adapters/AssistantMessageAdapter.tsx","../../src/components/ChatInput/ChatInput.styles.ts","../../src/components/ChatInput/ChatInput.tsx","../../src/components/copilotkit/adapters/InputAdapter.tsx","../../src/components/UserMessage/UserMessage.styles.ts","../../src/components/UserMessage/UserMessage.tsx","../../src/components/copilotkit/adapters/UserMessageAdapter.tsx","../../src/components/copilotkit/StreamStatusIndicator.tsx","../../src/components/copilotkit/Header/Header.styles.ts","../../src/components/copilotkit/Header/Header.tsx","../../src/components/copilotkit/Messages/Messages.styles.ts","../../src/components/copilotkit/Messages/Messages.tsx","../../src/components/copilotkit/Window/Window.styles.ts","../../src/components/copilotkit/Window/Window.tsx","../../src/components/copilotkit/CopilotSidebarIntegration.tsx","../../src/components/copilotkit/CustomCopilotSidebar/CustomCopilotSidebar.tsx","../../src/components/copilotkit/Footer/Footer.styles.ts","../../src/components/copilotkit/Footer/Footer.tsx","../../src/components/copilotkit/Input/Input.styles.ts","../../src/components/copilotkit/Input/Input.tsx","../../src/components/copilotkit/Messages/MessagesList.styles.ts","../../src/components/copilotkit/Messages/MessagesList.tsx","../../src/components/copilotkit/Messages/UserMessage.styles.ts","../../src/components/copilotkit/Messages/UserMessage.tsx","../../src/components/copilotkit/StreamErrorMessage.tsx","../../src/components/copilotkit/Suggestions/Suggestions.styles.ts","../../src/components/copilotkit/Suggestions/Suggestions.tsx"],"names":["css","styled","useRef","useButton","jsx","jsxs","keyframes","dotPulse","Container","LoadingDots","Dot","Message","StreamingText","useState","useEffect","Avatar","ActionsContainer","Fragment","useTextField","pulse","ActionButton","createGlobalStyle","useChatContext","CopilotSidebar","GlobalSidebarStyles","StyledChatButton","CustomCopilotSidebar","InputWrapper","StyledUserMessage","MessageContent","MessageTime","StreamingIndicator","UserMessage","Content","Actions","Button"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Design Tokens\n * Centralized design system tokens for colors, typography, spacing, etc.\n * These tokens are the single source of truth for styling across all components.\n */\n\nexport const tokens = {\n colors: {\n // Brand colors\n primary: '#2CB0AB', // Teal (main brand color)\n secondary: '#264E68', // Deep Blue\n accent: '#459FB9', // Sky Blue\n seaGreen: '#4EB999', // Sea Green (additional brand color)\n\n // Backgrounds - dark theme optimized\n background: {\n darkest: '#0a1b2a', // Darkest Blue (brand color)\n darker: '#151a26', // Discord gray (preserved)\n dark: '#1b2230', // Discord surface gray (preserved)\n light: '#252d3d', // Discord border gray (preserved)\n },\n\n // Text hierarchy\n text: {\n primary: '#FFFFFF',\n secondary: '#B4B8C5',\n tertiary: '#6B7280',\n disabled: '#4B5563',\n },\n\n // Semantic colors\n success: '#2CB0AB', // Teal (brand aligned)\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#459FB9', // Sky Blue (brand aligned)\n\n // Status colors (for workflow/SSE events)\n status: {\n pending: '#6B7280',\n idle: '#6B7280',\n running: '#459FB9', // Sky Blue (brand aligned)\n completed: '#2CB0AB', // Teal (brand aligned)\n failed: '#EF4444',\n timeout: '#F59E0B',\n // Badge status (online/offline pattern)\n online: '#2CB0AB',\n offline: '#EF4444',\n busy: '#459FB9',\n },\n\n // Connection status\n connection: {\n connected: '#2CB0AB', // Teal (brand aligned)\n streaming: '#459FB9', // Sky Blue (brand aligned)\n disconnected: '#EF4444',\n reconnecting: '#F59E0B',\n },\n\n // Surface variants (for overlays, cards, panels)\n surface: {\n base: '#1b2230',\n elevated: '#252d3d',\n overlay: 'rgba(255, 255, 255, 0.05)',\n overlayHover: 'rgba(255, 255, 255, 0.1)',\n overlayActive: 'rgba(255, 255, 255, 0.15)',\n subtle: 'rgba(255, 255, 255, 0.02)',\n glass: 'rgba(255, 255, 255, 0.26)',\n glassBorder: 'rgba(255, 255, 255, 0.3)',\n },\n\n // UI Element colors\n border: {\n default: 'rgba(255, 255, 255, 0.1)',\n subtle: 'rgba(255, 255, 255, 0.05)',\n hover: 'rgba(255, 255, 255, 0.2)',\n focus: '#2CB0AB', // Teal (brand aligned)\n error: '#EF4444',\n },\n\n // Scrollbar colors\n scrollbar: {\n track: 'transparent',\n thumb: 'rgba(255, 255, 255, 0.2)',\n thumbHover: 'rgba(255, 255, 255, 0.3)',\n },\n\n // Message bubbles\n message: {\n user: '#264E68', // Deep Blue (brand color)\n ai: '#1b2230', // Dark background\n system: '#151a26', // Darker background\n },\n\n // Overlays and backdrops\n overlay: 'rgba(0, 0, 0, 0.5)',\n backdrop: 'rgba(27, 34, 48, 0.95)',\n\n // Icon colors\n icon: {\n default: '#B4B8C5',\n muted: '#6B7280',\n active: '#2CB0AB',\n },\n\n // Platform brand colors (for social media icons)\n platform: {\n facebook: '#1877F2',\n instagram: '#E4405F',\n linkedin: '#0A66C2',\n x: '#000000',\n twitter: '#1DA1F2',\n youtube: '#FF0000',\n reddit: '#FF4500',\n slack: '#4A154B',\n telegram: '#0088CC',\n whatsapp: '#25D366',\n gmail: '#EA4335',\n },\n },\n\n typography: {\n fontFamily: {\n primary:\n \"'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', sans-serif\",\n heading:\n \"'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', sans-serif\",\n monospace: \"'Roboto Mono', 'Monaco', 'Menlo', 'Ubuntu Mono', monospace\",\n },\n fontSize: {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n base: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.25rem', // 20px\n '2xl': '1.5rem', // 24px\n '3xl': '1.875rem', // 30px\n '4xl': '2.25rem', // 36px\n },\n fontWeight: {\n light: 300,\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.75,\n },\n },\n\n spacing: {\n xs: '0.25rem', // 4px\n sm: '0.5rem', // 8px\n md: '1rem', // 16px\n lg: '1.5rem', // 24px\n xl: '2rem', // 32px\n '2xl': '3rem', // 48px\n '3xl': '4rem', // 64px\n },\n\n borderRadius: {\n none: '0',\n sm: '0.25rem', // 4px\n md: '0.5rem', // 8px\n lg: '0.75rem', // 12px\n xl: '1rem', // 16px\n '2xl': '1.5rem', // 24px\n full: '9999px', // Fully rounded\n },\n\n shadows: {\n none: 'none',\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n card: '0 4px 20px rgba(0, 0, 0, 0.3)',\n glow: {\n primary: '0 0 20px rgba(44, 176, 171, 0.3)',\n secondary: '0 0 20px rgba(38, 78, 104, 0.3)',\n accent: '0 0 20px rgba(69, 159, 185, 0.3)',\n },\n },\n\n transitions: {\n fast: '150ms ease-in-out',\n normal: '250ms ease-in-out',\n slow: '350ms ease-in-out',\n },\n\n animation: {\n duration: {\n micro: '150ms',\n short: '200ms',\n medium: '300ms',\n long: '500ms',\n },\n easing: {\n enter: 'cubic-bezier(0.4, 0, 0.2, 1)',\n exit: 'cubic-bezier(0.4, 0, 1, 1)',\n smooth: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n },\n },\n\n zIndex: {\n base: 0,\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n overlay: 1100,\n modal: 1200,\n popover: 1300,\n tooltip: 1400,\n toast: 1500,\n },\n\n breakpoints: {\n mobile: 640,\n tablet: 1024,\n desktop: 1280,\n },\n} as const;\n\nexport type Tokens = typeof tokens;\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport type { ButtonSize, ButtonVariant } from './Button.types';\n\ninterface StyledButtonProps {\n $variant: ButtonVariant;\n $size: ButtonSize;\n $isPressed: boolean;\n $isLoading: boolean;\n}\n\nconst variantStyles = {\n primary: css`\n background-color: ${tokens.colors.primary};\n color: ${tokens.colors.text.primary};\n border: none;\n\n &:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n }\n\n &:active:not(:disabled) {\n opacity: 0.8;\n transform: translateY(0);\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n secondary: css`\n background-color: transparent;\n color: ${tokens.colors.text.primary};\n border: 1px solid ${tokens.colors.border.default};\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlay};\n border-color: ${tokens.colors.primary};\n }\n\n &:active:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayActive};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n icon: css`\n background-color: transparent;\n color: ${tokens.colors.text.primary};\n border: none;\n padding: ${tokens.spacing.sm};\n min-width: auto;\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayHover};\n opacity: 0.8;\n }\n\n &:active:not(:disabled) {\n opacity: 0.6;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n};\n\nconst sizeStyles = {\n small: css`\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.sm};\n min-width: 60px;\n height: 28px;\n `,\n medium: css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-size: ${tokens.typography.fontSize.base};\n min-width: 80px;\n height: 36px;\n `,\n large: css`\n padding: ${tokens.spacing.md} ${tokens.spacing.lg};\n font-size: ${tokens.typography.fontSize.lg};\n min-width: 100px;\n height: 44px;\n `,\n};\n\nexport const StyledButton = styled.button<StyledButtonProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: ${tokens.spacing.xs};\n font-family: ${tokens.typography.fontFamily.primary};\n font-weight: ${tokens.typography.fontWeight.medium};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.normal};\n white-space: nowrap;\n user-select: none;\n\n /* Variant styles */\n ${({ $variant }) => variantStyles[$variant]}\n\n /* Size styles */\n ${({ $size, $variant }) => $variant !== 'icon' && sizeStyles[$size]}\n\n /* Icon variant size overrides */\n ${({ $variant, $size }) =>\n $variant === 'icon' &&\n css`\n width: ${$size === 'small' ? '28px' : $size === 'large' ? '44px' : '36px'};\n height: ${$size === 'small' ? '28px' : $size === 'large' ? '44px' : '36px'};\n border-radius: ${tokens.borderRadius.sm};\n `}\n\n /* Pressed state */\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: scale(0.98);\n `}\n\n /* Loading state */\n ${({ $isLoading }) =>\n $isLoading &&\n css`\n cursor: wait;\n opacity: 0.7;\n `}\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n }\n\n /* Remove default focus outline, using focus-visible instead */\n &:focus {\n outline: none;\n }\n`;\n","import type { AriaButtonProps } from '@react-aria/button';\nimport { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledButton } from './Button.styles';\nimport type { ButtonSize, ButtonVariant } from './Button.types';\n\n// Re-export types for public API\nexport type { ButtonSize, ButtonVariant } from './Button.types';\n\nexport interface ButtonProps extends AriaButtonProps {\n variant?: ButtonVariant;\n size?: ButtonSize;\n children: React.ReactNode;\n className?: string;\n disabled?: boolean;\n isLoading?: boolean;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'medium',\n children,\n className,\n disabled = false,\n isLoading = false,\n ...ariaProps\n}: ButtonProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps, isPressed } = useButton(\n {\n ...ariaProps,\n isDisabled: disabled || isLoading,\n },\n ref\n );\n\n return (\n <StyledButton\n {...buttonProps}\n ref={ref}\n className={className}\n $variant={variant}\n $size={size}\n $isPressed={isPressed}\n $isLoading={isLoading}\n disabled={disabled || isLoading}\n >\n {isLoading ? (\n <span aria-live=\"polite\" aria-busy=\"true\">\n Loading...\n </span>\n ) : (\n children\n )}\n </StyledButton>\n );\n}\n\nButton.displayName = 'Button';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport type { ActionsLayout } from './Actions.types';\n\ninterface ActionsContainerProps {\n $layout: ActionsLayout;\n}\n\nexport const ActionsContainer = styled.div<ActionsContainerProps>`\n display: flex;\n gap: ${tokens.spacing.sm};\n align-items: center;\n\n ${({ $layout }) =>\n $layout === 'horizontal'\n ? css`\n flex-direction: row;\n flex-wrap: wrap;\n `\n : css`\n flex-direction: column;\n align-items: stretch;\n\n button {\n width: 100%;\n }\n `}\n`;\n","import { Button } from '../Button';\nimport { ActionsContainer } from './Actions.styles';\nimport type { Action, ActionsLayout } from './Actions.types';\n\n// Re-export types for public API\nexport type { Action, ActionsLayout, ActionVariant } from './Actions.types';\n\nexport interface ActionsProps {\n actions: Action[];\n layout?: ActionsLayout;\n className?: string;\n}\n\nexport function Actions({ actions, layout = 'horizontal', className }: ActionsProps) {\n return (\n <ActionsContainer $layout={layout} className={className}>\n {actions.map((action) => (\n <Button\n key={action.id}\n variant={action.variant || 'secondary'}\n onPress={action.onClick}\n isDisabled={action.disabled}\n aria-label={action.label}\n >\n {action.icon && <span aria-hidden=\"true\">{action.icon}</span>}\n {action.variant !== 'icon' && action.label}\n </Button>\n ))}\n </ActionsContainer>\n );\n}\n\nActions.displayName = 'Actions';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n// Pulse animation matching AssistantThinking\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Fade in animation for streaming text\nconst fadeIn = keyframes`\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n`;\n\n// Cursor blink animation for streaming\nconst blink = keyframes`\n 0%, 49% {\n opacity: 1;\n }\n 50%, 100% {\n opacity: 0;\n }\n`;\n\nexport const ResponseContainer = styled.div`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${tokens.colors.surface.elevated};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: none;\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const LoadingDots = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: 0 ${tokens.spacing.xs};\n`;\n\nexport const Dot = styled.span<{ delay: number }>`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${dotPulse} 1.4s ease-in-out infinite;\n animation-delay: ${(props) => props.delay}s;\n`;\n\nexport const TypingIndicator = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: 0 ${tokens.spacing.xs};\n\n ${Dot} {\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${dotPulse} 1.4s ease-in-out infinite;\n }\n`;\n\nexport const Message = styled.span`\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.primary};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n\nexport const StreamingText = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n color: ${tokens.colors.text.primary};\n animation: ${fadeIn} ${tokens.animation.duration.medium} ease-in;\n position: relative;\n font-weight: ${tokens.typography.fontWeight.regular};\n white-space: nowrap;\n\n /* Blinking cursor effect */\n &::after {\n content: '|';\n margin-left: 0.125rem;\n animation: ${blink} 1s infinite;\n color: ${tokens.colors.text.tertiary};\n font-weight: ${tokens.typography.fontWeight.regular};\n }\n`;\n","import {\n Dot,\n LoadingDots,\n Message,\n ResponseContainer,\n StreamingText,\n TypingIndicator,\n} from './Response.styles';\n\nexport interface ResponseProps {\n /** Loading state - shows animated dots */\n isLoading?: boolean;\n /** Typing state - shows typing indicator */\n isTyping?: boolean;\n /** Streaming state - shows text being typed */\n isStreaming?: boolean;\n /** Content to display when streaming */\n streamingContent?: string;\n /** Message to display with loading/typing state */\n message?: string;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Response component for displaying loading and streaming states\n * Shows animated loading dots, typing indicators, and streaming text\n */\nexport const Response = ({\n isLoading = false,\n isTyping = false,\n isStreaming = false,\n streamingContent = '',\n message = 'Thinking...',\n className,\n}: ResponseProps) => {\n // Show loading dots\n if (isLoading) {\n return (\n <ResponseContainer className={className} data-testid=\"response-loading\">\n <LoadingDots aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </LoadingDots>\n <Message>{message}</Message>\n </ResponseContainer>\n );\n }\n\n // Show typing indicator\n if (isTyping) {\n return (\n <ResponseContainer className={className} data-testid=\"response-typing\">\n <TypingIndicator aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </TypingIndicator>\n <Message>{message}</Message>\n </ResponseContainer>\n );\n }\n\n // Show streaming text\n if (isStreaming && streamingContent) {\n return (\n <ResponseContainer className={className} data-testid=\"response-streaming\">\n <StreamingText>{streamingContent}</StreamingText>\n </ResponseContainer>\n );\n }\n\n // Empty state\n return null;\n};\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n// Pulse animation matching AssistantThinking\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Shake animation for error indicator\nconst shake = keyframes`\n 0%, 100% {\n transform: translateX(0);\n }\n 25% {\n transform: translateX(-5px);\n }\n 75% {\n transform: translateX(5px);\n }\n`;\n\nexport const AgentStateContainer = styled.div<{ isError?: boolean }>`\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${(props) => (props.isError ? 'rgba(239, 68, 68, 0.15)' : tokens.colors.surface.elevated)};\n border-radius: ${tokens.borderRadius.xl};\n border: ${(props) => (props.isError ? `1px solid ${tokens.colors.error}` : 'none')};\n box-shadow: none;\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const StateContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n align-items: center;\n width: 100%;\n`;\n\nexport const IdleIndicator = styled.div`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.status.idle};\n border-radius: ${tokens.borderRadius.full};\n animation: ${dotPulse} 2s infinite ease-in-out;\n`;\n\nexport const ErrorIndicator = styled.div`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.error};\n border-radius: ${tokens.borderRadius.full};\n animation: ${shake} 0.5s ease-in-out;\n`;\n\nexport const StateLabel = styled.span`\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.regular};\n color: ${tokens.colors.text.primary};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n\nexport const MessageText = styled.p`\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.tertiary};\n line-height: ${tokens.typography.lineHeight.normal};\n margin: 0;\n text-align: center;\n white-space: nowrap;\n`;\n\nexport const ProgressBar = styled.div`\n width: 100%;\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.surface.elevated};\n border-radius: ${tokens.borderRadius.sm};\n overflow: hidden;\n margin-top: ${tokens.spacing.xs};\n`;\n\nexport const ProgressBarFill = styled.div<{ progress: number }>`\n height: 100%;\n width: ${(props) => Math.min(Math.max(props.progress, 0), 100)}%;\n background: linear-gradient(135deg, ${tokens.colors.accent} 0%, ${tokens.colors.primary} 100%);\n border-radius: ${tokens.borderRadius.sm};\n transition: width ${tokens.transitions.normal};\n`;\n","import { Response } from '../Response';\nimport {\n AgentStateContainer,\n ErrorIndicator,\n IdleIndicator,\n ProgressBar,\n ProgressBarFill,\n StateContent,\n StateLabel,\n} from './AgentState.styles';\n\nexport interface AgentStateProps {\n /** Current agent state */\n state: 'idle' | 'thinking' | 'responding' | 'error';\n /** Optional message to display */\n message?: string;\n /** Optional progress percentage (0-100) */\n progress?: number;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * AgentState component for displaying agent status\n * Styled to match AssistantThinking and Response components with dark theme\n */\nexport const AgentState = ({ state, message, progress, className }: AgentStateProps) => {\n // Idle state - show pulsing indicator\n if (state === 'idle') {\n return (\n <AgentStateContainer className={className} data-testid=\"agent-state-idle\">\n <StateContent>\n <IdleIndicator />\n <StateLabel>{message || 'Agent is idle'}</StateLabel>\n {progress !== undefined && (\n <ProgressBar>\n <ProgressBarFill progress={progress} />\n </ProgressBar>\n )}\n </StateContent>\n </AgentStateContainer>\n );\n }\n\n // Error state - show error indicator\n if (state === 'error') {\n return (\n <AgentStateContainer className={className} data-testid=\"agent-state-error\" isError>\n <StateContent>\n <ErrorIndicator />\n <StateLabel>{message || 'Error occurred'}</StateLabel>\n </StateContent>\n </AgentStateContainer>\n );\n }\n\n // Thinking state - use Response component with loading dots\n if (state === 'thinking') {\n return <Response isLoading message={message || 'Agent is thinking...'} className={className} />;\n }\n\n // Responding state - use Response component with typing indicator\n if (state === 'responding') {\n return (\n <Response isTyping message={message || 'Agent is responding...'} className={className} />\n );\n }\n\n return null;\n};\n","/**\n * ActionExecutionAdapter Component\n *\n * Adapter for CopilotKit's action execution messages.\n * Displays tool calls using the AgentState component.\n */\n\nimport type { RenderMessageProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { AgentState } from '../AgentState';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * ActionExecutionMessage shape from CopilotKit\n * We define this interface because the runtime-client-gql types aren't\n * directly exported in a way TypeScript can use with the react-ui types.\n */\ninterface ActionExecutionMessageShape {\n type: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\n// =============================================================================\n// Styled Components\n// =============================================================================\n\nconst Container = styled.div`\n margin: ${tokens.spacing.sm} 0;\n padding: 0 ${tokens.spacing.sm};\n`;\n\nconst ToolName = styled.div`\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n margin-bottom: ${tokens.spacing.xs};\n font-family: ${tokens.typography.fontFamily.monospace};\n`;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Check if a message is an ActionExecutionMessage\n */\nfunction isActionExecutionMessage(message: unknown): message is ActionExecutionMessageShape {\n if (!message || typeof message !== 'object') return false;\n\n const msg = message as Record<string, unknown>;\n\n // Check for CopilotKit's message type indicator\n if (typeof msg.isActionExecutionMessage === 'function') {\n return (msg.isActionExecutionMessage as () => boolean)();\n }\n\n // Fallback: check for action execution message properties\n return (\n msg.type === 'ActionExecutionMessage' ||\n (typeof msg.name === 'string' && 'arguments' in msg && !('content' in msg))\n );\n}\n\n/**\n * Format tool name for display\n * e.g., \"create-social-media-posts\" -> \"Create Social Media Posts\"\n */\nfunction formatToolName(name: string): string {\n return name\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Extract a human-readable message from tool arguments\n */\nfunction getToolMessage(name: string, args: Record<string, unknown>): string {\n // Handle common tool patterns\n if (name.includes('social-media')) {\n const topic = args.topic as string | undefined;\n if (topic) {\n return `Creating posts about \"${topic}\"`;\n }\n return 'Creating social media posts...';\n }\n\n // Default message\n return `Running ${formatToolName(name)}...`;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * ActionExecutionAdapter - Renders tool/action execution messages in chat\n *\n * Uses the AgentState component to show:\n * - Tool name\n * - Current status (thinking/responding)\n * - Progress message based on tool arguments\n */\nexport const ActionExecutionAdapter: React.FC<RenderMessageProps> = ({ message, inProgress }) => {\n // Only handle ActionExecutionMessage types\n if (!isActionExecutionMessage(message)) {\n return null;\n }\n\n const toolName = message.name;\n const toolArgs = message.arguments || {};\n\n // Determine state based on whether still in progress\n const state = inProgress ? 'thinking' : 'responding';\n const statusMessage = getToolMessage(toolName, toolArgs);\n\n return (\n <Container data-testid=\"action-execution-message\">\n <ToolName>{formatToolName(toolName)}</ToolName>\n <AgentState state={state} message={statusMessage} />\n </Container>\n );\n};\n\nActionExecutionAdapter.displayName = 'ActionExecutionAdapter';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 0.5;\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n`;\n\nconst wave = keyframes`\n 0%, 40%, 100% {\n transform: translateY(0);\n }\n 20% {\n transform: translateY(-8px);\n }\n`;\n\ninterface SizeProps {\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst getSizeValue = (size: 'sm' | 'md' | 'lg' = 'md') => {\n switch (size) {\n case 'sm':\n return {\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n avatar: '32px',\n icon: '16px',\n fontSize: tokens.typography.fontSize.xs,\n dotSize: '4px',\n };\n case 'lg':\n return {\n padding: `${tokens.spacing.md} ${tokens.spacing.xl}`,\n avatar: '48px',\n icon: '24px',\n fontSize: tokens.typography.fontSize.base,\n dotSize: '8px',\n };\n case 'md':\n default:\n return {\n padding: `${tokens.spacing.md} ${tokens.spacing.md}`,\n avatar: '40px',\n icon: '20px',\n fontSize: tokens.typography.fontSize.sm,\n dotSize: '6px',\n };\n }\n};\n\nexport const Container = styled.div<SizeProps>`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.md};\n padding: ${(props) => getSizeValue(props.size).padding};\n background-color: ${tokens.colors.surface.base};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: ${tokens.shadows.none};\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const Avatar = styled.div<SizeProps>`\n width: ${(props) => getSizeValue(props.size).avatar};\n height: ${(props) => getSizeValue(props.size).avatar};\n border-radius: ${tokens.borderRadius.full};\n background: linear-gradient(135deg, ${tokens.colors.secondary} 0%, ${tokens.colors.primary} 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-shadow: ${tokens.shadows.glow.primary};\n`;\n\nexport const HeadphonesIcon = styled.svg<SizeProps>`\n width: ${(props) => getSizeValue(props.size).icon};\n height: ${(props) => getSizeValue(props.size).icon};\n color: ${tokens.colors.text.primary};\n`;\n\nexport const Content = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n`;\n\ninterface LoadingDotsProps extends SizeProps {\n variant?: 'dots' | 'pulse' | 'wave';\n}\n\nexport const LoadingDots = styled.div<LoadingDotsProps>`\n display: flex;\n align-items: center;\n gap: ${(props) => (props.variant === 'wave' ? '2px' : `${tokens.spacing.xs}`)};\n padding: 0 ${tokens.spacing.xs};\n`;\n\ninterface DotProps extends SizeProps {\n variant?: 'dots' | 'pulse' | 'wave';\n}\n\nexport const Dot = styled.span<DotProps>`\n width: ${(props) => getSizeValue(props.size).dotSize};\n height: ${(props) => getSizeValue(props.size).dotSize};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${(props) => {\n switch (props.variant) {\n case 'pulse':\n return pulse;\n case 'wave':\n return wave;\n case 'dots':\n default:\n return dotPulse;\n }\n }}\n 1.4s ease-in-out infinite;\n`;\n\nexport const Message = styled.span<SizeProps>`\n font-size: ${(props) => getSizeValue(props.size).fontSize};\n color: ${tokens.colors.text.secondary};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n","import { useRef } from 'react';\nimport {\n Avatar,\n Container,\n Content,\n Dot,\n HeadphonesIcon,\n LoadingDots,\n Message,\n} from './AssistantThinking.styles';\n\nexport interface AssistantThinkingProps {\n message?: string;\n className?: string;\n ariaLabel?: string;\n /** Visual variant for the loading indicator */\n variant?: 'dots' | 'pulse' | 'wave' | 'text';\n /** Size of the component */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport function AssistantThinking({\n message = 'Analyzing data, please wait...',\n className,\n ariaLabel = 'Assistant is thinking',\n variant = 'dots',\n size = 'md',\n}: AssistantThinkingProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const renderLoadingIndicator = () => {\n switch (variant) {\n case 'dots':\n return (\n <LoadingDots aria-hidden=\"true\" size={size}>\n <Dot style={{ animationDelay: '0ms' }} size={size} />\n <Dot style={{ animationDelay: '150ms' }} size={size} />\n <Dot style={{ animationDelay: '300ms' }} size={size} />\n </LoadingDots>\n );\n case 'pulse':\n return (\n <LoadingDots aria-hidden=\"true\" size={size} variant=\"pulse\">\n <Dot style={{ animationDelay: '0ms' }} size={size} variant=\"pulse\" />\n </LoadingDots>\n );\n case 'wave':\n return (\n <LoadingDots aria-hidden=\"true\" size={size} variant=\"wave\">\n <Dot style={{ animationDelay: '0ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '100ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '200ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '300ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '400ms' }} size={size} variant=\"wave\" />\n </LoadingDots>\n );\n case 'text':\n return null; // Just show the message with no indicator\n default:\n return null;\n }\n };\n\n return (\n <Container\n ref={containerRef}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={ariaLabel}\n size={size}\n >\n <Avatar aria-hidden=\"true\" size={size}>\n <HeadphonesIcon viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 13a4 4 0 0 1 0 8c-2.142 0-4-1.79-4-4h-2a4 4 0 1 1-.535-2h3.07A4 4 0 0 1 17 13M2 12v-2h2V7a4 4 0 0 1 4-4h8a4 4 0 0 1 4 4v3h2v2z\" />\n </HeadphonesIcon>\n </Avatar>\n <Content>\n {renderLoadingIndicator()}\n <Message size={size}>{message}</Message>\n </Content>\n </Container>\n );\n}\n\nAssistantThinking.displayName = 'AssistantThinking';\n","/**\n * StreamingText Component\n *\n * Provides typewriter animation for streaming AI responses.\n *\n * @see specs/015-restyle-ai-chat/spec.md:FR-031, FR-042\n * @see UI_COMPONENTS_SSE.md:548-595\n */\n\nimport { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nexport interface StreamingTextProps {\n /** The text content to display */\n content: string;\n /** Whether text is currently streaming */\n isStreaming?: boolean;\n /** Typing speed in milliseconds per character */\n typingSpeed?: number;\n /** Whether to show blinking cursor */\n cursor?: boolean;\n /** Visual variant */\n variant?: 'default' | 'code' | 'markdown';\n /** Callback when streaming completes */\n onStreamComplete?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\nconst Container = styled.div<{ variant: 'default' | 'code' | 'markdown' }>`\n font-family: ${(props) =>\n props.variant === 'code'\n ? tokens.typography.fontFamily.monospace\n : tokens.typography.fontFamily.primary};\n white-space: pre-wrap;\n word-break: break-word;\n line-height: ${tokens.typography.lineHeight.normal};\n`;\n\nconst Cursor = styled.span`\n display: inline-block;\n width: 2px;\n height: 1em;\n background-color: currentColor;\n margin-left: 2px;\n vertical-align: text-bottom;\n animation: blink 1s infinite;\n\n @keyframes blink {\n 0%,\n 49% {\n opacity: 1;\n }\n 50%,\n 100% {\n opacity: 0;\n }\n }\n`;\n\n/**\n * StreamingText component with typewriter animation\n *\n * Features:\n * - Character-by-character streaming animation\n * - Configurable typing speed\n * - Optional blinking cursor\n * - Code and markdown variants\n * - Completion callback\n */\nexport const StreamingText: React.FC<StreamingTextProps> = ({\n content,\n isStreaming = false,\n typingSpeed: _typingSpeed = 50, // Not used - streaming shows chunks as they arrive\n cursor = true,\n variant = 'default',\n onStreamComplete,\n className,\n}) => {\n const [displayedText, setDisplayedText] = useState('');\n\n useEffect(() => {\n // If streaming, show content as chunks arrive (CopilotKit streams in chunks, not chars)\n if (isStreaming) {\n setDisplayedText(content);\n return;\n }\n\n // When streaming stops, show final content and trigger completion\n if (!isStreaming && displayedText !== content) {\n setDisplayedText(content);\n if (onStreamComplete) {\n onStreamComplete();\n }\n }\n }, [content, isStreaming, onStreamComplete, displayedText]);\n\n const showCursor = isStreaming && cursor;\n\n return (\n <Container variant={variant} className={className}>\n {displayedText}\n {showCursor && <Cursor />}\n </Container>\n );\n};\n\nStreamingText.displayName = 'StreamingText';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const MessageContainer = styled.div`\n display: flex;\n gap: ${tokens.spacing.sm};\n align-items: flex-start;\n padding: ${tokens.spacing.sm} 0;\n max-width: 100%;\n\n /* Fade in and slide up animation */\n animation: fadeInSlideUp ${tokens.animation.duration.medium} ease-out;\n\n @keyframes fadeInSlideUp {\n from {\n opacity: 0;\n transform: translateY(${tokens.spacing.sm});\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n`;\n\nexport const AvatarContainer = styled.div`\n flex-shrink: 0;\n`;\n\nexport const Avatar = styled.img`\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n border-radius: ${tokens.borderRadius.full};\n object-fit: cover;\n background-color: transparent;\n`;\n\nexport const AvatarInitials = styled.div`\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n border-radius: ${tokens.borderRadius.full};\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${tokens.colors.secondary};\n padding: ${tokens.spacing.xs};\n box-sizing: border-box;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n`;\n\nexport const ContentContainer = styled.div`\n flex: 1;\n min-width: 0;\n`;\n\nexport const MessageContent = styled.div`\n background-color: ${tokens.colors.surface.glass};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n border-radius: ${tokens.borderRadius.lg};\n border-top-left-radius: ${tokens.borderRadius.sm};\n color: ${tokens.colors.text.primary};\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n font-family: ${tokens.typography.fontFamily.primary};\n word-wrap: break-word;\n white-space: pre-wrap;\n`;\n\nexport const LoadingDots = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${tokens.colors.surface.glass};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-radius: ${tokens.borderRadius.lg};\n border-top-left-radius: ${tokens.borderRadius.sm};\n width: fit-content;\n`;\n\nconst bounce = keyframes`\n 0%, 60%, 100% {\n transform: translateY(0);\n }\n 30% {\n transform: translateY(-${tokens.spacing.sm});\n }\n`;\n\nexport const LoadingDot = styled.div<{ delay: number }>`\n width: ${tokens.spacing.sm};\n height: ${tokens.spacing.sm};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${bounce} 1.4s ease-in-out infinite;\n animation-delay: ${(props) => props.delay}s;\n`;\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\ninterface FileAttachmentContainerProps {\n $isInteractive?: boolean;\n}\n\nexport const FileAttachmentContainer = styled.div<FileAttachmentContainerProps>`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm};\n background-color: ${tokens.colors.surface.elevated};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n max-width: 320px;\n cursor: ${(props) => (props.$isInteractive ? 'pointer' : 'default')};\n transition: border-color ${tokens.transitions.fast};\n\n /* Remove default button styles when used as button */\n ${(props) =>\n props.$isInteractive &&\n `\n font: inherit;\n color: inherit;\n text-align: left;\n appearance: none;\n -webkit-appearance: none;\n\n &:hover {\n border-color: ${tokens.colors.border.hover};\n background-color: ${tokens.colors.surface.overlayHover};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n border-color: ${tokens.colors.accent};\n }\n\n &:active {\n border-color: ${tokens.colors.border.hover};\n }\n `}\n`;\n\nexport const FileIconContainer = styled.div`\n flex-shrink: 0;\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: ${tokens.typography.fontSize['2xl']};\n line-height: 1;\n`;\n\nexport const FileInfo = styled.div`\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nexport const FileTitle = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const FileMetadata = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n`;\n\nexport const FileSubtitle = styled.span`\n color: ${tokens.colors.text.tertiary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:last-child {\n flex-shrink: 0;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type { AriaButtonProps } from '@react-types/button';\nimport type { PressEvent } from '@react-types/shared';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport {\n FileAttachmentContainer,\n FileIconContainer,\n FileInfo,\n FileMetadata,\n FileSubtitle,\n FileTitle,\n} from './FileAttachment.styles';\n\nexport interface FileAttachmentProps extends Omit<AriaButtonProps, 'children'> {\n /** File name/title */\n title: string;\n /** File subtitle/category (e.g., \"Downloads\", \"Documents\") */\n subtitle?: string;\n /** File size in human-readable format (e.g., \"500 KB\", \"2.5 MB\") */\n size?: string;\n /** File icon emoji or Unicode character */\n icon?: string;\n /** Click handler for file interaction */\n onClick?: () => void;\n /** Custom className for styling */\n className?: string;\n}\n\n/**\n * FileAttachment component displays file information in assistant messages\n *\n * Features:\n * - File icon display (emoji or Unicode)\n * - File metadata (title, subtitle, size)\n * - Accessible keyboard navigation via React ARIA\n * - Clean, minimal card-based design\n * - WCAG 2.1 AA compliant\n *\n * @example\n * ```tsx\n * <FileAttachment\n * title=\"Example File\"\n * subtitle=\"Downloads\"\n * size=\"500 KB\"\n * icon=\"📄\"\n * onPress={() => console.log('File clicked')}\n * />\n * ```\n */\nexport const FileAttachment: React.FC<FileAttachmentProps> = ({\n title,\n subtitle,\n size,\n icon = '📄',\n onClick,\n onPress,\n className,\n ...ariaProps\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const isInteractive = !!(onClick || onPress);\n\n // Combine onClick and onPress handlers\n const handlePress = (e: PressEvent) => {\n if (onClick) onClick();\n if (onPress) onPress(e);\n };\n\n const { buttonProps } = useButton(\n {\n ...ariaProps,\n onPress: isInteractive ? handlePress : undefined,\n isDisabled: !isInteractive,\n },\n ref\n );\n\n return (\n <FileAttachmentContainer\n {...(isInteractive ? buttonProps : {})}\n ref={isInteractive ? ref : undefined}\n className={className}\n $isInteractive={isInteractive}\n as={isInteractive ? 'button' : 'div'}\n >\n <FileIconContainer>{icon}</FileIconContainer>\n <FileInfo>\n <FileTitle>{title}</FileTitle>\n <FileMetadata>\n {subtitle && <FileSubtitle>{subtitle}</FileSubtitle>}\n {size && subtitle && <FileSubtitle aria-hidden=\"true\"> • </FileSubtitle>}\n {size && <FileSubtitle>{size}</FileSubtitle>}\n </FileMetadata>\n </FileInfo>\n </FileAttachmentContainer>\n );\n};\n\nexport default FileAttachment;\n","import type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { StreamingText } from '../StreamingText';\nimport {\n Avatar,\n AvatarContainer,\n AvatarInitials,\n ContentContainer,\n LoadingDot,\n LoadingDots,\n MessageContainer,\n MessageContent,\n} from './AssistantMessage.styles';\nimport { FileAttachment, type FileAttachmentProps } from './FileAttachment';\n\nconst AttachmentsContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.secondary};\n background: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.border.hover};\n color: ${tokens.colors.text.primary};\n }\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n flex-wrap: wrap;\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst MessageTime = styled.time`\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n margin-top: ${tokens.spacing.xs};\n display: block;\n`;\n\nconst StreamingIndicator = styled.span`\n display: inline-block;\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n margin-left: ${tokens.spacing.xs};\n background-color: ${tokens.colors.accent};\n border-radius: ${tokens.borderRadius.full};\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n }\n`;\n\nexport interface ActionButtonType {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n}\n\nexport interface AssistantMessageProps {\n /** Message content to display */\n content?: string;\n /** Avatar image URL */\n avatarUrl?: string;\n /** Avatar initials when no image is provided */\n avatarInitials?: string;\n /** Whether to show loading state */\n isLoading?: boolean;\n /** Whether message is currently streaming */\n isStreaming?: boolean;\n /** Custom className for styling */\n className?: string;\n /** Support for markdown rendering (future enhancement) */\n enableMarkdown?: boolean;\n /** File attachments to display below the message */\n attachments?: FileAttachmentProps[];\n /** Optional timestamp */\n timestamp?: string;\n /** Action buttons to display */\n actions?: ActionButtonType[];\n}\n\n/**\n * AssistantMessage component displays AI assistant messages with avatar\n *\n * Features:\n * - Avatar with image or initials fallback\n * - Loading state with animated dots\n * - Streaming state indicator\n * - Markdown support (optional)\n * - Dark gray bubble (#2D2D3D) from Figma design\n * - Left-aligned layout\n * - Action buttons support\n * - Timestamp display\n */\nexport const AssistantMessage: React.FC<AssistantMessageProps> = ({\n content = '',\n avatarUrl,\n avatarInitials: _avatarInitials = 'AI',\n isLoading = false,\n isStreaming = false,\n className,\n attachments = [],\n enableMarkdown = false,\n timestamp,\n actions = [],\n}) => {\n const renderContent = () => {\n if (isLoading) {\n return (\n <LoadingDots>\n <LoadingDot delay={0} />\n <LoadingDot delay={0.2} />\n <LoadingDot delay={0.4} />\n </LoadingDots>\n );\n }\n\n // Use StreamingText for typewriter effect\n return (\n <>\n {content && (\n <MessageContent>\n <StreamingText\n content={content}\n isStreaming={isStreaming}\n typingSpeed={30}\n cursor={false}\n variant={enableMarkdown ? 'markdown' : 'default'}\n />\n {isStreaming && <StreamingIndicator />}\n </MessageContent>\n )}\n {attachments.length > 0 && (\n <AttachmentsContainer>\n {attachments.map((attachment, index) => (\n <FileAttachment key={`${attachment.title}-${index}`} {...attachment} />\n ))}\n </AttachmentsContainer>\n )}\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n {actions.length > 0 && (\n <ActionsContainer>\n {actions.map((action, index) => (\n <ActionButton key={index} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ActionButton>\n ))}\n </ActionsContainer>\n )}\n </>\n );\n };\n\n return (\n <MessageContainer className={className}>\n <AvatarContainer>\n {avatarUrl ? (\n <Avatar src={avatarUrl} alt=\"Assistant avatar\" />\n ) : (\n <AvatarInitials>\n <Avatar src=\"/assets/avatar-transparent-bg.png\" alt=\"AI Assistant\" />\n </AvatarInitials>\n )}\n </AvatarContainer>\n <ContentContainer>{renderContent()}</ContentContainer>\n </MessageContainer>\n );\n};\n\nexport default AssistantMessage;\n","/**\n * Adapter component that bridges custom AssistantMessage with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's AssistantMessageProps to our custom component props\n * 2. Handles loading states by showing AssistantThinking component\n * 3. Extracts message content and renders with our styled component\n */\n\nimport type { AssistantMessageProps as CopilotAssistantMessageProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport { AssistantThinking } from '../../AssistantThinking/AssistantThinking';\nimport { AssistantMessage } from '../Messages/AssistantMessage';\n\n/**\n * Adapter that converts CopilotKit's AssistantMessageProps to our custom component\n */\nexport const AssistantMessageAdapter: React.FC<CopilotAssistantMessageProps> = ({\n message,\n isLoading,\n isGenerating,\n // These are available but not used in our current implementation:\n // isCurrentMessage,\n // onRegenerate,\n // onCopy,\n // onThumbsUp,\n // onThumbsDown,\n // markdownTagRenderers,\n // ImageRenderer,\n}) => {\n // Show thinking state ONLY when truly loading (no content yet)\n if (isLoading || (isGenerating && !message?.content)) {\n return <AssistantThinking message=\"Thinking...\" />;\n }\n\n // Extract content from the message\n const content = message?.content || '';\n\n // Parse attachments if present in the message\n // TODO: Implement attachments parsing from CopilotKit message data\n const attachments: any[] = [];\n\n return (\n <AssistantMessage\n content={content}\n avatarInitials=\"AI\"\n isLoading={false} // Don't show loading dots when we have content\n isStreaming={isGenerating} // Show streaming indicator while generating\n attachments={attachments}\n enableMarkdown={true}\n />\n );\n};\n\nAssistantMessageAdapter.displayName = 'AssistantMessageAdapter';\n","import styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\n/**\n * Main container for the chat input component with dark theme\n * Matches header style with backdrop blur\n */\nexport const ChatInputContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: ${tokens.spacing.sm};\n background-color: ${tokens.colors.backdrop};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-radius: ${tokens.borderRadius.none};\n box-shadow: ${tokens.shadows.none};\n box-sizing: border-box;\n\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n padding: ${tokens.spacing.md};\n }\n`;\n\n/**\n * Container for suggestion buttons - horizontal layout with wrapping\n */\nexport const SuggestionsWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: ${tokens.spacing.sm};\n margin-bottom: ${tokens.spacing.md};\n width: 100%;\n box-sizing: border-box;\n`;\n\n/**\n * Minimal pill-shaped suggestion button - Dark theme\n */\nexport const SuggestionButton = styled.button`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: 13px;\n font-weight: ${tokens.typography.fontWeight.regular};\n text-align: center;\n border: 1px solid ${tokens.colors.border.default};\n border-radius: 20px;\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n white-space: nowrap;\n\n /* Dark theme colors */\n background-color: ${tokens.colors.surface.base};\n color: ${tokens.colors.text.secondary};\n\n /* Hover state */\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.elevated};\n border-color: ${tokens.colors.border.hover};\n }\n\n /* Active state */\n &:active:not(:disabled) {\n background-color: ${tokens.colors.background.light};\n }\n\n /* Focus state */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n`;\n\n/**\n * Input wrapper with dark theme\n */\nexport const InputWrapper = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background-color: rgba(25, 25, 25, 0.4);\n border: 1px solid ${tokens.colors.border.subtle};\n border-radius: ${tokens.borderRadius.lg};\n transition: all ${tokens.transitions.normal};\n width: 100%;\n box-sizing: border-box;\n\n &:focus-within {\n /* Subtle focus indication without bold colored border */\n border-color: ${tokens.colors.border.hover};\n background-color: rgba(50, 50, 52, 0.6);\n }\n`;\n\n/**\n * Text input field - Dark theme\n */\nexport const InputField = styled.input`\n flex: 1;\n border: none;\n outline: none;\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.secondary};\n background: transparent;\n\n &::placeholder {\n color: ${tokens.colors.text.tertiary};\n }\n\n &:disabled {\n color: ${tokens.colors.text.tertiary};\n cursor: not-allowed;\n }\n`;\n\n/**\n * Circular submit button with arrow icon\n */\ninterface SubmitButtonProps {\n disabled?: boolean;\n}\n\nexport const SubmitButton = styled.button<SubmitButtonProps>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: ${tokens.borderRadius.full};\n background-color: ${(props) => (props.disabled ? tokens.colors.surface.elevated : tokens.colors.accent)};\n color: ${(props) => (props.disabled ? tokens.colors.text.tertiary : tokens.colors.text.primary)};\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n transition: all ${tokens.transitions.normal};\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.status.running};\n transform: scale(1.05);\n }\n\n &:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n }\n\n svg {\n width: 18px;\n height: 18px;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type { AriaTextFieldProps } from '@react-aria/textfield';\nimport { useTextField } from '@react-aria/textfield';\nimport React, { type KeyboardEvent, useRef, useState } from 'react';\nimport {\n ChatInputContainer,\n InputField,\n InputWrapper,\n SubmitButton,\n SuggestionButton,\n SuggestionsWrapper,\n} from './ChatInput.styles';\n\nexport interface Suggestion {\n /** The text content of the suggestion */\n text: string;\n}\n\nexport interface ChatInputProps extends Omit<AriaTextFieldProps, 'onChange'> {\n /** Array of suggestion items to display above the input */\n suggestions?: Suggestion[];\n /** Callback when a suggestion is selected */\n onSuggestionSelect?: (suggestion: string) => void;\n /** Current message value */\n value?: string;\n /** Callback when message value changes */\n onChange?: (value: string) => void;\n /** Callback when message is submitted */\n onSubmit?: (message: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input is read-only */\n isReadOnly?: boolean;\n /** Whether to auto-focus the input */\n autoFocus?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for the input */\n 'aria-label'?: string;\n}\n\n/**\n * ChatInput component with minimal pill-shaped suggestion buttons\n *\n * Features:\n * - Horizontal pill-shaped suggestion buttons with minimal design\n * - Single-line input with submit button\n * - React ARIA for accessibility\n * - Keyboard navigation support\n * - Clean, modern design matching vendor image\n *\n * @example\n * ```tsx\n * <ChatInput\n * suggestions={[\n * { text: \"Create in-depth analysis\" },\n * { text: \"Identify actionable tasks\" }\n * ]}\n * placeholder=\"Ask, write or search for anything...\"\n * onSubmit={(message) => console.log(message)}\n * onSuggestionSelect={(suggestion) => console.log(suggestion)}\n * />\n * ```\n */\nexport const ChatInput: React.FC<ChatInputProps> = ({\n suggestions = [],\n onSuggestionSelect,\n value = '',\n onChange,\n onSubmit,\n placeholder = 'Ask, write or search for anything...',\n isDisabled = false,\n isReadOnly = false,\n autoFocus = false,\n className,\n 'aria-label': ariaLabel = 'Chat message input',\n ...ariaProps\n}) => {\n const [internalValue, setInternalValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Use controlled value if provided, otherwise use internal state\n const currentValue = value !== undefined ? value : internalValue;\n const setValue = onChange || setInternalValue;\n\n // React ARIA hook for accessibility\n const { inputProps } = useTextField(\n {\n ...ariaProps,\n 'aria-label': ariaLabel,\n value: currentValue,\n onChange: (newValue: string) => {\n setValue(newValue);\n },\n isDisabled,\n isReadOnly,\n },\n inputRef\n );\n\n // Direct onChange handler as backup\n const handleDirectChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value);\n };\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n // Submit on Enter\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n // Handle submit\n const handleSubmit = () => {\n if (currentValue.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(currentValue.trim());\n setValue('');\n // Refocus the input after sending\n inputRef.current?.focus();\n }\n };\n\n // Handle suggestion selection\n const handleSuggestionClick = (suggestionText: string) => {\n if (onSuggestionSelect && !isDisabled && !isReadOnly) {\n onSuggestionSelect(suggestionText);\n }\n };\n\n const canSubmit = currentValue.trim().length > 0 && !isDisabled && !isReadOnly;\n\n return (\n <ChatInputContainer className={className}>\n {/* Suggestions */}\n {suggestions.length > 0 && (\n <SuggestionsWrapper role=\"list\" aria-label=\"Suggested prompts\">\n {suggestions.map((suggestion, index) => (\n <SuggestionButtonComponent\n key={`${suggestion.text}-${index}`}\n suggestion={suggestion}\n onSelect={handleSuggestionClick}\n isDisabled={isDisabled || isReadOnly}\n />\n ))}\n </SuggestionsWrapper>\n )}\n\n {/* Input field */}\n <InputWrapper>\n <InputField\n {...inputProps}\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n onKeyDown={handleKeyDown}\n onChange={handleDirectChange}\n autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n value={currentValue}\n />\n <SubmitButtonComponent\n onPress={handleSubmit}\n isDisabled={!canSubmit}\n ariaLabel=\"Send message\"\n />\n </InputWrapper>\n </ChatInputContainer>\n );\n};\n\n/**\n * Individual suggestion button component\n */\ninterface SuggestionButtonComponentProps {\n suggestion: Suggestion;\n onSelect: (text: string) => void;\n isDisabled?: boolean;\n}\n\nconst SuggestionButtonComponent: React.FC<SuggestionButtonComponentProps> = ({\n suggestion,\n onSelect,\n isDisabled = false,\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress: () => onSelect(suggestion.text),\n isDisabled,\n 'aria-label': `Select suggestion: ${suggestion.text}`,\n },\n ref\n );\n\n return (\n <SuggestionButton {...buttonProps} ref={ref} role=\"listitem\">\n {suggestion.text}\n </SuggestionButton>\n );\n};\n\n/**\n * Submit button component with arrow icon\n */\ninterface SubmitButtonComponentProps {\n onPress: () => void;\n isDisabled?: boolean;\n ariaLabel?: string;\n}\n\nconst SubmitButtonComponent: React.FC<SubmitButtonComponentProps> = ({\n onPress,\n isDisabled = false,\n ariaLabel = 'Send message',\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress,\n isDisabled,\n 'aria-label': ariaLabel,\n },\n ref\n );\n\n return (\n <SubmitButton {...buttonProps} ref={ref} disabled={isDisabled} title={ariaLabel}>\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Arrow Right Icon</title>\n <path\n d=\"M4 10H16M16 10L10 4M16 10L10 16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </SubmitButton>\n );\n};\n\nChatInput.displayName = 'ChatInput';\n","/**\n * Adapter component that bridges custom Input with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's InputProps to our custom component props\n * 2. Handles the onSend callback to work with CopilotKit's message system\n * 3. Manages input state and submission\n */\n\nimport type { InputProps as CopilotInputProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport { useState } from 'react';\nimport { ChatInput } from '../../ChatInput/ChatInput';\n\n/**\n * Adapter that converts CopilotKit's InputProps to our custom component\n */\nexport const InputAdapter: React.FC<CopilotInputProps> = ({\n inProgress,\n onSend,\n isVisible = true,\n}) => {\n const [value, setValue] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = async (message: string) => {\n if (!message.trim()) {\n console.log('[InputAdapter] handleSubmit: empty message, ignoring');\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n // Call CopilotKit's onSend which returns a Promise<Message>\n await onSend(message);\n setValue(''); // Clear input after sending\n } catch (error) {\n console.error('[InputAdapter] Error sending message:', error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleSuggestionSelect = async (suggestion: string) => {\n // Directly call onSend with the suggestion text without setting value first\n // This avoids potential race conditions and ensures the message is sent\n if (!suggestion.trim()) {\n return;\n }\n\n if (inProgress || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n await onSend(suggestion);\n // Don't set value since we're submitting directly\n } catch (error) {\n console.error('[InputAdapter] Error sending suggestion:', error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // TODO: Add support for stop button and file upload if needed\n const shouldDisableInput = isSubmitting;\n\n return (\n <ChatInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n placeholder=\"Ask, write or search for anything...\"\n isDisabled={shouldDisableInput}\n autoFocus={isVisible}\n aria-label=\"Chat message input\"\n suggestions={[{ text: 'Explore workflows' }]}\n onSuggestionSelect={handleSuggestionSelect}\n />\n );\n};\n\nInputAdapter.displayName = 'InputAdapter';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\ninterface StyledUserMessageProps {\n $isPressed: boolean;\n}\n\nexport const StyledUserMessage = styled.button<StyledUserMessageProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.md} ${tokens.spacing.xl};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: 1.4;\n border: none;\n cursor: default;\n user-select: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n position: relative;\n text-align: left;\n\n /* Force override CopilotKit's default user message styles */\n && {\n background: ${tokens.colors.message.user} !important;\n color: ${tokens.colors.text.primary} !important;\n border-radius: ${tokens.borderRadius.full} !important; /* Pill shape - fully rounded ends */\n }\n\n /* Subtle shadow and glow effect */\n box-shadow: ${tokens.shadows.glow.secondary};\n\n /* Smooth transitions */\n transition: all ${tokens.transitions.normal};\n\n /* Speech bubble tail - matches bubble background */\n &::after {\n content: '';\n position: absolute;\n bottom: -6px;\n right: ${tokens.spacing.md};\n width: 14px;\n height: 14px;\n background: ${tokens.colors.message.user} !important;\n transform: rotate(45deg);\n border-radius: 0 0 ${tokens.borderRadius.sm} 0;\n clip-path: polygon(0 0, 100% 100%, 0 100%);\n box-shadow: ${tokens.shadows.sm};\n transition: all ${tokens.transitions.normal};\n z-index: -1;\n }\n\n /* Hover state - only for button elements */\n &[role=\"button\"]:hover:not(:disabled) {\n transform: translateY(-1px);\n cursor: pointer;\n box-shadow: ${tokens.shadows.lg};\n\n &::after {\n box-shadow: ${tokens.shadows.md};\n }\n }\n\n /* Active/Pressed state - only for button elements */\n &[role=\"button\"]:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: ${tokens.shadows.sm};\n\n &::after {\n box-shadow: ${tokens.shadows.sm};\n }\n }\n\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: translateY(0) scale(0.98);\n box-shadow: ${tokens.shadows.sm};\n\n &::after {\n box-shadow: ${tokens.shadows.sm};\n }\n `}\n\n /* Focus state for accessibility */\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.secondary};\n outline-offset: 3px;\n box-shadow: ${tokens.shadows.lg};\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n box-shadow: ${tokens.shadows.none};\n\n &::after {\n opacity: 0.5;\n box-shadow: ${tokens.shadows.none};\n }\n }\n`;\n","import type { AriaButtonProps } from '@react-aria/button';\nimport { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledUserMessage } from './UserMessage.styles';\n\nexport interface UserMessageProps extends AriaButtonProps {\n /**\n * The message text to display\n */\n children: React.ReactNode;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * Whether the message is in a pressed state\n */\n isPressed?: boolean;\n /**\n * Optional click handler\n */\n onPress?: () => void;\n}\n\n/**\n * UserMessage component - Displays a user message in a gradient pill\n *\n * This component renders a user message with a purple-to-blue gradient background,\n * pill-shaped design with fully rounded ends, and white text. It uses React ARIA\n * for accessibility and supports keyboard navigation.\n *\n * @example\n * ```tsx\n * <UserMessage onPress={() => console.log('clicked')}>\n * Can you export this as a CSV?\n * </UserMessage>\n * ```\n */\nexport function UserMessage({\n children,\n className,\n isPressed = false,\n onPress,\n ...ariaProps\n}: UserMessageProps) {\n const ref = useRef<HTMLButtonElement>(null);\n\n // If no onPress handler, render as non-interactive div\n if (!onPress) {\n return (\n <StyledUserMessage as=\"div\" className={className} $isPressed={isPressed} role=\"presentation\">\n {children}\n </StyledUserMessage>\n );\n }\n\n // Otherwise render as interactive button with React ARIA\n const { buttonProps, isPressed: ariaPressedState } = useButton(\n {\n ...ariaProps,\n onPress,\n },\n ref\n );\n\n return (\n <StyledUserMessage\n {...buttonProps}\n ref={ref}\n className={className}\n $isPressed={isPressed || ariaPressedState}\n role=\"button\"\n tabIndex={0}\n >\n {children}\n </StyledUserMessage>\n );\n}\n\nUserMessage.displayName = 'UserMessage';\n","/**\n * Adapter component that bridges custom UserMessage with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's UserMessageProps to our custom component props\n * 2. Extracts message content from CopilotKit's message object\n * 3. Handles image messages appropriately\n */\n\nimport type { UserMessageProps as CopilotUserMessageProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { UserMessage } from '../../UserMessage/UserMessage';\n\n// Wrapper to align user messages to the right with fade-in animation\nconst UserMessageWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n width: 100%;\n padding: ${tokens.spacing.sm} 0;\n\n /* Fade in and slide up animation */\n animation: fadeInSlideUp ${tokens.animation.duration.medium} ease-out;\n\n @keyframes fadeInSlideUp {\n from {\n opacity: 0;\n transform: translateY(${tokens.spacing.sm});\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n`;\n\n/**\n * Adapter that converts CopilotKit's UserMessageProps to our custom component\n */\nexport const UserMessageAdapter: React.FC<CopilotUserMessageProps> = ({\n message,\n ImageRenderer,\n}) => {\n // Handle image messages\n if (message?.image) {\n return <ImageRenderer image={message.image} content={message.content} />;\n }\n\n // Extract text content\n const content = message?.content || '';\n\n // Our UserMessage is a button-like component with React ARIA\n // In the chat context, it's not interactive, so we don't provide onPress\n return (\n <UserMessageWrapper>\n <UserMessage>{content}</UserMessage>\n </UserMessageWrapper>\n );\n};\n\nUserMessageAdapter.displayName = 'UserMessageAdapter';\n","/**\n * StreamStatusIndicator Component\n *\n * Displays connection status for streaming chat (SSE).\n *\n * @see specs/015-restyle-ai-chat/spec.md\n */\n\nimport type React from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.6;\n transform: scale(1.1);\n }\n`;\n\nconst Container = styled.div<{ size: 'sm' | 'md' | 'lg' }>`\n display: inline-flex;\n align-items: center;\n gap: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.xs;\n }\n }};\n font-family: ${tokens.typography.fontFamily.primary};\n`;\n\nconst StatusDot = styled.div<{\n status: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n size: 'sm' | 'md' | 'lg';\n variant: 'dot' | 'badge';\n}>`\n width: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.borderRadius.lg;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }};\n height: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.borderRadius.lg;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${(props) => {\n switch (props.status) {\n case 'connected':\n return tokens.colors.connection.connected;\n case 'streaming':\n return tokens.colors.connection.streaming;\n case 'disconnected':\n return tokens.colors.connection.disconnected;\n case 'reconnecting':\n return tokens.colors.connection.reconnecting;\n }\n }};\n animation: ${(props) => (props.status === 'streaming' ? pulse : 'none')} 2s ease-in-out infinite;\n flex-shrink: 0;\n`;\n\nconst Label = styled.span<{ size: 'sm' | 'md' | 'lg'; variant: 'dot' | 'badge' }>`\n font-size: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.typography.fontSize.xs;\n case 'lg':\n return tokens.typography.fontSize.base;\n case 'md':\n default:\n return tokens.typography.fontSize.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.typography.fontSize.xs;\n case 'lg':\n return tokens.typography.fontSize.base;\n case 'md':\n default:\n return tokens.typography.fontSize.sm;\n }\n }};\n font-weight: ${(props) => (props.variant === 'badge' ? tokens.typography.fontWeight.medium : tokens.typography.fontWeight.regular)};\n color: ${tokens.colors.text.secondary};\n line-height: ${tokens.typography.lineHeight.tight};\n`;\n\nconst BadgeContainer = styled.div<{ size: 'sm' | 'md' | 'lg' }>`\n display: inline-flex;\n align-items: center;\n gap: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.xs;\n }\n }};\n padding: ${(props) => {\n switch (props.size) {\n case 'sm':\n return `${tokens.spacing.xs} ${tokens.spacing.sm}`;\n case 'lg':\n return `${tokens.spacing.sm} ${tokens.spacing.md}`;\n case 'md':\n default:\n return `${tokens.spacing.xs} ${tokens.spacing.sm}`;\n }\n }};\n background-color: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.borderRadius.sm;\n case 'lg':\n return tokens.borderRadius.md;\n case 'md':\n default:\n return tokens.borderRadius.md;\n }\n }};\n`;\n\nexport interface StreamStatusIndicatorProps {\n /** Connection status */\n status: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n /** Visual variant */\n variant?: 'dot' | 'badge';\n /** Size of the indicator */\n size?: 'sm' | 'md' | 'lg';\n /** Whether to show text label */\n showLabel?: boolean;\n /** Custom className */\n className?: string;\n}\n\nconst getStatusLabel = (status: StreamStatusIndicatorProps['status']): string => {\n switch (status) {\n case 'connected':\n return 'Connected';\n case 'streaming':\n return 'Streaming';\n case 'disconnected':\n return 'Disconnected';\n case 'reconnecting':\n return 'Reconnecting...';\n }\n};\n\n/**\n * StreamStatusIndicator component for showing connection status\n *\n * Features:\n * - Visual status indicators (connected/streaming/disconnected/reconnecting)\n * - Color-coded status (green/blue/red/yellow)\n * - Pulsing animation for streaming state\n * - Dot and badge variants\n * - Size options (sm/md/lg)\n * - Optional text labels\n */\nexport const StreamStatusIndicator: React.FC<StreamStatusIndicatorProps> = ({\n status,\n variant = 'dot',\n size = 'md',\n showLabel = false,\n className,\n}) => {\n const content = (\n <>\n <StatusDot status={status} size={size} variant={variant} aria-hidden=\"true\" />\n {showLabel && (\n <Label size={size} variant={variant}>\n {getStatusLabel(status)}\n </Label>\n )}\n </>\n );\n\n if (variant === 'badge') {\n return (\n <BadgeContainer\n size={size}\n className={className}\n role=\"status\"\n aria-label={getStatusLabel(status)}\n >\n {content}\n </BadgeContainer>\n );\n }\n\n return (\n <Container size={size} className={className} role=\"status\" aria-label={getStatusLabel(status)}>\n {content}\n </Container>\n );\n};\n\nStreamStatusIndicator.displayName = 'StreamStatusIndicator';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const HeaderContainer = styled.header`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background-color: ${tokens.colors.backdrop};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-bottom: 1px solid ${tokens.colors.border.default};\n min-height: 44px;\n box-sizing: border-box;\n\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n }\n`;\n\nexport const HeaderContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.xs};\n flex: 1;\n min-width: 0;\n`;\n\nexport const HeaderTitle = styled.h1`\n margin: 0;\n font-size: ${tokens.typography.fontSize.base};\n font-weight: ${tokens.typography.fontWeight.semibold};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.normal};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const HeaderSubtitle = styled.p`\n margin: 0;\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.secondary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const HeaderActions = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n margin-left: ${tokens.spacing.md};\n`;\n\nexport const ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n padding: 0;\n background-color: transparent;\n border: none;\n border-radius: ${tokens.borderRadius.md};\n color: ${tokens.colors.text.primary};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlay};\n }\n\n &:active:not(:disabled) {\n transform: scale(0.95);\n background-color: ${tokens.colors.surface.overlayActive};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.3;\n }\n\n svg {\n width: ${tokens.spacing.md};\n height: ${tokens.spacing.md};\n display: block;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport { tokens } from '../../../theme/tokens';\nimport { StreamStatusIndicator } from '../StreamStatusIndicator';\nimport {\n ActionButton,\n HeaderActions,\n HeaderContainer,\n HeaderContent,\n HeaderSubtitle,\n HeaderTitle,\n} from './Header.styles';\n\nexport interface HeaderProps {\n /**\n * The main title text displayed in the header\n */\n title: string;\n\n /**\n * Optional subtitle text displayed below the title\n */\n subtitle?: string;\n\n /**\n * Optional stream status indicator (connected/streaming/disconnected/reconnecting)\n * When provided, displays a StreamStatusIndicator next to the title\n */\n streamStatus?: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n\n /**\n * Callback function triggered when the close button is clicked\n */\n onClose?: () => void;\n\n /**\n * Callback function triggered when the minimize button is clicked\n */\n onMinimize?: () => void;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n}\n\n/**\n * Header Component\n *\n * A chat header component that displays a title, optional subtitle, and action buttons.\n * Built with React ARIA for accessibility and Styled Components for theming.\n *\n * @example\n * ```tsx\n * <Header\n * title=\"AI Assistant\"\n * subtitle=\"How can I help you today?\"\n * onClose={() => console.log('Close clicked')}\n * onMinimize={() => console.log('Minimize clicked')}\n * />\n * ```\n */\nexport const Header: React.FC<HeaderProps> = ({\n title,\n subtitle,\n streamStatus,\n onClose,\n onMinimize,\n className,\n}) => {\n const minimizeRef = useRef<HTMLButtonElement>(null);\n const closeRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: minimizeProps } = useButton(\n {\n onPress: onMinimize,\n 'aria-label': 'Minimize',\n isDisabled: !onMinimize,\n },\n minimizeRef\n );\n\n const { buttonProps: closeProps } = useButton(\n {\n onPress: onClose,\n 'aria-label': 'Close',\n isDisabled: !onClose,\n },\n closeRef\n );\n\n return (\n <HeaderContainer className={className}>\n <HeaderContent>\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\n <HeaderTitle>{title}</HeaderTitle>\n {streamStatus && (\n <StreamStatusIndicator\n status={streamStatus}\n variant=\"badge\"\n size=\"sm\"\n showLabel={streamStatus === 'streaming' || streamStatus === 'reconnecting'}\n />\n )}\n </div>\n {subtitle && <HeaderSubtitle>{subtitle}</HeaderSubtitle>}\n </HeaderContent>\n\n <HeaderActions>\n {onMinimize && (\n <ActionButton ref={minimizeRef} {...minimizeProps} data-action=\"minimize\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <title>Minimize</title>\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </ActionButton>\n )}\n\n {onClose && (\n <ActionButton ref={closeRef} {...closeProps} data-action=\"close\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <title>Close</title>\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </ActionButton>\n )}\n </HeaderActions>\n </HeaderContainer>\n );\n};\n\nHeader.displayName = 'Header';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n/**\n * Styled container for the messages area\n * Provides flexible layout and responsive spacing\n */\nexport const MessagesContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n /* Gradient background - brand aligned */\n background: linear-gradient(\n to right bottom,\n ${tokens.colors.background.dark},\n ${tokens.colors.background.darker},\n ${tokens.colors.background.darkest}\n );\n padding: ${tokens.spacing.sm};\n gap: ${tokens.spacing.md};\n box-sizing: border-box;\n\n /* Ensure proper scrolling behavior for child components */\n position: relative;\n min-height: 0;\n\n /* Desktop padding */\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n padding: ${tokens.spacing.md};\n }\n`;\n","import type React from 'react';\nimport { MessagesContainer } from './Messages.styles';\n\nexport interface MessagesProps {\n /**\n * Children elements to be rendered inside the messages container\n */\n children?: React.ReactNode;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * ARIA label for accessibility\n */\n ariaLabel?: string;\n}\n\n/**\n * Messages component - Container for message list\n *\n * This component serves as a wrapper for the messages area,\n * providing consistent spacing and layout for chat messages.\n *\n * @example\n * ```tsx\n * <Messages ariaLabel=\"Chat messages\">\n * <MessagesList messages={messages} />\n * </Messages>\n * ```\n */\nexport const Messages: React.FC<MessagesProps> = ({\n children,\n className,\n ariaLabel = 'Messages',\n}) => {\n return (\n <MessagesContainer className={className} role=\"region\" aria-label={ariaLabel}>\n {children}\n </MessagesContainer>\n );\n};\n\nMessages.displayName = 'Messages';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\ninterface WindowContainerProps {\n $isMinimized: boolean;\n $isFullscreen: boolean;\n $width: string;\n $height: string;\n}\n\nexport const WindowContainer = styled.div<WindowContainerProps>`\n display: flex;\n flex-direction: column;\n /* Glassmorphism effect */\n background: transparent;\n backdrop-filter: blur(3.8px);\n -webkit-backdrop-filter: blur(3.8px);\n border: 1px solid ${tokens.colors.surface.glassBorder};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: ${tokens.shadows.lg};\n overflow: hidden;\n transition: all ${tokens.animation.duration.short} ${tokens.animation.easing.smooth};\n position: relative;\n\n /* Default dimensions */\n width: ${({ $width }) => $width};\n height: ${({ $height }) => $height};\n\n /* Fullscreen state */\n ${({ $isFullscreen }) =>\n $isFullscreen &&\n css`\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n box-shadow: none;\n position: fixed;\n top: 0;\n left: 0;\n z-index: ${tokens.zIndex.modal};\n `}\n\n /* Minimized state */\n ${({ $isMinimized }) =>\n $isMinimized &&\n css`\n height: 60px;\n width: 300px;\n box-shadow: ${tokens.shadows.sm};\n cursor: pointer;\n\n /* Hide all content except header when minimized */\n > *:not(:first-child) {\n display: none;\n }\n\n /* Keep header visible but adjust styling */\n > *:first-child {\n border-bottom: none;\n }\n `}\n\n /* Responsive behavior for smaller screens */\n @media (max-width: ${tokens.breakpoints.tablet}px) {\n ${({ $isFullscreen, $isMinimized }) =>\n !$isFullscreen &&\n !$isMinimized &&\n css`\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n max-width: 100%;\n max-height: 100%;\n `}\n }\n\n /* Focus states for accessibility */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.primary};\n outline-offset: 2px;\n }\n\n /* Ensure proper stacking context */\n z-index: ${({ $isFullscreen }) => ($isFullscreen ? tokens.zIndex.modal : tokens.zIndex.fixed)};\n`;\n","import type React from 'react';\nimport { WindowContainer } from './Window.styles';\n\nexport interface WindowProps {\n /**\n * Whether the window is minimized to a small bar\n */\n isMinimized?: boolean;\n\n /**\n * Whether the window is fullscreen (100vw x 100vh)\n */\n isFullscreen?: boolean;\n\n /**\n * Custom width for the window (e.g., \"400px\", \"50vw\")\n * @default \"400px\"\n */\n width?: string;\n\n /**\n * Custom height for the window (e.g., \"600px\", \"80vh\")\n * @default \"600px\"\n */\n height?: string;\n\n /**\n * Children elements to be rendered inside the window\n */\n children: React.ReactNode;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n\n /**\n * ARIA label for the window\n */\n ariaLabel?: string;\n}\n\n/**\n * Window Component\n *\n * Main container/window wrapper for the CopilotKit chat interface.\n * This component holds the Header, Messages, Input, and Footer components.\n *\n * Features:\n * - Default: 400px width x 600px height with rounded corners and shadow\n * - Minimized: Collapsed to a small bar\n * - Fullscreen: Takes full viewport (100vw x 100vh)\n * - Smooth transitions between states\n * - Customizable dimensions via width/height props\n *\n * @example\n * ```tsx\n * // Default window\n * <Window>\n * <Header title=\"AI Assistant\" />\n * <Messages>...</Messages>\n * <MessageInput />\n * <Footer />\n * </Window>\n *\n * // Minimized window\n * <Window isMinimized>\n * <Header title=\"AI Assistant\" />\n * </Window>\n *\n * // Fullscreen window\n * <Window isFullscreen>\n * <Header title=\"AI Assistant\" />\n * <Messages>...</Messages>\n * <MessageInput />\n * </Window>\n *\n * // Custom dimensions\n * <Window width=\"500px\" height=\"700px\">\n * ...\n * </Window>\n * ```\n */\nexport const Window: React.FC<WindowProps> = ({\n isMinimized = false,\n isFullscreen = false,\n width = '400px',\n height = '600px',\n children,\n className,\n ariaLabel = 'Chat window',\n}) => {\n return (\n <WindowContainer\n className={className}\n $isMinimized={isMinimized}\n $isFullscreen={isFullscreen}\n $width={width}\n $height={height}\n role=\"dialog\"\n aria-label={ariaLabel}\n aria-modal=\"false\"\n >\n {children}\n </WindowContainer>\n );\n};\n\nWindow.displayName = 'Window';\n","/**\n * Complete CopilotSidebar Integration Example\n *\n * This file demonstrates how to integrate custom-designed components\n * (AssistantMessage, UserMessage, AssistantThinking, Input) with CopilotKit's\n * CopilotSidebar component using adapter components.\n *\n * Usage:\n * ```tsx\n * import { CopilotKit } from \"@copilotkit/react-core\";\n * import { CustomCopilotSidebar } from \"./CopilotSidebarIntegration\";\n *\n * function App() {\n * return (\n * <CopilotKit runtimeUrl=\"/api/copilotkit\">\n * <CustomCopilotSidebar>\n * <YourApp />\n * </CustomCopilotSidebar>\n * </CopilotKit>\n * );\n * }\n * ```\n */\n\nimport type {\n ButtonProps as CopilotButtonProps,\n HeaderProps as CopilotHeaderProps,\n MessagesProps as CopilotMessagesProps,\n WindowProps as CopilotWindowProps,\n} from '@copilotkit/react-ui';\nimport { CopilotSidebar, useChatContext } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport { AssistantMessageAdapter, InputAdapter, UserMessageAdapter } from './adapters';\nimport { Header } from './Header/Header';\nimport { Messages } from './Messages/Messages';\nimport { Window } from './Window/Window';\n\n// Global styles to ensure sidebar starts hidden and button visibility\nconst GlobalSidebarStyles = createGlobalStyle`\n /* Override CopilotKit's default positioning - start off-screen */\n .copilotKitSidebar {\n position: fixed !important;\n right: -100vw !important;\n bottom: 0 !important;\n transition: right 0.3s ease !important;\n }\n\n /* Move sidebar container into view when expanded */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar {\n right: 0 !important;\n }\n\n /* Mobile-first: Full viewport sidebar */\n .copilotKitSidebar .copilotKitWindow {\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: auto !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n margin: 0 !important;\n border-radius: 0 !important;\n z-index: 1001 !important;\n\n transform: translateX(100%) !important;\n visibility: hidden !important;\n pointer-events: none !important;\n opacity: 0 !important;\n display: none !important;\n\n transition: transform 0.3s ease, visibility 0.3s ease, opacity 0.3s ease !important;\n }\n\n /* When window has .open class (CopilotKit's native class), show it */\n .copilotKitSidebar .copilotKitWindow.open {\n display: flex !important;\n transform: translateX(0) !important;\n visibility: visible !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n }\n\n /* Desktop: Sidebar panel on the right (640px = CopilotKit's breakpoint) */\n @media (min-width: 640px) {\n .copilotKitSidebar .copilotKitWindow {\n inset: auto !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: auto !important;\n width: 28rem !important;\n height: 100vh !important;\n max-width: 28rem !important;\n max-height: 100vh !important;\n }\n }\n\n /* Hide button when sidebar is open */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: none !important;\n }\n }\n\n /* Show button when sidebar is closed */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: flex !important;\n }\n }\n\n /* Override CopilotKit's default message styles with our custom components */\n .copilotKitSidebar {\n /* Reset all default CopilotKit message styling */\n [class*=\"copilotKitMessage\"],\n [class*=\"Message-module\"] {\n all: unset !important;\n display: contents !important;\n }\n\n /* Ensure our custom UserMessage gradient pill shows through */\n button[role=\"presentation\"] {\n all: revert !important;\n display: inline-flex !important;\n }\n\n /* Reset input styles to allow our custom ChatInput */\n [class*=\"Input-module\"],\n [class*=\"copilotKitInput\"] {\n all: unset !important;\n display: contents !important;\n }\n\n /* Reset header styles */\n [class*=\"Header-module\"],\n [class*=\"copilotKitHeader\"] {\n all: unset !important;\n display: contents !important;\n }\n }\n`;\n\n// Styled button positioned in the bottom-right corner\nconst StyledChatButton = styled.button`\n position: fixed;\n bottom: 8px;\n right: 8px;\n width: 36px;\n height: 36px;\n border-radius: 18px;\n border: none;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1000;\n transition: all 0.2s ease;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 16px rgba(102, 126, 234, 0.5);\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n svg {\n width: 20px;\n height: 20px;\n fill: white;\n }\n`;\n\nexport interface CustomCopilotSidebarProps {\n /**\n * Children to render alongside the sidebar\n */\n children?: React.ReactNode;\n /**\n * Instructions for the AI assistant\n */\n instructions?: string;\n /**\n * Custom labels for the UI\n */\n labels?: Record<string, string>;\n /**\n * Custom icons for the UI\n */\n icons?: Record<string, React.ReactNode>;\n /**\n * Whether the sidebar should be open by default\n */\n defaultOpen?: boolean;\n /**\n * Whether clicking outside should close the sidebar\n */\n clickOutsideToClose?: boolean;\n /**\n * Whether hitting escape should close the sidebar\n */\n hitEscapeToClose?: boolean;\n /**\n * Keyboard shortcut to open the sidebar\n */\n shortcut?: string;\n /**\n * Callback when the sidebar open state changes\n */\n onSetOpen?: (open: boolean) => void;\n /**\n * Additional CSS class name\n */\n className?: string;\n}\n\n/**\n * CopilotSidebar with custom-designed components\n *\n * This component wraps CopilotKit's CopilotSidebar and injects our\n * custom components via adapter components.\n *\n * Features:\n * - Custom AssistantMessage with avatar and loading states\n * - AssistantThinking component shown during loading\n * - Custom UserMessage with gradient pill design\n * - Custom Input with React ARIA accessibility\n * - Styled chat button with gradient\n */\nexport const CustomCopilotSidebar: React.FC<CustomCopilotSidebarProps> = ({\n children,\n instructions = 'You are a helpful AI assistant.',\n labels,\n icons,\n defaultOpen = false,\n clickOutsideToClose = true,\n hitEscapeToClose = true,\n shortcut = '/',\n onSetOpen,\n className,\n}) => {\n // Header adapter with close handler\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const HeaderAdapter = (_props: CopilotHeaderProps) => {\n const { setOpen } = useChatContext();\n\n const handleClose = () => {\n setOpen(false);\n onSetOpen?.(false);\n };\n\n return (\n <Header title=\"AI Assistant\" subtitle=\"How can I help you today?\" onClose={handleClose} />\n );\n };\n\n // Window adapter - wraps our custom Window component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const WindowAdapter = (props: CopilotWindowProps) => {\n return <Window>{props.children}</Window>;\n };\n\n // Messages adapter - wraps our custom Messages component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const MessagesAdapter = (props: CopilotMessagesProps) => {\n return (\n <Messages>\n {props.messages.map((message, index) => (\n <props.RenderMessage\n key={message.id || `message-${index}`}\n message={message}\n inProgress={props.inProgress}\n index={index}\n isCurrentMessage={index === props.messages.length - 1}\n />\n ))}\n </Messages>\n );\n };\n\n // Custom Button component that uses CopilotKit's ChatContext\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const CustomButton = (_props: CopilotButtonProps) => {\n const { open, setOpen } = useChatContext();\n\n const handleClick = () => {\n const newOpenState = !open;\n setOpen(newOpenState);\n onSetOpen?.(newOpenState);\n };\n\n return (\n <StyledChatButton\n onClick={handleClick}\n aria-label={open ? 'Close chat' : 'Open chat'}\n type=\"button\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Chat icon\"\n >\n <title>Chat</title>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n </StyledChatButton>\n );\n };\n\n return (\n <>\n <GlobalSidebarStyles />\n <CopilotSidebar\n // Pass through custom components via adapters\n AssistantMessage={AssistantMessageAdapter}\n UserMessage={UserMessageAdapter}\n Input={InputAdapter}\n Header={HeaderAdapter}\n Window={WindowAdapter}\n Messages={MessagesAdapter}\n Button={CustomButton}\n // Configuration\n instructions={instructions}\n labels={{\n title: 'AI Assistant',\n initial: 'Hi! How can I help you today?',\n ...labels,\n }}\n icons={icons}\n // Behavior\n defaultOpen={defaultOpen}\n clickOutsideToClose={clickOutsideToClose}\n hitEscapeToClose={hitEscapeToClose}\n shortcut={shortcut}\n onSetOpen={onSetOpen}\n // Styling\n className={className}\n >\n {children}\n </CopilotSidebar>\n </>\n );\n};\n\nCustomCopilotSidebar.displayName = 'CustomCopilotSidebar';\n","import type {\n ButtonProps as CopilotButtonProps,\n HeaderProps as CopilotHeaderProps,\n WindowProps as CopilotWindowProps,\n} from '@copilotkit/react-ui';\nimport { CopilotSidebar, useChatContext } from '@copilotkit/react-ui';\nimport type { ReactNode } from 'react';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport {\n ActionExecutionAdapter,\n AssistantMessageAdapter,\n InputAdapter,\n UserMessageAdapter,\n} from '../adapters';\nimport { Header } from '../Header/Header';\nimport { Window } from '../Window/Window';\n\n// Global styles to ensure sidebar starts hidden and button visibility\nconst GlobalSidebarStyles = createGlobalStyle`\n /* Override CopilotKit's default positioning - keep sidebar container in place */\n /* z-index must be higher than NavHorizontal (sticky: 1020) for button to show above nav */\n .copilotKitSidebar {\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n width: 100vw !important;\n height: 100vh !important;\n pointer-events: none !important;\n z-index: ${tokens.zIndex.fixed} !important;\n }\n\n /* Keep sidebar container always visible (the window inside will animate) */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar {\n pointer-events: auto !important;\n }\n\n /* Mobile-first: Glassmorphism sidebar with rounded corners */\n /* Target the actual dialog element that gets rendered */\n .copilotKitSidebar [role=\"dialog\"] {\n /* Override CopilotKit defaults for mobile */\n position: fixed !important;\n top: ${tokens.spacing.sm} !important;\n right: ${tokens.spacing.sm} !important;\n /* Reserve space for Android nav buttons - matches NavHorizontal approach */\n bottom: max(90px, env(safe-area-inset-bottom, 90px)) !important;\n left: ${tokens.spacing.sm} !important;\n width: calc(100vw - ${tokens.spacing.lg}) !important;\n /* Adjust height to account for bottom safe area */\n height: calc(100vh - ${tokens.spacing.lg} - max(80px, env(safe-area-inset-bottom, 80px))) !important;\n max-width: calc(100vw - ${tokens.spacing.lg}) !important;\n max-height: calc(100vh - ${tokens.spacing.lg} - max(80px, env(safe-area-inset-bottom, 80px))) !important;\n margin: 0 !important;\n border-radius: ${tokens.borderRadius.xl} !important;\n\n /* Glassmorphism effect */\n background: ${tokens.colors.surface.glass} !important;\n box-shadow: ${tokens.shadows.lg} !important;\n backdrop-filter: blur(11.1px) !important;\n -webkit-backdrop-filter: blur(11.1px) !important;\n border: 1px solid ${tokens.colors.surface.glassBorder} !important;\n\n /* Smooth slide transition */\n transition: transform 0.3s ease, visibility 0.3s ease, opacity 0.3s ease !important;\n z-index: ${tokens.zIndex.modal} !important;\n }\n\n /* Hidden by default */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) .copilotKitSidebar [role=\"dialog\"] {\n transform: translateX(100%) !important;\n visibility: hidden !important;\n pointer-events: none !important;\n opacity: 0 !important;\n }\n\n /* Visible when expanded */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar [role=\"dialog\"] {\n transform: translateX(0) !important;\n visibility: visible !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n }\n\n /* Desktop: Sidebar panel on the right with glassmorphism (640px = CopilotKit's breakpoint) */\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n .copilotKitSidebar [role=\"dialog\"] {\n inset: auto !important;\n top: ${tokens.spacing.sm} !important;\n right: ${tokens.spacing.sm} !important;\n /* Reserve space for Android nav buttons on desktop too */\n bottom: max(90px, env(safe-area-inset-bottom, 90px)) !important;\n left: auto !important;\n width: 28rem !important;\n /* Adjust height to account for bottom safe area */\n height: calc(100vh - ${tokens.spacing.lg} - max(80px, env(safe-area-inset-bottom, 80px))) !important;\n max-width: 28rem !important;\n max-height: calc(100vh - ${tokens.spacing.lg} - max(80px, env(safe-area-inset-bottom, 80px))) !important;\n }\n }\n\n /* Hide button when sidebar is open */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: none !important;\n }\n }\n\n /* Show button when sidebar is closed */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: flex !important;\n }\n }\n\n /* Fix messages container background */\n .copilotKitMessages {\n background-color: transparent !important;\n }\n\n /* Fade-in animation for new messages */\n @keyframes messagesFadeIn {\n from {\n opacity: 0;\n transform: translateY(${tokens.spacing.sm});\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .copilotKitMessage {\n animation: messagesFadeIn 0.3s ease-out;\n }\n\n /* Override CopilotKit suggestions to be single-row with horizontal scroll */\n div[role=\"list\"][aria-label*=\"Suggested\"] {\n display: flex !important;\n flex-wrap: nowrap !important; /* Force single row */\n gap: ${tokens.spacing.sm} !important;\n padding: ${tokens.spacing.xs} 0 !important;\n\n /* Horizontal scrolling */\n overflow-x: auto !important;\n overflow-y: hidden !important;\n\n /* Smooth scrolling */\n -webkit-overflow-scrolling: touch;\n scroll-behavior: smooth;\n\n /* Fixed height for one suggestion */\n max-height: 40px !important;\n min-height: 40px !important;\n align-items: center !important;\n\n /* Hide scrollbar */\n scrollbar-width: none !important;\n -ms-overflow-style: none !important;\n\n &::-webkit-scrollbar {\n display: none !important;\n }\n }\n\n /* Ensure suggestion buttons don't wrap or shrink */\n div[role=\"list\"][aria-label*=\"Suggested\"] button {\n flex-shrink: 0 !important;\n white-space: nowrap !important;\n }\n\n /* Remove teal/cyan outline from all inputs */\n .copilotKitSidebar input,\n .copilotKitSidebar input:focus,\n .copilotKitSidebar input:focus-visible,\n .copilotKitSidebar textarea,\n .copilotKitSidebar textarea:focus,\n .copilotKitSidebar textarea:focus-visible {\n outline: none !important;\n outline-color: transparent !important;\n box-shadow: none !important;\n }\n`;\n\n// Styled button positioned in the bottom-right corner\nconst StyledChatButton = styled.button<{ $disabled?: boolean }>`\n position: fixed;\n bottom: ${tokens.spacing.sm};\n right: ${tokens.spacing.sm};\n width: 36px;\n height: 36px;\n border-radius: ${tokens.borderRadius.full};\n border: none;\n background: linear-gradient(135deg, ${tokens.colors.primary} 0%, ${tokens.colors.accent} 100%);\n box-shadow: ${({ $disabled }) => ($disabled ? 'none' : tokens.shadows.glow.primary)};\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n opacity: ${({ $disabled }) => ($disabled ? 0.5 : 1)};\n filter: ${({ $disabled }) => ($disabled ? 'grayscale(0.6)' : 'none')};\n z-index: ${tokens.zIndex.fixed};\n transition: all ${tokens.transitions.fast};\n\n &:hover:not([aria-disabled='true']) {\n transform: scale(1.05);\n box-shadow: ${tokens.shadows.glow.accent};\n }\n\n &:active:not([aria-disabled='true']) {\n transform: scale(0.95);\n }\n\n svg {\n width: 20px;\n height: 20px;\n fill: ${tokens.colors.text.primary};\n }\n`;\n\nexport interface CustomCopilotSidebarProps {\n children: ReactNode;\n defaultOpen?: boolean;\n onSetOpen?: (open: boolean) => void;\n instructions?: string;\n className?: string;\n /**\n * When true, disables the chat button and prevents opening the sidebar.\n */\n disabled?: boolean;\n /**\n * Message to display as tooltip when disabled.\n */\n disabledReason?: string;\n}\n\n/**\n * CustomCopilotSidebar - A CopilotSidebar wrapper using our custom components\n *\n * This component wraps CopilotKit's CopilotSidebar and provides our custom\n * design system components for a consistent look and feel.\n *\n * @example\n * ```tsx\n * <CustomCopilotSidebar defaultOpen={false} onSetOpen={(open) => console.log(open)}>\n * <YourApp />\n * </CustomCopilotSidebar>\n * ```\n */\nexport function CustomCopilotSidebar({\n children,\n defaultOpen = false,\n onSetOpen,\n instructions,\n className,\n disabled = false,\n disabledReason = 'Start a free trial to enable AI chat',\n}: CustomCopilotSidebarProps) {\n // Header adapter with close handler\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const HeaderAdapterWithClose = (_props: CopilotHeaderProps) => {\n const { setOpen } = useChatContext();\n\n const handleClose = () => {\n setOpen(false);\n onSetOpen?.(false);\n };\n\n return <Header title=\"AI Assistant\" onClose={handleClose} />;\n };\n\n // Window adapter - wraps our custom Window component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const WindowAdapterLocal = (props: CopilotWindowProps) => {\n return <Window>{props.children}</Window>;\n };\n\n // Don't override Messages - let CopilotKit handle rendering with our custom message components\n // Overriding Messages breaks the adapter chain because props.RenderMessage uses default components\n\n // Custom Button component that uses CopilotKit's ChatContext\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const CustomButton = (_props: CopilotButtonProps) => {\n const { open, setOpen } = useChatContext();\n\n const handleClick = () => {\n if (disabled) return;\n const newOpenState = !open;\n setOpen(newOpenState);\n onSetOpen?.(newOpenState);\n };\n\n return (\n <StyledChatButton\n onClick={handleClick}\n aria-label={disabled ? disabledReason : open ? 'Close chat' : 'Open chat'}\n aria-disabled={disabled}\n title={disabled ? disabledReason : undefined}\n type=\"button\"\n $disabled={disabled}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Chat</title>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n </StyledChatButton>\n );\n };\n\n return (\n <>\n <GlobalSidebarStyles />\n <CopilotSidebar\n // Pass through custom components via adapters\n AssistantMessage={AssistantMessageAdapter}\n UserMessage={UserMessageAdapter}\n Input={InputAdapter}\n Header={HeaderAdapterWithClose}\n Window={WindowAdapterLocal}\n // Don't override Messages - it breaks the adapter chain\n Button={CustomButton}\n // Custom renderer for action/tool execution messages\n RenderActionExecutionMessage={ActionExecutionAdapter}\n // Configuration\n instructions={instructions}\n labels={{\n title: 'AI Assistant',\n initial: 'Hi! How can I help you today?',\n }}\n // Behavior\n defaultOpen={defaultOpen}\n clickOutsideToClose={true}\n hitEscapeToClose={true}\n onSetOpen={onSetOpen}\n // Styling\n className={className}\n >\n {children}\n </CopilotSidebar>\n </>\n );\n}\n\nCustomCopilotSidebar.displayName = 'CustomCopilotSidebar';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const FooterContainer = styled.footer`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${tokens.colors.surface.base};\n border-top: 1px solid ${tokens.colors.border.default};\n min-height: 44px;\n`;\n\nexport const FooterContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ${tokens.spacing.md};\n width: 100%;\n max-width: 100%;\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.secondary};\n opacity: 0.6;\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n`;\n\nexport const FooterBranding = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n flex-shrink: 0;\n`;\n\nexport const FooterStatus = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: ${tokens.typography.fontSize.xs};\n opacity: 0.8;\n`;\n\nexport const FooterLink = styled.a`\n color: ${tokens.colors.primary};\n text-decoration: none;\n transition: opacity ${tokens.transitions.fast};\n cursor: pointer;\n\n &:hover {\n opacity: 0.8;\n text-decoration: underline;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n border-radius: ${tokens.borderRadius.sm};\n }\n`;\n","import type React from 'react';\nimport {\n FooterBranding,\n FooterContainer,\n FooterContent,\n FooterLink,\n FooterStatus,\n} from './Footer.styles';\n\nexport interface FooterProps {\n /**\n * Branding text to display (e.g., \"Powered by CopilotKit\")\n */\n branding?: string;\n\n /**\n * Optional status text (e.g., \"Connected\", \"Typing...\", \"3 tokens remaining\")\n */\n status?: string;\n\n /**\n * Optional link URL for the branding text\n */\n brandingUrl?: string;\n\n /**\n * Callback when branding link is clicked\n */\n onBrandingClick?: () => void;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n}\n\n/**\n * Footer Component\n *\n * A chat footer component that displays branding, status information, and optional links.\n * Typically used at the bottom of a chat interface to show provider information or connection status.\n *\n * @example\n * ```tsx\n * <Footer\n * branding=\"Powered by CopilotKit\"\n * status=\"Connected\"\n * brandingUrl=\"https://copilotkit.ai\"\n * />\n * ```\n */\nexport const Footer: React.FC<FooterProps> = ({\n branding,\n status,\n brandingUrl,\n onBrandingClick,\n className,\n}) => {\n // If no content, don't render\n if (!branding && !status) {\n return null;\n }\n\n const handleBrandingClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (onBrandingClick) {\n e.preventDefault();\n onBrandingClick();\n }\n };\n\n return (\n <FooterContainer className={className}>\n <FooterContent>\n {branding && (\n <FooterBranding>\n {brandingUrl ? (\n <FooterLink\n href={brandingUrl}\n onClick={handleBrandingClick}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {branding}\n </FooterLink>\n ) : (\n branding\n )}\n </FooterBranding>\n )}\n\n {status && <FooterStatus>{status}</FooterStatus>}\n </FooterContent>\n </FooterContainer>\n );\n};\n\nFooter.displayName = 'Footer';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const InputContainer = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 100%;\n\tposition: relative;\n`;\n\nexport const InputWrapper = styled.div`\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: ${tokens.spacing.sm};\n\tpadding: ${tokens.spacing.md};\n\tbackground-color: ${tokens.colors.backdrop};\n\tbackdrop-filter: blur(10px);\n\t-webkit-backdrop-filter: blur(10px);\n\tborder: 1px solid ${tokens.colors.border.default};\n\tborder-radius: ${tokens.borderRadius.lg};\n\ttransition: all ${tokens.transitions.normal};\n\n\t&:focus-within {\n\t\tborder-color: ${tokens.colors.border.hover};\n\t}\n\n\t&:hover:not(:focus-within) {\n\t\tborder-color: ${tokens.colors.border.subtle};\n\t}\n`;\n\ninterface TextAreaProps {\n $maxRows?: number;\n disabled?: boolean;\n readOnly?: boolean;\n}\n\nexport const TextArea = styled.textarea<TextAreaProps>`\n\tflex: 1;\n\tmin-height: ${tokens.spacing.lg};\n\tmax-height: ${(props) => `${(props.$maxRows || 5) * 24}px`};\n\tpadding: 0;\n\tborder: none;\n\toutline: none;\n\tresize: none;\n\tfont-family: ${tokens.typography.fontFamily.primary};\n\tfont-size: ${tokens.typography.fontSize.sm};\n\tline-height: ${tokens.spacing.lg};\n\tcolor: ${tokens.colors.text.primary};\n\tbackground: transparent;\n\toverflow-y: auto;\n\n\t&::placeholder {\n\t\tcolor: ${tokens.colors.text.tertiary};\n\t}\n\n\t&:disabled {\n\t\tcolor: ${tokens.colors.text.disabled};\n\t\tcursor: not-allowed;\n\t}\n\n\t&:read-only {\n\t\tcursor: default;\n\t}\n\n\t/* Custom scrollbar */\n\t&::-webkit-scrollbar {\n\t\twidth: ${tokens.spacing.xs};\n\t}\n\n\t&::-webkit-scrollbar-track {\n\t\tbackground: ${tokens.colors.scrollbar.track};\n\t}\n\n\t&::-webkit-scrollbar-thumb {\n\t\tbackground: ${tokens.colors.scrollbar.thumb};\n\t\tborder-radius: ${tokens.borderRadius.sm};\n\t}\n\n\t&::-webkit-scrollbar-thumb:hover {\n\t\tbackground: ${tokens.colors.scrollbar.thumbHover};\n\t}\n`;\n\ninterface SendButtonProps {\n disabled?: boolean;\n}\n\nexport const SendButton = styled.button<SendButtonProps>`\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 36px;\n\theight: 36px;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: ${tokens.borderRadius.md};\n\tbackground-color: ${(props) => (props.disabled ? tokens.colors.surface.overlay : tokens.colors.primary)};\n\tcolor: ${(props) => (props.disabled ? tokens.colors.text.tertiary : tokens.colors.text.primary)};\n\tcursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n\ttransition: all ${tokens.transitions.normal};\n\tflex-shrink: 0;\n\n\t&:hover:not(:disabled) {\n\t\tbackground-color: ${tokens.colors.accent};\n\t\ttransform: translateY(-1px);\n\t}\n\n\t&:active:not(:disabled) {\n\t\ttransform: translateY(0);\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid ${tokens.colors.border.focus};\n\t\toutline-offset: 2px;\n\t}\n\n\tsvg {\n\t\twidth: 20px;\n\t\theight: 20px;\n\t}\n`;\n","import type { AriaTextFieldProps } from '@react-aria/textfield';\nimport { useTextField } from '@react-aria/textfield';\nimport React, { type KeyboardEvent, useRef } from 'react';\nimport { InputContainer, InputWrapper, SendButton, TextArea } from './Input.styles';\n\nexport interface InputProps\n extends Omit<AriaTextFieldProps, 'onChange' | 'onFocus' | 'onBlur' | 'onKeyDown' | 'onKeyUp'> {\n /** Current message value */\n value?: string;\n /** Callback when message value changes */\n onChange?: (value: string) => void;\n /** Callback when message is submitted */\n onSubmit?: (message: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input is read-only */\n isReadOnly?: boolean;\n /** Maximum number of rows before scrolling */\n maxRows?: number;\n /** Whether to auto-focus the input */\n autoFocus?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for the input */\n 'aria-label'?: string;\n}\n\n/**\n * Input component for chat interfaces\n * Features:\n * - Multi-line text support\n * - Submit on Enter, Shift+Enter for new line\n * - React ARIA for accessibility\n * - Auto-growing textarea\n * - Integrated send button\n */\nexport const Input: React.FC<InputProps> = ({\n value = '',\n onChange,\n onSubmit,\n placeholder = 'Type a message...',\n isDisabled = false,\n isReadOnly = false,\n maxRows = 5,\n autoFocus = false,\n className,\n 'aria-label': ariaLabel = 'Message input',\n ...ariaProps\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // React ARIA hook for accessibility\n const { inputProps } = useTextField(\n {\n ...ariaProps,\n 'aria-label': ariaLabel,\n value,\n onChange: (newValue: string) => {\n onChange?.(newValue);\n },\n isDisabled,\n isReadOnly,\n inputElementType: 'textarea',\n },\n textareaRef\n );\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (value.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(value.trim());\n // Clear the input after submission\n onChange?.('');\n }\n }\n // Shift+Enter adds a new line (default behavior)\n };\n\n // Handle send button click\n const handleSend = () => {\n if (value.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(value.trim());\n onChange?.('');\n // Refocus the textarea after sending\n textareaRef.current?.focus();\n }\n };\n\n const canSend = value.trim().length > 0 && !isDisabled && !isReadOnly;\n\n return (\n <InputContainer className={className}>\n <InputWrapper>\n <TextArea\n {...inputProps}\n ref={textareaRef}\n placeholder={placeholder}\n onKeyDown={handleKeyDown}\n $maxRows={maxRows}\n autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n />\n <SendButton\n type=\"button\"\n onClick={handleSend}\n disabled={!canSend}\n aria-label=\"Send message\"\n title=\"Send message (Enter)\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Send Icon</title>\n <path\n d=\"M2.5 10L17.5 3.75L11.25 18.75L10 12.5L2.5 10Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </SendButton>\n </InputWrapper>\n </InputContainer>\n );\n};\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const MessagesListContainer = styled.div<{ $maxHeight: string }>`\n display: flex;\n flex-direction: column;\n width: 100%;\n max-height: ${(props) => props.$maxHeight};\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n background: ${tokens.colors.surface.base};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n scroll-behavior: smooth;\n\n /* Custom scrollbar styling */\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: ${tokens.colors.scrollbar.track};\n border-radius: ${tokens.borderRadius.sm};\n }\n\n &::-webkit-scrollbar-thumb {\n background: ${tokens.colors.scrollbar.thumb};\n border-radius: ${tokens.borderRadius.sm};\n transition: background ${tokens.transitions.fast};\n }\n\n &::-webkit-scrollbar-thumb:hover {\n background: ${tokens.colors.scrollbar.thumbHover};\n }\n\n /* Firefox scrollbar styling */\n scrollbar-width: thin;\n scrollbar-color: ${tokens.colors.scrollbar.thumb} ${tokens.colors.scrollbar.track};\n\n /* Ensure proper rendering on mobile */\n -webkit-overflow-scrolling: touch;\n`;\n\nexport const MessagesListContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.md};\n min-height: min-content;\n\n /* Message styling */\n .message {\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n border-radius: ${tokens.borderRadius.md};\n max-width: 85%;\n word-wrap: break-word;\n animation: messageSlideIn ${tokens.animation.duration.short} ease-out;\n }\n\n @keyframes messageSlideIn {\n from {\n opacity: 0;\n transform: translateY(${tokens.spacing.sm});\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Role-specific message styling */\n .message--user {\n align-self: flex-end;\n background: ${tokens.colors.message.user};\n color: ${tokens.colors.text.primary};\n border-bottom-right-radius: ${tokens.borderRadius.sm};\n }\n\n .message--assistant {\n align-self: flex-start;\n background: ${tokens.colors.message.ai};\n color: ${tokens.colors.text.primary};\n border-bottom-left-radius: ${tokens.borderRadius.sm};\n }\n\n .message--system {\n align-self: center;\n background: ${tokens.colors.message.system};\n color: ${tokens.colors.text.secondary};\n font-size: ${tokens.typography.fontSize.sm};\n font-style: italic;\n max-width: 100%;\n text-align: center;\n }\n`;\n","import { type ReactNode, useEffect, useRef } from 'react';\nimport { MessagesListContainer, MessagesListContent } from './MessagesList.styles';\n\nexport interface Message {\n id: string;\n content: ReactNode;\n role: 'user' | 'assistant' | 'system';\n timestamp?: Date;\n}\n\nexport interface MessagesListProps {\n /** Array of messages to display */\n messages: Message[];\n /** Whether to automatically scroll to the bottom when new messages arrive */\n autoScroll?: boolean;\n /** Custom class name for the container */\n className?: string;\n /** Custom render function for individual messages */\n renderMessage?: (message: Message) => ReactNode;\n /** Callback when scroll reaches the top (for loading more messages) */\n onScrollTop?: () => void;\n /** Maximum height of the messages list */\n maxHeight?: string;\n}\n\n/**\n * MessagesList Component\n *\n * A scrollable message list component with auto-scroll functionality.\n * Designed for chat interfaces where messages need to be displayed\n * in a scrollable container with automatic scrolling to the latest message.\n *\n * Features:\n * - Auto-scroll to bottom on new messages\n * - Overflow handling with custom scrollbar\n * - Flexible message rendering\n * - Scroll event handling for pagination\n */\nexport const MessagesList = ({\n messages,\n autoScroll = true,\n className,\n renderMessage,\n onScrollTop,\n maxHeight = '600px',\n}: MessagesListProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const isUserScrollingRef = useRef(false);\n const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Auto-scroll to bottom when new messages arrive\n // biome-ignore lint/correctness/useExhaustiveDependencies: We need messages.length to trigger scroll on new messages\n useEffect(() => {\n if (autoScroll && !isUserScrollingRef.current && containerRef.current) {\n const container = containerRef.current;\n container.scrollTop = container.scrollHeight;\n }\n }, [messages.length, autoScroll]);\n\n // Handle scroll events\n const handleScroll = () => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const isAtBottom = container.scrollHeight - container.scrollTop - container.clientHeight < 10;\n\n // User is scrolling manually\n isUserScrollingRef.current = !isAtBottom;\n\n // Clear existing timeout\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n // Reset user scrolling flag after 1 second of no scrolling\n scrollTimeoutRef.current = setTimeout(() => {\n isUserScrollingRef.current = false;\n }, 1000);\n\n // Check if scrolled to top\n if (container.scrollTop === 0 && onScrollTop) {\n onScrollTop();\n }\n };\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, []);\n\n // Default message renderer\n const defaultRenderMessage = (message: Message) => (\n <div\n key={message.id}\n className={`message message--${message.role}`}\n data-message-id={message.id}\n data-role={message.role}\n >\n {message.content}\n </div>\n );\n\n return (\n <MessagesListContainer\n ref={containerRef}\n onScroll={handleScroll}\n className={className}\n $maxHeight={maxHeight}\n >\n <MessagesListContent ref={contentRef}>\n {messages.map(renderMessage || defaultRenderMessage)}\n </MessagesListContent>\n </MessagesListContainer>\n );\n};\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n/**\n * Container for the user message, aligned to the right\n */\nexport const StyledUserMessage = styled.div`\n display: flex;\n justify-content: flex-end;\n align-items: flex-start;\n margin: ${tokens.spacing.sm} 0;\n padding: 0 ${tokens.spacing.md};\n width: 100%;\n`;\n\n/**\n * The message bubble containing the user's text\n */\nexport const MessageBubble = styled.div`\n display: flex;\n flex-direction: column;\n max-width: 70%;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n border-radius: ${tokens.borderRadius.lg};\n\n /* User message colors - dark blue from brand */\n background: ${tokens.colors.message.user};\n color: ${tokens.colors.text.primary};\n\n /* Smooth transitions */\n transition: all ${tokens.transitions.fast};\n\n /* Username styling */\n strong {\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.semibold};\n margin-bottom: ${tokens.spacing.xs};\n opacity: 0.9;\n }\n`;\n\n/**\n * The actual message text content\n */\nexport const MessageContent = styled.p`\n margin: 0;\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n word-wrap: break-word;\n white-space: pre-wrap;\n`;\n\n/**\n * Optional timestamp display\n */\nexport const MessageTime = styled.time`\n font-size: ${tokens.typography.fontSize.xs};\n opacity: 0.7;\n margin-top: ${tokens.spacing.xs};\n text-align: right;\n`;\n","import type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport {\n MessageBubble,\n MessageContent,\n MessageTime,\n StyledUserMessage,\n} from './UserMessage.styles';\n\nconst ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.secondary};\n background: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.border.hover};\n }\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n flex-wrap: wrap;\n`;\n\nconst StreamingIndicator = styled.span`\n display: inline-block;\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n margin-left: ${tokens.spacing.xs};\n background-color: ${tokens.colors.text.tertiary};\n border-radius: ${tokens.borderRadius.full};\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n }\n`;\n\nconst Avatar = styled.img`\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n border-radius: ${tokens.borderRadius.full};\n margin-left: ${tokens.spacing.sm};\n object-fit: cover;\n border: 2px solid ${tokens.colors.border.default};\n`;\n\nexport interface ActionButtonType {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n}\n\nexport interface UserMessageProps {\n /** The message content to display */\n content: string;\n /** Optional timestamp for the message */\n timestamp?: string;\n /** Optional CSS class name */\n className?: string;\n /** Optional avatar URL */\n avatarUrl?: string;\n /** Optional username */\n username?: string;\n /** Whether the message is currently streaming */\n isStreaming?: boolean;\n /** Action buttons to display below the message */\n actions?: ActionButtonType[];\n}\n\n/**\n * UserMessage component displays a user's message in a chat interface.\n * Styled with right alignment and pink/purple gradient from Figma design.\n *\n * Features:\n * - Right-aligned layout\n * - Pink/purple gradient background (#D8B4FE)\n * - Support for streaming state\n * - Optional timestamp display\n * - Action buttons support\n * - Avatar display\n */\nexport const UserMessage = ({\n content,\n timestamp,\n className,\n avatarUrl,\n username,\n isStreaming = false,\n actions = [],\n}: UserMessageProps) => {\n return (\n <StyledUserMessage className={className}>\n <MessageBubble>\n {username && <strong>{username}</strong>}\n <MessageContent>\n {content}\n {isStreaming && <StreamingIndicator />}\n </MessageContent>\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n {actions.length > 0 && (\n <ActionsContainer>\n {actions.map((action, index) => (\n <ActionButton key={index} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ActionButton>\n ))}\n </ActionsContainer>\n )}\n </MessageBubble>\n {avatarUrl && <Avatar src={avatarUrl} alt={username || 'User'} />}\n </StyledUserMessage>\n );\n};\n","/**\n * StreamErrorMessage Component\n *\n * Displays inline chat errors with retry support.\n *\n * @see specs/015-restyle-ai-chat/spec.md\n */\n\nimport type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst ErrorContainer = styled.div<{ variant: 'inline' | 'banner' }>`\n display: flex;\n align-items: flex-start;\n gap: ${tokens.spacing.sm};\n padding: ${(props) => (props.variant === 'banner' ? tokens.spacing.md : `${tokens.spacing.sm} ${tokens.spacing.md}`)};\n background-color: ${(props) =>\n props.variant === 'banner' ? `${tokens.colors.error}1a` : `${tokens.colors.error}0d`};\n border: 1px solid ${tokens.colors.error}4d;\n border-radius: ${(props) => (props.variant === 'banner' ? tokens.borderRadius.md : tokens.borderRadius.lg)};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n margin: ${tokens.spacing.sm} 0;\n width: ${(props) => (props.variant === 'banner' ? '100%' : 'auto')};\n max-width: ${(props) => (props.variant === 'banner' ? '100%' : '600px')};\n`;\n\nconst IconContainer = styled.div`\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: ${tokens.colors.error};\n`;\n\nconst ErrorIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n width=\"20\"\n height=\"20\"\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\n </svg>\n);\n\nconst Content = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n`;\n\nconst ErrorMessage = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n color: ${tokens.colors.text.primary};\n`;\n\nconst ErrorDetails = styled.div`\n font-size: ${tokens.typography.fontSize.xs};\n line-height: 1.4;\n color: ${tokens.colors.text.secondary};\n margin-top: ${tokens.spacing.xs};\n`;\n\nconst Actions = styled.div`\n display: flex;\n gap: ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst Button = styled.button<{ variant: 'primary' | 'secondary' }>`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${(props) => (props.variant === 'primary' ? tokens.colors.text.primary : tokens.colors.text.secondary)};\n background: ${(props) => (props.variant === 'primary' ? tokens.colors.error : tokens.colors.surface.overlay)};\n border: 1px solid\n ${(props) => (props.variant === 'primary' ? tokens.colors.error : tokens.colors.border.default)};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${(props) =>\n props.variant === 'primary'\n ? tokens.colors.status.failed\n : tokens.colors.surface.overlayHover};\n border-color: ${(props) =>\n props.variant === 'primary' ? tokens.colors.status.failed : tokens.colors.border.hover};\n }\n\n &:active {\n transform: scale(0.98);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst CloseButton = styled.button`\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: ${tokens.colors.text.secondary};\n cursor: pointer;\n border-radius: ${tokens.borderRadius.sm};\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n color: ${tokens.colors.text.primary};\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nconst CloseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nexport interface StreamErrorMessageProps {\n /** Error message to display */\n error: string | Error;\n /** Visual variant */\n variant?: 'inline' | 'banner';\n /** Whether the error can be retried */\n retryable?: boolean;\n /** Callback when retry is clicked */\n onRetry?: () => void;\n /** Callback when dismiss is clicked */\n onDismiss?: () => void;\n /** Additional error details */\n details?: string;\n /** Custom className */\n className?: string;\n}\n\n/**\n * StreamErrorMessage component for inline chat errors\n *\n * Features:\n * - Inline and banner variants\n * - Retry support for recoverable errors\n * - Dismissible errors\n * - Error details display\n * - Accessible error reporting\n */\nexport const StreamErrorMessage: React.FC<StreamErrorMessageProps> = ({\n error,\n variant = 'inline',\n retryable = false,\n onRetry,\n onDismiss,\n details,\n className,\n}) => {\n const errorMessage = typeof error === 'string' ? error : error.message;\n\n return (\n <ErrorContainer variant={variant} className={className} role=\"alert\" aria-live=\"assertive\">\n <IconContainer aria-hidden=\"true\">\n <ErrorIcon />\n </IconContainer>\n <Content>\n <ErrorMessage>{errorMessage}</ErrorMessage>\n {details && <ErrorDetails>{details}</ErrorDetails>}\n {(retryable || onDismiss) && (\n <Actions>\n {retryable && onRetry && (\n <Button variant=\"primary\" onClick={onRetry}>\n Retry\n </Button>\n )}\n {onDismiss && (\n <Button variant=\"secondary\" onClick={onDismiss}>\n Dismiss\n </Button>\n )}\n </Actions>\n )}\n </Content>\n {onDismiss && (\n <CloseButton onClick={onDismiss} aria-label=\"Dismiss error\">\n <CloseIcon />\n </CloseButton>\n )}\n </ErrorContainer>\n );\n};\n\nStreamErrorMessage.displayName = 'StreamErrorMessage';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const SuggestionsContainer = styled.div`\n display: flex;\n flex-wrap: nowrap; /* Single row */\n gap: ${tokens.spacing.sm};\n\n /* Reduced padding for tighter height */\n padding: ${tokens.spacing.xs} 0;\n\n /* Horizontal scrolling */\n overflow-x: auto;\n overflow-y: hidden;\n\n /* Smooth scrolling on mobile */\n -webkit-overflow-scrolling: touch;\n scroll-behavior: smooth;\n\n /* Align items to ensure single-row height */\n align-items: center;\n\n /* Constrain to exact height of buttons + minimal padding */\n /* Button height: ~14px font + 16px padding + 2px border = ~32px */\n /* Add small padding: 8px total = 40px */\n max-height: 40px;\n min-height: 40px;\n\n /* Hide scrollbar but keep functionality */\n scrollbar-width: none; /* Firefox */\n -ms-overflow-style: none; /* IE/Edge */\n\n &::-webkit-scrollbar {\n display: none; /* Chrome/Safari/Opera */\n }\n`;\n\ninterface StyledSuggestionProps {\n $isPressed: boolean;\n}\n\nexport const StyledSuggestion = styled.button<StyledSuggestionProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.primary};\n background-color: ${tokens.colors.surface.elevated};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.lg};\n cursor: pointer;\n transition: all ${tokens.transitions.normal};\n white-space: nowrap;\n user-select: none;\n flex-shrink: 0; /* Prevent shrinking to maintain size */\n\n /* Hover state */\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.primary};\n transform: translateY(-1px);\n box-shadow: ${tokens.shadows.sm};\n }\n\n /* Active/Pressed state */\n &:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: none;\n }\n\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: scale(0.98);\n `}\n\n /* Focus state */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n\n /* Remove default focus outline */\n &:focus {\n outline: none;\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledSuggestion, SuggestionsContainer } from './Suggestions.styles';\n\nexport interface SuggestionsProps {\n suggestions: string[];\n onSelect: (suggestion: string) => void;\n className?: string;\n}\n\nexport function Suggestions({ suggestions, onSelect, className }: SuggestionsProps) {\n if (suggestions.length === 0) {\n return null;\n }\n\n return (\n <SuggestionsContainer className={className} role=\"list\" aria-label=\"Suggested prompts\">\n {suggestions.map((suggestion) => (\n <SuggestionChip key={suggestion} suggestion={suggestion} onSelect={onSelect} />\n ))}\n </SuggestionsContainer>\n );\n}\n\ninterface SuggestionChipProps {\n suggestion: string;\n onSelect: (suggestion: string) => void;\n}\n\nfunction SuggestionChip({ suggestion, onSelect }: SuggestionChipProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps, isPressed } = useButton(\n {\n onPress: () => onSelect(suggestion),\n 'aria-label': `Select suggestion: ${suggestion}`,\n },\n ref\n );\n\n return (\n <StyledSuggestion {...buttonProps} ref={ref} $isPressed={isPressed} role=\"listitem\">\n {suggestion}\n </StyledSuggestion>\n );\n}\n\nSuggestions.displayName = 'Suggestions';\n"]}