@agentiffai/design 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +187 -0
  4. package/assets/layout/main-pane-section.png +0 -0
  5. package/assets/layout/nav-complete.png +0 -0
  6. package/assets/layout/nav-horizontal-section.png +0 -0
  7. package/assets/layout/nav-vertical-section.png +0 -0
  8. package/assets/layout/pane-section-dropdowns.png +0 -0
  9. package/assets/layout/pane-section-header.png +0 -0
  10. package/dist/Window-B6e_UfLV.d.ts +429 -0
  11. package/dist/Window-CgGFIYHS.d.cts +429 -0
  12. package/dist/chunk-CNVJ5UF2.js +2069 -0
  13. package/dist/chunk-CNVJ5UF2.js.map +1 -0
  14. package/dist/chunk-CVHHTWDQ.cjs +72 -0
  15. package/dist/chunk-CVHHTWDQ.cjs.map +1 -0
  16. package/dist/chunk-H4VHCHCP.cjs +1268 -0
  17. package/dist/chunk-H4VHCHCP.cjs.map +1 -0
  18. package/dist/chunk-JQ6Q7MDQ.js +67 -0
  19. package/dist/chunk-JQ6Q7MDQ.js.map +1 -0
  20. package/dist/chunk-KNSPBTTJ.cjs +2158 -0
  21. package/dist/chunk-KNSPBTTJ.cjs.map +1 -0
  22. package/dist/chunk-MNXQDDWP.js +2143 -0
  23. package/dist/chunk-MNXQDDWP.js.map +1 -0
  24. package/dist/chunk-P4Q3MHIY.cjs +2093 -0
  25. package/dist/chunk-P4Q3MHIY.cjs.map +1 -0
  26. package/dist/chunk-PAOXD7DF.js +1253 -0
  27. package/dist/chunk-PAOXD7DF.js.map +1 -0
  28. package/dist/copilotkit/index.cjs +611 -0
  29. package/dist/copilotkit/index.cjs.map +1 -0
  30. package/dist/copilotkit/index.d.cts +162 -0
  31. package/dist/copilotkit/index.d.ts +162 -0
  32. package/dist/copilotkit/index.js +538 -0
  33. package/dist/copilotkit/index.js.map +1 -0
  34. package/dist/icons/index.cjs +48 -0
  35. package/dist/icons/index.cjs.map +1 -0
  36. package/dist/icons/index.d.cts +375 -0
  37. package/dist/icons/index.d.ts +375 -0
  38. package/dist/icons/index.js +3 -0
  39. package/dist/icons/index.js.map +1 -0
  40. package/dist/index.cjs +536 -0
  41. package/dist/index.cjs.map +1 -0
  42. package/dist/index.d-DYU1eVeb.d.cts +252 -0
  43. package/dist/index.d-DYU1eVeb.d.ts +252 -0
  44. package/dist/index.d.cts +185 -0
  45. package/dist/index.d.ts +185 -0
  46. package/dist/index.js +358 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/layout/index.cjs +48 -0
  49. package/dist/layout/index.cjs.map +1 -0
  50. package/dist/layout/index.d.cts +206 -0
  51. package/dist/layout/index.d.ts +206 -0
  52. package/dist/layout/index.js +3 -0
  53. package/dist/layout/index.js.map +1 -0
  54. package/dist/theme/index.cjs +24 -0
  55. package/dist/theme/index.cjs.map +1 -0
  56. package/dist/theme/index.d.cts +95 -0
  57. package/dist/theme/index.d.ts +95 -0
  58. package/dist/theme/index.js +3 -0
  59. package/dist/theme/index.js.map +1 -0
  60. package/package.json +148 -0
  61. package/public/assets/bg-set/brand-logos/Google.svg +1 -0
  62. package/public/assets/bg-set/brand-logos/Google2.svg +1 -0
  63. package/public/assets/bg-set/brand-logos/Microsoft.svg +1 -0
  64. package/public/assets/bg-set/brand-logos/Microsoft2.svg +1 -0
  65. package/public/assets/bg-set/brand-logos/Slack.svg +1 -0
  66. package/public/assets/bg-set/brand-logos/Slack2.svg +1 -0
  67. package/public/assets/bg-set/brand-logos/YouTube.svg +1 -0
  68. package/public/assets/bg-set/brand-logos/YouTube2.svg +1 -0
  69. package/public/assets/bg-set/pattern/Size=lg, Type=Waves Rays2.svg +1 -0
  70. package/public/assets/bg-set/pattern/Size=md, Type=Waves Rays2.svg +1 -0
  71. package/public/assets/bg-set/pattern/Size=sm, Type=Waves Rays2.svg +1 -0
  72. package/public/assets/bg-set/pattern/Size=xl, Type=Waves Rays2.svg +1 -0
  73. package/public/assets/bg-set/pattern/Size=xs, Type=Waves Rays2.svg +1 -0
  74. package/public/assets/icon-set/Icon-add-circle-fill.svg +1 -0
  75. package/public/assets/icon-set/Icon-calendar-fill.svg +1 -0
  76. package/public/assets/icon-set/Icon-chat-1-fill.svg +1 -0
  77. package/public/assets/icon-set/Icon-download-2-fill.svg +1 -0
  78. package/public/assets/icon-set/Icon-home-fill.svg +1 -0
  79. package/public/assets/icon-set/Icon-mic-fill.svg +1 -0
  80. package/public/assets/icon-set/Icon-settings-3-fill.svg +1 -0
  81. package/public/assets/icon-set/Icon-settings-fill.svg +1 -0
  82. package/public/assets/icon-set/Icon-settings-line.svg +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AssistantThinking/AssistantThinking.styles.ts","../src/components/AssistantThinking/AssistantThinking.tsx","../src/components/ChatInput/ChatInput.styles.ts","../src/components/ChatInput/ChatInput.tsx","../src/components/UserMessage/UserMessage.styles.ts","../src/components/UserMessage/UserMessage.tsx","../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/Footer/Footer.styles.ts","../src/components/copilotkit/Footer/Footer.tsx","../src/components/copilotkit/Header/Header.styles.ts","../src/components/copilotkit/Header/Header.tsx","../src/components/copilotkit/Input/Input.styles.ts","../src/components/copilotkit/Input/Input.tsx","../src/components/copilotkit/Messages/FileAttachment.styles.ts","../src/components/copilotkit/Messages/FileAttachment.tsx","../src/components/copilotkit/Messages/AssistantMessage.styles.ts","../src/components/copilotkit/Messages/AssistantMessage.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/Window/Window.styles.ts","../src/components/copilotkit/Window/Window.tsx"],"names":["styled","useRef","jsxs","jsx","useButton","css","dotPulse","keyframes","LoadingDots","Dot","Message","InputWrapper","useTextField","Avatar","StyledUserMessage","MessageContent","UserMessage"],"mappings":"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","file":"chunk-CNVJ5UF2.js","sourcesContent":["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\nexport const Container = 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 Avatar = styled.div`\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: linear-gradient(135deg, #8B5CF6 0%, #EC4899 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-shadow: 0 2px 8px rgba(139, 92, 246, 0.3);\n`;\n\nexport const HeadphonesIcon = styled.svg`\n width: 20px;\n height: 20px;\n color: #FFFFFF;\n`;\n\nexport const Content = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\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`\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #8e8e93;\n animation: ${dotPulse} 1.4s ease-in-out infinite;\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","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}\n\nexport function AssistantThinking({\n message = 'Analyzing data, please wait...',\n className,\n ariaLabel = 'Assistant is thinking',\n}: AssistantThinkingProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n return (\n <Container\n ref={containerRef}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={ariaLabel}\n >\n <Avatar aria-hidden=\"true\">\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 <LoadingDots aria-hidden=\"true\">\n <Dot style={{ animationDelay: '0ms' }} />\n <Dot style={{ animationDelay: '150ms' }} />\n <Dot style={{ animationDelay: '300ms' }} />\n </LoadingDots>\n <Message>{message}</Message>\n </Content>\n </Container>\n );\n}\n\nAssistantThinking.displayName = 'AssistantThinking';\n","import styled from 'styled-components';\n\n/**\n * Main container for the chat input component with dark theme\n */\nexport const ChatInputContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 8px;\n background: transparent;\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: #2c2c2e;\n border: 1px solid #3a3a3c;\n border-radius: 12px;\n transition: all 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n\n &:focus-within {\n border-color: #5B9FFF;\n background-color: #323234;\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 // 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 // Optionally set the suggestion as the input value\n setValue(suggestionText);\n inputRef.current?.focus();\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 autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\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","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 color: #ffffff;\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 /* Pill shape - fully rounded ends */\n border-radius: 999px;\n\n /* Purple to blue gradient (left to right) */\n background: linear-gradient(90deg, #8B5CF6 0%, #5B8DEF 100%);\n\n /* Subtle shadow and glow effect */\n box-shadow:\n 0 2px 8px rgba(91, 141, 239, 0.25),\n 0 1px 3px rgba(139, 92, 246, 0.15);\n\n /* Smooth transitions */\n transition: all 0.2s ease-in-out;\n\n /* Speech bubble tail */\n &::after {\n content: '';\n position: absolute;\n bottom: -4px;\n right: -6px;\n width: 18px;\n height: 18px;\n background: #5B8DEF;\n transform: rotate(45deg);\n border-radius: 0 0 16px 0;\n box-shadow:\n 2px 2px 4px rgba(91, 141, 239, 0.15);\n transition: all 0.2s ease-in-out;\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(91, 141, 239, 0.35),\n 0 2px 6px rgba(139, 92, 246, 0.25);\n\n &::after {\n box-shadow:\n 3px 3px 6px rgba(91, 141, 239, 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(91, 141, 239, 0.2),\n 0 1px 2px rgba(139, 92, 246, 0.1);\n\n &::after {\n box-shadow:\n 1px 1px 2px rgba(91, 141, 239, 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(91, 141, 239, 0.2),\n 0 1px 2px rgba(139, 92, 246, 0.1);\n\n &::after {\n box-shadow:\n 1px 1px 2px rgba(91, 141, 239, 0.1);\n }\n `}\n\n /* Focus state for accessibility */\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: 2px solid #5B8DEF;\n outline-offset: 3px;\n box-shadow:\n 0 4px 12px rgba(91, 141, 239, 0.35),\n 0 2px 6px rgba(139, 92, 246, 0.25),\n 0 0 0 3px rgba(91, 141, 239, 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 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","import styled, { css } from 'styled-components';\nimport type { ButtonSize, ButtonVariant } from './Button';\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';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'icon';\nexport type ButtonSize = 'small' | 'medium' | 'large';\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';\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 type React from 'react';\nimport { Button } from '../Button';\nimport { ActionsContainer } from './Actions.styles';\n\nexport type ActionVariant = 'primary' | 'secondary' | 'icon';\nexport type ActionsLayout = 'horizontal' | 'vertical';\n\nexport interface Action {\n id: string;\n label: string;\n onClick: () => void;\n variant?: ActionVariant;\n disabled?: boolean;\n icon?: React.ReactNode;\n}\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 <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","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 HeaderContainer = styled.header`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px;\n background-color: #2c2c2e;\n border-bottom: 1px solid #3a3a3c;\n min-height: 60px;\n box-sizing: border-box;\n\n @media (min-width: 640px) {\n padding: 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 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: #ffffff;\n\tborder: 1px solid #e5e7eb;\n\tborder-radius: 12px;\n\ttransition: all 0.2s ease;\n\n\t&:focus-within {\n\t\tborder-color: #3b82f6;\n\t\tbox-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n\t}\n\n\t&:hover:not(:focus-within) {\n\t\tborder-color: #d1d5db;\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: #111827;\n\tbackground: transparent;\n\toverflow-y: auto;\n\n\t&::placeholder {\n\t\tcolor: #9ca3af;\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 ? '#e5e7eb' : '#3b82f6')};\n\tcolor: ${(props) => (props.disabled ? '#9ca3af' : '#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: #2563eb;\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 #3b82f6;\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';\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","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\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: #e5e7eb;\n`;\n\nexport const AvatarInitials = styled.div`\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: linear-gradient(135deg, #8B5CF6 0%, #EC4899 100%);\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n\n svg {\n width: 18px;\n height: 18px;\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: #2c2c2e;\n padding: 12px 16px;\n border-radius: 16px;\n border-top-left-radius: 4px;\n color: #e5e5e7;\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: #2c2c2e;\n border-radius: 16px;\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 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';\n\nconst AttachmentsContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 12px;\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 /** 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}\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 * - Markdown support (optional)\n * - Clean, modern design\n */\nexport const AssistantMessage: React.FC<AssistantMessageProps> = ({\n content = '',\n avatarUrl,\n avatarInitials: _avatarInitials = 'AI',\n isLoading = false,\n className,\n attachments = [],\n enableMarkdown: _enableMarkdown = false,\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 // For now, render as plain text\n // TODO: Add markdown support when enableMarkdown is true\n return (\n <>\n {content && <MessageContent>{content}</MessageContent>}\n {attachments.length > 0 && (\n <AttachmentsContainer>\n {attachments.map((attachment, index) => (\n <FileAttachment key={`${attachment.title}-${index}`} {...attachment} />\n ))}\n </AttachmentsContainer>\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 <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\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 </svg>\n </AvatarInitials>\n )}\n </AvatarContainer>\n <ContentContainer>{renderContent()}</ContentContainer>\n </MessageContainer>\n );\n};\n\nexport default AssistantMessage;\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 background-color: #1c1c1e;\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: 18px 18px 4px 18px;\n\n /* User message colors - distinct from assistant messages */\n background-color: #007AFF;\n color: #FFFFFF;\n\n /* Box shadow for depth */\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n\n /* Smooth transitions */\n transition: all 0.2s ease-in-out;\n\n &:hover {\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);\n }\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 {\n MessageBubble,\n MessageContent,\n MessageTime,\n StyledUserMessage,\n} from './UserMessage.styles';\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}\n\n/**\n * UserMessage component displays a user's message in a chat interface.\n * Styled with right alignment and distinct styling from assistant messages.\n */\nexport const UserMessage = ({\n content,\n timestamp,\n className,\n avatarUrl,\n username,\n}: UserMessageProps) => {\n return (\n <StyledUserMessage className={className}>\n <MessageBubble>\n {username && <strong>{username}</strong>}\n <MessageContent>{content}</MessageContent>\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n </MessageBubble>\n {avatarUrl && (\n <img\n src={avatarUrl}\n alt={username || 'User'}\n style={{ width: '32px', height: '32px', borderRadius: '50%', marginLeft: '8px' }}\n />\n )}\n </StyledUserMessage>\n );\n};\n","import styled, { css } from 'styled-components';\n\nexport const SuggestionsContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ theme }) => theme?.spacing?.sm ?? '8px'};\n padding: ${({ theme }) => theme?.spacing?.md ?? '16px'} 0;\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\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","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 background-color: #1c1c1e;\n border-radius: 0;\n box-shadow: none;\n overflow: hidden;\n transition: all 300ms 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"]}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ var styledComponents = require('styled-components');
4
+
5
+ // src/theme/tokens.ts
6
+ var tokens = {
7
+ colors: {
8
+ primary: { light: "#0066FF", dark: "#4D94FF" },
9
+ surface: { light: "#FFFFFF", dark: "#1A1A1A" },
10
+ text: { light: "#000000", dark: "#FFFFFF" },
11
+ border: { light: "#E0E0E0", dark: "#333333" }
12
+ },
13
+ spacing: { xs: "4px", sm: "8px", md: "16px", lg: "24px", xl: "32px" },
14
+ radii: { sm: "4px", md: "8px", lg: "12px" },
15
+ fonts: { body: "system-ui, sans-serif", mono: "monospace" }
16
+ };
17
+
18
+ // src/theme/darkTheme.ts
19
+ var darkTheme = {
20
+ name: "dark",
21
+ colors: {
22
+ primary: tokens.colors.primary.dark,
23
+ surface: tokens.colors.surface.dark,
24
+ text: tokens.colors.text.dark,
25
+ border: tokens.colors.border.dark
26
+ },
27
+ spacing: tokens.spacing,
28
+ radii: tokens.radii,
29
+ fonts: tokens.fonts
30
+ };
31
+ var GlobalStyle = styledComponents.createGlobalStyle`
32
+ *,
33
+ *::before,
34
+ *::after {
35
+ box-sizing: border-box;
36
+ }
37
+
38
+ body {
39
+ margin: 0;
40
+ padding: 0;
41
+ font-family: ${({ theme }) => theme.fonts.body};
42
+ color: ${({ theme }) => theme.colors.text};
43
+ background-color: ${({ theme }) => theme.colors.surface};
44
+ -webkit-font-smoothing: antialiased;
45
+ -moz-osx-font-smoothing: grayscale;
46
+ }
47
+
48
+ button {
49
+ font-family: inherit;
50
+ }
51
+ `;
52
+
53
+ // src/theme/lightTheme.ts
54
+ var lightTheme = {
55
+ name: "light",
56
+ colors: {
57
+ primary: tokens.colors.primary.light,
58
+ surface: tokens.colors.surface.light,
59
+ text: tokens.colors.text.light,
60
+ border: tokens.colors.border.light
61
+ },
62
+ spacing: tokens.spacing,
63
+ radii: tokens.radii,
64
+ fonts: tokens.fonts
65
+ };
66
+
67
+ exports.GlobalStyle = GlobalStyle;
68
+ exports.darkTheme = darkTheme;
69
+ exports.lightTheme = lightTheme;
70
+ exports.tokens = tokens;
71
+ //# sourceMappingURL=chunk-CVHHTWDQ.cjs.map
72
+ //# sourceMappingURL=chunk-CVHHTWDQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/darkTheme.ts","../src/theme/GlobalStyle.tsx","../src/theme/lightTheme.ts"],"names":["createGlobalStyle"],"mappings":";;;;;AAAO,IAAM,MAAA,GAAS;AAAA,EACpB,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,IAC7C,OAAA,EAAS,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,IAC7C,IAAA,EAAM,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,IAC1C,MAAA,EAAQ,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,SAAA;AAAU,GAC9C;AAAA,EACA,OAAA,EAAS,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAO;AAAA,EACpE,OAAO,EAAE,EAAA,EAAI,OAAO,EAAA,EAAI,KAAA,EAAO,IAAI,MAAA,EAAO;AAAA,EAC1C,KAAA,EAAO,EAAE,IAAA,EAAM,uBAAA,EAAyB,MAAM,WAAA;AAChD;;;ACRO,IAAM,SAAA,GAAY;AAAA,EACvB,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAA,IAC/B,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAA,IAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAA;AAAA,IACzB,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO;AAAA,GAC/B;AAAA,EACA,SAAS,MAAA,CAAO,OAAA;AAAA,EAChB,OAAO,MAAA,CAAO,KAAA;AAAA,EACd,OAAO,MAAA,CAAO;AAChB;ACXO,IAAM,WAAA,GAAcA,kCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,iBAAA,EAUR,CAAC,EAAE,KAAA,EAAM,KAAM,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,WAAA,EACrC,CAAC,EAAE,KAAA,EAAM,KAAM,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,sBAAA,EACrB,CAAC,EAAE,KAAA,EAAM,KAAM,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;ACZpD,IAAM,UAAA,GAAa;AAAA,EACxB,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA;AAAA,IAC/B,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA;AAAA,IAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA;AAAA,IACzB,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO;AAAA,GAC/B;AAAA,EACA,SAAS,MAAA,CAAO,OAAA;AAAA,EAChB,OAAO,MAAA,CAAO,KAAA;AAAA,EACd,OAAO,MAAA,CAAO;AAChB","file":"chunk-CVHHTWDQ.cjs","sourcesContent":["export const tokens = {\n colors: {\n primary: { light: '#0066FF', dark: '#4D94FF' },\n surface: { light: '#FFFFFF', dark: '#1A1A1A' },\n text: { light: '#000000', dark: '#FFFFFF' },\n border: { light: '#E0E0E0', dark: '#333333' },\n },\n spacing: { xs: '4px', sm: '8px', md: '16px', lg: '24px', xl: '32px' },\n radii: { sm: '4px', md: '8px', lg: '12px' },\n fonts: { body: 'system-ui, sans-serif', mono: 'monospace' },\n};\n","import { tokens } from './tokens';\n\nexport const darkTheme = {\n name: 'dark',\n colors: {\n primary: tokens.colors.primary.dark,\n surface: tokens.colors.surface.dark,\n text: tokens.colors.text.dark,\n border: tokens.colors.border.dark,\n },\n spacing: tokens.spacing,\n radii: tokens.radii,\n fonts: tokens.fonts,\n};\n","import { createGlobalStyle } from 'styled-components';\n\nexport const GlobalStyle = createGlobalStyle`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n body {\n margin: 0;\n padding: 0;\n font-family: ${({ theme }) => theme.fonts.body};\n color: ${({ theme }) => theme.colors.text};\n background-color: ${({ theme }) => theme.colors.surface};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n button {\n font-family: inherit;\n }\n`;\n","import { tokens } from './tokens';\n\nexport const lightTheme = {\n name: 'light',\n colors: {\n primary: tokens.colors.primary.light,\n surface: tokens.colors.surface.light,\n text: tokens.colors.text.light,\n border: tokens.colors.border.light,\n },\n spacing: tokens.spacing,\n radii: tokens.radii,\n fonts: tokens.fonts,\n};\n"]}