{"version":3,"file":"Shell-BcgVQ9ib.cjs","names":["useComposerState","IconButton","Square","ArrowUp","useComposerState","IconButton","Square","ArrowUp","ShellStoreProvider","LayoutContextProvider","Lightbulb","Fragment","ArrowUp","isChatEmpty","Carousel","CarouselContent","useShellStore","IconButton","Menu","Plus","useShellStore","useLayoutContext","IconButton","PanelLeftClose","PanelLeftOpen","useShellStore","useLayoutContext","IconButton","SquarePen","Button","useLayoutContext","useShellStore","ArtifactOverlay","ArtifactPortalTarget","MarkDownRenderer","ToolCallComponent","ToolResult","MessageLoadingComponent","Callout","MessageProvider","useTheme","useShellStore","useLayoutContext","DropdownMenu","IconButton","EllipsisVerticalIcon","Button","Trash2Icon","Fragment","isChatEmpty"],"sources":["../src/utils/contentParser.ts","../src/components/Shell/components/Composer.tsx","../src/components/Shell/components/DesktopWelcomeComposer.tsx","../src/hooks/useElementSize.ts","../src/components/Shell/Container.tsx","../src/components/Shell/ConversationStarter.tsx","../src/components/Shell/MobileHeader.tsx","../src/components/Shell/Sidebar.tsx","../src/components/Shell/NewChatButton.tsx","../src/components/Shell/ResizableSeparator.tsx","../src/components/Shell/useArtifactResize.ts","../src/components/Shell/Thread.tsx","../src/components/Shell/ThreadList.tsx","../src/components/Shell/WelcomeScreen.tsx"],"sourcesContent":["const openTag = (tag: string) => `<${tag}>`;\nconst closeTag = (tag: string) => `</${tag}>`;\n\nexport function wrapContent(text: string): string {\n  return `${openTag(\"content\")}${text}${closeTag(\"content\")}`;\n}\n\nexport function wrapContext(json: string): string {\n  return `${openTag(\"context\")}${json}${closeTag(\"context\")}`;\n}\n\n/**\n * Separate openui-lang code from <context> tag in a message.\n * Returns { content: the message/code, contextString: raw JSON or null }\n */\nexport function separateContentAndContext(raw: string): {\n  content: string;\n  contextString: string | null;\n} {\n  const contextMatch = raw.match(/<context>([\\s\\S]*)<\\/context>\\s*$/);\n  let content = raw;\n  let contextString: string | null = null;\n\n  if (contextMatch) {\n    contextString = contextMatch[1] ?? null;\n    content = raw.slice(0, contextMatch.index!).trimEnd();\n  }\n\n  const contentMatch = content.match(/^<content[^>]*>([\\s\\S]*)<\\/content>\\s*$/);\n  if (contentMatch) {\n    content = contentMatch[1] ?? content;\n  }\n\n  return { content, contextString };\n}\n","import { useThread } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport { ArrowUp, Square } from \"lucide-react\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport { useComposerState } from \"../../../hooks/useComposerState\";\nimport { IconButton } from \"../../IconButton\";\n\nexport interface ComposerProps {\n  className?: string;\n  placeholder?: string;\n}\n\nexport const Composer = ({ className, placeholder = \"Type your query here\" }: ComposerProps) => {\n  const { textContent, setTextContent } = useComposerState();\n  const processMessage = useThread((s) => s.processMessage);\n  const cancelMessage = useThread((s) => s.cancelMessage);\n  const isRunning = useThread((s) => s.isRunning);\n  const isLoadingMessages = useThread((s) => s.isLoadingMessages);\n  const inputRef = useRef<HTMLTextAreaElement>(null);\n\n  const handleSubmit = () => {\n    if (!textContent.trim() || isRunning || isLoadingMessages) {\n      return;\n    }\n\n    processMessage({\n      role: \"user\",\n      content: textContent,\n    });\n\n    setTextContent(\"\");\n  };\n\n  useLayoutEffect(() => {\n    const input = inputRef.current;\n    if (!input) return;\n\n    // Reset to 0 (not \"auto\") so scrollHeight reflects content, not container\n    input.style.height = \"0px\";\n    input.style.height = `${Math.max(input.scrollHeight, 24)}px`;\n  }, [textContent]);\n\n  return (\n    <div\n      className={clsx(\"openui-shell-thread-composer\", className)}\n      data-drafting={textContent.length > 0 || undefined}\n      onClick={(e) => {\n        if (!(e.target as HTMLElement).closest(\"button, a, [role='button']\")) {\n          inputRef.current?.focus();\n        }\n      }}\n    >\n      <div className=\"openui-shell-thread-composer__input-wrapper\">\n        <textarea\n          ref={inputRef}\n          value={textContent}\n          onChange={(e) => setTextContent(e.target.value)}\n          className=\"openui-shell-thread-composer__input\"\n          placeholder={placeholder}\n          rows={1}\n          onKeyDown={(e) => {\n            if (e.key === \"Enter\" && !e.shiftKey) {\n              e.preventDefault();\n              handleSubmit();\n            }\n          }}\n        />\n        <div className=\"openui-shell-thread-composer__action-bar\">\n          <IconButton\n            onClick={isRunning ? cancelMessage : handleSubmit}\n            icon={isRunning ? <Square size=\"1em\" fill=\"currentColor\" /> : <ArrowUp size=\"1em\" />}\n            size=\"extra-small\"\n            variant=\"primary\"\n            aria-label={isRunning ? \"Cancel message\" : \"Send message\"}\n            className=\"openui-shell-thread-composer__submit-button\"\n          />\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default Composer;\n","import { useThread } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport { ArrowUp, Square } from \"lucide-react\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport { useComposerState } from \"../../../hooks/useComposerState\";\nimport { IconButton } from \"../../IconButton\";\n\nexport interface DesktopWelcomeComposerProps {\n  className?: string;\n  placeholder?: string;\n}\n\nexport const DesktopWelcomeComposer = ({\n  className,\n  placeholder = \"Type your query here\",\n}: DesktopWelcomeComposerProps) => {\n  const { textContent, setTextContent } = useComposerState();\n  const processMessage = useThread((s) => s.processMessage);\n  const cancelMessage = useThread((s) => s.cancelMessage);\n  const isRunning = useThread((s) => s.isRunning);\n  const isLoadingMessages = useThread((s) => s.isLoadingMessages);\n  const inputRef = useRef<HTMLTextAreaElement>(null);\n\n  const handleSubmit = () => {\n    if (!textContent.trim() || isRunning || isLoadingMessages) {\n      return;\n    }\n\n    processMessage({\n      role: \"user\",\n      content: textContent,\n    });\n\n    setTextContent(\"\");\n  };\n\n  useLayoutEffect(() => {\n    const input = inputRef.current;\n    if (!input) return;\n\n    // Reset to 0 (not \"auto\") so scrollHeight reflects content, not container\n    input.style.height = \"0px\";\n    input.style.height = `${Math.max(input.scrollHeight, 24)}px`;\n  }, [textContent]);\n\n  return (\n    <div\n      className={clsx(\"openui-shell-desktop-welcome-composer\", className)}\n      data-drafting={textContent.length > 0 || undefined}\n    >\n      <textarea\n        ref={inputRef}\n        value={textContent}\n        onChange={(e) => setTextContent(e.target.value)}\n        className=\"openui-shell-desktop-welcome-composer__input\"\n        placeholder={placeholder}\n        rows={1}\n        onKeyDown={(e) => {\n          if (e.key === \"Enter\" && !e.shiftKey) {\n            e.preventDefault();\n            handleSubmit();\n          }\n        }}\n      />\n      <div className=\"openui-shell-desktop-welcome-composer__action-bar\">\n        <IconButton\n          onClick={isRunning ? cancelMessage : handleSubmit}\n          disabled={!textContent.trim() && !isRunning}\n          aria-label={isRunning ? \"Cancel\" : \"Send\"}\n          icon={isRunning ? <Square size=\"1em\" fill=\"currentColor\" /> : <ArrowUp size=\"1em\" />}\n          size=\"extra-small\"\n          variant=\"primary\"\n          className=\"openui-shell-desktop-welcome-composer__submit-button\"\n        />\n      </div>\n    </div>\n  );\n};\n\nexport default DesktopWelcomeComposer;\n","import { useEffect, useState } from \"react\";\n\nexport const useElementSize = ({ ref }: { ref: React.RefObject<HTMLElement | null> }) => {\n  const [size, setSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n\n  useEffect(() => {\n    if (!ref.current) {\n      return;\n    }\n    const element = ref.current;\n    const handleResize = () => {\n      setSize({ width: element.clientWidth, height: element.clientHeight });\n    };\n\n    const resizeObserver = new ResizeObserver(handleResize);\n    resizeObserver.observe(element);\n\n    handleResize();\n    return () => {\n      resizeObserver.disconnect();\n    };\n  }, [ref]);\n\n  return size;\n};\n","import clsx from \"clsx\";\nimport { useRef } from \"react\";\nimport { LayoutContextProvider } from \"../../context/LayoutContext\";\nimport { useElementSize } from \"../../hooks/useElementSize\";\nimport { ShellStoreProvider } from \"../_shared/store\";\n\ninterface ContainerProps {\n  children?: React.ReactNode;\n  logoUrl: string;\n  agentName: string;\n  className?: string;\n  showAssistantLogo?: boolean;\n}\n\nexport const Container = ({\n  children,\n  logoUrl,\n  agentName,\n  className,\n  showAssistantLogo = false,\n}: ContainerProps) => {\n  const ref = useRef<HTMLDivElement>(null);\n  const { width } = useElementSize({ ref }) || {};\n  // TODO: revisit this logic\n  const isMobile = width > 0 && width < 768;\n  const isFullScreen = width > 768;\n  const layout = isMobile ? \"mobile\" : isFullScreen ? \"fullscreen\" : \"tray\";\n\n  return (\n    <ShellStoreProvider\n      logoUrl={logoUrl}\n      agentName={agentName}\n      showAssistantLogo={showAssistantLogo}\n    >\n      <LayoutContextProvider layout={layout}>\n        <div\n          className={clsx(\n            \"openui-shell-container\",\n            {\n              \"openui-shell-container--mobile\": isMobile,\n            },\n            className,\n          )}\n          ref={ref}\n        >\n          {children}\n        </div>\n      </LayoutContextProvider>\n    </ShellStoreProvider>\n  );\n};\n","import { useThread } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport { ArrowUp, Lightbulb } from \"lucide-react\";\nimport { Fragment, ReactNode, isValidElement } from \"react\";\nimport { ConversationStarterIcon, ConversationStarterProps } from \"../../types/ConversationStarter\";\nimport { Carousel, CarouselContent } from \"../Carousel\";\nimport { isChatEmpty } from \"../_shared/utils\";\n\nexport type ConversationStarterVariant = \"short\" | \"long\";\n\ninterface ConversationStarterItemProps extends ConversationStarterProps {\n  onClick: (prompt: string) => void;\n  variant: ConversationStarterVariant;\n}\n\n/**\n * Renders the appropriate icon based on the icon prop value\n * - undefined: Show default lightbulb icon\n * - ReactNode: Show the provided icon (use <></> or React.Fragment for no icon)\n */\nconst renderIcon = (icon: ConversationStarterIcon | undefined): ReactNode => {\n  if (icon === undefined) {\n    return <Lightbulb size={16} />;\n  }\n  return icon;\n};\n\nconst hasRenderableIcon = (icon: ReactNode): boolean => {\n  if (icon === null || icon === undefined || icon === false) {\n    return false;\n  }\n\n  if (isValidElement<{ children?: ReactNode }>(icon) && icon.type === Fragment) {\n    return Boolean(icon.props.children);\n  }\n\n  return true;\n};\n\nconst ConversationStarterItem = ({\n  displayText,\n  prompt,\n  onClick,\n  variant,\n  icon,\n}: ConversationStarterItemProps) => {\n  const renderedIcon = renderIcon(icon);\n  const shouldRenderIcon = hasRenderableIcon(renderedIcon);\n\n  if (variant === \"short\") {\n    return (\n      <button\n        type=\"button\"\n        className=\"openui-shell-conversation-starter-item-short\"\n        onClick={() => onClick(prompt)}\n      >\n        {shouldRenderIcon && (\n          <span className=\"openui-shell-conversation-starter-item-short__icon\">{renderedIcon}</span>\n        )}\n        <span className=\"openui-shell-conversation-starter-item-short__text\">{displayText}</span>\n      </button>\n    );\n  }\n\n  // Long variant (detailed list style)\n  return (\n    <button\n      type=\"button\"\n      className=\"openui-shell-conversation-starter-item-long\"\n      onClick={() => onClick(prompt)}\n    >\n      <div className=\"openui-shell-conversation-starter-item-long__content\">\n        {shouldRenderIcon && (\n          <span className=\"openui-shell-conversation-starter-item-long__icon\">{renderedIcon}</span>\n        )}\n        <span className=\"openui-shell-conversation-starter-item-long__text\">{displayText}</span>\n      </div>\n      <span className=\"openui-shell-conversation-starter-item-long__arrow\">\n        <ArrowUp size={16} />\n      </span>\n    </button>\n  );\n};\n\nexport interface ConversationStarterContainerProps {\n  starters: ConversationStarterProps[];\n  className?: string;\n  /**\n   * Variant of the conversation starter\n   * - \"short\": Pill-style buttons that wrap (default)\n   * - \"long\": Vertical list items with icons and hover arrow\n   */\n  variant?: ConversationStarterVariant;\n}\n\nexport const ConversationStarter = ({\n  starters,\n  className,\n  variant = \"short\",\n}: ConversationStarterContainerProps) => {\n  const processMessage = useThread((s) => s.processMessage);\n  const isRunning = useThread((s) => s.isRunning);\n  const messages = useThread((s) => s.messages);\n  const isLoadingMessages = useThread((s) => s.isLoadingMessages);\n\n  const handleClick = (prompt: string) => {\n    if (isRunning) return;\n    processMessage({\n      role: \"user\",\n      content: prompt,\n    });\n  };\n\n  // Only show when there are no messages\n  if (!isChatEmpty({ isLoadingMessages, messages })) {\n    return null;\n  }\n\n  if (starters.length === 0) {\n    return null;\n  }\n\n  if (variant === \"short\") {\n    return (\n      <Carousel\n        showButtons={false}\n        className={clsx(\n          \"openui-shell-conversation-starter\",\n          \"openui-shell-conversation-starter--short\",\n          className,\n        )}\n      >\n        <CarouselContent className=\"openui-shell-conversation-starter__carousel-content\">\n          {starters.map((item, index) => (\n            <ConversationStarterItem\n              key={`${item.displayText}-${index}`}\n              displayText={item.displayText}\n              prompt={item.prompt}\n              icon={item.icon}\n              onClick={handleClick}\n              variant={variant}\n            />\n          ))}\n        </CarouselContent>\n      </Carousel>\n    );\n  }\n\n  return (\n    <div\n      className={clsx(\n        \"openui-shell-conversation-starter\",\n        `openui-shell-conversation-starter--${variant}`,\n        className,\n      )}\n    >\n      {starters.map((item, index) => (\n        <Fragment key={`${item.displayText}-${index}`}>\n          <ConversationStarterItem\n            displayText={item.displayText}\n            prompt={item.prompt}\n            icon={item.icon}\n            onClick={handleClick}\n            variant={variant}\n          />\n        </Fragment>\n      ))}\n    </div>\n  );\n};\n\nexport default ConversationStarter;\n","import { useThreadList } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport { Menu, Plus } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport { IconButton } from \"../IconButton\";\nimport { useShellStore } from \"../_shared/store\";\n\ninterface MobileHeaderProps {\n  className?: string;\n  rightChildren?: ReactNode;\n}\n\nexport const MobileHeader = ({ className, rightChildren }: MobileHeaderProps) => {\n  const switchToNewThread = useThreadList((s) => s.switchToNewThread);\n  const { logoUrl, agentName, setIsSidebarOpen } = useShellStore((state) => ({\n    logoUrl: state.logoUrl,\n    agentName: state.agentName,\n    setIsSidebarOpen: state.setIsSidebarOpen,\n  }));\n\n  return (\n    <div className={clsx(\"openui-shell-mobile-header\", className)}>\n      <IconButton\n        size=\"medium\"\n        icon={<Menu size=\"1em\" />}\n        onClick={() => setIsSidebarOpen(true)}\n        variant=\"secondary\"\n        aria-label=\"Open sidebar\"\n      />\n      <div className=\"openui-shell-mobile-header-logo-container\">\n        <img className=\"openui-shell-mobile-header-logo\" src={logoUrl} alt=\"Logo\" />\n        <span className=\"openui-shell-mobile-header-agent-name\">{agentName}</span>\n      </div>\n      <div className=\"openui-shell-mobile-header-actions\">\n        {rightChildren}\n        <IconButton\n          size=\"medium\"\n          icon={<Plus size=\"1em\" />}\n          onClick={switchToNewThread}\n          variant=\"secondary\"\n          aria-label=\"New chat\"\n        />\n      </div>\n    </div>\n  );\n};\n","import { useActiveArtifact } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport { PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport { createContext, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLayoutContext } from \"../../context/LayoutContext\";\nimport { IconButton } from \"../IconButton\";\nimport { useShellStore } from \"../_shared/store\";\n\nconst SIDEBAR_FADE_DURATION_MS = 90;\nconst SIDEBAR_RESIZE_DURATION_MS = 160;\n\ntype SidebarVisualState = \"expanded\" | \"collapsing\" | \"collapsed\" | \"expanding\";\n\nconst SidebarVisualStateContext = createContext<{\n  isCollapsedLayout: boolean;\n  visualState: SidebarVisualState;\n} | null>(null);\n\nexport const useOptionalSidebarVisualState = () => useContext(SidebarVisualStateContext);\n\nconst useSidebarVisualState = () => {\n  const context = useOptionalSidebarVisualState();\n  if (!context) {\n    throw new Error(\"useSidebarVisualState must be used within SidebarContainer\");\n  }\n  return context;\n};\n\nexport const SidebarContainer = ({\n  children,\n  className,\n}: {\n  children?: React.ReactNode;\n  className?: string;\n}) => {\n  const { isSidebarOpen, setIsSidebarOpen } = useShellStore((state) => ({\n    isSidebarOpen: state.isSidebarOpen,\n    setIsSidebarOpen: state.setIsSidebarOpen,\n  }));\n  const { isArtifactActive } = useActiveArtifact();\n  const { layout } = useLayoutContext() || {};\n  const isMobile = layout === \"mobile\";\n  const [isCollapsedLayout, setIsCollapsedLayout] = useState(!isSidebarOpen);\n  const [visualState, setVisualState] = useState<SidebarVisualState>(\n    isSidebarOpen ? \"expanded\" : \"collapsed\",\n  );\n  const animationTimeoutsRef = useRef<Array<ReturnType<typeof setTimeout>>>([]);\n  const previousIsMobileRef = useRef<boolean | null>(null);\n\n  const clearAnimationTimeouts = () => {\n    animationTimeoutsRef.current.forEach((timeoutId) => clearTimeout(timeoutId));\n    animationTimeoutsRef.current = [];\n  };\n\n  useEffect(() => {\n    return () => {\n      clearAnimationTimeouts();\n    };\n  }, []);\n\n  useEffect(() => {\n    clearAnimationTimeouts();\n\n    const justSwitchedLayout = previousIsMobileRef.current !== isMobile;\n    previousIsMobileRef.current = isMobile;\n\n    // On viewport breakpoint change, force sidebar open state and let the effect\n    // re-run with the new `isSidebarOpen` to drive the animation.\n    if (justSwitchedLayout) {\n      const targetOpen = !isMobile;\n      if (isSidebarOpen !== targetOpen) {\n        setIsSidebarOpen(targetOpen);\n        return;\n      }\n    }\n\n    if (isMobile) {\n      setIsCollapsedLayout(!isSidebarOpen);\n      setVisualState(isSidebarOpen ? \"expanded\" : \"collapsed\");\n      return;\n    }\n\n    if (isSidebarOpen) {\n      if (visualState === \"expanded\" && !isCollapsedLayout) {\n        return;\n      }\n\n      setIsCollapsedLayout(true);\n      setVisualState(\"expanding\");\n\n      animationTimeoutsRef.current.push(\n        setTimeout(() => {\n          setIsCollapsedLayout(false);\n          animationTimeoutsRef.current.push(\n            setTimeout(() => {\n              setVisualState(\"expanded\");\n            }, SIDEBAR_RESIZE_DURATION_MS),\n          );\n        }, SIDEBAR_FADE_DURATION_MS),\n      );\n\n      return;\n    }\n\n    if (visualState === \"collapsed\" && isCollapsedLayout) {\n      return;\n    }\n\n    setIsCollapsedLayout(false);\n    setVisualState(\"collapsing\");\n\n    animationTimeoutsRef.current.push(\n      setTimeout(() => {\n        setIsCollapsedLayout(true);\n        animationTimeoutsRef.current.push(\n          setTimeout(() => {\n            setVisualState(\"collapsed\");\n          }, SIDEBAR_RESIZE_DURATION_MS),\n        );\n      }, SIDEBAR_FADE_DURATION_MS),\n    );\n  }, [isMobile, isSidebarOpen]);\n\n  const contextValue = useMemo(\n    () => ({\n      isCollapsedLayout,\n      visualState,\n    }),\n    [isCollapsedLayout, visualState],\n  );\n\n  return (\n    <SidebarVisualStateContext.Provider value={contextValue}>\n      {isMobile && (\n        <div\n          className={clsx(\"openui-shell-sidebar-container__overlay\", {\n            \"openui-shell-sidebar-container__overlay--collapsed\": !isSidebarOpen,\n          })}\n          onClick={() => {\n            setIsSidebarOpen(false);\n          }}\n        />\n      )}\n      <div\n        className={clsx(\n          \"openui-shell-sidebar-container\",\n          {\n            \"openui-shell-sidebar-container--collapsed\": isCollapsedLayout,\n            \"openui-shell-sidebar-container--hidden\": isArtifactActive && !isMobile,\n          },\n          className,\n        )}\n        data-sidebar-visual-state={visualState}\n        onClick={() => {\n          if (!isMobile && isCollapsedLayout) {\n            setIsSidebarOpen(true);\n          }\n        }}\n      >\n        {children}\n      </div>\n    </SidebarVisualStateContext.Provider>\n  );\n};\n\nexport const SidebarHeader = ({\n  children,\n  className,\n}: {\n  children?: React.ReactNode;\n  className?: string;\n}) => {\n  const { agentName, logoUrl, setIsSidebarOpen, isSidebarOpen } = useShellStore((state) => ({\n    agentName: state.agentName,\n    logoUrl: state.logoUrl,\n    setIsSidebarOpen: state.setIsSidebarOpen,\n    isSidebarOpen: state.isSidebarOpen,\n  }));\n  const { isCollapsedLayout, visualState } = useSidebarVisualState();\n  const showExpandedIcon = visualState === \"expanded\" || visualState === \"collapsing\";\n\n  return (\n    <div\n      className={clsx(\n        \"openui-shell-sidebar-header\",\n        { \"openui-shell-sidebar-header--collapsed\": isCollapsedLayout },\n        className,\n      )}\n    >\n      <div className=\"openui-shell-sidebar-header__top-row\">\n        <img src={logoUrl} alt={agentName} className=\"openui-shell-sidebar-header__logo\" />\n        <div className=\"openui-shell-sidebar-header__agent-name\">{agentName}</div>\n        <IconButton\n          icon={showExpandedIcon ? <PanelLeftClose size=\"1em\" /> : <PanelLeftOpen size=\"1em\" />}\n          onClick={(e) => {\n            e.stopPropagation();\n            setIsSidebarOpen(!isSidebarOpen);\n          }}\n          size=\"small\"\n          variant=\"tertiary\"\n          aria-label={isSidebarOpen ? \"Collapse sidebar\" : \"Expand sidebar\"}\n          className=\"openui-shell-sidebar-header__toggle-button\"\n        />\n      </div>\n      {children}\n    </div>\n  );\n};\n\nexport const SidebarContent = ({\n  children,\n  className,\n}: {\n  children?: React.ReactNode;\n  className?: string;\n}) => {\n  const { isCollapsedLayout } = useSidebarVisualState();\n\n  return (\n    <div\n      className={clsx(\n        \"openui-shell-sidebar-content\",\n        { \"openui-shell-sidebar-content--collapsed\": isCollapsedLayout },\n        className,\n      )}\n    >\n      {children}\n    </div>\n  );\n};\n\nexport const SidebarSeparator = () => {\n  return null;\n};\n","import { useThreadList } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport { SquarePen } from \"lucide-react\";\nimport { useLayoutContext } from \"../../context/LayoutContext\";\nimport { Button } from \"../Button\";\nimport { IconButton } from \"../IconButton\";\nimport { useShellStore } from \"../_shared/store\";\nimport { useOptionalSidebarVisualState } from \"./Sidebar\";\n\nexport const NewChatButton = ({ className }: { className?: string }) => {\n  const switchToNewThread = useThreadList((s) => s.switchToNewThread);\n  const { isSidebarOpen } = useShellStore((state) => ({\n    isSidebarOpen: state.isSidebarOpen,\n  }));\n  const { layout } = useLayoutContext();\n  const sidebarVisualState = useOptionalSidebarVisualState();\n  const showExpandedButton = sidebarVisualState\n    ? sidebarVisualState.visualState === \"expanded\"\n    : isSidebarOpen;\n  const isMobile = layout === \"mobile\";\n\n  if (!showExpandedButton) {\n    return (\n      <IconButton\n        icon={<SquarePen size=\"1em\" />}\n        onClick={(e) => {\n          e.stopPropagation();\n          switchToNewThread();\n        }}\n        variant=\"secondary\"\n        size={isMobile ? \"medium\" : \"small\"}\n        className={clsx(\"openui-shell-new-chat-button_collapsed\", className)}\n      />\n    );\n  }\n\n  return (\n    <Button\n      className={clsx(\"openui-shell-new-chat-button\", className)}\n      iconLeft={<SquarePen />}\n      variant=\"secondary\"\n      size={isMobile ? \"medium\" : \"small\"}\n      onClick={switchToNewThread}\n    >\n      New Chat\n    </Button>\n  );\n};\n","import clsx from \"clsx\";\nimport { useEffect, useRef } from \"react\";\n\ninterface ResizableSeparatorProps {\n  onResize: (clientX: number) => void;\n  onDragStart: () => void;\n  onDragEnd: () => void;\n  className?: string;\n}\n\n/**\n * A draggable vertical separator for resizing panels.\n * Used between chat and artifact panels in desktop mode.\n */\nexport const ResizableSeparator = ({\n  onResize,\n  onDragStart,\n  onDragEnd,\n  className,\n}: ResizableSeparatorProps) => {\n  const isDraggingRef = useRef(false);\n  const onResizeRef = useRef(onResize);\n  const onDragStartRef = useRef(onDragStart);\n  const onDragEndRef = useRef(onDragEnd);\n\n  // Keep callback refs up to date without triggering effect re-runs\n  useEffect(() => {\n    onResizeRef.current = onResize;\n    onDragStartRef.current = onDragStart;\n    onDragEndRef.current = onDragEnd;\n  }, [onResize, onDragStart, onDragEnd]);\n\n  // Global mouse event handlers for drag behavior\n  // Uses refs instead of dependencies to avoid re-creating listeners\n  useEffect(() => {\n    const handleMouseMove = (e: MouseEvent) => {\n      if (isDraggingRef.current) {\n        e.preventDefault();\n        onResizeRef.current(e.clientX);\n      }\n    };\n\n    const handleMouseUp = () => {\n      if (isDraggingRef.current) {\n        isDraggingRef.current = false;\n        onDragEndRef.current();\n        // Reset cursor styles\n        document.body.style.cursor = \"\";\n        document.body.style.userSelect = \"\";\n      }\n    };\n\n    document.addEventListener(\"mousemove\", handleMouseMove);\n    document.addEventListener(\"mouseup\", handleMouseUp);\n\n    return () => {\n      document.removeEventListener(\"mousemove\", handleMouseMove);\n      document.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n  }, []); // Empty deps - handlers use refs to access latest callbacks\n\n  const handleMouseDown = () => {\n    isDraggingRef.current = true;\n    onDragStartRef.current();\n    document.body.style.cursor = \"col-resize\";\n    document.body.style.userSelect = \"none\";\n  };\n\n  return (\n    <div\n      className={clsx(\"openui-shell-resizable-separator\", className)}\n      onMouseDown={handleMouseDown}\n    >\n      <div className=\"openui-shell-resizable-separator__handle\" />\n    </div>\n  );\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\ninterface UseArtifactResizeProps {\n  isArtifactActive: boolean;\n  isMobile: boolean;\n  setIsSidebarOpen: (isOpen: boolean) => void;\n}\n\ninterface UseArtifactResizeReturn {\n  containerRef: React.RefObject<HTMLDivElement | null>;\n  chatPanelRef: React.RefObject<HTMLDivElement | null>;\n  artifactPanelRef: React.RefObject<HTMLDivElement | null>;\n  isDragging: boolean;\n  handleResize: (clientX: number) => void;\n  handleDragStart: () => void;\n  handleDragEnd: () => void;\n}\n\nconst INITIAL_CHAT_WIDTH = 420;\nconst MIN_CHAT_WIDTH = 420;\nconst MAX_CHAT_WIDTH_RATIO = 0.8;\n\n/**\n * Custom hook to manage artifact panel resizing logic (desktop only).\n * Handles:\n * - Chat panel width constraints\n * - Resize drag events\n * - Sidebar state when artifact is active/inactive\n */\nexport const useArtifactResize = ({\n  isArtifactActive,\n  isMobile,\n  setIsSidebarOpen,\n}: UseArtifactResizeProps): UseArtifactResizeReturn => {\n  const [isDragging, setIsDragging] = useState(false);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const chatPanelRef = useRef<HTMLDivElement>(null);\n  const artifactPanelRef = useRef<HTMLDivElement>(null);\n\n  // Handle sidebar visibility and panel widths when artifact state changes\n  useEffect(() => {\n    if (isMobile) return;\n\n    if (isArtifactActive) {\n      // Desktop artifact active: close sidebar and set chat width to 420px\n      setIsSidebarOpen(false);\n      if (chatPanelRef.current) {\n        chatPanelRef.current.style.width = `${INITIAL_CHAT_WIDTH}px`;\n      }\n    } else {\n      // Desktop artifact inactive: open sidebar and reset chat width\n      setIsSidebarOpen(true);\n      if (chatPanelRef.current) {\n        chatPanelRef.current.style.width = \"100%\";\n      }\n    }\n  }, [isArtifactActive, isMobile, setIsSidebarOpen]);\n\n  const handleResize = useCallback((clientX: number) => {\n    if (!containerRef.current || !chatPanelRef.current) return;\n\n    const containerRect = containerRef.current.getBoundingClientRect();\n    const newWidthPx = clientX - containerRect.left;\n\n    // Constrain width between min and max\n    const maxWidthPx = containerRect.width * MAX_CHAT_WIDTH_RATIO;\n    const constrainedWidth = Math.min(Math.max(newWidthPx, MIN_CHAT_WIDTH), maxWidthPx);\n\n    chatPanelRef.current.style.width = `${constrainedWidth}px`;\n  }, []);\n\n  const handleDragStart = useCallback(() => {\n    setIsDragging(true);\n  }, []);\n\n  const handleDragEnd = useCallback(() => {\n    setIsDragging(false);\n  }, []);\n\n  return {\n    containerRef,\n    chatPanelRef,\n    artifactPanelRef,\n    isDragging,\n    handleResize,\n    handleDragStart,\n    handleDragEnd,\n  };\n};\n","import type { AssistantMessage, Message, ToolMessage } from \"@openuidev/react-headless\";\nimport { MessageProvider, useActiveArtifact, useThread } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport React, { memo, useRef } from \"react\";\nimport { useLayoutContext } from \"../../context/LayoutContext\";\nimport { ScrollVariant, useScrollToBottom } from \"../../hooks/useScrollToBottom\";\nimport { separateContentAndContext } from \"../../utils/contentParser\";\nimport { ArtifactOverlay, ArtifactPortalTarget } from \"../_shared/artifact\";\nimport { useShellStore } from \"../_shared/store\";\nimport type { AssistantMessageComponent, UserMessageComponent } from \"../_shared/types\";\nimport { Callout } from \"../Callout\";\nimport { MarkDownRenderer } from \"../MarkDownRenderer\";\nimport { MessageLoading as MessageLoadingComponent } from \"../MessageLoading\";\nimport { ToolCallComponent } from \"../ToolCall\";\nimport { ToolResult } from \"../ToolResult\";\nimport { ResizableSeparator } from \"./ResizableSeparator\";\nimport { useArtifactResize } from \"./useArtifactResize\";\n\nexport const ThreadContainer = ({\n  children,\n  className,\n}: {\n  children?: React.ReactNode;\n  className?: string;\n}) => {\n  const { layout } = useLayoutContext();\n  const isMobile = layout === \"mobile\";\n  const { isArtifactActive } = useActiveArtifact();\n\n  const { setIsSidebarOpen } = useShellStore((state) => ({\n    setIsSidebarOpen: state.setIsSidebarOpen,\n  }));\n\n  const isLoadingMessages = useThread((s) => s.isLoadingMessages);\n\n  const {\n    containerRef,\n    chatPanelRef,\n    artifactPanelRef,\n    isDragging,\n    handleResize,\n    handleDragStart,\n    handleDragEnd,\n  } = useArtifactResize({\n    isArtifactActive,\n    isMobile,\n    setIsSidebarOpen,\n  });\n\n  return (\n    <div\n      className={clsx(\"openui-shell-thread-container\", className, {\n        \"openui-shell-thread-container--artifact-active\": isArtifactActive,\n      })}\n      style={{\n        visibility: isLoadingMessages ? \"hidden\" : undefined,\n      }}\n    >\n      <div className=\"openui-shell-thread-wrapper\" ref={containerRef}>\n        {/* Chat panel - always visible */}\n        <div\n          ref={chatPanelRef}\n          className={clsx(\"openui-shell-thread-chat-panel\", {\n            \"openui-shell-thread-chat-panel--animating\": !isDragging,\n          })}\n        >\n          {children}\n          {isMobile && <ArtifactOverlay />}\n        </div>\n\n        {/* Desktop only: Resizable separator and artifact panel */}\n        {!isMobile && isArtifactActive && (\n          <>\n            <ResizableSeparator\n              onResize={handleResize}\n              onDragStart={handleDragStart}\n              onDragEnd={handleDragEnd}\n            />\n            <div\n              ref={artifactPanelRef}\n              className={clsx(\"openui-shell-thread-artifact-panel\", {\n                \"openui-shell-thread-artifact-panel--animating\": !isDragging,\n              })}\n            >\n              <ArtifactPortalTarget />\n            </div>\n          </>\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport const ScrollArea = ({\n  children,\n  className,\n  scrollVariant = \"user-message-anchor\",\n  userMessageSelector,\n}: {\n  children?: React.ReactNode;\n  className?: string;\n  /**\n   * Scroll to bottom once the last message is added\n   */\n  scrollVariant?: ScrollVariant;\n  /**\n   * Selector for the user message\n   */\n  userMessageSelector?: string;\n}) => {\n  const ref = useRef<HTMLDivElement>(null);\n\n  const messages = useThread((s) => s.messages);\n  const isRunning = useThread((s) => s.isRunning);\n  const isLoadingMessages = useThread((s) => s.isLoadingMessages);\n\n  useScrollToBottom({\n    ref,\n    lastMessage: messages[messages.length - 1] || { id: \"\" },\n    scrollVariant,\n    userMessageSelector,\n    isRunning,\n    isLoadingMessages,\n  });\n\n  return (\n    <div className=\"openui-shell-thread-scroll-container\">\n      <div\n        ref={ref}\n        className={clsx(\n          \"openui-shell-thread-scroll-area\",\n          {\n            \"openui-shell-thread-scroll-area--user-message-anchor\":\n              scrollVariant === \"user-message-anchor\",\n          },\n          className,\n        )}\n      >\n        {children}\n      </div>\n    </div>\n  );\n};\n\nexport const AssistantMessageContainer = ({\n  children,\n  className,\n}: {\n  children?: React.ReactNode;\n  className?: string;\n}) => {\n  const { logoUrl, showAssistantLogo } = useShellStore((store) => ({\n    logoUrl: store.logoUrl,\n    showAssistantLogo: store.showAssistantLogo,\n  }));\n\n  return (\n    <div\n      className={clsx(\"openui-shell-thread-message-assistant\", className, {\n        \"openui-shell-thread-message-assistant--without-logo\": !showAssistantLogo,\n      })}\n    >\n      {showAssistantLogo && (\n        <img\n          src={logoUrl}\n          alt=\"Assistant\"\n          className=\"openui-shell-thread-message-assistant__logo\"\n        />\n      )}\n      <div className=\"openui-shell-thread-message-assistant__content\">{children}</div>\n    </div>\n  );\n};\n\nexport const UserMessageContainer = ({\n  children,\n  className,\n}: {\n  children?: React.ReactNode;\n  className?: string;\n}) => {\n  return (\n    <div className={clsx(\"openui-shell-thread-message-user\", className)}>\n      <div className=\"openui-shell-thread-message-user__content\">{children}</div>\n    </div>\n  );\n};\n\nconst AssistantMessageContent = ({\n  message,\n  allMessages,\n}: {\n  message: AssistantMessage;\n  allMessages: Message[];\n}) => {\n  // Find tool result messages that correspond to this message's tool calls\n  const getToolName = (toolCallId: string) => {\n    const toolCall = message.toolCalls?.find((tc) => tc.id === toolCallId);\n    return toolCall?.function.name;\n  };\n\n  // Collect tool messages that follow this assistant message\n  const toolMessages: ToolMessage[] = [];\n  const msgIndex = allMessages.findIndex((m) => m.id === message.id);\n  if (msgIndex !== -1) {\n    for (let i = msgIndex + 1; i < allMessages.length; i++) {\n      const m = allMessages[i];\n      if (m && m.role === \"tool\") {\n        toolMessages.push(m as ToolMessage);\n      } else {\n        break;\n      }\n    }\n  }\n\n  return (\n    <>\n      {message.content && (\n        <MarkDownRenderer\n          textMarkdown={message.content}\n          className=\"openui-shell-thread-message-assistant__text\"\n        />\n      )}\n      {message.toolCalls?.map((toolCall) => (\n        <ToolCallComponent key={toolCall.id} toolCall={toolCall} />\n      ))}\n      {toolMessages.map((tm) => (\n        <ToolResult key={tm.id} message={tm} toolName={getToolName(tm.toolCallId)} />\n      ))}\n    </>\n  );\n};\n\nconst UserMessageContent = ({ message }: { message: Message }) => {\n  if (message.role !== \"user\") return null;\n  const content = message.content;\n  if (typeof content === \"string\") {\n    // Strip XML wrapper tags (<content>, <context>) so the bubble shows clean text\n    const { content: humanText } = separateContentAndContext(content);\n    return <>{humanText}</>;\n  }\n  // InputContent[] — render text parts\n  return (\n    <>\n      {content?.map((part, i) => {\n        if (part.type === \"text\") {\n          return <span key={i}>{part.text}</span>;\n        }\n        // Binary content — could be image, file, etc.\n        if (part.type === \"binary\" && part.url) {\n          return (\n            <img\n              key={i}\n              src={part.url}\n              alt=\"\"\n              className=\"openui-shell-thread-message-user__image\"\n            />\n          );\n        }\n        return null;\n      })}\n    </>\n  );\n};\n\nexport const RenderMessage = memo(\n  ({\n    message,\n    className,\n    allMessages,\n    assistantMessage: CustomAssistantMessage,\n    userMessage: CustomUserMessage,\n    isStreaming,\n  }: {\n    message: Message;\n    className?: string;\n    allMessages: Message[];\n    assistantMessage?: AssistantMessageComponent;\n    userMessage?: UserMessageComponent;\n    isStreaming: boolean;\n  }) => {\n    if (message.role === \"tool\") {\n      // Tool messages are rendered inline with their parent assistant message\n      return null;\n    }\n\n    if (message.role === \"assistant\") {\n      if (CustomAssistantMessage) {\n        return <CustomAssistantMessage message={message} isStreaming={isStreaming} />;\n      }\n      return (\n        <AssistantMessageContainer className={className}>\n          <AssistantMessageContent message={message} allMessages={allMessages} />\n        </AssistantMessageContainer>\n      );\n    }\n\n    if (message.role === \"user\") {\n      if (CustomUserMessage) {\n        return <CustomUserMessage message={message} />;\n      }\n      return (\n        <UserMessageContainer className={className}>\n          <UserMessageContent message={message} />\n        </UserMessageContainer>\n      );\n    }\n\n    // Other roles (system, developer, reasoning, activity) — skip by default\n    return null;\n  },\n);\n\nexport const MessageLoading = () => {\n  return (\n    <div className=\"openui-shell-thread-message-loading\">\n      <MessageLoadingComponent />\n    </div>\n  );\n};\n\nexport const ThreadError = () => {\n  const threadError = useThread((s) => s.threadError);\n  if (!threadError) return null;\n\n  return (\n    <div className=\"openui-shell-thread-error\">\n      <Callout\n        variant=\"danger\"\n        title=\"Something went wrong\"\n        description={threadError.message || \"An unexpected error occurred. Please try again.\"}\n      />\n    </div>\n  );\n};\n\nexport const Messages = ({\n  className,\n  loader,\n  assistantMessage,\n  userMessage,\n}: {\n  className?: string;\n  loader?: React.ReactNode;\n  assistantMessage?: AssistantMessageComponent;\n  userMessage?: UserMessageComponent;\n}) => {\n  const messages = useThread((s) => s.messages);\n  const isRunning = useThread((s) => s.isRunning);\n  const threadError = useThread((s) => s.threadError);\n\n  return (\n    <div className={clsx(\"openui-shell-thread-messages\", className)}>\n      {messages.map((message, i) => {\n        return (\n          <MessageProvider key={message.id} message={message}>\n            <RenderMessage\n              message={message}\n              allMessages={messages}\n              assistantMessage={assistantMessage}\n              userMessage={userMessage}\n              isStreaming={isRunning && i === messages.length - 1}\n            />\n          </MessageProvider>\n        );\n      })}\n      {isRunning && <div>{loader}</div>}\n      {!isRunning && threadError && <ThreadError />}\n    </div>\n  );\n};\n\nexport const ThreadHeader = ({\n  children,\n  className,\n}: {\n  children?: React.ReactNode;\n  className?: string;\n}) => {\n  return <div className={clsx(\"openui-shell-thread-header\", className)}>{children}</div>;\n};\n\n// Re-export Composer from components\nexport { Composer } from \"./components\";\n","import type { Thread } from \"@openuidev/react-headless\";\nimport { useThreadList } from \"@openuidev/react-headless\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport clsx from \"clsx\";\nimport { EllipsisVerticalIcon, Trash2Icon } from \"lucide-react\";\nimport { Fragment, useEffect } from \"react\";\nimport { useLayoutContext } from \"../../context/LayoutContext\";\nimport { useShellStore } from \"../_shared/store\";\nimport { Button } from \"../Button\";\nimport { IconButton } from \"../IconButton\";\nimport { useTheme } from \"../ThemeProvider\";\n\nexport const ThreadButton = ({\n  id,\n  title,\n  className,\n}: {\n  id: string;\n  title: string;\n  className?: string;\n}) => {\n  const selectThread = useThreadList((s) => s.selectThread);\n  const deleteThread = useThreadList((s) => s.deleteThread);\n  const selectedThreadId = useThreadList((s) => s.selectedThreadId);\n  const { portalThemeClassName } = useTheme();\n  const { isSidebarOpen, setIsSidebarOpen } = useShellStore((state) => ({\n    isSidebarOpen: state.isSidebarOpen,\n    setIsSidebarOpen: state.setIsSidebarOpen,\n  }));\n  const { layout } = useLayoutContext();\n\n  return (\n    <div\n      className={clsx(\n        \"openui-shell-thread-button\",\n        {\n          \"openui-shell-thread-button--selected\": selectedThreadId === id,\n        },\n        className,\n      )}\n    >\n      <button\n        className=\"openui-shell-thread-button-title\"\n        onClick={() => {\n          if (layout === \"mobile\") {\n            setIsSidebarOpen(!isSidebarOpen);\n          }\n          selectThread(id);\n        }}\n      >\n        {title}\n      </button>\n      <DropdownMenu.Root>\n        <DropdownMenu.Trigger asChild>\n          <IconButton\n            icon={<EllipsisVerticalIcon size=\"1em\" />}\n            aria-label={`More actions for ${title}`}\n            variant=\"tertiary\"\n            size={layout === \"mobile\" ? \"small\" : \"extra-small\"}\n            className=\"openui-shell-thread-button-dropdown-trigger\"\n          />\n        </DropdownMenu.Trigger>\n        <DropdownMenu.Portal>\n          <DropdownMenu.Content\n            className={clsx(\"openui-shell-thread-button-dropdown-menu\", portalThemeClassName)}\n            side=\"bottom\"\n            align=\"end\"\n            sideOffset={4}\n          >\n            <DropdownMenu.Item\n              asChild\n              onSelect={() => {\n                deleteThread(id);\n              }}\n            >\n              <Button\n                type=\"button\"\n                variant=\"tertiary\"\n                buttonType=\"destructive\"\n                size=\"small\"\n                iconLeft={<Trash2Icon size={14} />}\n                className=\"openui-shell-thread-button-dropdown-menu-item\"\n              >\n                Delete\n              </Button>\n            </DropdownMenu.Item>\n          </DropdownMenu.Content>\n        </DropdownMenu.Portal>\n      </DropdownMenu.Root>\n    </div>\n  );\n};\n\nexport const ThreadList = ({ className }: { className?: string }) => {\n  const threads = useThreadList((s) => s.threads);\n  const loadThreads = useThreadList((s) => s.loadThreads);\n\n  useEffect(() => {\n    loadThreads();\n  }, []);\n\n  const groupThreads = () => {\n    const now = new Date();\n    const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n    const yesterday = new Date(today);\n    yesterday.setDate(yesterday.getDate() - 1);\n    const last7Days = new Date(today);\n    last7Days.setDate(last7Days.getDate() - 7);\n    const last30Days = new Date(today);\n    last30Days.setDate(last30Days.getDate() - 30);\n    const thisYear = new Date(today);\n    thisYear.setMonth(0, 1);\n\n    return threads.reduce(\n      (groups, thread) => {\n        const threadDate = new Date(thread.createdAt);\n\n        if (threadDate >= today) {\n          groups.today = [...(groups.today || []), thread];\n        } else if (threadDate >= yesterday) {\n          groups.yesterday = [...(groups.yesterday || []), thread];\n        } else if (threadDate >= last7Days) {\n          groups.last7Days = [...(groups.last7Days || []), thread];\n        } else if (threadDate >= last30Days) {\n          groups.last30Days = [...(groups.last30Days || []), thread];\n        } else if (threadDate >= thisYear) {\n          groups.thisYear = [...(groups.thisYear || []), thread];\n        } else {\n          groups.older = [...(groups.older || []), thread];\n        }\n\n        return groups;\n      },\n      {\n        today: [] as Thread[],\n        yesterday: [] as Thread[],\n        last7Days: [] as Thread[],\n        last30Days: [] as Thread[],\n        thisYear: [] as Thread[],\n        older: [] as Thread[],\n      },\n    );\n  };\n\n  const groupedThreads = groupThreads();\n  const groupLabels: { [key in keyof typeof groupedThreads]: string } = {\n    today: \"Today\",\n    yesterday: \"Yesterday\",\n    last7Days: \"Previous 7 Days\",\n    last30Days: \"Previous 30 Days\",\n    thisYear: \"This Year\",\n    older: \"Older\",\n  };\n\n  return (\n    <div className={clsx(\"openui-shell-thread-list\", className)}>\n      {Object.entries(groupedThreads)\n        .filter(([_, groupThreads]) => groupThreads.length > 0)\n        .map(([group, groupThreads]) => (\n          <Fragment key={group}>\n            <div className=\"openui-shell-thread-list-group\">\n              {groupLabels[group as keyof typeof groupLabels]}\n            </div>\n            {groupThreads.map((thread) => (\n              <ThreadButton key={thread.id} id={thread.id} title={thread.title} />\n            ))}\n          </Fragment>\n        ))}\n    </div>\n  );\n};\n","import { useThread } from \"@openuidev/react-headless\";\nimport clsx from \"clsx\";\nimport { ReactNode } from \"react\";\nimport { ConversationStarterProps } from \"../../types/ConversationStarter\";\nimport { isChatEmpty } from \"../_shared/utils\";\nimport { DesktopWelcomeComposer } from \"./components\";\nimport { ConversationStarter, ConversationStarterVariant } from \"./ConversationStarter\";\n\ninterface WelcomeScreenBaseProps {\n  /**\n   * Additional CSS class name\n   */\n  className?: string;\n}\n\ninterface WelcomeScreenWithContentProps extends WelcomeScreenBaseProps {\n  /**\n   * The greeting/title text to display\n   */\n  title?: string;\n  /**\n   * Optional description text to add more context\n   */\n  description?: string;\n  /**\n   * Image to display - can be a URL object or a ReactNode\n   * - { url: string }: Renders an <img> tag with default styling (64x64, object-fit: cover, rounded)\n   * - ReactNode: Renders the provided element directly (for custom icons, styled images, etc.)\n   */\n  image?: { url: string } | ReactNode;\n  /**\n   * Conversation starters to show below the composer\n   */\n  starters?: ConversationStarterProps[];\n  /**\n   * Variant of the conversation starters\n   */\n  starterVariant?: ConversationStarterVariant;\n  /**\n   * Children are not allowed when using props-based content\n   */\n  children?: never;\n}\n\ninterface WelcomeScreenWithChildrenProps extends WelcomeScreenBaseProps {\n  /**\n   * Custom content to render inside the welcome screen\n   * When children are provided, title, description, and image are ignored\n   */\n  children: ReactNode;\n  title?: never;\n  description?: never;\n  image?: never;\n  starters?: never;\n  starterVariant?: never;\n}\n\nexport type WelcomeScreenProps = WelcomeScreenWithContentProps | WelcomeScreenWithChildrenProps;\n\n/**\n * Type guard to check if image is a URL object\n */\nconst isImageUrl = (image: { url: string } | ReactNode): image is { url: string } => {\n  return typeof image === \"object\" && image !== null && \"url\" in image;\n};\n\nexport const WelcomeScreen = (props: WelcomeScreenProps) => {\n  const { className, starters = [], starterVariant = \"long\" } = props;\n\n  const messages = useThread((s) => s.messages);\n  const isLoadingMessages = useThread((s) => s.isLoadingMessages);\n\n  // Only show when there are no messages\n  if (!isChatEmpty({ isLoadingMessages, messages })) {\n    return null;\n  }\n\n  // Check if children are provided\n  if (\"children\" in props && props.children) {\n    return <div className={clsx(\"openui-shell-welcome-screen\", className)}>{props.children}</div>;\n  }\n\n  // Props-based content\n  const { title, description, image } = props as WelcomeScreenWithContentProps;\n\n  const renderImage = () => {\n    if (!image) return null;\n\n    if (isImageUrl(image)) {\n      return (\n        <img src={image.url} alt={title || \"\"} className=\"openui-shell-welcome-screen__image\" />\n      );\n    }\n\n    return image;\n  };\n\n  return (\n    <div\n      className={clsx(\n        \"openui-shell-welcome-screen\",\n        \"openui-shell-welcome-screen--with-composer\",\n        className,\n      )}\n    >\n      <div className=\"openui-shell-welcome-screen__header\">\n        {image && (\n          <div className=\"openui-shell-welcome-screen__image-container\">{renderImage()}</div>\n        )}\n        {(title || description) && (\n          <div className=\"openui-shell-welcome-screen__content\">\n            {title && <h2 className=\"openui-shell-welcome-screen__title\">{title}</h2>}\n            {description && (\n              <p className=\"openui-shell-welcome-screen__description\">{description}</p>\n            )}\n          </div>\n        )}\n      </div>\n      {/* Desktop-only welcome composer */}\n      <div className=\"openui-shell-welcome-screen__composer-starters-container\">\n        <div className=\"openui-shell-welcome-screen__desktop-composer\">\n          <DesktopWelcomeComposer />\n        </div>\n        {/* Desktop-only conversation starters */}\n        {starters.length > 0 && (\n          <div className=\"openui-shell-welcome-screen__desktop-starters\">\n            <ConversationStarter starters={starters} variant={starterVariant} />\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport default WelcomeScreen;\n"],"mappings":"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"}