{"version":3,"file":"ai-chat-room-components.mjs","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/components/base/Avatar/Avatar.tsx","../src/components/base/Button/Button.tsx","../src/utils/file.ts","../src/components/base/MessageBubble/MessageBubble.tsx","../src/components/composite/ChatInputArea/ChatInputArea.tsx","../src/components/base/FileUpload/FileUpload.tsx","../src/components/composite/ChatMessage/ChatMessage.tsx","../src/components/composite/ChatMessagesList/ChatMessagesList.tsx","../src/utils/format.ts","../src/utils/constants.ts","../src/components/composite/ConversationItem/ConversationItem.tsx","../src/components/features/AIChatRoom/AIChatRoom.tsx","../src/components/features/ConversationList/ConversationList.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n  REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n  var key = null;\n  void 0 !== maybeKey && (key = \"\" + maybeKey);\n  void 0 !== config.key && (key = \"\" + config.key);\n  if (\"key\" in config) {\n    maybeKey = {};\n    for (var propName in config)\n      \"key\" !== propName && (maybeKey[propName] = config[propName]);\n  } else maybeKey = config;\n  config = maybeKey.ref;\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key,\n    ref: void 0 !== config ? config : null,\n    props: maybeKey\n  };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n  (function () {\n    function getComponentNameFromType(type) {\n      if (null == type) return null;\n      if (\"function\" === typeof type)\n        return type.$$typeof === REACT_CLIENT_REFERENCE\n          ? null\n          : type.displayName || type.name || null;\n      if (\"string\" === typeof type) return type;\n      switch (type) {\n        case REACT_FRAGMENT_TYPE:\n          return \"Fragment\";\n        case REACT_PROFILER_TYPE:\n          return \"Profiler\";\n        case REACT_STRICT_MODE_TYPE:\n          return \"StrictMode\";\n        case REACT_SUSPENSE_TYPE:\n          return \"Suspense\";\n        case REACT_SUSPENSE_LIST_TYPE:\n          return \"SuspenseList\";\n        case REACT_ACTIVITY_TYPE:\n          return \"Activity\";\n      }\n      if (\"object\" === typeof type)\n        switch (\n          (\"number\" === typeof type.tag &&\n            console.error(\n              \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n            ),\n          type.$$typeof)\n        ) {\n          case REACT_PORTAL_TYPE:\n            return \"Portal\";\n          case REACT_CONTEXT_TYPE:\n            return (type.displayName || \"Context\") + \".Provider\";\n          case REACT_CONSUMER_TYPE:\n            return (type._context.displayName || \"Context\") + \".Consumer\";\n          case REACT_FORWARD_REF_TYPE:\n            var innerType = type.render;\n            type = type.displayName;\n            type ||\n              ((type = innerType.displayName || innerType.name || \"\"),\n              (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n            return type;\n          case REACT_MEMO_TYPE:\n            return (\n              (innerType = type.displayName || null),\n              null !== innerType\n                ? innerType\n                : getComponentNameFromType(type.type) || \"Memo\"\n            );\n          case REACT_LAZY_TYPE:\n            innerType = type._payload;\n            type = type._init;\n            try {\n              return getComponentNameFromType(type(innerType));\n            } catch (x) {}\n        }\n      return null;\n    }\n    function testStringCoercion(value) {\n      return \"\" + value;\n    }\n    function checkKeyStringCoercion(value) {\n      try {\n        testStringCoercion(value);\n        var JSCompiler_inline_result = !1;\n      } catch (e) {\n        JSCompiler_inline_result = !0;\n      }\n      if (JSCompiler_inline_result) {\n        JSCompiler_inline_result = console;\n        var JSCompiler_temp_const = JSCompiler_inline_result.error;\n        var JSCompiler_inline_result$jscomp$0 =\n          (\"function\" === typeof Symbol &&\n            Symbol.toStringTag &&\n            value[Symbol.toStringTag]) ||\n          value.constructor.name ||\n          \"Object\";\n        JSCompiler_temp_const.call(\n          JSCompiler_inline_result,\n          \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n          JSCompiler_inline_result$jscomp$0\n        );\n        return testStringCoercion(value);\n      }\n    }\n    function getTaskName(type) {\n      if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n      if (\n        \"object\" === typeof type &&\n        null !== type &&\n        type.$$typeof === REACT_LAZY_TYPE\n      )\n        return \"<...>\";\n      try {\n        var name = getComponentNameFromType(type);\n        return name ? \"<\" + name + \">\" : \"<...>\";\n      } catch (x) {\n        return \"<...>\";\n      }\n    }\n    function getOwner() {\n      var dispatcher = ReactSharedInternals.A;\n      return null === dispatcher ? null : dispatcher.getOwner();\n    }\n    function UnknownOwner() {\n      return Error(\"react-stack-top-frame\");\n    }\n    function hasValidKey(config) {\n      if (hasOwnProperty.call(config, \"key\")) {\n        var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n        if (getter && getter.isReactWarning) return !1;\n      }\n      return void 0 !== config.key;\n    }\n    function defineKeyPropWarningGetter(props, displayName) {\n      function warnAboutAccessingKey() {\n        specialPropKeyWarningShown ||\n          ((specialPropKeyWarningShown = !0),\n          console.error(\n            \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n            displayName\n          ));\n      }\n      warnAboutAccessingKey.isReactWarning = !0;\n      Object.defineProperty(props, \"key\", {\n        get: warnAboutAccessingKey,\n        configurable: !0\n      });\n    }\n    function elementRefGetterWithDeprecationWarning() {\n      var componentName = getComponentNameFromType(this.type);\n      didWarnAboutElementRef[componentName] ||\n        ((didWarnAboutElementRef[componentName] = !0),\n        console.error(\n          \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n        ));\n      componentName = this.props.ref;\n      return void 0 !== componentName ? componentName : null;\n    }\n    function ReactElement(\n      type,\n      key,\n      self,\n      source,\n      owner,\n      props,\n      debugStack,\n      debugTask\n    ) {\n      self = props.ref;\n      type = {\n        $$typeof: REACT_ELEMENT_TYPE,\n        type: type,\n        key: key,\n        props: props,\n        _owner: owner\n      };\n      null !== (void 0 !== self ? self : null)\n        ? Object.defineProperty(type, \"ref\", {\n            enumerable: !1,\n            get: elementRefGetterWithDeprecationWarning\n          })\n        : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n      type._store = {};\n      Object.defineProperty(type._store, \"validated\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: 0\n      });\n      Object.defineProperty(type, \"_debugInfo\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: null\n      });\n      Object.defineProperty(type, \"_debugStack\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: debugStack\n      });\n      Object.defineProperty(type, \"_debugTask\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: debugTask\n      });\n      Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n      return type;\n    }\n    function jsxDEVImpl(\n      type,\n      config,\n      maybeKey,\n      isStaticChildren,\n      source,\n      self,\n      debugStack,\n      debugTask\n    ) {\n      var children = config.children;\n      if (void 0 !== children)\n        if (isStaticChildren)\n          if (isArrayImpl(children)) {\n            for (\n              isStaticChildren = 0;\n              isStaticChildren < children.length;\n              isStaticChildren++\n            )\n              validateChildKeys(children[isStaticChildren]);\n            Object.freeze && Object.freeze(children);\n          } else\n            console.error(\n              \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n            );\n        else validateChildKeys(children);\n      if (hasOwnProperty.call(config, \"key\")) {\n        children = getComponentNameFromType(type);\n        var keys = Object.keys(config).filter(function (k) {\n          return \"key\" !== k;\n        });\n        isStaticChildren =\n          0 < keys.length\n            ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n            : \"{key: someKey}\";\n        didWarnAboutKeySpread[children + isStaticChildren] ||\n          ((keys =\n            0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n          console.error(\n            'A props object containing a \"key\" prop is being spread into JSX:\\n  let props = %s;\\n  <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n  let props = %s;\\n  <%s key={someKey} {...props} />',\n            isStaticChildren,\n            children,\n            keys,\n            children\n          ),\n          (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n      }\n      children = null;\n      void 0 !== maybeKey &&\n        (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n      hasValidKey(config) &&\n        (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n      if (\"key\" in config) {\n        maybeKey = {};\n        for (var propName in config)\n          \"key\" !== propName && (maybeKey[propName] = config[propName]);\n      } else maybeKey = config;\n      children &&\n        defineKeyPropWarningGetter(\n          maybeKey,\n          \"function\" === typeof type\n            ? type.displayName || type.name || \"Unknown\"\n            : type\n        );\n      return ReactElement(\n        type,\n        children,\n        self,\n        source,\n        getOwner(),\n        maybeKey,\n        debugStack,\n        debugTask\n      );\n    }\n    function validateChildKeys(node) {\n      \"object\" === typeof node &&\n        null !== node &&\n        node.$$typeof === REACT_ELEMENT_TYPE &&\n        node._store &&\n        (node._store.validated = 1);\n    }\n    var React = require(\"react\"),\n      REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n      REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n      REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n      REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n      REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\");\n    Symbol.for(\"react.provider\");\n    var REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n      REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n      REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n      REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n      REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n      REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n      REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n      REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n      REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n      ReactSharedInternals =\n        React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n      hasOwnProperty = Object.prototype.hasOwnProperty,\n      isArrayImpl = Array.isArray,\n      createTask = console.createTask\n        ? console.createTask\n        : function () {\n            return null;\n          };\n    React = {\n      \"react-stack-bottom-frame\": function (callStackForError) {\n        return callStackForError();\n      }\n    };\n    var specialPropKeyWarningShown;\n    var didWarnAboutElementRef = {};\n    var unknownOwnerDebugStack = React[\"react-stack-bottom-frame\"].bind(\n      React,\n      UnknownOwner\n    )();\n    var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n    var didWarnAboutKeySpread = {};\n    exports.Fragment = REACT_FRAGMENT_TYPE;\n    exports.jsx = function (type, config, maybeKey, source, self) {\n      var trackActualOwner =\n        1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n      return jsxDEVImpl(\n        type,\n        config,\n        maybeKey,\n        !1,\n        source,\n        self,\n        trackActualOwner\n          ? Error(\"react-stack-top-frame\")\n          : unknownOwnerDebugStack,\n        trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n      );\n    };\n    exports.jsxs = function (type, config, maybeKey, source, self) {\n      var trackActualOwner =\n        1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n      return jsxDEVImpl(\n        type,\n        config,\n        maybeKey,\n        !0,\n        source,\n        self,\n        trackActualOwner\n          ? Error(\"react-stack-top-frame\")\n          : unknownOwnerDebugStack,\n        trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n      );\n    };\n  })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react';\nimport './Avatar.scss';\n\ninterface AvatarProps {\n  src?: string; // Made optional for icon-only avatars\n  alt: string;\n  size?: 'small' | 'medium' | 'large';\n  shape?: 'circle' | 'square';\n  gradient?: 'primary' | 'secondary'; // New prop for gradient background\n  children?: React.ReactNode; // Allow children for icon avatars\n}\n\nconst Avatar: React.FC<AvatarProps> = React.memo(\n  ({ src, alt, size = 'medium', shape = 'circle', gradient, children }) => {\n    const gradientClass = gradient ? `avatar--${gradient}-gradient` : '';\n\n    return (\n      <div\n        className={`avatar avatar--${size} avatar--${shape} ${gradientClass}`}\n        role=\"img\"\n        aria-label={alt}\n      >\n        {src ? (\n          <img src={src} alt={alt} />\n        ) : (\n          children // Render children (e.g., an icon) if no src is provided\n        )}\n      </div>\n    );\n  }\n);\n\nexport default Avatar;\n","import React from 'react';\nimport './Button.scss';\n\ninterface ButtonProps {\n  onClick: () => void;\n  children: React.ReactNode;\n  variant?: 'primary' | 'secondary';\n  disabled?: boolean;\n  type?: 'button' | 'submit' | 'reset';\n  isCircle?: boolean; // New prop for circular buttons\n  className?: string; // Additional CSS classes\n}\n\nconst Button: React.FC<ButtonProps> = ({\n  onClick,\n  children,\n  variant = 'primary',\n  disabled = false,\n  type = 'button',\n  isCircle = false,\n  className = '',\n}) => {\n  const buttonClass = isCircle ? 'button--circle' : `button--${variant}`;\n  const fullClassName = `button ${buttonClass} ${className}`.trim();\n\n  return (\n    <button type={type} className={fullClassName} onClick={onClick} disabled={disabled}>\n      {children}\n    </button>\n  );\n};\n\nexport default Button;\n","// [!] 文件处理工具函数\n\n/**\n * 获取文件图标类名\n * @param fileName 文件名\n * @returns FontAwesome图标类名\n */\nexport const getFileIcon = (fileName: string): string => {\n  const extension = fileName.split('.').pop()?.toLowerCase();\n\n  switch (extension) {\n    case 'pdf':\n      return 'fas fa-file-pdf';\n    case 'xlsx':\n    case 'xls':\n      return 'fas fa-file-excel';\n    case 'docx':\n    case 'doc':\n      return 'fas fa-file-word';\n    case 'pptx':\n    case 'ppt':\n      return 'fas fa-file-powerpoint';\n    case 'jpg':\n    case 'jpeg':\n    case 'png':\n    case 'gif':\n    case 'bmp':\n    case 'svg':\n    case 'webp':\n      return 'fas fa-file-image';\n    case 'mp4':\n    case 'avi':\n    case 'mov':\n    case 'wmv':\n    case 'flv':\n      return 'fas fa-file-video';\n    case 'mp3':\n    case 'wav':\n    case 'flac':\n    case 'aac':\n      return 'fas fa-file-audio';\n    case 'zip':\n    case 'rar':\n    case '7z':\n    case 'tar':\n    case 'gz':\n      return 'fas fa-file-archive';\n    case 'txt':\n    case 'md':\n      return 'fas fa-file-alt';\n    case 'js':\n    case 'ts':\n    case 'jsx':\n    case 'tsx':\n    case 'html':\n    case 'css':\n    case 'scss':\n    case 'json':\n    case 'xml':\n    case 'py':\n    case 'java':\n    case 'cpp':\n    case 'c':\n      return 'fas fa-file-code';\n    default:\n      return 'fas fa-file';\n  }\n};\n\n/**\n * 格式化文件大小\n * @param bytes 字节数\n * @returns 格式化后的文件大小字符串\n */\nexport const formatFileSize = (bytes: number): string => {\n  if (bytes === 0) return '0 B';\n\n  const k = 1024;\n  const sizes = ['B', 'KB', 'MB', 'GB'];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n};\n\n/**\n * 验证文件类型\n * @param file 文件对象\n * @param acceptedTypes 接受的文件类型\n * @returns 是否为有效文件类型\n */\nexport const validateFileType = (file: File, acceptedTypes: string): boolean => {\n  if (!acceptedTypes) return true;\n\n  const types = acceptedTypes.split(',').map(type => type.trim());\n  return types.some(type => {\n    if (type.startsWith('.')) {\n      return file.name.toLowerCase().endsWith(type.toLowerCase());\n    }\n    return file.type.match(type);\n  });\n};\n","import React from 'react';\nimport type { MessageBubbleProps } from './interfaces';\nimport { getFileIcon, formatFileSize } from '../../../utils/file';\nimport './MessageBubble.scss';\n\nconst MessageBubble: React.FC<MessageBubbleProps> = React.memo(\n  ({ id, content, sender, type = 'text', isLoading, files }) => {\n    const renderContent = () => {\n      switch (type) {\n        case 'image':\n          return <img src={content as string} alt=\"\" />;\n        case 'code':\n          return (\n            <pre>\n              <code>{content as string}</code>\n            </pre>\n          );\n        case 'text':\n        default:\n          return <p>{content}</p>;\n      }\n    };\n\n    return (\n      <div className={`message-bubble ${sender} message-bubble--${type}`} key={id}>\n        {renderContent()}\n        {files && files.length > 0 && (\n          <div className=\"file-attachments\">\n            {files.map(file => (\n              <div key={file.id} className=\"file-attachment\">\n                <div className=\"file-icon\">\n                  <i className={getFileIcon(file.name)}></i>\n                </div>\n                <div className=\"file-info\">\n                  <div className=\"file-name\">{file.name}</div>\n                  <div className=\"file-size\">{formatFileSize(file.size)}</div>\n                </div>\n              </div>\n            ))}\n          </div>\n        )}\n        {isLoading && <span className=\"loading-indicator\">...</span>}{' '}\n        {/* Simple loading indicator */}\n      </div>\n    );\n  }\n);\n\nexport default MessageBubble;\n","import React, { useState, useRef } from 'react';\nimport { v4 as uuid } from 'uuid';\nimport Button from '../../base/Button/Button';\nimport type { UploadedFile } from '../../base/FileUpload/interfaces';\nimport { getFileIcon, formatFileSize } from '../../../utils/file';\nimport './ChatInputArea.scss';\n\ninterface ChatInputAreaProps {\n  onSendMessage: (message: string, files: UploadedFile[]) => void;\n  isSending?: boolean;\n  placeholder?: string;\n  onFilesChange?: (files: UploadedFile[]) => void;\n}\n\nconst ChatInputArea: React.FC<ChatInputAreaProps> = ({\n  onSendMessage,\n  isSending = false,\n  placeholder = '输入消息...',\n  onFilesChange,\n}) => {\n  const [inputValue, setInputValue] = useState('');\n  const [files, setFiles] = useState<UploadedFile[]>([]);\n  const fileInputRef = useRef<HTMLInputElement>(null); // Ref for the hidden file input\n\n  const handleFilesChange = (newFiles: UploadedFile[]) => {\n    setFiles(newFiles);\n    if (onFilesChange) {\n      onFilesChange(newFiles);\n    }\n  };\n\n  const handleSubmit = (e: React.FormEvent) => {\n    e.preventDefault();\n    if (inputValue.trim() || files.length > 0) {\n      onSendMessage(inputValue.trim(), files);\n      setInputValue('');\n      setFiles([]);\n    }\n  };\n\n  const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n    if (e.key === 'Enter' && !e.shiftKey) {\n      e.preventDefault();\n      handleSubmit(e as unknown as React.FormEvent); // Cast to FormEvent\n    }\n  };\n\n  return (\n    <form className=\"chat-input-area\" onSubmit={handleSubmit}>\n      <div className=\"input-container\">\n        <div className=\"input-toolbar\">\n          <Button isCircle onClick={() => fileInputRef.current?.click()} disabled={isSending}>\n            <i className=\"fas fa-paperclip\"></i>\n          </Button>\n        </div>\n\n        {/* Hidden file input for FileUpload component */}\n        <input\n          type=\"file\"\n          ref={fileInputRef}\n          multiple\n          accept=\"image/*,.pdf,.xlsx,.docx\"\n          onChange={e => {\n            const selectedFiles = Array.from(e.target.files || []);\n            const uploadedFiles: UploadedFile[] = selectedFiles.map(file =>\n              Object.assign(file, { id: uuid() })\n            );\n            // Append new files to existing files instead of replacing\n            handleFilesChange([...files, ...uploadedFiles]);\n            e.target.value = ''; // Clear input\n          }}\n          style={{ display: 'none' }}\n        />\n\n        {files.length > 0 && (\n          <div className=\"file-list\">\n            {' '}\n            {/* Display selected files here */}\n            {files.map(file => (\n              <div key={file.id} className=\"file-card\">\n                <span className=\"file-icon\">\n                  <i className={getFileIcon(file.name)}></i>\n                </span>\n                <div className=\"file-info\">\n                  <span className=\"file-name\">{file.name}</span>\n                  <span className=\"file-size\">{formatFileSize(file.size)}</span>\n                </div>\n                <button\n                  type=\"button\"\n                  className=\"file-remove-button\"\n                  onClick={() => handleFilesChange(files.filter(f => f.id !== file.id))}\n                  disabled={isSending}\n                >\n                  &times;\n                </button>\n              </div>\n            ))}\n          </div>\n        )}\n\n        <textarea\n          className=\"message-input\"\n          placeholder={placeholder}\n          value={inputValue}\n          onChange={e => setInputValue(e.target.value)}\n          onKeyDown={handleKeyDown}\n          aria-label=\"消息输入框\"\n          disabled={isSending}\n        />\n\n        <div className=\"input-actions\">\n          <div className=\"input-hints\">\n            <i className=\"fas fa-lightbulb\"></i> 按 Enter 发送，Shift + Enter 换行\n          </div>\n          <Button type=\"submit\" variant=\"primary\" disabled={isSending} onClick={() => {}}>\n            <i className=\"fas fa-paper-plane\"></i>\n            发送\n          </Button>\n        </div>\n      </div>\n    </form>\n  );\n};\n\nexport default ChatInputArea;\n","import React, { useRef, useState, useEffect } from 'react'; // Removed useMemo\nimport { v4 as uuid } from 'uuid';\nimport type { FileUploadProps, UploadedFile } from './interfaces'; // Changed to import type\nimport './FileUpload.scss';\n\nconst FileUpload: React.FC<FileUploadProps> = ({\n  onFilesChange,\n  acceptedFileTypes = 'image/*,.pdf,.xlsx,.docx',\n  maxFiles = 5,\n  value, // Controlled component value\n  disabled = false,\n}) => {\n  const fileInputRef = useRef<HTMLInputElement>(null);\n  const [internalFiles, setInternalFiles] = useState<UploadedFile[]>(value || []);\n\n  // Effect to keep internal state in sync with controlled 'value' prop\n  useEffect(() => {\n    if (value !== undefined) {\n      setInternalFiles(value);\n    }\n  }, [value]);\n\n  const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (disabled) return;\n\n    const selectedFiles = Array.from(event.target.files || []);\n    const newFiles: UploadedFile[] = [];\n\n    selectedFiles.forEach(file => {\n      if (internalFiles.length + newFiles.length < maxFiles) {\n        // Basic type validation\n        const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();\n        const isAccepted = acceptedFileTypes.split(',').some(type => {\n          type = type.trim().toLowerCase();\n          if (type.startsWith('.')) {\n            // Extension check\n            return fileExtension === type;\n          } else if (type.endsWith('/*')) {\n            // Wildcard MIME type\n            return file.type.startsWith(type.slice(0, -1));\n          }\n          return file.type === type; // Exact MIME type\n        });\n\n        if (isAccepted) {\n          const uploadedFile: UploadedFile = {\n            ...file,\n            id: uuid(),\n            ...(file.type.startsWith('image/') && { preview: URL.createObjectURL(file) }),\n          } as UploadedFile;\n          newFiles.push(uploadedFile);\n        } else {\n          console.warn(`File type not accepted: ${file.name} (${file.type})`);\n        }\n      } else {\n        console.warn(`Max files reached (${maxFiles}). Skipping ${file.name}.`);\n      }\n    });\n\n    const updatedFiles = [...internalFiles, ...newFiles];\n    setInternalFiles(updatedFiles);\n    onFilesChange?.(updatedFiles);\n\n    // Clear the input value to allow selecting the same file again\n    if (fileInputRef.current) {\n      fileInputRef.current.value = '';\n    }\n  };\n\n  const handleFileRemove = (id: string) => {\n    if (disabled) return;\n    const updatedFiles = internalFiles.filter(file => file.id !== id);\n    setInternalFiles(updatedFiles);\n    onFilesChange?.(updatedFiles);\n  };\n\n  const getFileIcon = (file: UploadedFile) => {\n    if (file.type.startsWith('image/')) return '🖼️';\n    if (file.type === 'application/pdf') return '📄';\n    if (\n      file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n      file.name.endsWith('.xlsx')\n    )\n      return '📊';\n    return '📎'; // Generic attachment icon\n  };\n\n  const formatFileSize = (bytes: number) => {\n    if (bytes === 0) return '0 Bytes';\n    const k = 1024;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n  };\n\n  const isMaxFilesReached = internalFiles.length >= maxFiles;\n\n  return (\n    <div className=\"file-upload-container\">\n      <input\n        type=\"file\"\n        ref={fileInputRef}\n        multiple\n        accept={acceptedFileTypes}\n        onChange={handleFileSelect}\n        disabled={disabled || isMaxFilesReached}\n        style={{ display: 'none' }} // Hide the default input\n      />\n      <button\n        type=\"button\"\n        className=\"file-upload-button\"\n        onClick={() => fileInputRef.current?.click()}\n        disabled={disabled || isMaxFilesReached}\n      >\n        {isMaxFilesReached ? 'Max files reached' : 'Select Files'}\n      </button>\n\n      {internalFiles.length > 0 && (\n        <div className=\"file-list\">\n          {internalFiles.map(file => (\n            <div key={file.id} className=\"file-card\">\n              <span className=\"file-icon\">{getFileIcon(file)}</span>\n              {file.preview && <img src={file.preview} alt=\"preview\" className=\"file-preview\" />}\n              <div className=\"file-info\">\n                <span className=\"file-name\">{file.name}</span>\n                <span className=\"file-size\">{formatFileSize(file.size)}</span>\n              </div>\n              <button\n                type=\"button\"\n                className=\"file-remove-button\"\n                onClick={() => handleFileRemove(file.id)}\n                disabled={disabled}\n              >\n                &times;\n              </button>\n            </div>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport default FileUpload;\n","import React from 'react';\nimport type { IMessage, IChatConfig } from '../../../types/chat';\nimport Avatar from '../../base/Avatar/Avatar';\nimport MessageBubble from '../../base/MessageBubble/MessageBubble';\nimport './ChatMessage.scss';\n\ninterface ChatMessageProps {\n  message: IMessage;\n  config?: IChatConfig;\n}\n\nconst ChatMessage: React.FC<ChatMessageProps> = React.memo(({ message, config }) => {\n  const isUser = message.sender === 'user';\n  const avatarSrc = isUser ? config?.userAvatar : config?.aiAvatar;\n  const avatarAlt = isUser ? 'User Avatar' : 'AI Avatar';\n  const avatarGradient = isUser ? 'primary' : 'secondary';\n\n  const formatTime = (timestamp: number) => {\n    const date = new Date(timestamp);\n    return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n  };\n\n  return (\n    <div className={`message-row ${isUser ? 'user' : ''}`}>\n      <Avatar\n        {...(avatarSrc && { src: avatarSrc })}\n        alt={avatarAlt}\n        size=\"medium\"\n        gradient={avatarGradient}\n      >\n        {/* Render icon if no src provided */}\n        {!avatarSrc && <i className={`fas fa-${isUser ? 'user' : 'robot'}`}></i>}\n      </Avatar>\n      <div className=\"message-content\">\n        <MessageBubble\n          id={message.id}\n          content={message.content}\n          sender={message.sender}\n          type={message.type || 'text'}\n          {...(message.isLoading !== undefined && { isLoading: message.isLoading })}\n          {...(message.files && { files: message.files })}\n        />\n        <div className=\"message-time\">{formatTime(message.timestamp)}</div>\n      </div>\n    </div>\n  );\n});\n\nexport default ChatMessage;\n","import React, { useRef, useEffect } from 'react';\nimport type { IMessage, IChatConfig } from '../../../types/chat';\nimport ChatMessage from '../ChatMessage/ChatMessage';\nimport './ChatMessagesList.scss';\n\ninterface ChatMessagesListProps {\n  messages: IMessage[];\n  config?: IChatConfig;\n  isLoadingMore?: boolean; // For future infinite scrolling\n}\n\nconst ChatMessagesList: React.FC<ChatMessagesListProps> = ({ messages, config, isLoadingMore }) => {\n  const messagesEndRef = useRef<HTMLDivElement>(null);\n\n  const scrollToBottom = () => {\n    messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n  };\n\n  useEffect(() => {\n    scrollToBottom();\n  }, [messages]); // Scroll to bottom when messages change\n\n  return (\n    <div className=\"chat-messages\">\n      {' '}\n      {/* Changed class name */}\n      {messages.map(message => (\n        <ChatMessage key={message.id} message={message} {...(config && { config })} />\n      ))}\n      {isLoadingMore && <div className=\"loading-more\">Loading more messages...</div>}\n      <div ref={messagesEndRef} /> {/* Scroll target */}\n    </div>\n  );\n};\n\nexport default ChatMessagesList;\n","// [!] 格式化工具函数\nimport dayjs from 'dayjs';\n\n/**\n * 格式化时间戳为可读时间\n * @param timestamp 时间戳\n * @param format 格式化模板，默认为 'HH:mm'\n * @returns 格式化后的时间字符串\n */\nexport const formatTime = (timestamp: number, format = 'HH:mm'): string => {\n  return dayjs(timestamp).format(format);\n};\n\n/**\n * 格式化相对时间\n * @param timestamp 时间戳\n * @returns 相对时间字符串（如：2分钟前）\n */\nexport const formatRelativeTime = (timestamp: number): string => {\n  const now = dayjs();\n  const target = dayjs(timestamp);\n  const diffInMinutes = now.diff(target, 'minute');\n\n  if (diffInMinutes < 1) return '刚刚';\n  if (diffInMinutes < 60) return `${diffInMinutes}分钟前`;\n\n  const diffInHours = now.diff(target, 'hour');\n  if (diffInHours < 24) return `${diffInHours}小时前`;\n\n  const diffInDays = now.diff(target, 'day');\n  if (diffInDays < 7) return `${diffInDays}天前`;\n\n  return target.format('YYYY-MM-DD');\n};\n\n/**\n * 截断文本并添加省略号\n * @param text 原始文本\n * @param maxLength 最大长度\n * @returns 截断后的文本\n */\nexport const truncateText = (text: string, maxLength: number): string => {\n  if (text.length <= maxLength) return text;\n  return text.substring(0, maxLength) + '...';\n};\n","// [!] 常量定义\n\n/**\n * 文件上传限制\n */\nexport const FILE_UPLOAD = {\n  MAX_SIZE: 10 * 1024 * 1024, // 10MB\n  MAX_FILES: 5,\n  ACCEPTED_TYPES: 'image/*,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.md',\n} as const;\n\n/**\n * 消息相关常量\n */\nexport const MESSAGE = {\n  MAX_LENGTH: 2000,\n  TYPING_DELAY: 1000, // 模拟AI输入延迟\n} as const;\n\n/**\n * UI相关常量\n */\nexport const UI = {\n  CONVERSATION_TITLE_MAX_LENGTH: 30,\n  MESSAGE_PREVIEW_MAX_LENGTH: 50,\n  ANIMATION_DURATION: 300,\n} as const;\n\n/**\n * 主题相关常量\n */\nexport const THEME = {\n  COLORS: {\n    PRIMARY: '#4D8EFF',\n    SECONDARY: '#00F0FF',\n    SUCCESS: '#28D193',\n    ERROR: '#FF4D7A',\n    WARNING: '#FFC84D',\n  },\n  BREAKPOINTS: {\n    MOBILE: '768px',\n    TABLET: '1024px',\n    DESKTOP: '1200px',\n  },\n} as const;\n","import React from 'react';\nimport type { IConversation } from '../../../types/conversation';\nimport { formatTime, truncateText } from '../../../utils/format';\nimport { UI } from '../../../utils/constants';\nimport './ConversationItem.scss';\n\ninterface ConversationItemProps {\n  conversation: IConversation;\n  isActive: boolean;\n  onClick: (id: string) => void;\n  // onDelete: (id: string) => void; // Removed\n}\n\nconst ConversationItem: React.FC<ConversationItemProps> = ({\n  conversation,\n  isActive,\n  onClick,\n  // onDelete, // Removed\n}) => {\n  // Use first message as title, fallback to original title\n  const conversationTitle =\n    conversation.messages.length > 0 && conversation.messages[0]\n      ? truncateText(conversation.messages[0].content, UI.CONVERSATION_TITLE_MAX_LENGTH)\n      : conversation.title;\n\n  const lastMessage = conversation.messages[conversation.messages.length - 1];\n  const lastMessageSnippet =\n    conversation.messages.length > 0 && lastMessage\n      ? truncateText(lastMessage.content, UI.MESSAGE_PREVIEW_MAX_LENGTH)\n      : 'No messages yet.';\n\n  const formattedLastUpdated = formatTime(conversation.lastUpdated);\n\n  return (\n    <div\n      className={`conversation-item ${isActive ? 'active' : ''}`}\n      onClick={() => onClick(conversation.id)}\n    >\n      <div className=\"conversation-info\">\n        <div className=\"conversation-title\">\n          <span>{conversationTitle}</span>\n          <span className=\"conversation-time\">{formattedLastUpdated}</span>\n        </div>\n        <div className=\"conversation-preview\">{lastMessageSnippet}</div>\n      </div>\n      {/* Conditionally render badge if needed, e.g., for unread messages */}\n      {/* <div className=\"conversation-badge\"></div> */}\n    </div>\n  );\n};\n\nexport default ConversationItem;\n","import React, { useState } from 'react';\nimport type { IMessage, IChatConfig } from '../../../types/chat';\nimport type { UploadedFile } from '../../base/FileUpload/interfaces';\nimport ChatMessagesList from '../../composite/ChatMessagesList/ChatMessagesList';\nimport ChatInputArea from '../../composite/ChatInputArea/ChatInputArea';\nimport './AIChatRoom.scss';\n\ninterface AIChatRoomProps {\n  messages: IMessage[];\n  onSendMessage: (message: string, files: UploadedFile[]) => void;\n  isAITyping?: boolean;\n  config?: IChatConfig;\n  conversationTitle?: string;\n}\n\nconst AIChatRoom: React.FC<AIChatRoomProps> = ({\n  messages,\n  onSendMessage,\n  isAITyping = false,\n  config,\n  conversationTitle,\n}) => {\n  const [isSending, setIsSending] = useState(false);\n\n  const handleSendMessage = async (message: string, files: UploadedFile[]) => {\n    setIsSending(true);\n    await onSendMessage(message, files);\n    setIsSending(false);\n  };\n\n  return (\n    <div className=\"chat-container\">\n      {' '}\n      {/* Changed class name */}\n      <div className=\"chat-header\">\n        <div className=\"chat-title\">{conversationTitle || '新对话'}</div>\n      </div>\n      <ChatMessagesList messages={messages} {...(config && { config })} />\n      <ChatInputArea\n        onSendMessage={handleSendMessage}\n        isSending={isSending || isAITyping}\n        placeholder=\"输入消息...\"\n      />\n    </div>\n  );\n};\n\nexport default AIChatRoom;\n","import React, { useState, useMemo } from 'react';\nimport type { IConversation } from '../../../types/conversation';\nimport ConversationItem from '../../composite/ConversationItem/ConversationItem';\nimport Button from '../../base/Button/Button';\nimport './ConversationList.scss';\n\ninterface ConversationListProps {\n  conversations: IConversation[];\n  activeConversationId: string | null;\n  onSelectConversation: (id: string) => void;\n  onNewConversation: () => void;\n}\n\nconst ConversationList: React.FC<ConversationListProps> = ({\n  conversations,\n  activeConversationId,\n  onSelectConversation,\n  onNewConversation,\n}) => {\n  const [searchQuery, setSearchQuery] = useState('');\n\n  const filteredConversations = useMemo(() => {\n    if (!searchQuery) {\n      return conversations;\n    }\n    const lowerCaseQuery = searchQuery.toLowerCase();\n    return conversations.filter(\n      conv =>\n        conv.title.toLowerCase().includes(lowerCaseQuery) ||\n        conv.messages.some(msg => msg.content.toLowerCase().includes(lowerCaseQuery))\n    );\n  }, [conversations, searchQuery]);\n\n  return (\n    <div className=\"conversations-panel\">\n      {' '}\n      {/* Changed class name */}\n      <div className=\"panel-header\">\n        {' '}\n        {/* New header structure */}\n        <div className=\"panel-title\">\n          <i className=\"fas fa-comments\"></i>\n          对话列表\n          <Button isCircle onClick={onNewConversation} className=\"new-conversation-btn\">\n            <i className=\"fas fa-plus\"></i>\n          </Button>\n        </div>\n        <div className=\"search-container\">\n          <i className=\"fas fa-search search-icon\"></i>\n          <input\n            type=\"text\"\n            className=\"search-input\"\n            placeholder=\"搜索对话...\"\n            value={searchQuery}\n            onChange={e => setSearchQuery(e.target.value)}\n          />\n        </div>\n      </div>\n      <div className=\"conversation-list\">\n        {' '}\n        {/* Changed class name */}\n        {filteredConversations.length > 0 ? (\n          filteredConversations.map(conv => (\n            <ConversationItem\n              key={conv.id}\n              conversation={conv}\n              isActive={conv.id === activeConversationId}\n              onClick={onSelectConversation}\n            />\n          ))\n        ) : (\n          <div className=\"conversation-list__empty\">No conversations found.</div>\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport default ConversationList;\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","self","source","owner","debugStack","debugTask","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","Avatar","src","alt","size","shape","gradient","gradientClass","jsx","Button","onClick","variant","disabled","isCircle","className","fullClassName","getFileIcon","fileName","formatFileSize","bytes","sizes","MessageBubble","id","content","sender","isLoading","files","renderContent","file","jsxs","ChatInputArea","onSendMessage","isSending","placeholder","onFilesChange","inputValue","setInputValue","useState","setFiles","fileInputRef","useRef","handleFilesChange","newFiles","handleSubmit","e","handleKeyDown","uploadedFiles","uuid","FileUpload","acceptedFileTypes","maxFiles","internalFiles","setInternalFiles","useEffect","handleFileSelect","event","selectedFiles","fileExtension","uploadedFile","updatedFiles","handleFileRemove","i","isMaxFilesReached","ChatMessage","message","isUser","avatarSrc","avatarAlt","avatarGradient","formatTime","timestamp","ChatMessagesList","messages","isLoadingMore","messagesEndRef","scrollToBottom","format","dayjs","truncateText","text","maxLength","UI","ConversationItem","conversation","isActive","conversationTitle","lastMessage","lastMessageSnippet","formattedLastUpdated","AIChatRoom","isAITyping","setIsSending","handleSendMessage","ConversationList","conversations","activeConversationId","onSelectConversation","onNewConversation","searchQuery","setSearchQuery","filteredConversations","useMemo","lowerCaseQuery","conv","msg"],"mappings":"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","x_google_ignoreList":[0,1,2]}