@opencx/widget-react 4.0.25 → 4.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/data-component.ts","../src/components/lib/utils/cn.ts","../src/components/lib/wobble.tsx","../src/components/lib/MotionDiv.tsx","../src/components/lib/button.tsx","../src/components/Dialoger.tsx","../src/components/AttachmentPreview.tsx","../src/components/MemoizedReactMarkdown.tsx","../src/components/RichText.tsx","../src/components/custom-components/BotOrAgentMessageDefaultComponent.tsx","../src/components/custom-components/FallbackDefaultComponent.tsx","../src/components/lib/avatar.tsx","../src/components/AgentOrBotAvatar.tsx","../src/components/custom-components/LoadingDefaultComponent.tsx","../src/components/lib/tooltip.tsx","../src/hooks/useIsSmallScreen.ts","../src/hooks/useTheme.ts","../src/hooks/useSetWidgetSize.ts","../src/components/lib/DynamicIcon.tsx","../src/components/Header.tsx","../src/components/lib/LoadingSpinner.tsx","../src/hooks/useCanvas.ts","../src/screens/chat/ChatCanvas.tsx","../src/components/lib/MotionDiv__VerticalReveal.tsx","../src/components/CsatSurvey.tsx","../src/hooks/useTranslation.ts","../src/components/SuggestedReplyButton.tsx","../src/components/MightSolveUserIssueSuggestedReplies.tsx","../src/screens/chat/ChatFooterItems.tsx","../src/screens/chat/ChatFooter.tsx","../src/components/BotOrAgentMessage.tsx","../src/components/GroupTimestamp.tsx","../src/components/BotOrAgentMessageGroup.tsx","../src/hooks/useSpecialComponentProps.ts","../src/components/special-components/SessionResolvedComponent.tsx","../src/components/UserMessage.tsx","../src/components/UserMessageGroup.tsx","../src/utils/group-messages-by-type.ts","../src/screens/chat/AdvancedInitialMessages.tsx","../src/screens/chat/ChatBannerItems.tsx","../src/screens/chat/InitialMessages.tsx","../src/components/special-components/ChatBottomComponents.tsx","../src/screens/chat/ChatMain.tsx","../src/screens/chat/index.tsx","../src/components/lib/skeleton.tsx","../src/components/svg/OpenLogoSvg.tsx","../src/components/PoweredByOpen.tsx","../src/screens/sessions/index.tsx","../src/components/lib/input.tsx","../src/hooks/useWidgetContentHeight.tsx","../src/screens/welcome/index.tsx","../src/screens/index.tsx","../src/WidgetPopoverContent.tsx","../src/components/svg/ChatBubbleSvg.tsx","../src/WidgetPopoverTrigger.tsx","../src/WidgetPopoverAnchor.tsx","../src/index.tsx"],"sourcesContent":["import type { OpenCxComponentNameU } from '@opencx/widget-core';\n\n/**\n * A silly util to help with the component name type safety.\n */\nexport function dc(componentName: OpenCxComponentNameU) {\n return { 'data-component': componentName };\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React, {\n cloneElement,\n forwardRef,\n type ReactElement,\n useState,\n} from 'react';\nimport { memo } from 'react';\nimport { cn } from './utils/cn';\n\n/**\n * The maximum number of pixels the element can move in the x and y directions\n *\n * This would make very small elements wobble more visibly, and large elements would wobble more subtly\n */\nexport const WOBBLE_MAX_MOVEMENT_PIXELS = {\n x: 2,\n y: 2,\n};\n\nconst INVERSE_SCALE = true;\n\ntype ChildProps = {\n onMouseMove?: (event: React.MouseEvent<HTMLElement>) => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n style?: React.CSSProperties;\n className?: string;\n ref: React.ForwardedRef<HTMLElement>;\n};\n\nexport interface WobbleProps {\n children: ReactElement<ChildProps>;\n className?: string;\n scale?: number;\n off?: boolean;\n}\n\nconst Wobble = memo(\n forwardRef<HTMLElement, WobbleProps>(\n ({ children, className, scale = 1.02, off = false }, ref) => {\n const [isHovering, setIsHovering] = useState(false);\n const [movement, setMovement] = useState({ x: 0, y: 0 });\n\n if (off) return children;\n\n const hasTranslateClass = /translate/.test(\n children.props.className || '',\n );\n if (hasTranslateClass) return children;\n\n /**\n * Thanks Mr. ChatGippity for refactoring this function\n */\n const handleMouseMove = (event: React.MouseEvent<HTMLElement>) => {\n const { clientX, clientY } = event;\n const rect = event.currentTarget.getBoundingClientRect();\n\n // Calculate mouse position relative to the center of the element\n const offsetX = clientX - (rect.left + rect.width / 2);\n const offsetY = clientY - (rect.top + rect.height / 2);\n\n // Normalize offset values to the range [-1, 1]\n const normalizedX = Math.max(\n -1,\n Math.min(1, offsetX / (rect.width / 2)),\n );\n const normalizedY = Math.max(\n -1,\n Math.min(1, offsetY / (rect.height / 2)),\n );\n\n // Scale normalized values to the desired range\n const x = normalizedX * WOBBLE_MAX_MOVEMENT_PIXELS.x;\n const y = normalizedY * WOBBLE_MAX_MOVEMENT_PIXELS.y;\n\n setMovement({ x, y });\n children.props.onMouseMove?.(event);\n };\n\n const handleMouseEnter = () => {\n setIsHovering(true);\n children.props.onMouseEnter?.();\n };\n const handleMouseLeave = () => {\n setIsHovering(false);\n setMovement({ x: 0, y: 0 });\n children.props.onMouseLeave?.();\n };\n\n const childStyles = {\n '--wobble-x': isHovering ? `${movement.x}px` : '0px',\n '--wobble-y': isHovering ? `${movement.y}px` : '0px',\n '--scale': INVERSE_SCALE\n ? 1 - (scale - 1) // if scale is 1.02, it becomes 0.98\n : scale,\n } as React.CSSProperties;\n\n return cloneElement(children, {\n ref,\n onMouseMove: handleMouseMove,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n style: {\n ...childStyles,\n ...children.props.style,\n },\n className: cn(\n 'translate-x-[var(--wobble-x)]',\n 'translate-y-[var(--wobble-y)]',\n 'hover:scale-[var(--scale)] active:hover:scale-[calc(var(--scale)-0.02)]',\n className,\n children.props.className,\n 'transition-all ease-out',\n ),\n });\n },\n ),\n);\n\nWobble.displayName = 'Wobble';\n\nexport { Wobble };\n","import React from 'react';\nimport { motion, type Target } from 'framer-motion';\nimport { type ComponentProps, forwardRef } from 'react';\n\ntype MotionProps = ComponentProps<typeof motion.div>;\ntype AnimationDirection = 'right' | 'left' | 'up' | 'down';\nexport type MotionDivProps = MotionProps & {\n fadeIn?: AnimationDirection;\n distance?: number;\n snapExit?: boolean;\n overrides?: Overrides;\n delay?: number;\n};\n\ntype Overrides = {\n initial?: Target;\n animate?: Target;\n exit?: Target;\n};\n\nexport const ANIMATION_DISTANCE_PX = 10;\n\nconst fadeInRight = (\n distance: number,\n overrides: Overrides,\n delay: number,\n): MotionProps => ({\n initial: { opacity: 0, x: -distance, ...overrides.initial },\n animate: { opacity: 1, x: 0, ...overrides.animate, transition: { delay } },\n exit: { opacity: 0, x: distance, ...overrides.exit },\n});\n\nconst fadeInLeft = (\n distance: number,\n overrides: Overrides,\n delay: number,\n): MotionProps => ({\n initial: { opacity: 0, x: distance, ...overrides.initial },\n animate: { opacity: 1, x: 0, ...overrides.animate, transition: { delay } },\n exit: { opacity: 0, x: -distance, ...overrides.exit },\n});\n\nconst fadeInUp = (\n distance: number,\n overrides: Overrides,\n delay: number,\n): MotionProps => ({\n initial: { opacity: 0, y: distance, ...overrides.initial },\n animate: { opacity: 1, y: 0, ...overrides.animate, transition: { delay } },\n exit: { opacity: 0, y: -distance, ...overrides.exit },\n});\n\nconst fadeInDown = (\n distance: number,\n overrides: Overrides,\n delay: number,\n): MotionProps => ({\n initial: { opacity: 0, y: -distance, ...overrides.initial },\n animate: { opacity: 1, y: 0, ...overrides.animate, transition: { delay } },\n exit: { opacity: 0, y: distance, ...overrides.exit },\n});\n\nconst treasureMap: Record<\n AnimationDirection,\n (distance: number, overrides: Overrides, delay: number) => MotionProps\n> = {\n right: fadeInRight,\n left: fadeInLeft,\n up: fadeInUp,\n down: fadeInDown,\n};\n\nconst MotionDiv = forwardRef<HTMLDivElement, MotionDivProps>(\n (\n {\n fadeIn = 'down',\n distance = ANIMATION_DISTANCE_PX,\n children,\n snapExit = false,\n overrides = {},\n delay = 0,\n ...props\n },\n ref,\n ) => {\n const fadeInProps: MotionProps = fadeIn\n ? treasureMap[fadeIn](distance, overrides, delay)\n : {};\n\n if (\n snapExit &&\n fadeInProps.exit &&\n typeof fadeInProps.exit === 'object' &&\n !Array.isArray(fadeInProps.exit)\n ) {\n fadeInProps.exit.transition = { duration: 0 };\n }\n\n return (\n <motion.div ref={ref} {...props} {...fadeInProps}>\n {children}\n </motion.div>\n );\n },\n);\nMotionDiv.displayName = 'MotionDiv';\n\nexport { MotionDiv };\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Wobble } from './wobble';\nimport { cn } from './utils/cn';\nimport { dc } from '../../utils/data-component';\n\nconst buttonVariants = cva(\n cn(\n 'inline-flex shrink-0 items-center justify-center gap-2',\n 'text-sm font-medium whitespace-nowrap',\n 'ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'active:scale-95 hover:active:scale-95',\n 'rounded-xl',\n 'transition',\n ),\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground',\n destructive: 'bg-destructive text-destructive-foreground',\n outline: 'bg-background border',\n secondary: 'bg-secondary text-secondary-foreground',\n ghost: 'hover:bg-secondary',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'py-2 px-3.5 text-xs',\n /**\n * This size is useful for top level buttons that needs to sit nicely inside the iframe's border radius.\n * Having the minimum height higher than usual (the `default` variant) will make the border radius look just right.\n */\n lg: 'min-h-12 px-4 rounded-[20px]',\n icon: 'h-10 w-10',\n fit: 'size-fit p-2',\n free: 'p-2',\n selfless: 'p-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n { className, variant = 'default', size, asChild = false, ...props },\n ref,\n ) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Wobble ref={ref}>\n <Comp\n {...dc('ui_lib/btn')}\n data-variant={variant}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n </Wobble>\n );\n },\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import { AnimatePresence } from 'framer-motion';\nimport React, {\n cloneElement,\n createContext,\n useContext,\n useEffect,\n useState,\n type Dispatch,\n type SetStateAction,\n} from 'react';\nimport { MotionDiv } from './lib/MotionDiv';\nimport { cn } from './lib/utils/cn';\nimport { Button } from './lib/button';\nimport { X } from 'lucide-react';\nimport { useWidget } from '@opencx/widget-react-headless';\n\ninterface DialogerProviderValue {\n open: (content: React.ReactNode) => void;\n close: () => void;\n isOpen: boolean;\n content: React.ReactNode | null;\n}\n\nconst context = createContext<DialogerProviderValue | null>(null);\n\nexport function DialogerProvider({ children }: { children: React.ReactNode }) {\n const [isOpen, setIsOpen] = useState(false);\n const [content, setContent] = useState<React.ReactNode | null>(null);\n\n const openDialog = (content: React.ReactNode) => {\n setContent(content);\n setIsOpen(true);\n };\n\n const closeDialog = () => {\n setIsOpen(false);\n setTimeout(() => {\n setContent(null);\n }, 200);\n };\n\n return (\n <context.Provider\n value={{ open: openDialog, close: closeDialog, isOpen, content }}\n >\n <DialogerPortal />\n {children}\n </context.Provider>\n );\n}\n\nexport function useDialoger(): DialogerProviderValue {\n const dialoger = useContext(context);\n\n if (!dialoger) {\n console.error('useDialoger must be used within a DialogerProvider');\n return {\n open: () => {},\n close: () => {},\n isOpen: false,\n content: null,\n };\n }\n\n return dialoger;\n}\n\nfunction DialogerPortal() {\n const { contentIframeRef } = useWidget();\n const { isOpen, content, close } = useDialoger();\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close();\n };\n\n contentIframeRef?.current?.contentWindow?.document.addEventListener(\n 'keydown',\n handleEscape,\n );\n return () =>\n contentIframeRef?.current?.contentWindow?.document.removeEventListener(\n 'keydown',\n handleEscape,\n );\n }, []);\n\n return (\n <AnimatePresence mode=\"wait\">\n {isOpen && content && (\n <MotionDiv\n overrides={{\n initial: { y: 0 },\n exit: { y: 0 },\n }}\n key=\"dialog-content\"\n className=\"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm\"\n tabIndex={-1}\n onClick={close}\n >\n {content}\n </MotionDiv>\n )}\n </AnimatePresence>\n );\n}\n\nexport function DialogerContent({\n children,\n className,\n withClose = false,\n}: {\n children: React.ReactNode;\n className?: string;\n withClose?: boolean;\n}) {\n const { close } = useDialoger();\n return (\n <div\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 flex flex-col gap-4 w-full max-w-[61.8%] translate-x-[-50%] translate-y-[-50%] border bg-background p-4 rounded-3xl',\n className,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n {withClose && (\n <Button\n size=\"fit\"\n className=\"rounded-full absolute top-4 right-4\"\n variant=\"secondary\"\n onClick={close}\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n )}\n </div>\n );\n}\n\nexport const DialogerHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col gap-2 text-center pt-2', className)}\n {...props}\n />\n);\nDialogerHeader.displayName = 'DialogerHeader';\n\nexport const DialogerBody = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col gap-2 text-center', className)}\n {...props}\n />\n);\nDialogerBody.displayName = 'DialogerBody';\n\nexport const DialogerFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col gap-2', className)} {...props} />\n);\nDialogerFooter.displayName = 'DialogerFooter';\n\nexport const DialogerTitle = React.forwardRef<\n React.ElementRef<'p'>,\n React.ComponentPropsWithoutRef<'p'>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\n 'text-lg font-semibold leading-none tracking-tight',\n className,\n )}\n {...props}\n />\n));\nDialogerTitle.displayName = 'DialogerTitle';\n\nexport const DialogerDescription = React.forwardRef<\n React.ElementRef<'p'>,\n React.ComponentPropsWithoutRef<'p'>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDialogerDescription.displayName = 'DialogerDescription';\n\nexport function Dialoger({\n children,\n trigger,\n}: {\n children: React.ReactNode;\n trigger: React.ReactElement<{ onClick: () => void }>;\n}) {\n const { open } = useDialoger();\n const clonedTrigger = cloneElement(trigger, {\n onClick: () => open(children),\n });\n\n return clonedTrigger;\n}\n","import type { MessageAttachmentType } from '@opencx/widget-core';\nimport React from 'react';\nimport { cn } from './lib/utils/cn';\nimport { Wobble } from './lib/wobble';\nimport { Dialoger, DialogerContent } from './Dialoger';\n\ntype Props = {\n attachment: MessageAttachmentType;\n};\n\nexport function AttachmentPreview({ attachment }: Props) {\n const { name, size, type, url } = attachment;\n\n const isImage = type.startsWith('image/');\n const isVideo = type.startsWith('video/');\n const isAudio = type.startsWith('audio/');\n\n if (isAudio) {\n return (\n <Wobble>\n <div className=\"w-full shrink-0 overflow-hidden\">\n <audio controls className=\"w-full\">\n <source src={url} type={type} />\n Your browser does not support the audio tag.\n </audio>\n </div>\n </Wobble>\n );\n }\n\n if (isVideo) {\n return (\n <Wobble>\n <div className=\"w-full border shrink-0 rounded-2xl overflow-hidden\">\n <video controls>\n <source src={url} type={type} />\n Your browser does not support the video tag.\n </video>\n </div>\n </Wobble>\n );\n }\n\n if (!isImage && !isVideo && !isAudio) {\n return (\n <Wobble>\n <div className=\"size-fit border shrink-0 rounded-2xl overflow-hidden\">\n <div className=\"flex items-end gap-2 p-2\">\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'text-xs text-blue-500 line-clamp-2 underline hover:text-blue-600',\n 'break-words [word-break:break-word]', // `[word-break:break-word]` is deprecated but works in the browser, while `break-words` which is `[overflow-wrap: break-word]` does not work\n )}\n >\n {name}\n </a>\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">\n {(size / 1024).toFixed(2)} KB\n </span>\n </div>\n </div>\n </Wobble>\n );\n }\n\n return (\n <Dialoger\n trigger={\n <div>\n <Wobble>\n <div className=\"size-fit border shrink-0 rounded-2xl overflow-hidden\">\n {isImage && (\n <img src={url} className=\"object-cover size-16\" alt={name} />\n )}\n </div>\n </Wobble>\n </div>\n }\n >\n <DialogerContent\n className=\"size-full max-w-full rounded-3xl flex items-center justify-center bg-transparent border-none gap-0\"\n withClose\n >\n {isImage && (\n <div className=\"size-fit shrink-0 rounded-2xl overflow-hidden max-h-full\">\n <img src={url} className=\"object-cover size-auto\" alt={name} />\n </div>\n )}\n </DialogerContent>\n </Dialoger>\n );\n}\n","import React from 'react';\nimport ReactMarkdown from 'react-markdown';\n\nexport const MemoizedReactMarkdown = React.memo(\n ReactMarkdown,\n (prev, next) =>\n prev.children === next.children && prev.className === next.className,\n);\n","import React from 'react';\nimport remarkGfm from 'remark-gfm';\nimport { MemoizedReactMarkdown } from './MemoizedReactMarkdown';\nimport rehypeRaw from 'rehype-raw';\nimport { useConfig } from '@opencx/widget-react-headless';\n\nexport function RichText({\n children,\n messageType,\n messageId,\n}: {\n children: string;\n messageType?: string;\n messageId?: string;\n}) {\n const { anchorTarget } = useConfig();\n\n return (\n <MemoizedReactMarkdown\n data-type={messageType}\n data-id={messageId}\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n a: ({ children, ...props }) => {\n return (\n <a target={props.target || anchorTarget || '_top'} {...props}>\n {children}\n </a>\n );\n },\n }}\n // Do not pass className directly to ReactMarkdown component because that will create a container div wrapping the rich text\n >\n {children}\n </MemoizedReactMarkdown>\n );\n}\n","import type { OpenCxComponentNameU } from '@opencx/widget-core';\nimport type { WidgetComponentProps } from '@opencx/widget-react-headless';\nimport React from 'react';\nimport { dc } from '../../utils/data-component.js';\nimport { AttachmentPreview } from '../AttachmentPreview.js';\nimport { cn } from '../lib/utils/cn.js';\nimport { RichText } from '../RichText.js';\n\nexport function BotOrAgentMessageDefaultComponent({\n data,\n id,\n type,\n attachments,\n isFirstInGroup,\n isLastInGroup,\n isAloneInGroup,\n dataComponentNames,\n classNames,\n}: WidgetComponentProps & {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isAloneInGroup: boolean;\n dataComponentNames?: {\n messageContainer?: OpenCxComponentNameU;\n message?: OpenCxComponentNameU;\n };\n classNames?: {\n messageContainer?: string;\n message?: string;\n };\n}) {\n if (type !== 'AI' && type !== 'AGENT') return null;\n\n const { message, variant = 'default' } = data;\n\n if (variant === 'error') {\n return (\n <div>\n <div className=\"flex flex-row flex-wrap items-center justify-start\">\n <div className=\"leading-snug text-sm text-destructive\">{message}</div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n {...dc(dataComponentNames?.messageContainer ?? 'chat/agent_msg/root')}\n className={cn(\n 'w-5/6 flex flex-col items-start gap-1',\n classNames?.messageContainer,\n )}\n >\n {attachments && attachments.length > 0 && (\n <div className=\"w-full gap-1 flex flex-row flex-wrap items-center justify-start\">\n {attachments?.map((attachment) => (\n <AttachmentPreview attachment={attachment} key={attachment.id} />\n ))}\n </div>\n )}\n {message.length > 0 && (\n <div\n {...dc(dataComponentNames?.message ?? 'chat/agent_msg/msg')}\n // Expose these data attributes for external styling customization\n data-first={isFirstInGroup}\n data-last={isLastInGroup}\n data-alone={isAloneInGroup}\n className={cn(\n 'transition-all',\n 'w-fit py-3 px-4 rounded-3xl bg-secondary text-secondary-foreground',\n 'leading-snug text-sm prose prose-sm prose-a:decoration-primary prose-a:underline',\n 'break-words [word-break:break-word]', // `[word-break:break-word]` is deprecated but works in the browser, while `break-words` which is `[overflow-wrap: break-word]` does not work\n // No need to add \"whitespace-pre-wrap\" in the agent or bot message because it is markup and content appear on separate lines as expected\n // Adding \"whitespace-pre-wrap\" will result in unnecessarily huge line breaks\n\n // We're using the booleans directly here, not the data attributes, to make any external styling more specific than this\n isFirstInGroup && !isAloneInGroup && 'rounded-bl-md',\n isLastInGroup && !isAloneInGroup && 'rounded-tl-md',\n !isFirstInGroup &&\n !isLastInGroup &&\n !isAloneInGroup &&\n 'rounded-l-md',\n classNames?.message,\n )}\n >\n <RichText messageType={type} messageId={id}>\n {message}\n </RichText>\n </div>\n )}\n </div>\n );\n}\n","import type { WidgetComponentProps } from '@opencx/widget-react-headless';\nimport React from 'react';\n\n/**\n * The Basic Fallback component (Rendered when Debug is True and the component key is not found)\n */\nexport function FallbackDefaultComponent(props: WidgetComponentProps) {\n return (\n <div className=\"w-full max-w-full overflow-auto shrink-0\">\n <pre className=\"text-xs leading-tight whitespace-pre-wrap break-word\">\n {JSON.stringify(props, null, 1)}\n </pre>\n </div>\n );\n}\n","import * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cn } from './utils/cn';\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex size-6 aspect-square shrink-0 overflow-hidden rounded-full bg-secondary',\n // 'border',\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex size-full text-xs items-center justify-center rounded-lg',\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import type { AgentOrBotType } from '@opencx/widget-core';\nimport React from 'react';\nimport { Avatar, AvatarFallback, AvatarImage } from './lib/avatar';\nimport type { AvatarProps } from '@radix-ui/react-avatar';\n\nexport function AgentOrBotAvatar({\n agent,\n ...props\n}: AvatarProps & {\n agent: AgentOrBotType | undefined;\n}) {\n return (\n <Avatar {...props}>\n <AvatarImage src={agent?.avatar ?? ''} alt=\"Agent Icon\" />\n {agent?.name && (\n <AvatarFallback>\n {agent?.name?.slice(0, 1)?.toUpperCase()}\n </AvatarFallback>\n )}\n </Avatar>\n );\n}\n","import { type AgentOrBotType } from '@opencx/widget-core';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport React from 'react';\nimport { dc } from '../../utils/data-component';\nimport { AgentOrBotAvatar } from '../AgentOrBotAvatar';\nimport { MotionDiv } from '../lib/MotionDiv';\nimport { cn } from '../lib/utils/cn';\n\nexport type LoadingComponentProps = {\n agent: AgentOrBotType | undefined;\n};\n\nexport function LoadingDefaultComponent({ agent }: LoadingComponentProps) {\n return (\n <AnimatePresence>\n <MotionDiv\n {...dc('chat/bot_loading/root')}\n className=\"flex flex-row items-end w-full gap-2 animate-pulse\"\n >\n <AgentOrBotAvatar agent={agent} />\n <div\n {...dc('chat/bot_loading/bouncing_dots_container')}\n className={cn(\n 'flex items-center [&_span]:bg-secondary-foreground [&_span]:size-1 gap-1 p-2 rounded-xl bg-secondary',\n // 'border',\n )}\n >\n <motion.span className=\"rounded-full animate-bounce [animation-delay:-0.3s]\" />\n <motion.span className=\"rounded-full animate-bounce [animation-delay:-0.15s]\" />\n <motion.span className=\"rounded-full animate-bounce\" />\n </div>\n </MotionDiv>\n </AnimatePresence>\n );\n}\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\nimport { cn } from './utils/cn.js';\nimport { useConfig } from '@opencx/widget-react-headless';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden max-w-xs rounded-xl bg-primary border text-primary-foreground p-2 text-center align-middle text-xs animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n));\n\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nfunction Tooltippy({\n children,\n content,\n side,\n align,\n}: {\n children: React.ReactNode;\n content: React.ReactNode;\n side?: TooltipPrimitive.TooltipContentProps['side'];\n align?: TooltipPrimitive.TooltipContentProps['align'];\n}) {\n const { disableTooltips } = useConfig();\n if (!content || disableTooltips) return children;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent\n side={side}\n align={align}\n collisionPadding={8}\n avoidCollisions\n >\n {content}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nexport { TooltipProvider, Tooltippy };\n","import React from 'react';\n\nconst THRESHOLD_PIXELS = 450;\n\nexport function useIsSmallScreen() {\n const [isSmallScreen, setIsSmallScreen] = React.useState(() => {\n return (window.top || window).innerWidth < THRESHOLD_PIXELS;\n });\n\n React.useEffect(() => {\n const topWindow = window.top || window;\n\n const checkScreenSize = () => {\n setIsSmallScreen(topWindow.innerWidth < THRESHOLD_PIXELS);\n };\n\n checkScreenSize();\n\n topWindow.addEventListener('resize', checkScreenSize);\n\n return () => {\n topWindow.removeEventListener('resize', checkScreenSize);\n };\n }, []);\n\n return { isSmallScreen };\n}\n","import type { CSSProperties } from 'react';\nimport tc from 'tinycolor2';\nimport { isExhaustive, type WidgetConfig } from '@opencx/widget-core';\nimport { useConfig, useDocumentDir } from '@opencx/widget-react-headless';\nimport { WOBBLE_MAX_MOVEMENT_PIXELS } from '../components/lib/wobble';\nimport { useIsSmallScreen } from './useIsSmallScreen';\n\ntype DeepRequired<T> = {\n [K in keyof T]-?: DeepRequired<T[K]>;\n};\n\nconst DEFAULTS = {\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n transitionDuration: '1000ms',\n};\n\n/**\n * @returns The widget config theme with fallback default value\n */\nexport function useTheme() {\n const { dir } = useDocumentDir();\n const { isSmallScreen } = useIsSmallScreen();\n const { theme, inline } = useConfig();\n\n const withInlineDefault = (v: string) => {\n return inline ? '100%' : v;\n };\n\n const withSmallScreenDefault = (target: 'w' | 'h', v: string) => {\n return isSmallScreen ? `100dv${target}` : v;\n };\n\n const withDefaults = (target: 'w' | 'h', v: string) => {\n return withInlineDefault(withSmallScreenDefault(target, v));\n };\n\n const widgetTrigger = {\n zIndex: theme?.widgetTrigger?.zIndex ?? 10_000_000,\n offset: {\n bottom: theme?.widgetTrigger?.offset?.bottom ?? 20,\n right:\n theme?.widgetTrigger?.offset?.right ?? (dir === 'ltr' ? 20 : 'initial'),\n left:\n theme?.widgetTrigger?.offset?.left ?? (dir === 'rtl' ? 20 : 'initial'),\n },\n size: {\n button: theme?.widgetTrigger?.size?.button ?? 48,\n icon: theme?.widgetTrigger?.size?.icon ?? 24,\n },\n } satisfies NonNullable<DeepRequired<WidgetConfig['theme']>>['widgetTrigger'];\n\n const triggerOffset = (() => {\n const v =\n dir === 'ltr' ? widgetTrigger.offset.right : widgetTrigger.offset.left;\n if (typeof v !== 'number') return 0;\n return v;\n })();\n\n const themeWithFallbacks = {\n palette: theme?.palette ?? 'neutral',\n primaryColor: theme?.primaryColor ?? 'hsl(0 0% 9%)',\n widgetTrigger,\n widgetContentContainer: {\n borderRadius: isSmallScreen\n ? '0px'\n : (theme?.widgetContentContainer?.borderRadius ?? '32px'),\n zIndex: theme?.widgetContentContainer?.zIndex ?? widgetTrigger.zIndex + 1,\n outline: theme?.widgetContentContainer?.outline ?? 'none', // was: '1px solid'\n outlineColor:\n theme?.widgetContentContainer?.outlineColor ?? 'hsl(0 0% 50% / .5)',\n boxShadow:\n theme?.widgetContentContainer?.boxShadow ??\n '0 0px 100px 0px rgb(0 0 0 / 0.25)',\n transitionProperty:\n theme?.widgetContentContainer?.transitionProperty ?? 'all',\n transitionTimingFunction:\n theme?.widgetContentContainer?.transitionTimingFunction ??\n DEFAULTS.transitionTimingFunction,\n transitionDuration:\n theme?.widgetContentContainer?.transitionDuration ??\n DEFAULTS.transitionDuration,\n offset: {\n side: isSmallScreen\n ? 0\n : widgetTrigger.offset.bottom +\n widgetTrigger.size.button +\n WOBBLE_MAX_MOVEMENT_PIXELS.y * 2 +\n (theme?.widgetContentContainer?.offset?.side ?? 10),\n align: isSmallScreen\n ? 0\n : triggerOffset + (theme?.widgetContentContainer?.offset?.align ?? 0),\n },\n },\n screens: {\n welcome: {\n width: withDefaults('w', theme?.screens?.welcome?.width ?? '400px'),\n // By setting minHeight to 1px, a nice animation will play from 1px to the dynamic height of the content of the screen\n minHeight: withDefaults(\n 'h',\n theme?.screens?.welcome?.minHeight ?? '1px',\n ),\n },\n sessions: {\n width: withDefaults('w', theme?.screens?.sessions?.width ?? '450px'),\n height: withDefaults('h', theme?.screens?.sessions?.height ?? '600px'),\n },\n chat: {\n width: withDefaults('w', theme?.screens?.chat?.width ?? '525px'),\n height: withDefaults('h', theme?.screens?.chat?.height ?? '700px'),\n withCanvas: {\n width: withDefaults(\n 'w',\n theme?.screens?.chat?.withCanvas?.width ?? 'min(1050px, 100vw)',\n ),\n height: withDefaults(\n 'h',\n theme?.screens?.chat?.withCanvas?.height ?? 'min(800px, 100vh)',\n ),\n transitionTimingFunction:\n theme?.screens?.chat?.withCanvas?.transitionTimingFunction ??\n DEFAULTS.transitionTimingFunction,\n transitionDuration:\n theme?.screens?.chat?.withCanvas?.transitionDuration ??\n DEFAULTS.transitionDuration,\n },\n },\n },\n } satisfies NonNullable<DeepRequired<WidgetConfig['theme']>>;\n\n const computed = {\n // Subtract the offset.bottom twice so that it adds a bit of padding to the top\n // Subtract the distance between the trigger and the widget content container\n // Subtract the invisible padding of the trigger (for the wobble effect)\n maxHeight: withDefaults(\n 'h',\n `calc(\n 100vh \n - ${themeWithFallbacks.widgetTrigger.offset.bottom}px\n - ${themeWithFallbacks.widgetContentContainer.offset.side}px\n - ${WOBBLE_MAX_MOVEMENT_PIXELS.y * 2}px\n )`,\n ),\n // Subtract the offset.right twice so that it adds a bit of padding to the left\n maxWidth: withDefaults(\n 'w',\n `calc(\n 100vw \n - ${triggerOffset * 2}px\n )`,\n ),\n\n minHeight: withDefaults(\n 'h',\n `min(\n ${themeWithFallbacks.screens.welcome.minHeight}, \n ${themeWithFallbacks.screens.sessions.height}, \n ${themeWithFallbacks.screens.chat.height}\n )`,\n ),\n minWidth: withDefaults(\n 'w',\n `min(\n ${themeWithFallbacks.screens.welcome.width}, \n ${themeWithFallbacks.screens.sessions.width}, \n ${themeWithFallbacks.screens.chat.width}\n )`,\n ),\n };\n\n return {\n theme: themeWithFallbacks,\n computed,\n cssVars: cssVars({\n palette: themeWithFallbacks.palette,\n primary: themeWithFallbacks.primaryColor,\n }),\n };\n}\n\nfunction cssVars({\n palette: paletteName,\n primary,\n}: {\n palette: NonNullable<NonNullable<WidgetConfig['theme']>['palette']>;\n primary: string;\n}) {\n const palette = getPaletteColors(paletteName);\n const _primary = tc(primary).toHsl();\n const primaryForeground = tc(primary).isLight()\n ? palette['950']\n : palette['50'];\n\n /**\n * Spread the primary color without the `hsl()` call so that we can use tailwind opacity classes on it\n */\n const primitivePrimary = `${_primary.h} ${_primary.s * 100}% ${_primary.l * 100}%`;\n\n return {\n '--opencx-primary': primitivePrimary,\n '--opencx-primary-foreground': primaryForeground,\n\n '--opencx-background': palette['100'],\n '--opencx-foreground': palette['950'],\n\n '--opencx-destructive': '0 72.2% 50.6%',\n '--opencx-destructive-foreground': palette['50'],\n\n '--opencx-accent': palette['200'],\n '--opencx-accent-foreground': 'var(--opencx-foreground)',\n\n '--opencx-secondary': palette['200'],\n '--opencx-secondary-foreground': 'var(--opencx-foreground)',\n\n '--opencx-muted': palette['200'],\n '--opencx-muted-foreground': palette['500'],\n\n '--opencx-input': palette['300'],\n '--opencx-border': palette['300'],\n '--opencx-ring': 'var(--opencx-foreground)',\n } as CSSProperties;\n}\n\ntype PaletteValues = {\n '50': string;\n '100': string;\n '200': string;\n '300': string;\n '400': string;\n '500': string;\n '600': string;\n '700': string;\n '800': string;\n '900': string;\n '950': string;\n};\n/**\n * @returns A palette object with HSL values\n */\nfunction getPaletteColors(\n palette: NonNullable<NonNullable<WidgetConfig['theme']>['palette']>,\n): PaletteValues {\n const neutral: PaletteValues = {\n '50': '0 0% 98%',\n '100': '0 0% 96.1%',\n '200': '0 0% 89.8%',\n '300': '0 0% 83.1%',\n '400': '0 0% 63.9%',\n '500': '0 0% 45.1%',\n '600': '0 0% 32.2%',\n '700': '0 0% 25.1%',\n '800': '0 0% 14.9%',\n '900': '0 0% 9%',\n '950': '0 0% 3.9%',\n };\n\n const stone: PaletteValues = {\n '50': '60 9.1% 97.8%',\n '100': '60 4.8% 95.9%',\n '200': '20 5.9% 90%',\n '300': '24 5.7% 82.9%',\n '400': '24 5.4% 63.9%',\n '500': '25 5.3% 44.7%',\n '600': '33.3 5.5% 32.4%',\n '700': '30 6.3% 25.1%',\n '800': '12 6.5% 15.1%',\n '900': '24 9.8% 10%',\n '950': '20 14.3% 4.1%',\n };\n\n const zinc: PaletteValues = {\n '50': '0 0% 98%',\n '100': '240 4.8% 95.9%',\n '200': '240 5.9% 90%',\n '300': '240 4.9% 83.9%',\n '400': '240 5% 64.9%',\n '500': '240 3.8% 46.1%',\n '600': '240 5.2% 33.9%',\n '700': '240 5.3% 26.1%',\n '800': '240 3.7% 15.9%',\n '900': '240 5.9% 10%',\n '950': '240 10% 3.9%',\n };\n\n const slate: PaletteValues = {\n '50': '210 40% 98%',\n '100': '210 40% 96.1%',\n '200': '214.3 31.8% 91.4%',\n '300': '212.7 26.8% 83.9%',\n '400': '215 20.2% 65.1%',\n '500': '215.4 16.3% 46.9%',\n '600': '215.3 19.3% 34.5%',\n '700': '215.3 25% 26.7%',\n '800': '217.2 32.6% 17.5%',\n '900': '222.2 47.4% 11.2%',\n '950': '222.2 84% 4.9%',\n };\n\n switch (palette) {\n case 'neutral':\n return neutral;\n case 'stone':\n return stone;\n case 'zinc':\n return zinc;\n case 'slate':\n return slate;\n default:\n isExhaustive(palette, getPaletteColors.name);\n return neutral;\n }\n}\n","import { useEffect } from 'react';\nimport { useIsSmallScreen } from './useIsSmallScreen';\nimport { useConfig, useWidget } from '@opencx/widget-react-headless';\n\nexport function useSetWidgetSizeFn() {\n const { contentIframeRef } = useWidget();\n const { inline } = useConfig();\n\n return {\n setWidth: (width: string) => {\n contentIframeRef?.current?.style.setProperty(\n '--opencx-widget-width',\n inline ? '100%' : width,\n );\n },\n setHeight: (height: string) => {\n contentIframeRef?.current?.style.setProperty(\n '--opencx-widget-height',\n inline ? '100%' : height,\n );\n },\n };\n}\n\nexport function useSetWidgetSize({\n width,\n height,\n}: {\n width?: string;\n height?: string;\n}) {\n const { isSmallScreen } = useIsSmallScreen();\n const { setWidth, setHeight } = useSetWidgetSizeFn();\n\n useEffect(() => {\n if (width) setWidth(width);\n\n if (height) setHeight(height);\n }, [isSmallScreen, height, width, setWidth, setHeight]);\n}\n","import { isExhaustive, type IconNameU } from '@opencx/widget-core';\nimport {\n CheckCheckIcon,\n CheckIcon,\n CircleCheckBigIcon,\n CircleCheckIcon,\n CircleDashedIcon,\n CircleXIcon,\n ExpandIcon,\n Maximize2Icon,\n MaximizeIcon,\n Minimize2Icon,\n MinimizeIcon,\n ShrinkIcon,\n SquareCheckBigIcon,\n SquareCheckIcon,\n SquareXIcon,\n XIcon,\n type LucideIcon,\n} from 'lucide-react';\nimport React from 'react';\nimport { cn } from './utils/cn';\n\nconst FallbackIcon = CircleDashedIcon;\n\nexport function DynamicIcon({\n name,\n className,\n}: {\n name: IconNameU | undefined;\n className?: string;\n}) {\n const Icon: LucideIcon = (() => {\n switch (name) {\n case 'Check':\n return CheckIcon;\n case 'CheckCheck':\n return CheckCheckIcon;\n case 'CircleCheck':\n return CircleCheckIcon;\n case 'CircleCheckBig':\n return CircleCheckBigIcon;\n case 'CircleX':\n return CircleXIcon;\n case 'Expand':\n return ExpandIcon;\n case 'Maximize':\n return MaximizeIcon;\n case 'Maximize2':\n return Maximize2Icon;\n case 'Minimize':\n return MinimizeIcon;\n case 'Minimize2':\n return Minimize2Icon;\n case 'Shrink':\n return ShrinkIcon;\n case 'SquareCheck':\n return SquareCheckIcon;\n case 'SquareCheckBig':\n return SquareCheckBigIcon;\n case 'SquareX':\n return SquareXIcon;\n case 'X':\n return XIcon;\n\n case undefined:\n return FallbackIcon;\n\n default:\n isExhaustive(name, DynamicIcon.name);\n return FallbackIcon;\n }\n })();\n\n return <Icon className={cn('size-4', className)} />;\n}\n","import {\n isExhaustive,\n type HeaderButtonU,\n type SafeExtract,\n type ScreenU,\n} from '@opencx/widget-core';\nimport {\n useConfig,\n useSessions,\n useWidget,\n useWidgetRouter,\n useWidgetTrigger,\n} from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport { ChevronLeftIcon } from 'lucide-react';\nimport React, { useState } from 'react';\nimport { useIsSmallScreen } from '../hooks/useIsSmallScreen';\nimport { useSetWidgetSizeFn } from '../hooks/useSetWidgetSize';\nimport { useTheme } from '../hooks/useTheme';\nimport { dc } from '../utils/data-component';\nimport {\n Dialoger,\n DialogerBody,\n DialogerContent,\n DialogerDescription,\n DialogerFooter,\n DialogerHeader,\n DialogerTitle,\n useDialoger,\n} from './Dialoger';\nimport { Button } from './lib/button';\nimport { DynamicIcon } from './lib/DynamicIcon';\nimport { cn } from './lib/utils/cn';\n\nfunction useGetHeaderTitle() {\n const { widgetCtx: { org } } = useWidget();\n const {\n routerState: { screen },\n } = useWidgetRouter();\n const { textContent } = useConfig();\n\n const override = (() => {\n switch (screen) {\n case 'chat':\n return textContent?.chatScreen?.headerTitle;\n case 'sessions':\n return textContent?.sessionsScreen?.headerTitle;\n case 'welcome':\n return undefined;\n default:\n isExhaustive(screen, useGetHeaderTitle.name);\n return undefined;\n }\n })();\n\n return override ?? org.name ?? 'Chat';\n}\n\nfunction useGetHeaderDataComponentProp(\n screen: ScreenU,\n): ReturnType<typeof dc> | undefined {\n switch (screen) {\n case 'chat':\n return dc('chat/header');\n case 'sessions':\n return dc('sessions/header');\n case 'welcome':\n return undefined;\n default:\n isExhaustive(screen, useGetHeaderTitle.name);\n return undefined;\n }\n}\n\nfunction Header__BackToSessionsScreenButton() {\n const { router } = useConfig();\n const {\n routerState: { screen },\n toSessionsScreen,\n } = useWidgetRouter();\n\n if (screen !== 'chat') return null;\n if (router?.chatScreenOnly) return null;\n\n return (\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n onClick={toSessionsScreen}\n >\n <ChevronLeftIcon className=\"size-4 rtl:-scale-100\" />\n </Button>\n );\n}\n\nfunction Header__Buttons__Item__CloseWidget({\n button,\n}: {\n button: SafeExtract<HeaderButtonU, { functionality: 'close-widget' }>;\n}) {\n const { setIsOpen } = useWidgetTrigger();\n const { isSmallScreen } = useIsSmallScreen();\n\n if (isSmallScreen && button.hideOnSmallScreen) return null;\n if (!isSmallScreen && button.hideOnLargeScreen) return null;\n\n const handleClick = () => {\n if (button.handleClick) return button.handleClick();\n setIsOpen(false);\n };\n\n return (\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n onClick={handleClick}\n >\n <DynamicIcon name={button.icon} />\n </Button>\n );\n}\n\nfunction Header__Buttons__Item__ExpandShrink({\n button,\n}: {\n button: SafeExtract<HeaderButtonU, { functionality: 'expand-shrink' }>;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const {\n routerState: { screen },\n } = useWidgetRouter();\n const { isSmallScreen } = useIsSmallScreen();\n const { theme } = useTheme();\n const { setWidth, setHeight } = useSetWidgetSizeFn();\n\n if (screen !== 'chat' && screen !== 'sessions') return null;\n\n const screenHeight = (() => {\n switch (screen) {\n case 'chat':\n return theme.screens.chat.height;\n case 'sessions':\n return theme.screens.sessions.height;\n default:\n isExhaustive(screen, Header__Buttons__Item__ExpandShrink.name);\n return theme.screens.chat.height;\n }\n })();\n const screenWidth = (() => {\n switch (screen) {\n case 'chat':\n return theme.screens.chat.width;\n case 'sessions':\n return theme.screens.sessions.width;\n default:\n isExhaustive(screen, Header__Buttons__Item__ExpandShrink.name);\n return theme.screens.chat.width;\n }\n })();\n\n const handleClick = () => {\n setExpanded((prev) => {\n const isExpanded = !prev;\n setHeight(isExpanded ? '100vh' : screenHeight);\n setWidth(isExpanded ? `max(40vw, ${screenWidth})` : screenWidth);\n\n return isExpanded;\n });\n };\n\n if (isSmallScreen && button.hideOnSmallScreen) return null;\n if (!isSmallScreen && button.hideOnLargeScreen) return null;\n\n return (\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n onClick={handleClick}\n >\n <DynamicIcon\n name={button.icon || (expanded ? button.shrinkIcon : button.expandIcon)}\n />\n </Button>\n );\n}\n\nfunction Header__Buttons__Item__ResolveSession({\n button,\n}: {\n button: SafeExtract<HeaderButtonU, { functionality: 'resolve-session' }>;\n}) {\n const { close: closeDialog } = useDialoger();\n const { widgetCtx } = useWidget();\n const { setIsOpen } = useWidgetTrigger();\n const { resolveSession, sessionState } = useSessions();\n const { isSmallScreen } = useIsSmallScreen();\n\n const isNoSession = !sessionState.session;\n const isResolved = sessionState.session?.isOpened === false;\n const onResolved: NonNullable<typeof button.onResolved> =\n button.onResolved || 'stay-in-chat';\n const behaviorBeforeSessionCreation: NonNullable<\n typeof button.behaviorBeforeSessionCreation\n > = button.behaviorBeforeSessionCreation || 'disabled';\n const behaviorIfSessionIsResolved: NonNullable<\n typeof button.behaviorIfSessionIsResolved\n > = button.behaviorIfSessionIsResolved || 'disabled';\n\n const isDisabled = (() => {\n if (sessionState.isResolvingSession) return true;\n if (isNoSession && behaviorBeforeSessionCreation === 'disabled')\n return true;\n if (isResolved && behaviorIfSessionIsResolved === 'disabled') return true;\n return false;\n })();\n\n const handleResolve = async () => {\n const { success, error } = await resolveSession();\n closeDialog();\n if (!success) return console.error(error);\n\n switch (onResolved) {\n case 'stay-in-chat':\n return;\n case 'close-widget':\n setIsOpen(false);\n break;\n case 'reset-chat':\n widgetCtx.resetChat();\n break;\n case 'reset-chat-and-close-widget':\n setIsOpen(false);\n widgetCtx.resetChat();\n break;\n default:\n isExhaustive(onResolved, Header__Buttons__Item__ResolveSession.name);\n break;\n }\n };\n\n const handleResolveAlternative = () => {\n if (isNoSession) {\n switch (behaviorBeforeSessionCreation) {\n case 'disabled':\n return;\n case 'close-widget':\n setIsOpen(false);\n break;\n default:\n isExhaustive(\n behaviorBeforeSessionCreation,\n handleResolveAlternative.name,\n );\n }\n }\n\n if (isResolved) {\n switch (behaviorIfSessionIsResolved) {\n case 'disabled':\n return;\n case 'close-widget':\n setIsOpen(false);\n break;\n case 'reset-chat':\n widgetCtx.resetChat();\n break;\n case 'reset-chat-and-close-widget':\n setIsOpen(false);\n setTimeout(() => {\n widgetCtx.resetChat();\n }, 200);\n break;\n default:\n isExhaustive(\n behaviorIfSessionIsResolved,\n handleResolveAlternative.name,\n );\n }\n }\n };\n\n if (isSmallScreen && button.hideOnSmallScreen) return null;\n if (!isSmallScreen && button.hideOnLargeScreen) return null;\n\n // TODO: add translations for fallbacks\n if (button.confirmation?.type === 'modal' && !isResolved && !isNoSession) {\n return (\n <Dialoger\n trigger={\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n disabled={isDisabled}\n >\n <DynamicIcon name={button.icon} />\n </Button>\n }\n >\n <DialogerContent>\n <DialogerHeader>\n <DialogerTitle>\n {button.confirmation.title || 'Close conversation'}\n </DialogerTitle>\n </DialogerHeader>\n <DialogerBody>\n <DialogerDescription>\n {button.confirmation.description ||\n 'Are you sure you want to close this conversation?'}\n </DialogerDescription>\n </DialogerBody>\n <DialogerFooter>\n <Button\n variant=\"secondary\"\n onClick={closeDialog}\n disabled={sessionState.isResolvingSession}\n >\n {button.confirmation.cancelButtonText || 'No'}\n </Button>\n <Button\n variant=\"destructive\"\n onClick={handleResolve}\n disabled={sessionState.isResolvingSession}\n >\n {button.confirmation.confirmButtonText || 'Yes'}\n </Button>\n </DialogerFooter>\n </DialogerContent>\n </Dialoger>\n );\n }\n\n return (\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n onClick={\n isResolved || isNoSession ? handleResolveAlternative : handleResolve\n }\n disabled={isDisabled}\n >\n <DynamicIcon name={button.icon} />\n </Button>\n );\n}\n\nfunction Header__Buttons__Item({ button }: { button: HeaderButtonU }) {\n switch (button.functionality) {\n case 'close-widget':\n return <Header__Buttons__Item__CloseWidget button={button} />;\n case 'expand-shrink':\n return <Header__Buttons__Item__ExpandShrink button={button} />;\n case 'resolve-session':\n return <Header__Buttons__Item__ResolveSession button={button} />;\n default:\n isExhaustive(button, Header__Buttons__Item.name);\n return null;\n }\n}\n\nconst defaultCloseWidgetButton = {\n functionality: 'close-widget',\n hideOnLargeScreen: true,\n icon: 'X',\n} satisfies HeaderButtonU;\n\nexport function Header__Buttons() {\n const {\n routerState: { screen },\n } = useWidgetRouter();\n const { headerButtons } = useConfig();\n\n const buttons =\n screen === 'chat'\n ? headerButtons?.chatScreen\n : screen === 'sessions'\n ? headerButtons?.sessionsScreen\n : [];\n\n if (!buttons || buttons.length === 0) {\n return <Header__Buttons__Item button={defaultCloseWidgetButton} />;\n }\n\n return (\n <>\n {buttons.map((button) => (\n <Header__Buttons__Item\n key={`${button.functionality}-${button.icon}`}\n button={button}\n />\n ))}\n </>\n );\n}\n\nexport function Header() {\n const {\n routerState: { screen },\n } = useWidgetRouter();\n const dataComponentProp = useGetHeaderDataComponentProp(screen);\n const title = useGetHeaderTitle();\n\n return (\n <header {...dataComponentProp} className=\"py-2 px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Header__BackToSessionsScreenButton />\n <div\n className={cn(\n 'flex-1 h-8 flex items-center',\n screen === 'sessions' && 'ps-2',\n )}\n >\n <h2 className=\"font-semibold\">{title}</h2>\n </div>\n <Header__Buttons />\n </div>\n </header>\n );\n}\n","import React from 'react';\nimport { LoaderIcon } from 'lucide-react';\nimport { cn } from './utils/cn';\n\nexport function LoadingSpinner({ className }: { className?: string }) {\n return <LoaderIcon className={cn('size-4 animate-spin', className)} />;\n}\n","import { useMessages } from '@opencx/widget-react-headless';\nimport { useIsSmallScreen } from './useIsSmallScreen';\nimport { useModes } from '@opencx/widget-react-headless';\n\nexport function useCanvas() {\n const {\n messagesState: { isInitialFetchLoading },\n } = useMessages();\n const { isSmallScreen } = useIsSmallScreen();\n const { activeMode, Component } = useModes();\n\n const isCanvasOpen =\n !isInitialFetchLoading && !isSmallScreen && !!activeMode && !!Component;\n\n return {\n isCanvasOpen,\n };\n}\n","import React, { useState } from 'react';\nimport { useMessages, useModes, useSessions } from '@opencx/widget-react-headless';\n\nexport function ChatCanvas() {\n const { activeMode, Component } = useModes();\n const { sendMessage } = useMessages();\n const { createStateCheckpoint } = useSessions();\n\n const [isSendingMessage, setIsSendingMessage] = useState(false);\n\n const handleSendMessage = async (args: Parameters<typeof sendMessage>[0]) => {\n try {\n setIsSendingMessage(true);\n await sendMessage(args);\n } catch (error) {\n console.error(error);\n } finally {\n setIsSendingMessage(false);\n }\n };\n\n if (!activeMode || !Component) return null;\n\n return (\n <Component\n react={React}\n mode={activeMode}\n createStateCheckpoint={createStateCheckpoint}\n sendMessage={handleSendMessage}\n isSendingMessage={isSendingMessage}\n />\n );\n}\n","import React from 'react';\nimport { MotionDiv, type MotionDivProps } from './MotionDiv';\nimport { cn } from './utils/cn';\n\nexport const MotionDiv__VerticalReveal = React.forwardRef<HTMLDivElement, MotionDivProps>(\n (props, ref) => {\n return (\n <MotionDiv\n {...props}\n ref={ref}\n className={cn('overflow-hidden', props.className)}\n overrides={{\n initial: { height: 0, opacity: 0, ...props.overrides?.initial },\n animate: { height: 'auto', opacity: 1, ...props.overrides?.animate },\n exit: { height: 0, opacity: 0, ...props.overrides?.exit },\n }}\n />\n );\n }\n);\nMotionDiv__VerticalReveal.displayName = 'MotionDiv__VerticalReveal';\n","import {\n useCsat,\n type WidgetComponentProps,\n} from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport { ArrowUpIcon } from 'lucide-react';\nimport React, { useState } from 'react';\nimport { useIsSmallScreen } from '../hooks/useIsSmallScreen';\nimport { Button } from './lib/button';\nimport { MotionDiv__VerticalReveal } from './lib/MotionDiv__VerticalReveal';\nimport { cn } from './lib/utils/cn';\n\nconst CSAT_SCORES = [\n {\n label: 'Terrible',\n value: 1,\n emoji: '😡',\n },\n {\n label: 'Poor',\n value: 2,\n emoji: '😞',\n },\n {\n label: 'Okay',\n value: 3,\n emoji: '😐',\n },\n {\n label: 'Good',\n value: 4,\n emoji: '😊',\n },\n {\n label: 'Great',\n value: 5,\n emoji: '😍',\n },\n];\n\nexport function CsatSurvey() {\n const { isSmallScreen } = useIsSmallScreen();\n const {\n submitCsat,\n isCsatRequested,\n isCsatSubmitted,\n submittedScore,\n submittedFeedback,\n } = useCsat();\n\n const [score, setScore] = useState<number | null>(null);\n const [feedback, setFeedback] = useState<string | null>(null);\n\n const handleRatingClick = (value: number) => {\n setScore((prev) => (prev === value ? null : value));\n };\n\n const handleSubmit = () => {\n if (!score) return;\n void submitCsat({\n score: score,\n feedback: feedback || undefined,\n });\n };\n\n if (!isCsatRequested && !isCsatSubmitted) return null;\n\n return (\n <div className=\"w-1/2 min-w-80 max-w-96 mx-auto overflow-hidden\">\n {/* ------------------------ TITLE ----------------------- */}\n <AnimatePresence mode=\"wait\">\n {isCsatRequested && !score ? (\n <MotionDiv__VerticalReveal key=\"csat-requested-title\">\n <p className=\"text-sm text-muted-foreground text-center pt-2\">\n How was your conversation?\n </p>\n </MotionDiv__VerticalReveal>\n ) : isCsatSubmitted ? (\n <MotionDiv__VerticalReveal key=\"csat-submitted-title\">\n <p className=\"text-sm text-muted-foreground text-center pt-2\">\n You rated the conversation as\n </p>\n </MotionDiv__VerticalReveal>\n ) : null}\n </AnimatePresence>\n\n {/* ------------------------ EMOJI ----------------------- */}\n <div\n className={cn(\n 'flex gap-4 justify-between pt-2 px-2 pb-2',\n 'transition-all',\n isCsatSubmitted && 'gap-0 justify-center',\n )}\n >\n {CSAT_SCORES.map((s) => (\n <Button\n variant={s.value === score ? 'secondary' : 'ghost'}\n size=\"selfless\"\n className={cn(\n 'transition-all overflow-hidden',\n 'text-2xl size-8 rounded-full',\n 'opacity-35',\n 'hover:opacity-100',\n !score && 'opacity-100',\n s.value === score && 'opacity-100',\n isCsatSubmitted &&\n s.value !== submittedScore &&\n 'opacity-0 size-0',\n isCsatSubmitted &&\n s.value === submittedScore &&\n 'opacity-100 size-fit text-4xl',\n )}\n key={s.value}\n onClick={\n isCsatRequested ? () => handleRatingClick(s.value) : undefined\n }\n >\n {s.emoji}\n </Button>\n ))}\n </div>\n\n {/* ------------------------ FEEDBACK ----------------------- */}\n <AnimatePresence mode=\"wait\">\n {(score || submittedScore) && (\n <MotionDiv__VerticalReveal key=\"feedback-box\">\n <div className=\"pb-2 px-2 flex items-end\">\n <textarea\n // Thw `rows` attribute will take effect in browsers that do not support [field-sizing:content;] (Firefox and Safari as of now)\n rows={3}\n className={cn(\n 'transition-all',\n 'max-h-40 [field-sizing:content]',\n 'w-full resize-none',\n 'bg-transparent outline-none',\n 'placeholder:text-muted-foreground',\n // 16px on mobiles prevents auto-zoom on the input when focused\n isSmallScreen ? 'text-[16px]' : 'text-sm',\n isCsatSubmitted && 'text-center',\n )}\n value={\n isCsatSubmitted ? submittedFeedback || '' : feedback || ''\n }\n onChange={\n isCsatRequested\n ? (e) => setFeedback(e.target.value)\n : undefined\n }\n readOnly={isCsatSubmitted}\n placeholder={\n isCsatRequested ? 'Tell us more... (optional)' : undefined\n }\n />\n <Button\n size=\"fit\"\n onClick={handleSubmit}\n disabled={!score}\n className={cn(\n 'transition-all overflow-hidden',\n 'rounded-full size-8 flex items-center justify-center p-0',\n isCsatSubmitted && 'opacity-0 size-0',\n )}\n >\n <ArrowUpIcon className=\"size-4\" />\n </Button>\n </div>\n </MotionDiv__VerticalReveal>\n )}\n </AnimatePresence>\n\n {/* ----------------------- SPACER ----------------------- */}\n <div className={cn('h-0 transition-[height]', isCsatSubmitted && 'h-4')} />\n </div>\n );\n}\n","import { useConfig, useDocumentDir } from '@opencx/widget-react-headless';\nimport { useMemo } from 'react';\nimport {\n getTranslation,\n isSupportedLanguage,\n type Language,\n type TranslationKeyU,\n} from '@opencx/widget-core';\n\nexport function useTranslation() {\n const { dir: hostDocumentDir } = useDocumentDir();\n const config = useConfig();\n\n return useMemo(() => {\n const language: Language = isSupportedLanguage(config.language)\n ? config.language\n : 'en';\n return {\n t: (key: TranslationKeyU) => getTranslation(key, language, config.translationOverrides),\n language: language,\n dir: language === 'ar' ? 'rtl' : 'ltr',\n hostDocumentDir,\n };\n }, [config.language, hostDocumentDir]);\n}\n","import { useMessages } from '@opencx/widget-react-headless';\nimport React from 'react';\nimport { dc } from '../utils/data-component.js';\nimport { Button, type ButtonProps } from './lib/button.js';\nimport { cn } from './lib/utils/cn.js';\n\nexport function SuggestedReplyButton({\n suggestion,\n className,\n ...props\n}: ButtonProps & { suggestion: string }) {\n const { sendMessage } = useMessages();\n\n const handleSend = () => {\n const trimmed = suggestion.trim();\n if (!trimmed) return;\n sendMessage({ content: trimmed });\n };\n\n return (\n <Button\n {...dc('chat/suggested_reply_btn')}\n size=\"sm\"\n className={cn('rounded-xl w-fit', className)}\n {...props}\n onClick={handleSend}\n >\n {suggestion}\n </Button>\n );\n}\n","import React from 'react';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { SuggestedReplyButton } from './SuggestedReplyButton';\nimport { dc } from '../utils/data-component';\n\nexport function MightSolveUserIssueSuggestedReplies() {\n const { t } = useTranslation();\n const options = [t('i_need_more_help'), t('this_was_helpful')];\n\n return (\n <div\n {...dc('chat/might_solve_user_issue_suggested_replies_container')}\n className=\"flex items-center gap-2 p-2 pb-0 flex-wrap\"\n >\n {options.map((option) => (\n <SuggestedReplyButton\n key={option}\n suggestion={option}\n className=\"flex-1\"\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport { useConfig, useSessions } from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport { MotionDiv__VerticalReveal } from '../../components/lib/MotionDiv__VerticalReveal';\nimport { RichText } from '../../components/RichText';\n\nexport function ChatFooterItems() {\n const { sessionState } = useSessions();\n const { chatFooterItems } = useConfig();\n\n const isSessionResolved = !!sessionState.session && !sessionState.session.isOpened;\n const isSessionOpen = !isSessionResolved;\n\n return (\n <AnimatePresence mode=\"wait\">\n {chatFooterItems?.map((item, i) => {\n if (item.showWhenSessionIsOpen === false && isSessionOpen) {\n return null;\n }\n if (item.showWhenSessionIsResolved === false && isSessionResolved) {\n return null;\n }\n\n return (\n <MotionDiv__VerticalReveal key={`${item.message}-${i}`}>\n <div className=\"pb-2 text-center text-xs\">\n <RichText>{item.message}</RichText>\n </div>\n </MotionDiv__VerticalReveal>\n );\n })}\n </AnimatePresence>\n );\n}\n","import { type SendMessageDto } from '@opencx/widget-core';\nimport {\n useConfig,\n useCsat,\n useIsAwaitingBotReply,\n useMessages,\n useSessions,\n useUploadFiles,\n useWidget,\n useWidgetRouter,\n type FileWithProgress,\n} from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport {\n AlertCircle,\n ArrowUpIcon,\n CircleCheckIcon,\n CircleDashed,\n FileAudio2Icon,\n FileIcon,\n FileVideo2Icon,\n ImageIcon,\n Loader2,\n PaperclipIcon,\n XIcon,\n} from 'lucide-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { CsatSurvey } from '../../components/CsatSurvey';\nimport { MightSolveUserIssueSuggestedReplies } from '../../components/MightSolveUserIssueSuggestedReplies';\nimport { SuggestedReplyButton } from '../../components/SuggestedReplyButton';\nimport { MotionDiv } from '../../components/lib/MotionDiv';\nimport { MotionDiv__VerticalReveal } from '../../components/lib/MotionDiv__VerticalReveal';\nimport { Button } from '../../components/lib/button';\nimport { Tooltippy } from '../../components/lib/tooltip';\nimport { cn } from '../../components/lib/utils/cn';\nimport { useIsSmallScreen } from '../../hooks/useIsSmallScreen';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { dc } from '../../utils/data-component';\nimport { ChatFooterItems } from './ChatFooterItems';\n\nfunction FileDisplay({\n file: { status, file, error },\n onCancel,\n}: {\n file: FileWithProgress;\n onCancel: () => void;\n}) {\n const [fileContent, setFileContent] = useState<string | ArrayBuffer | null>(\n null,\n );\n\n useEffect(() => {\n if (!file.type.startsWith('image/')) return;\n\n const reader = new FileReader();\n reader.onload = () => setFileContent(reader.result as string);\n reader.onerror = () => console.error('Error reading file');\n reader.readAsDataURL(file);\n\n return () => reader.abort();\n }, [file]);\n\n const getStatusIcon = () => {\n switch (status) {\n case 'uploading':\n return <Loader2 className=\"size-4 animate-spin\" />;\n case 'error':\n return <AlertCircle className=\"size-4 text-destructive\" />;\n default:\n return null;\n }\n };\n\n const FileContent = () => {\n const fileType = file.type.split('/')[0];\n\n if (fileType === 'image' && fileContent) {\n return (\n <img\n src={typeof fileContent === 'string' ? fileContent : ''}\n className=\"object-cover bg-secondary size-full\"\n alt={file.name}\n />\n );\n }\n if (fileType === 'audio') {\n return <FileAudio2Icon />;\n }\n if (fileType === 'video') {\n return <FileVideo2Icon />;\n }\n return <FileIcon />;\n };\n\n return (\n <Tooltippy\n side=\"bottom\"\n content={\n status === 'error' ? (\n <span className=\"text-destructive\">Failed to upload: {error}</span>\n ) : (\n file.name\n )\n }\n >\n <div\n className={cn(\n status === 'uploading' && 'opacity-50',\n 'group',\n 'size-12 border rounded-2xl overflow-hidden relative',\n 'flex items-center justify-center shrink-0',\n )}\n >\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {getStatusIcon()}\n </div>\n <button\n type=\"button\"\n className={cn(\n 'absolute bg-black/50 inset-0 size-full z-10 opacity-0',\n 'flex items-center justify-center',\n 'opacity-0 group-hover:opacity-100 transition',\n )}\n onClick={onCancel}\n >\n <XIcon className=\"size-4 text-primary-foreground\" />\n </button>\n <FileContent />\n </div>\n </Tooltippy>\n );\n}\n\nfunction ChatInput() {\n const { isSmallScreen } = useIsSmallScreen();\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const { sendMessage } = useMessages();\n const { sessionState } = useSessions();\n const { t } = useTranslation();\n const [inputText, setInputText] = useState('');\n\n const {\n allFiles,\n emptyTheFiles,\n handleCancelUpload,\n appendFiles,\n isUploading,\n successFiles,\n } = useUploadFiles();\n\n const isHandedOff = !!sessionState.session?.isHandedOff;\n\n const { isAwaitingBotReply } = useIsAwaitingBotReply();\n\n const handleFileDrop = (acceptedFiles: File[]) => {\n appendFiles(acceptedFiles);\n };\n\n const cannotSend = !inputText.trim() && successFiles.length === 0;\n\n const handleSubmit = async () => {\n if (isAwaitingBotReply) return;\n if (cannotSend) return;\n\n if (isUploading) {\n // TODO use something other than toast\n const message = 'please wait for the file(s) to upload';\n console.info(message);\n }\n const trimmed = inputText.trim();\n\n // Do not await this\n void sendMessage({\n content: trimmed,\n attachments: successFiles.flatMap((f) =>\n f.fileUrl\n ? [\n {\n url: f.fileUrl,\n type: f.file.type,\n name: f.file.name,\n id: f.id,\n size: f.file.size,\n } satisfies NonNullable<SendMessageDto['attachments']>[number],\n ]\n : [],\n ),\n });\n\n setInputText('');\n emptyTheFiles();\n };\n\n const {\n getRootProps: dropzone__getRootProps,\n getInputProps: dropzone__getInputProps,\n open: dropzone__openFileSelect,\n } = useDropzone({\n onDrop: handleFileDrop,\n noClick: true,\n onDropRejected() {\n // TODO use something other than toast\n const message = 'unsupported file type, or the file is too large';\n console.error(message);\n },\n maxSize: 5 * 1024 * 1024,\n accept: isHandedOff\n ? {\n 'text/*': ['.txt'],\n 'image/*': ['.png', '.jpg', '.jpeg', '.gif'],\n 'application/pdf': ['.pdf'],\n }\n : {\n 'image/png': ['.png'],\n 'image/jpeg': ['.jpg', '.jpeg'],\n 'image/gif': ['.gif'],\n 'image/webp': ['.webp'],\n },\n });\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) return;\n if (clipboardData.files.length > 0) {\n handleFileDrop(Array.from(clipboardData.files));\n }\n };\n\n return (\n <div\n {...dc('chat/input_box/root')}\n className=\"p-2 relative space-y-1\"\n {...dropzone__getRootProps()}\n >\n <input {...dropzone__getInputProps()} />\n <div\n {...dc('chat/input_box/inner_root')}\n className={cn(\n 'transition-all',\n 'bg-white',\n // 'border',\n 'relative rounded-3xl flex flex-col gap-2 p-2',\n 'hover:border-primary focus-within:border-primary',\n )}\n >\n <div\n {...dc('chat/input_box/textarea_and_attachments_container')}\n className=\"flex flex-col gap-2\"\n >\n {allFiles.length > 0 && (\n <div\n {...dc('chat/input_box/attachments_container')}\n className=\"flex items-center gap-1\"\n >\n <AnimatePresence mode=\"popLayout\">\n {allFiles.map((file) => (\n <MotionDiv key={file.id} snapExit>\n <FileDisplay\n onCancel={() => handleCancelUpload(file.id)}\n file={file}\n />\n </MotionDiv>\n ))}\n </AnimatePresence>\n </div>\n )}\n <textarea\n {...dc('chat/input_box/textarea')}\n onPaste={handlePaste}\n ref={inputRef}\n id=\"chat-input\"\n value={inputText}\n // Thw `rows` attribute will take effect in browsers that do not support [field-sizing:content;] (Firefox and Safari as of now)\n rows={3}\n className={cn(\n /** Match the border radius of the container */\n // INPUT_CONTAINER_B_RADIUS,\n 'max-h-16 [field-sizing:content]',\n 'w-full resize-none px-2',\n allFiles.length === 0 && 'pt-1',\n 'bg-transparent outline-none',\n 'placeholder:text-muted-foreground',\n // 16px on mobiles prevents auto-zoom on the input when focused\n isSmallScreen ? 'text-[16px]' : 'text-sm',\n )}\n onChange={(e) => setInputText(e.target.value)}\n onKeyDown={async (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n handleSubmit();\n }\n }}\n placeholder={t('write_a_message_placeholder')}\n />\n </div>\n <div className=\"gap-2 flex justify-between\">\n <Tooltippy\n side=\"top\"\n align=\"start\"\n content=\"attach files, (maximum size 5mb)\"\n >\n <Button\n onClick={dropzone__openFileSelect}\n size=\"fit\"\n variant=\"ghost\"\n className={cn(\n 'rounded-full size-8 flex items-center justify-center p-0 overflow-hidden',\n )}\n >\n <AnimatePresence mode=\"wait\">\n {isHandedOff ? (\n <MotionDiv key=\"paper-clip\">\n <PaperclipIcon className=\"size-4\" />\n </MotionDiv>\n ) : (\n <MotionDiv key=\"image-icon\">\n <ImageIcon className=\"size-4\" />\n </MotionDiv>\n )}\n </AnimatePresence>\n </Button>\n </Tooltippy>\n\n <Tooltippy content=\"send message\" side=\"top\" align=\"end\">\n <Button\n size=\"fit\"\n onClick={handleSubmit}\n disabled={isAwaitingBotReply || isUploading || cannotSend}\n className=\"rounded-full size-8 flex items-center justify-center p-0\"\n >\n <AnimatePresence mode=\"wait\">\n {isAwaitingBotReply || isUploading ? (\n <MotionDiv key=\"loading\" snapExit>\n <CircleDashed className=\"size-4 animate-spin animate-iteration-infinite\" />\n </MotionDiv>\n ) : (\n <MotionDiv key=\"send\" snapExit>\n <ArrowUpIcon className=\"size-4\" />\n </MotionDiv>\n )}\n </AnimatePresence>\n </Button>\n </Tooltippy>\n </div>\n </div>\n </div>\n );\n}\n\nfunction NewConvOrBackToConvsButton() {\n const { widgetCtx } = useWidget();\n const { router } = useConfig();\n const { canCreateNewSession } = useSessions();\n const { toSessionsScreen } = useWidgetRouter();\n const { t } = useTranslation();\n\n return (\n <>\n {canCreateNewSession || !!router?.chatScreenOnly ? (\n <Button onClick={widgetCtx.resetChat} className=\"rounded-2xl w-full\">\n {t('new_conversation')}\n </Button>\n ) : (\n <Button onClick={toSessionsScreen} className=\"rounded-2xl w-full\">\n {t('back_to_conversations')}\n </Button>\n )}\n </>\n );\n}\n\nfunction SessionClosedSection() {\n const { t } = useTranslation();\n const { isCsatRequested, isCsatSubmitted } = useCsat();\n\n return (\n <div className=\"p-2\">\n <div className=\"p-2 bg-muted rounded-3xl\">\n <AnimatePresence mode=\"wait\">\n {isCsatRequested || isCsatSubmitted ? (\n <MotionDiv__VerticalReveal key=\"csat\">\n <CsatSurvey />\n <AnimatePresence mode=\"wait\">\n {isCsatSubmitted && (\n <MotionDiv__VerticalReveal key=\"new-conv-or-back-to-convs-button\">\n <NewConvOrBackToConvsButton />\n </MotionDiv__VerticalReveal>\n )}\n </AnimatePresence>\n </MotionDiv__VerticalReveal>\n ) : (\n <MotionDiv__VerticalReveal key=\"session-closed\">\n <div className=\"ps-2 flex items-center gap-1 pb-2\">\n <CircleCheckIcon className=\"size-4 text-emerald-600\" />\n <h2 className=\"text-sm font-medium\">\n {t('your_issue_has_been_resolved')}\n </h2>\n </div>\n <NewConvOrBackToConvsButton />\n </MotionDiv__VerticalReveal>\n )}\n </AnimatePresence>\n </div>\n </div>\n );\n}\n\nexport function ChatFooter() {\n const { initialQuestions, initialQuestionsPosition, thisWasHelpfulOrNot } =\n useConfig();\n const { sessionState } = useSessions();\n const { messagesState } = useMessages();\n\n const noMessages = messagesState.messages.length === 0;\n\n return (\n <footer>\n <AnimatePresence mode=\"wait\">\n {sessionState.session && !sessionState.session?.isOpened ? (\n <MotionDiv__VerticalReveal key=\"session-closed\">\n <SessionClosedSection />\n <ChatFooterItems />\n </MotionDiv__VerticalReveal>\n ) : (\n <MotionDiv__VerticalReveal key=\"chat-input\">\n {messagesState.lastAIResMightSolveUserIssue &&\n thisWasHelpfulOrNot?.enabled !== false && (\n <MightSolveUserIssueSuggestedReplies />\n )}\n\n {noMessages &&\n initialQuestions &&\n initialQuestionsPosition !== 'below-initial-messages' && (\n <div className=\"flex items-center flex-row justify-end gap-2 flex-wrap px-2\">\n {initialQuestions?.map((iq, index) => (\n <SuggestedReplyButton\n key={`${iq}-${index}`}\n suggestion={iq}\n />\n ))}\n </div>\n )}\n\n <ChatInput />\n <ChatFooterItems />\n </MotionDiv__VerticalReveal>\n )}\n </AnimatePresence>\n </footer>\n );\n}\n","import {\n useWidget,\n type WidgetComponentProps,\n} from '@opencx/widget-react-headless';\nimport React from 'react';\nimport { BotOrAgentMessageDefaultComponent } from './custom-components/BotOrAgentMessageDefaultComponent';\n\nexport function BotOrAgentMessage({\n isFirstInGroup,\n isLastInGroup,\n isAloneInGroup,\n ...props\n}: WidgetComponentProps & {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isAloneInGroup: boolean;\n}) {\n const { componentStore } = useWidget();\n if (props.type !== 'AGENT' && props.type !== 'AI') return null;\n\n // Try to use custom components first\n if (props.data.action) {\n const Component = componentStore.getComponent(props.data.action.name);\n if (Component) {\n return (\n <Component\n {...props}\n id={props.id}\n isFirstInGroup={isFirstInGroup}\n isLastInGroup={isLastInGroup}\n isAloneInGroup={isAloneInGroup}\n />\n );\n }\n }\n\n const Component = componentStore.getComponent(props.component);\n\n if (!Component) {\n // Fallback... just in case\n return (\n <BotOrAgentMessageDefaultComponent\n {...props}\n isFirstInGroup={isFirstInGroup}\n isLastInGroup={isLastInGroup}\n isAloneInGroup={isAloneInGroup}\n />\n );\n }\n\n return (\n <Component\n {...props}\n id={props.id}\n isFirstInGroup={isFirstInGroup}\n isLastInGroup={isLastInGroup}\n isAloneInGroup={isAloneInGroup}\n />\n );\n}\n","import React from 'react';\nimport type {\n WidgetAiMessage,\n WidgetAgentMessage,\n WidgetUserMessage,\n} from '@opencx/widget-core';\nimport { useConfig } from '@opencx/widget-react-headless';\nimport { cn } from './lib/utils/cn';\n\nexport function GroupTimestamp({\n messages,\n className,\n containerClassName,\n}: {\n messages: WidgetAiMessage[] | WidgetAgentMessage[] | WidgetUserMessage[];\n className?: string;\n containerClassName?: string;\n}) {\n const { timestamps } = useConfig();\n\n if (!timestamps?.perMessageGroup?.enabled) {\n return null;\n }\n\n const lastMessageTimestamp = messages[messages.length - 1]?.timestamp;\n if (!lastMessageTimestamp) return null;\n\n const formattedTimestamp = (() => {\n try {\n return new Date(lastMessageTimestamp).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n });\n } catch (error) {\n console.error(error);\n return null;\n }\n })();\n if (!formattedTimestamp) return null;\n\n return (\n <div className={containerClassName}>\n <span className={cn('text-xs text-muted-foreground', className)}>\n {formattedTimestamp}\n </span>\n </div>\n );\n}\n","import {\n type WidgetAgentMessage,\n type AgentOrBotType,\n type WidgetAiMessage,\n} from '@opencx/widget-core';\nimport React from 'react';\nimport { dc } from '../utils/data-component';\nimport { AgentOrBotAvatar } from './AgentOrBotAvatar';\nimport { BotOrAgentMessage } from './BotOrAgentMessage';\nimport { Tooltippy } from './lib/tooltip';\nimport { cn } from './lib/utils/cn';\nimport { SuggestedReplyButton } from './SuggestedReplyButton';\nimport { GroupTimestamp } from './GroupTimestamp';\n\nexport function BotOrAgentMessageGroup({\n messages,\n agent,\n suggestedReplies,\n}: {\n messages: WidgetAiMessage[] | WidgetAgentMessage[];\n agent: AgentOrBotType | undefined;\n suggestedReplies?: string[];\n}) {\n return (\n <div\n {...dc('chat/agent_msg_group/root')}\n className={cn('flex items-end gap-2')}\n >\n <Tooltippy content={agent?.name} side=\"right\" align=\"end\">\n <AgentOrBotAvatar\n {...dc('chat/agent_msg_group/root/avatar')}\n agent={agent}\n className=\"hidden\"\n />\n </Tooltippy>\n\n <div className={cn('flex-1 flex flex-col gap-1')}>\n <div\n {...dc('chat/agent_msg_group/avatar_and_msgs/root')}\n className={cn('flex items-end gap-2')}\n >\n <Tooltippy content={agent?.name} side=\"right\" align=\"end\">\n <AgentOrBotAvatar\n {...dc('chat/agent_msg_group/avatar_and_msgs/avatar')}\n agent={agent}\n />\n </Tooltippy>\n <div\n {...dc('chat/agent_msg_group/avatar_and_msgs/msgs')}\n className={cn('flex-1 flex flex-col gap-1')}\n >\n {messages.map((message, index, array) => (\n <BotOrAgentMessage\n key={message.id}\n isFirstInGroup={index === 0}\n isLastInGroup={index === array.length - 1}\n isAloneInGroup={array.length === 1}\n {...message}\n />\n ))}\n <GroupTimestamp messages={messages} />\n </div>\n </div>\n\n {suggestedReplies && suggestedReplies.length > 0 && (\n <div\n {...dc('chat/agent_msg_group/suggestions')}\n className={cn('flex flex-col gap-1 ps-8')}\n >\n {suggestedReplies?.map((suggestion, index) => (\n <SuggestedReplyButton\n key={`${suggestion}-${index}`}\n suggestion={suggestion}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { SpecialComponentProps } from '@opencx/widget-core';\nimport {\n useSessions,\n useConfig,\n useWidget,\n useMessages,\n} from '@opencx/widget-react-headless';\nimport React from 'react';\n\nexport function useSpecialComponentProps(): { props: SpecialComponentProps } {\n const {\n widgetCtx: { org },\n } = useWidget();\n const {\n sessionState: { session },\n } = useSessions();\n const config = useConfig();\n const {\n messagesState: { messages },\n } = useMessages();\n\n return {\n props: {\n react: React,\n org,\n session,\n config,\n messages,\n },\n };\n}\n","import React from 'react';\nimport { useSpecialComponentProps } from '../../hooks/useSpecialComponentProps';\n\nexport function SessionResolvedComponent() {\n const { props } = useSpecialComponentProps();\n\n if (props.session?.isOpened || !props.session) return null;\n\n const Component = props.config.specialComponents?.onSessionResolved;\n if (!Component) return null;\n\n return <Component {...props} />;\n}\n","import type { WidgetUserMessage } from '@opencx/widget-core';\nimport React from 'react';\nimport { dc } from '../utils/data-component';\nimport { AttachmentPreview } from './AttachmentPreview';\nimport { cn } from './lib/utils/cn';\n\nexport function UserMessage({\n message,\n isFirstInGroup,\n isLastInGroup,\n isAloneInGroup,\n}: {\n message: WidgetUserMessage;\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isAloneInGroup: boolean;\n}) {\n return (\n <div\n {...dc('chat/user_msg/root')}\n className=\"w-5/6 flex flex-col items-end gap-1\"\n >\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"w-full flex gap-1 flex-wrap justify-end\">\n {message.attachments?.map((attachment) => (\n <AttachmentPreview attachment={attachment} key={attachment.id} />\n ))}\n </div>\n )}\n {message.content.length > 0 && (\n <div\n {...dc('chat/user_msg/msg')}\n // Expose these data attributes for external styling customization\n data-first={isFirstInGroup}\n data-last={isLastInGroup}\n data-alone={isAloneInGroup}\n className={cn(\n 'transition-all',\n 'w-fit py-3 px-4 rounded-3xl text-sm',\n 'bg-primary text-primary-foreground',\n 'break-words [word-break:break-word]', // `[word-break:break-word]` is deprecated but works in the browser, while `break-words` which is `[overflow-wrap: break-word]` does not work\n 'whitespace-pre-wrap',\n\n // We're using the booleans directly here, not the data attributes, to make any external styling more specific than this\n isFirstInGroup && !isAloneInGroup && 'rounded-br-md',\n isLastInGroup && !isAloneInGroup && 'rounded-tr-md',\n !isFirstInGroup &&\n !isLastInGroup &&\n !isAloneInGroup &&\n 'rounded-r-md',\n )}\n >\n {message.content}\n </div>\n )}\n </div>\n );\n}\n","import type { WidgetUserMessage } from '@opencx/widget-core';\nimport React from 'react';\nimport { dc } from '../utils/data-component';\nimport { cn } from './lib/utils/cn';\nimport { UserMessage } from './UserMessage';\nimport { GroupTimestamp } from './GroupTimestamp';\n\nexport function UserMessageGroup({\n messages,\n}: {\n messages: WidgetUserMessage[];\n}) {\n return (\n <div\n {...dc('chat/user_msg_group/root')}\n className={cn('group', 'flex flex-col gap-1 justify-end items-end')}\n >\n {messages.map((message, index, array) => (\n <UserMessage\n key={message.id}\n message={message}\n isFirstInGroup={index === 0}\n isLastInGroup={index === array.length - 1}\n isAloneInGroup={array.length === 1}\n />\n ))}\n <GroupTimestamp messages={messages} containerClassName=\"ms-auto\" />\n </div>\n );\n}\n","import {\n type WidgetAgentMessage,\n type WidgetAiMessage,\n type WidgetMessageU,\n type WidgetSystemMessageU,\n type WidgetUserMessage,\n} from '@opencx/widget-core';\n\nexport function groupMessagesByType(\n messages: WidgetMessageU[],\n): WidgetMessageU[][] {\n const result: WidgetMessageU[][] = [];\n let currentGroup: WidgetMessageU[] | null = null;\n\n messages.forEach((message) => {\n // Start a new group if the type changes\n if (!currentGroup || currentGroup[0]?.type !== message.type) {\n currentGroup = [];\n result.push(currentGroup);\n }\n\n // Start a new group if the agent changes\n if (\n currentGroup[0]?.type === 'AGENT' &&\n message.type === 'AGENT' &&\n (message.agent?.id !== currentGroup[0].agent?.id ||\n message.agent?.name !== currentGroup[0].agent?.name)\n ) {\n currentGroup = [];\n result.push(currentGroup);\n }\n\n currentGroup.push(message);\n });\n\n return result;\n}\n\nexport function isUserMessageGroup(\n messages: WidgetMessageU[],\n): messages is WidgetUserMessage[] {\n return messages?.[0]?.type === 'USER';\n}\n\nexport function isBotMessageGroup(\n messages: WidgetMessageU[],\n): messages is WidgetAiMessage[] {\n return messages?.[0]?.type === 'AI';\n}\n\nexport function isAgentMessageGroup(\n messages: WidgetMessageU[],\n): messages is WidgetAgentMessage[] {\n return messages?.[0]?.type === 'AGENT';\n}\n\nexport function isSystemMessageGroup(\n messages: WidgetMessageU[],\n): messages is WidgetSystemMessageU[] {\n return messages?.[0]?.type === 'SYSTEM';\n}\n","import React from 'react';\nimport type { WidgetAiMessage } from '@opencx/widget-core';\nimport { useMessages, useConfig } from '@opencx/widget-react-headless';\nimport { BotOrAgentMessageGroup } from '../../components/BotOrAgentMessageGroup';\n\nexport function AdvancedInitialMessages() {\n const {\n messagesState: { messages },\n } = useMessages();\n\n const {\n advancedInitialMessages = [],\n initialQuestionsPosition,\n initialQuestions,\n bot,\n } = useConfig();\n\n return (\n <>\n {messages.length === 0 && advancedInitialMessages.length > 0 && (\n <BotOrAgentMessageGroup\n messages={advancedInitialMessages.map(\n ({ message }, index) =>\n ({\n component: 'bot_message',\n data: { message },\n id: `${index}-${message}`,\n type: 'AI',\n timestamp: null,\n }) satisfies WidgetAiMessage,\n )}\n suggestedReplies={\n messages.length === 0 &&\n initialQuestionsPosition === 'below-initial-messages'\n ? initialQuestions\n : undefined\n }\n agent={bot ? { ...bot, isAi: true, id: null } : undefined}\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { useMessages, useConfig } from '@opencx/widget-react-headless';\nimport { RichText } from '../../components/RichText';\n\nexport function ChatBannerItems() {\n const {\n messagesState: { messages },\n } = useMessages();\n const { chatBannerItems } = useConfig();\n\n if (!chatBannerItems?.length) return null;\n if (\n messages.length > 0 &&\n chatBannerItems.every((item) => !item.persistent)\n ) {\n return null;\n }\n\n return (\n <div className=\"w-full text-center text-xs\">\n {chatBannerItems.map(({ message, persistent }, index) =>\n messages.length > 0 && !persistent ? null : (\n <div key={`${message}-${index}`}>\n <RichText>{message}</RichText>\n </div>\n ),\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { WidgetAiMessage } from '@opencx/widget-core';\nimport { useMessages, useConfig } from '@opencx/widget-react-headless';\nimport { BotOrAgentMessageGroup } from '../../components/BotOrAgentMessageGroup';\n\nexport function InitialMessages() {\n const {\n messagesState: { messages },\n } = useMessages();\n const config = useConfig();\n const {\n advancedInitialMessages = [],\n initialQuestions,\n initialQuestionsPosition,\n } = config;\n\n const initialMessages = (() => {\n if (advancedInitialMessages.length) return [];\n if (messages.length) return [];\n // TODO translate default welcome message\n if (!config.initialMessages?.length) return ['Hello, how can I help you?'];\n return config.initialMessages;\n })();\n\n return (\n <>\n {messages.length === 0 && initialMessages.length > 0 && (\n <BotOrAgentMessageGroup\n messages={initialMessages.map(\n (m, index) =>\n ({\n component: 'bot_message',\n data: { message: m },\n id: `${index}-${m}`,\n type: 'AI',\n timestamp: null,\n }) satisfies WidgetAiMessage,\n )}\n suggestedReplies={\n initialQuestionsPosition === 'below-initial-messages'\n ? initialQuestions\n : undefined\n }\n agent={\n config.bot ? { ...config.bot, isAi: true, id: null } : undefined\n }\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { useSpecialComponentProps } from '../../hooks/useSpecialComponentProps';\n\nexport function ChatBottomComponents() {\n const { props } = useSpecialComponentProps();\n const components = props.config.specialComponents?.chatBottomComponents;\n\n if (!components) return null;\n\n return (\n <div>\n {components.map(({ key, component: Component }) => (\n <Component key={key} {...props} />\n ))}\n </div>\n );\n}\n","import {\n type LiteralWidgetComponentKey,\n type SafeExtract,\n} from '@opencx/widget-core';\nimport {\n useConfig,\n useIsAwaitingBotReply,\n useMessages,\n useWidget,\n} from '@opencx/widget-react-headless';\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { BotOrAgentMessageGroup } from '../../components/BotOrAgentMessageGroup';\nimport { SessionResolvedComponent } from '../../components/special-components/SessionResolvedComponent';\nimport { UserMessageGroup } from '../../components/UserMessageGroup';\nimport { dc } from '../../utils/data-component';\nimport {\n groupMessagesByType,\n isAgentMessageGroup,\n isBotMessageGroup,\n isUserMessageGroup,\n} from '../../utils/group-messages-by-type';\nimport { AdvancedInitialMessages } from './AdvancedInitialMessages';\nimport { ChatBannerItems } from './ChatBannerItems';\nimport { InitialMessages } from './InitialMessages';\nimport { ChatBottomComponents } from '../../components/special-components/ChatBottomComponents';\n\nexport function ChatMain() {\n const {\n messagesState: { messages },\n } = useMessages();\n const { isAwaitingBotReply } = useIsAwaitingBotReply();\n const { componentStore } = useWidget();\n const config = useConfig();\n\n const groupedMessages = useMemo(\n () => groupMessagesByType(messages),\n [messages],\n );\n\n const LoadingComponent = componentStore.getComponent(\n 'loading' satisfies SafeExtract<LiteralWidgetComponentKey, 'loading'>,\n );\n\n /* ------------------------------------------------------ */\n /* Auto Scroller */\n /* ------------------------------------------------------ */\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n function handleNewMessage() {\n setTimeout(() => {\n const container_ = messagesContainerRef.current;\n if (container_) {\n container_.scrollTop = container_.scrollHeight;\n }\n }, 0);\n }\n\n useEffect(() => {\n handleNewMessage();\n }, [messages]);\n\n return (\n <div\n {...dc('chat/msgs/root')}\n ref={messagesContainerRef}\n className=\"max-h-full scroll-smooth relative flex-1 py-2 px-4 flex flex-col gap-2 overflow-auto\"\n >\n <ChatBannerItems />\n <AdvancedInitialMessages />\n <InitialMessages />\n\n {groupedMessages.map((group) => {\n const type = group?.[0]?.type;\n const firstIdInGroup = group[0]?.id;\n if (!type || !firstIdInGroup) return null;\n\n if (isUserMessageGroup(group)) {\n return <UserMessageGroup key={firstIdInGroup} messages={group} />;\n }\n\n if (isBotMessageGroup(group) || isAgentMessageGroup(group)) {\n const agent = group[0]?.agent;\n return (\n <BotOrAgentMessageGroup\n key={firstIdInGroup}\n messages={group}\n agent={agent}\n />\n );\n }\n\n return null;\n })}\n {isAwaitingBotReply && LoadingComponent && (\n <LoadingComponent agent={config.bot} />\n )}\n\n <ChatBottomComponents />\n <SessionResolvedComponent />\n </div>\n );\n}\n","import { useMessages, useSessions } from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport React, { useRef } from 'react';\nimport { Header } from '../../components/Header';\nimport { LoadingSpinner } from '../../components/lib/LoadingSpinner';\nimport { MotionDiv } from '../../components/lib/MotionDiv';\nimport { cn } from '../../components/lib/utils/cn';\nimport { useCanvas } from '../../hooks/useCanvas';\nimport { useSetWidgetSize } from '../../hooks/useSetWidgetSize';\nimport { useTheme } from '../../hooks/useTheme';\nimport { dc } from '../../utils/data-component';\nimport { ChatCanvas } from './ChatCanvas';\nimport { ChatFooter } from './ChatFooter';\nimport { ChatMain } from './ChatMain';\n\nexport function ChatScreen() {\n const {\n messagesState: { isInitialFetchLoading },\n } = useMessages();\n const {\n sessionState: { session },\n } = useSessions();\n const { isCanvasOpen } = useCanvas();\n const { theme } = useTheme();\n\n useSetWidgetSize({\n width: isCanvasOpen\n ? theme.screens.chat.withCanvas.width\n : theme.screens.chat.width,\n height: isCanvasOpen\n ? theme.screens.chat.withCanvas.height\n : theme.screens.chat.height,\n });\n\n // The key is the session id, so that when chat is reset, the animation replays\n const chatContentKeyRef = useRef(session?.id || 'chat').current;\n\n return (\n <div\n {...dc('chat/root')}\n className={cn('flex flex-col overflow-hidden')}\n style={{\n width: '100vw', // Relative to the iframe\n maxWidth: '100vw', // Relative to the iframe\n height: '100vh', // Relative to the iframe\n maxHeight: '100vh', // Relative to the iframe\n }}\n >\n <div className=\"size-full justify-between flex flex-col\">\n <Header />\n <AnimatePresence mode=\"wait\">\n {isInitialFetchLoading ? (\n <MotionDiv\n key=\"loading\"\n className=\"flex flex-col items-center justify-center w-full flex-1\"\n >\n <LoadingSpinner />\n </MotionDiv>\n ) : (\n <MotionDiv\n key={chatContentKeyRef}\n className=\"flex items-start h-full flex-1 overflow-auto\"\n // If we don't snap exit, the initial questions will show before the animation starts\n snapExit\n >\n <div\n {...dc('chat/main/root')}\n className={cn(\n 'flex flex-col h-full overflow-auto transition-all',\n isCanvasOpen ? 'w-2/5' : 'w-full',\n )}\n style={{\n transitionTimingFunction:\n theme.screens.chat.withCanvas.transitionTimingFunction,\n transitionDuration:\n theme.screens.chat.withCanvas.transitionDuration,\n }}\n >\n <ChatMain />\n <ChatFooter />\n </div>\n <div\n {...dc('chat/canvas/root')}\n className={cn(\n 'h-full overflow-auto transition-all',\n isCanvasOpen ? 'w-3/5' : 'w-0',\n )}\n style={{\n transitionTimingFunction:\n theme.screens.chat.withCanvas.transitionTimingFunction,\n transitionDuration:\n theme.screens.chat.withCanvas.transitionDuration,\n }}\n >\n <ChatCanvas />\n </div>\n </MotionDiv>\n )}\n </AnimatePresence>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { cn } from './utils/cn';\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('animate-pulse rounded-md bg-secondary', className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import React from 'react';\nimport { cn } from '../lib/utils/cn';\n\nexport function OpenLogoSvg({ className }: { className?: string }) {\n return (\n <svg\n width=\"26\"\n height=\"32\"\n viewBox=\"0 0 26 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn('text-primary-foreground', className)}\n >\n <path\n d=\"M1.34103 25.6132H5.44245C5.74203 25.6228 6.02673 25.7462 6.23867 25.9582C6.45062 26.1703 6.5739 26.4551 6.58348 26.7548V30.8584C6.59305 31.1581 6.71634 31.443 6.92828 31.655C7.14023 31.8671 7.42492 31.9904 7.7245 32H18.2894C18.589 31.9904 18.8737 31.8671 19.0856 31.655C19.2976 31.443 19.4209 31.1581 19.4304 30.8584V26.7548C19.4401 26.4545 19.5638 26.1692 19.7765 25.957C19.9892 25.7449 20.2748 25.6219 20.5749 25.6132H24.659C24.9586 25.6036 25.2433 25.4803 25.4552 25.2682C25.6671 25.0562 25.7904 24.7713 25.8 24.4716V7.52839C25.7904 7.22865 25.6671 6.94381 25.4552 6.73176C25.2433 6.5197 24.9586 6.39635 24.659 6.38677H20.561C20.2603 6.37802 19.9742 6.25457 19.7614 6.04169C19.5487 5.82881 19.4253 5.54261 19.4165 5.24168V1.14161C19.4072 0.84419 19.2858 0.561291 19.0768 0.349589C18.8678 0.137887 18.5865 0.0130193 18.2894 0L7.7245 0C7.42492 0.00957792 7.14023 0.132929 6.92828 0.344983C6.71634 0.557036 6.59305 0.841878 6.58348 1.14161V5.24168C6.57477 5.54203 6.45187 5.82773 6.23983 6.04052C6.0278 6.25331 5.74262 6.37715 5.44245 6.38677H1.34103C1.04144 6.39635 0.756749 6.5197 0.544805 6.73176C0.332861 6.94381 0.209574 7.22865 0.200001 7.52839V24.4716C0.209574 24.7713 0.332861 25.0562 0.544805 25.2682C0.756749 25.4803 1.04144 25.6036 1.34103 25.6132ZM6.58348 24.4716V7.52839C6.59305 7.22865 6.71634 6.94381 6.92828 6.73176C7.14023 6.5197 7.42492 6.39635 7.7245 6.38677H18.2894C18.589 6.39635 18.8737 6.5197 19.0856 6.73176C19.2976 6.94381 19.4209 7.22865 19.4304 7.52839V24.4716C19.4209 24.7713 19.2976 25.0562 19.0856 25.2682C18.8737 25.4803 18.589 25.6036 18.2894 25.6132H7.7245C7.42492 25.6036 7.14023 25.4803 6.92828 25.2682C6.71634 25.0562 6.59305 24.7713 6.58348 24.4716Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { useConfig } from '@opencx/widget-react-headless';\nimport * as React from 'react';\nimport { cn } from './lib/utils/cn.js';\nimport { Wobble } from './lib/wobble.js';\nimport { OpenLogoSvg } from './svg/OpenLogoSvg.js';\n\nexport function PoweredByOpen({ className }: { className?: string }) {\n const { token } = useConfig();\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center gap-2 p-2 pt-0',\n className,\n )}\n >\n <Wobble>\n <a\n href={`https://open.cx/?ref=${token}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn(\n 'text-[10px] flex items-center',\n 'text-muted-foreground/70 [&_svg]:text-muted-foreground/70',\n 'hover:text-primary [&_svg]:hover:text-primary',\n )}\n >\n <span>Powered by</span>\n <span> </span>\n <span className=\"flex items-center gap-[1px]\">\n <span>\n <OpenLogoSvg className=\"size-3 inline-block\" />\n </span>\n <span className=\"font-semibold\">open</span>\n </span>\n </a>\n </Wobble>\n </div>\n );\n}\n","import { type SessionDto } from '@opencx/widget-core';\nimport {\n useConfig,\n useSessions,\n useWidgetRouter,\n} from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport { ChevronRightIcon, UserRoundIcon } from 'lucide-react';\nimport React from 'react';\nimport rehypeRaw from 'rehype-raw';\nimport remarkGfm from 'remark-gfm';\nimport { Header } from '../../components/Header';\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from '../../components/lib/avatar';\nimport { Button } from '../../components/lib/button';\nimport { LoadingSpinner } from '../../components/lib/LoadingSpinner';\nimport { MotionDiv } from '../../components/lib/MotionDiv';\nimport { Skeleton } from '../../components/lib/skeleton';\nimport { cn } from '../../components/lib/utils/cn';\nimport { MemoizedReactMarkdown } from '../../components/MemoizedReactMarkdown';\nimport { PoweredByOpen } from '../../components/PoweredByOpen';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useSetWidgetSize } from '../../hooks/useSetWidgetSize';\nimport { useTheme } from '../../hooks/useTheme';\nimport { dc } from '../../utils/data-component';\n\nfunction SectionTitle({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"ps-4 text-xs text-muted-foreground/75 uppercase font-semibold tracking-tight\">\n {children}\n </p>\n );\n}\n\nfunction SessionCard({\n session,\n className,\n}: {\n session: SessionDto;\n className?: string;\n}) {\n const { bot } = useConfig();\n const { toChatScreen } = useWidgetRouter();\n\n const assigneeName =\n session.assignee.kind === 'human'\n ? session.assignee.name || 'Support Agent'\n : bot?.name || 'AI Support Agent';\n const assigneeAvatarUrl =\n session.assignee.kind === 'human'\n ? session.assignee.avatarUrl || ''\n : bot?.avatar || '';\n\n return (\n <Button\n variant=\"ghost\"\n size=\"lg\"\n className={cn(\n 'rounded-full p-2 pe-4 flex text-start justify-between w-full whitespace-normal',\n className,\n )}\n onClick={() => toChatScreen(session.id)}\n >\n <div className=\"flex-1 flex gap-2 items-center\">\n <AnimatePresence mode=\"wait\">\n <MotionDiv snapExit>\n <Avatar className=\"size-10\">\n <AvatarImage src={assigneeAvatarUrl} alt=\"Agent Icon\" />\n <AvatarFallback>\n <UserRoundIcon className=\"size-4\" />\n </AvatarFallback>\n </Avatar>\n </MotionDiv>\n </AnimatePresence>\n <div className=\"flex-1\">\n <AnimatePresence mode=\"wait\">\n <MotionDiv key={assigneeName} snapExit>\n {assigneeName}\n </MotionDiv>\n </AnimatePresence>\n <AnimatePresence mode=\"wait\">\n {session.lastMessage ? (\n <MotionDiv key={session.lastMessage || 'content'} snapExit>\n <MemoizedReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n // Do not add `prose` styling for last message preview\n className=\"line-clamp-1 overflow-hidden text-ellipsis text-xs text-muted-foreground\"\n >\n {session.lastMessage}\n </MemoizedReactMarkdown>\n </MotionDiv>\n ) : (\n <MotionDiv key=\"skeleton\" className=\"w-1/2\" snapExit>\n <Skeleton className=\"h-4 w-full\" />\n </MotionDiv>\n )}\n </AnimatePresence>\n </div>\n </div>\n <ChevronRightIcon className=\"size-4 text-muted-foreground shrink-0 rtl:-scale-100\" />\n </Button>\n );\n}\n\nfunction SessionsList() {\n const { t } = useTranslation();\n const { toChatScreen } = useWidgetRouter();\n const {\n sessionsState: { data: sessions, isInitialFetchLoading: isLoading },\n openSessions,\n closedSessions,\n canCreateNewSession,\n } = useSessions();\n\n return (\n <div className=\"flex-1 flex flex-col overflow-scroll py-2 px-2\">\n <AnimatePresence mode=\"wait\">\n {isLoading ? (\n <MotionDiv\n key=\"loading\"\n className=\"flex-1 flex items-center justify-center\"\n >\n <LoadingSpinner />\n </MotionDiv>\n ) : (\n <MotionDiv\n key=\"sessions\"\n className=\"flex-1 flex flex-col gap-2 relative\"\n >\n {sessions.length ? (\n <>\n <AnimatePresence>\n {openSessions.length > 0 && (\n <MotionDiv\n fadeIn=\"up\"\n delay={0.2}\n key=\"open-sessions\"\n className=\"space-y-2\"\n snapExit\n >\n {openSessions.map((s) => (\n <SessionCard key={s.id} session={s} />\n ))}\n </MotionDiv>\n )}\n\n {closedSessions.length > 0 && (\n <MotionDiv\n key=\"closed-sessions\"\n className=\"space-y-2\"\n delay={0.2}\n snapExit\n >\n <SectionTitle>{t('closed_conversations')}</SectionTitle>\n {closedSessions.map((s) => (\n <SessionCard\n key={s.id}\n session={s}\n className=\"opacity-50 hover:opacity-100\"\n />\n ))}\n </MotionDiv>\n )}\n </AnimatePresence>\n\n {canCreateNewSession && (\n <div className=\"mt-auto w-full rounded-3xl sticky bottom-0 outline outline-8 outline-background bg-background\">\n <Button\n {...dc('sessions/new_conversation_btn')}\n size=\"lg\"\n key=\"new-session\"\n className=\"w-full\"\n onClick={() => toChatScreen()}\n >\n {t('new_conversation')}\n </Button>\n </div>\n )}\n </>\n ) : (\n <div className=\"flex-1 flex flex-col gap-2 items-center\">\n <div className=\"flex-1 flex items-center justify-center\">\n <p className=\"text-muted-foreground\">\n {t('no_conversations_yet')}\n </p>\n </div>\n <Button\n {...dc('sessions/new_conversation_btn')}\n size=\"lg\"\n key=\"new-session\"\n className=\"w-full\"\n onClick={() => toChatScreen()}\n >\n {t('new_conversation')}\n </Button>\n </div>\n )}\n </MotionDiv>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nexport function SessionsScreen() {\n const { theme } = useTheme();\n useSetWidgetSize({\n width: theme.screens.sessions.width,\n height: theme.screens.sessions.height,\n });\n\n return (\n <div\n {...dc('sessions/root')}\n className={cn('flex flex-col overflow-hidden bg-background')}\n style={{\n width: '100vw', // Relative to the iframe\n maxWidth: '100vw', // Relative to the iframe\n height: '100vh', // Relative to the iframe\n maxHeight: '100vh', // Relative to the iframe\n }}\n >\n <div className=\"size-full flex flex-col\">\n <Header />\n <SessionsList />\n <PoweredByOpen />\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { useIsSmallScreen } from '../../hooks/useIsSmallScreen.js';\nimport { cn } from './utils/cn.js';\nimport { Wobble } from './wobble.js';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n const { isSmallScreen } = useIsSmallScreen();\n\n return (\n <Wobble ref={ref}>\n <input\n type={type}\n className={cn(\n // 16px on mobiles prevents auto-zoom on the input when focused\n isSmallScreen ? 'text-[16px]' : 'text-sm',\n 'flex w-full rounded-xl p-2 ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-primary-foreground placeholder:text-muted-foreground/75 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition',\n 'rounded-2xl px-4',\n 'border shadow-sm',\n className,\n )}\n {...props}\n />\n </Wobble>\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import { useEffect, useRef } from 'react';\nimport { useConfig, useWidget } from '@opencx/widget-react-headless';\n\nexport function useWidgetContentHeight() {\n const { contentIframeRef } = useWidget();\n const { inline } = useConfig();\n /**\n * This is the element that we will observe for height changes\n */\n const observedElementRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const contentRoot = contentIframeRef?.current;\n\n if (contentRoot && observedElementRef.current) {\n const observedElement = observedElementRef.current;\n\n let animationFrame: number;\n const observer = new ResizeObserver(() => {\n animationFrame = requestAnimationFrame(() => {\n const height = observedElement.offsetHeight;\n contentRoot.style.setProperty(\n '--opencx-widget-height',\n inline ? '100%' : `${height.toFixed(1)}px`,\n );\n });\n });\n observer.observe(observedElement);\n\n return () => {\n cancelAnimationFrame(animationFrame);\n observer.unobserve(observedElement);\n };\n }\n }, [contentIframeRef, inline]);\n\n return { observedElementRef };\n}\n","import {\n useConfig,\n useContact,\n useWidget,\n useWidgetTrigger,\n} from '@opencx/widget-react-headless';\nimport { SendHorizontal, XIcon } from 'lucide-react';\nimport React, { useState } from 'react';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport { z } from 'zod';\nimport { Button } from '../../components/lib/button';\nimport { Input } from '../../components/lib/input';\nimport { MotionDiv } from '../../components/lib/MotionDiv';\nimport { cn } from '../../components/lib/utils/cn';\nimport { PoweredByOpen } from '../../components/PoweredByOpen';\nimport { useIsSmallScreen } from '../../hooks/useIsSmallScreen';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useSetWidgetSize } from '../../hooks/useSetWidgetSize';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useWidgetContentHeight } from '../../hooks/useWidgetContentHeight';\n\nconst schema = z.object({\n name: z.string().min(2),\n email: z.string().email(),\n});\n\nexport function WelcomeScreen() {\n const {\n widgetCtx: { org },\n } = useWidget();\n const { setIsOpen } = useWidgetTrigger();\n const { createUnverifiedContact } = useContact();\n const { isSmallScreen } = useIsSmallScreen();\n const config = useConfig();\n const { theme } = useTheme();\n const { t } = useTranslation();\n const { observedElementRef } = useWidgetContentHeight();\n\n useSetWidgetSize({\n height: undefined,\n width: theme.screens.welcome.width,\n });\n\n const [name, setName] = useState(config.prefillUserData?.name || '');\n const [email, setEmail] = useState(config.prefillUserData?.email || '');\n\n const extraDataFields = (config.extraDataCollectionFields || []).filter(\n (f) => f !== 'name' && f !== 'email' && !!f,\n );\n\n const [extraData, setExtraData] = useState<Record<string, string>>({});\n\n const [handleSubmitState, handleSubmit] = useAsyncFn(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const result = schema.safeParse({ name, email });\n if (result.success) {\n await createUnverifiedContact(\n {\n email: result.data.email,\n non_verified_name: result.data.name,\n },\n // Only pass extra data if there is any\n Object.values(extraData).filter(Boolean).length\n ? extraData\n : undefined,\n );\n }\n },\n [name, email, extraData],\n );\n\n return (\n <div\n style={{\n width: '100vw', // Relative to the iframe\n maxWidth: '100vw', // Relative to the iframe\n minHeight: theme.screens.welcome.minHeight,\n height: '100vh', // Relative to the iframe\n maxHeight: '100vh', // Relative to the iframe\n overflowY: 'auto',\n }}\n >\n <div\n ref={observedElementRef}\n className={cn(\n 'flex flex-col',\n isSmallScreen && 'h-full',\n 'bg-[radial-gradient(ellipse_at_top_left,hsl(var(--opencx-primary)),transparent),radial-gradient(ellipse_at_top_right,hsl(var(--opencx-primary)),transparent)]',\n )}\n >\n <div\n className={cn(\n 'flex-1 flex flex-col px-4 py-12 text-start space-y-4 relative z-10',\n 'text-primary-foreground',\n )}\n >\n {isSmallScreen && (\n <MotionDiv className=\"absolute top-6 end-6\">\n <Button size=\"selfless\" onClick={() => setIsOpen(false)}>\n <XIcon className=\"size-4\" />\n </Button>\n </MotionDiv>\n )}\n\n <div className=\"flex items-center justify-between w-full mb-2\">\n {config.assets?.organizationLogo ? (\n <img\n src={config.assets?.organizationLogo}\n alt=\"Company Logo\"\n className=\"h-8 w-auto object-contain\"\n />\n ) : (\n <h2 className=\"font-bold text-sm\">{org.name}</h2>\n )}\n </div>\n <div className=\"space-y-2\">\n <h1 className=\"text-[1.75rem] font-semibold tracking-tight leading-none\">\n {config.textContent?.welcomeScreen?.title ||\n t('welcome_screen_title')}\n </h1>\n\n <p className=\"text-sm\">\n {config.textContent?.welcomeScreen?.description ||\n t('welcome_screen_description')}\n </p>\n </div>\n </div>\n\n <div\n className={cn(\n 'z-10 m-2 px-2 pt-2 bp-0 space-y-2',\n 'bg-[white]',\n 'border shadow',\n 'rounded-3xl',\n )}\n >\n <form onSubmit={handleSubmit} className=\"space-y-2\">\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n required\n placeholder={t('your_name_placeholder')}\n name=\"name\"\n />\n <Input\n required\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n type=\"email\"\n placeholder={t('your_email_placeholder')}\n name=\"email\"\n />\n {extraDataFields.map((field) => (\n <Input\n key={field}\n value={extraData[field]}\n onChange={(e) =>\n setExtraData((prev) => ({\n ...prev,\n [field]: e.target.value,\n }))\n }\n placeholder={`${field} (${t('optional')})`}\n />\n ))}\n\n <Button\n disabled={handleSubmitState.loading}\n className=\"w-full\"\n size=\"lg\"\n >\n {handleSubmitState.loading\n ? t('start_chat_button_loading')\n : t('start_chat_button')}\n <SendHorizontal className=\"size-4 rtl:-scale-100\" />\n </Button>\n </form>\n\n <PoweredByOpen />\n </div>\n </div>\n </div>\n );\n}\n","import { isExhaustive } from '@opencx/widget-core';\nimport { useWidgetRouter } from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport React from 'react';\nimport { MotionDiv } from '../components/lib/MotionDiv';\nimport { ChatScreen } from './chat';\nimport { SessionsScreen } from './sessions';\nimport { WelcomeScreen } from './welcome';\n\nexport function RootScreen() {\n const {\n routerState: { screen },\n } = useWidgetRouter();\n\n return (\n <div className=\"relative bg-background size-full\">\n <AnimatePresence mode=\"wait\">\n {(() => {\n switch (screen) {\n case 'welcome':\n return (\n <MotionDiv\n key={screen}\n fadeIn=\"right\"\n className=\"size-full\"\n snapExit\n >\n <WelcomeScreen />\n </MotionDiv>\n );\n\n case 'sessions':\n return (\n <MotionDiv\n key={screen}\n fadeIn=\"right\"\n className=\"size-full\"\n snapExit\n >\n <SessionsScreen />\n </MotionDiv>\n );\n\n case 'chat':\n return (\n <MotionDiv\n key={screen}\n fadeIn=\"right\"\n className=\"size-full\"\n snapExit\n >\n <ChatScreen />\n </MotionDiv>\n );\n default: {\n isExhaustive(screen, RootScreen.name);\n return null;\n }\n }\n })()}\n </AnimatePresence>\n </div>\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport IFrame from '@uiw/react-iframe';\nimport { motion } from 'framer-motion';\nimport React from 'react';\nimport styles from '../index.css?inline.css';\nimport {\n useConfig,\n useWidget,\n useWidgetTrigger,\n} from '@opencx/widget-react-headless';\nimport { TooltipProvider } from './components/lib/tooltip';\nimport { cn } from './components/lib/utils/cn';\nimport { useTheme } from './hooks/useTheme';\nimport { RootScreen } from './screens';\nimport { useTranslation } from './hooks/useTranslation';\nimport { version } from '../package.json';\nimport { DialogerProvider } from './components/Dialoger';\n\nconst initialContent = `<!DOCTYPE html>\n<html>\n<head>\n<style>\n${styles}\nhtml, body {\n height: 100%;\n width: 100%;\n margin: 0;\n padding: 0;\n font-size: 16px;\n}\n</style>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, interactive-widget=resizes-content\">\n</head>\n<body>\n</body>\n</html>`;\n\nexport function WidgetContent() {\n const { isOpen } = useWidgetTrigger();\n const { contentIframeRef } = useWidget();\n const { cssOverrides, inline } = useConfig();\n const { theme, cssVars, computed } = useTheme();\n const { dir } = useTranslation();\n\n return (\n <motion.div\n animate={isOpen ? 'visible' : 'hidden'}\n initial=\"hidden\"\n variants={{\n hidden: {\n opacity: 0,\n y: 8,\n transitionEnd: { display: 'none' },\n transition: { duration: 0.15 },\n },\n visible: {\n opacity: 1,\n y: 0,\n display: 'block',\n height: inline ? '100%' : undefined,\n },\n }}\n >\n <IFrame\n ref={contentIframeRef}\n initialContent={initialContent}\n allowFullScreen\n title=\"OpenCX Live Chat\"\n style={{\n // @ts-expect-error this is a valid css variable\n '--opencx-widget-width': computed.minWidth,\n '--opencx-widget-height': computed.minHeight,\n\n minWidth: computed.minWidth,\n width: 'var(--opencx-widget-width)',\n maxWidth: computed.maxWidth, // Relative to the viewport\n\n minHeight: computed.minHeight,\n height: 'var(--opencx-widget-height)',\n maxHeight: computed.maxHeight, // Relative to the viewport\n\n overflow: 'hidden',\n /** outline is better than border because of box sizing; the outline wouldn't affect the content inside... the border will mess up how the children's border radius sits with the parent */\n outline: theme.widgetContentContainer.outline,\n outlineColor: theme.widgetContentContainer.outlineColor,\n borderRadius: theme.widgetContentContainer.borderRadius,\n boxShadow: theme.widgetContentContainer.boxShadow,\n transitionProperty: theme.widgetContentContainer.transitionProperty,\n transitionTimingFunction:\n theme.widgetContentContainer.transitionTimingFunction,\n transitionDuration: theme.widgetContentContainer.transitionDuration,\n\n // reset iframe defaults\n boxSizing: 'border-box',\n borderWidth: '0px',\n }}\n >\n {cssOverrides && <style>{cssOverrides}</style>}\n <div\n style={{\n ...cssVars,\n zIndex: theme.widgetContentContainer.zIndex,\n }}\n data-version={version}\n className={cn(\n 'antialiased font-sans size-full overflow-hidden relative text-secondary-foreground isolate',\n )}\n dir={dir}\n >\n <TooltipProvider\n delayDuration={200}\n // this is important, because without it, the tooltip remains even after moving the mouse away from trigger\n disableHoverableContent\n >\n <DialogerProvider>\n <RootScreen />\n </DialogerProvider>\n </TooltipProvider>\n </div>\n </IFrame>\n </motion.div>\n );\n}\n\nexport function WidgetPopoverContent() {\n const { theme } = useTheme();\n\n return (\n <PopoverPrimitive.Content\n onInteractOutside={(ev) => ev.preventDefault()}\n forceMount\n style={{\n zIndex: theme.widgetContentContainer.zIndex,\n fontSize: '16px',\n }}\n side=\"top\"\n align=\"end\"\n sideOffset={theme.widgetContentContainer.offset.side}\n alignOffset={theme.widgetContentContainer.offset.align}\n avoidCollisions={false}\n // do not use `asChild` as it will mess up setting the zIndex correctly on the top-most div\n >\n <WidgetContent />\n </PopoverPrimitive.Content>\n );\n}\n","import React from 'react';\nimport { cn } from '../lib/utils/cn';\n\nexport function ChatBubbleSvg({\n className,\n style,\n}: {\n className?: string;\n style?: React.CSSProperties;\n}) {\n return (\n <svg\n width=\"32\"\n height=\"30\"\n viewBox=\"0 0 32 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn('text-primary-foreground', className)}\n style={style}\n >\n <path\n d=\"M0 6.94263C0 3.62892 2.68629 0.942627 6 0.942627H26C29.3137 0.942627 32 3.62892 32 6.94263V17.9426C32 21.2563 29.3137 23.9426 26 23.9426H6C2.68629 23.9426 0 21.2563 0 17.9426V6.94263Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.9945 23.8935L26.237 23.8934C26.1982 24.3557 26.1712 25.2778 26.1704 26.2318C26.1688 28.2839 26.1376 28.7041 25.974 28.868C25.583 29.2598 25.2686 29.0967 24.0616 27.8754C23.4162 27.2222 22.1141 25.9522 21.1682 25.0531L19.9945 23.8935Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport IFrame from '@uiw/react-iframe';\nimport { AnimatePresence } from 'framer-motion';\nimport { ChevronDownIcon } from 'lucide-react';\nimport React from 'react';\nimport styles from '../index.css?inline.css';\nimport { useConfig, useWidgetTrigger } from '@opencx/widget-react-headless';\nimport { MotionDiv } from './components/lib/MotionDiv';\nimport { cn } from './components/lib/utils/cn';\nimport { Wobble, WOBBLE_MAX_MOVEMENT_PIXELS } from './components/lib/wobble';\nimport { ChatBubbleSvg } from './components/svg/ChatBubbleSvg';\nimport { useTheme } from './hooks/useTheme';\nimport { dc } from './utils/data-component';\n\nconst initialContent = `<!DOCTYPE html>\n<html>\n<head>\n<style>\n${styles}\nhtml, body {\n height: 100%;\n width: 100%;\n margin: 0;\n padding: 0;\n font-size: 16px;\n}\n</style>\n</head>\n<body>\n</body>\n</html>`;\n\nfunction WidgetPopoverTrigger() {\n const { isOpen } = useWidgetTrigger();\n const { cssOverrides, assets } = useConfig();\n const { theme, cssVars } = useTheme();\n\n return (\n <IFrame\n initialContent={initialContent}\n style={{\n height: `calc(${theme.widgetTrigger.size.button}px + ${WOBBLE_MAX_MOVEMENT_PIXELS.x * 2}px)`,\n width: `calc(${theme.widgetTrigger.size.button}px + ${WOBBLE_MAX_MOVEMENT_PIXELS.y * 2}px)`,\n fontSize: '16px',\n position: 'fixed',\n zIndex: theme.widgetTrigger.zIndex,\n right: theme.widgetTrigger.offset.right,\n bottom: theme.widgetTrigger.offset.bottom,\n left: theme.widgetTrigger.offset.left,\n\n // reset iframe defaults\n boxSizing: 'border-box',\n borderWidth: '0px',\n\n // A quick fix for the white square background of the iframe when the hosting website switches to dark mode\n borderRadius: '100%',\n }}\n >\n {cssOverrides && <style>{cssOverrides}</style>}\n <div\n style={{\n ...cssVars,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <PopoverPrimitive.PopoverTrigger\n className={cn(\n 'font-sans flex items-center justify-center rounded-full',\n )}\n style={{\n height: theme.widgetTrigger.size.button,\n width: theme.widgetTrigger.size.button,\n }}\n >\n <Wobble>\n <div\n {...dc('trigger/btn')}\n className={cn(\n 'relative size-full rounded-full',\n 'flex items-center justify-center',\n 'overflow-hidden',\n 'transition-all',\n 'bg-primary',\n 'text-primary-foreground',\n )}\n >\n <AnimatePresence mode=\"wait\">\n {isOpen ? (\n <MotionDiv\n key=\"x-icon\"\n snapExit\n fadeIn=\"up\"\n overrides={{\n initial: { rotate: 45 },\n animate: { rotate: 0 },\n }}\n >\n {assets?.widgetTrigger?.closeIcon ? (\n <img\n src={assets.widgetTrigger.closeIcon}\n alt=\"Widget trigger close icon\"\n style={{\n width: theme.widgetTrigger.size.icon,\n height: theme.widgetTrigger.size.icon,\n }}\n />\n ) : (\n <ChevronDownIcon\n style={{\n width: theme.widgetTrigger.size.icon,\n height: theme.widgetTrigger.size.icon,\n }}\n />\n )}\n </MotionDiv>\n ) : (\n <MotionDiv\n key=\"message-icon\"\n snapExit\n overrides={{\n initial: { rotate: 45 },\n animate: { rotate: 0 },\n }}\n >\n {assets?.widgetTrigger?.openIcon ? (\n <img\n src={assets.widgetTrigger.openIcon}\n alt=\"Widget trigger open icon\"\n style={{\n width: theme.widgetTrigger.size.icon,\n height: theme.widgetTrigger.size.icon,\n }}\n />\n ) : (\n <ChatBubbleSvg\n style={{\n width: theme.widgetTrigger.size.icon,\n height: theme.widgetTrigger.size.icon,\n }}\n className=\"mt-0.5 opacity-95\"\n />\n )}\n </MotionDiv>\n )}\n </AnimatePresence>\n </div>\n </Wobble>\n </PopoverPrimitive.PopoverTrigger>\n </div>\n </IFrame>\n );\n}\n\nexport { WidgetPopoverTrigger };\n","import React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { useDocumentDir } from '@opencx/widget-react-headless';\n\nexport function WidgetPopoverAnchor() {\n const { dir } = useDocumentDir();\n\n return (\n <PopoverPrimitive.Anchor\n style={{\n position: 'fixed',\n bottom: 0,\n right: dir === 'ltr' ? 0 : undefined,\n left: dir === 'rtl' ? 0 : undefined,\n }}\n />\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport React from 'react';\nimport type {\n ExternalStorage,\n LiteralWidgetComponentKey,\n WidgetConfig,\n} from '@opencx/widget-core';\nimport {\n useWidgetTrigger,\n WidgetProvider,\n WidgetTriggerProvider,\n type WidgetComponentType,\n} from '@opencx/widget-react-headless';\nimport { BotOrAgentMessageDefaultComponent } from './components/custom-components/BotOrAgentMessageDefaultComponent';\nimport { FallbackDefaultComponent } from './components/custom-components/FallbackDefaultComponent';\nimport { LoadingDefaultComponent } from './components/custom-components/LoadingDefaultComponent';\nimport { WidgetContent, WidgetPopoverContent } from './WidgetPopoverContent';\nimport { WidgetPopoverTrigger } from './WidgetPopoverTrigger';\nimport { WidgetPopoverAnchor } from './WidgetPopoverAnchor';\n\nfunction WidgetPopoverTriggerAndContent() {\n const { isOpen, setIsOpen } = useWidgetTrigger();\n\n return (\n <PopoverPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>\n <WidgetPopoverAnchor />\n <WidgetPopoverTrigger />\n <WidgetPopoverContent />\n </PopoverPrimitive.Root>\n );\n}\n\nconst defaultComponents: WidgetComponentType[] = [\n {\n key: 'loading' satisfies LiteralWidgetComponentKey,\n component: LoadingDefaultComponent,\n },\n {\n key: 'fallback' satisfies LiteralWidgetComponentKey,\n component: FallbackDefaultComponent,\n },\n {\n key: 'bot_message' satisfies LiteralWidgetComponentKey,\n component: BotOrAgentMessageDefaultComponent,\n },\n {\n key: 'agent_message' satisfies LiteralWidgetComponentKey,\n component: BotOrAgentMessageDefaultComponent,\n },\n];\n\nconst storage: ExternalStorage = {\n get: async (key: string) => {\n return localStorage.getItem(key);\n },\n set: async (key: string, value: string) => {\n localStorage.setItem(key, value);\n },\n remove: async (key: string) => {\n localStorage.removeItem(key);\n },\n};\n\nfunction WidgetWrapper({\n options,\n components = [],\n loadingComponent,\n}: {\n options: WidgetConfig;\n components?: WidgetComponentType[];\n loadingComponent?: React.ReactNode;\n}) {\n return (\n <WidgetProvider\n components={[...defaultComponents, ...components]}\n options={options}\n storage={storage}\n loadingComponent={loadingComponent}\n >\n <WidgetTriggerProvider>\n {options.inline ? (\n <WidgetContent />\n ) : (\n <WidgetPopoverTriggerAndContent />\n )}\n </WidgetTriggerProvider>\n </WidgetProvider>\n );\n}\n\nexport { WidgetWrapper as Widget };\n"],"names":["dc","componentName","cn","inputs","twMerge","clsx","WOBBLE_MAX_MOVEMENT_PIXELS","Wobble","memo","forwardRef","children","className","scale","off","ref","isHovering","setIsHovering","useState","movement","setMovement","handleMouseMove","event","clientX","clientY","rect","offsetX","offsetY","normalizedX","normalizedY","x","y","_b","_a","handleMouseEnter","handleMouseLeave","childStyles","cloneElement","ANIMATION_DISTANCE_PX","fadeInRight","distance","overrides","delay","fadeInLeft","fadeInUp","fadeInDown","treasureMap","MotionDiv","fadeIn","snapExit","props","fadeInProps","jsx","motion","buttonVariants","cva","Button","React","variant","size","asChild","Comp","Slot","context","createContext","DialogerProvider","isOpen","setIsOpen","content","setContent","openDialog","closeDialog","jsxs","DialogerPortal","useDialoger","dialoger","useContext","contentIframeRef","useWidget","close","useEffect","handleEscape","e","AnimatePresence","DialogerContent","withClose","X","DialogerHeader","DialogerBody","DialogerFooter","DialogerTitle","DialogerDescription","Dialoger","trigger","open","AttachmentPreview","attachment","name","type","url","isImage","isVideo","isAudio","MemoizedReactMarkdown","ReactMarkdown","prev","next","RichText","messageType","messageId","anchorTarget","useConfig","remarkGfm","rehypeRaw","BotOrAgentMessageDefaultComponent","data","id","attachments","isFirstInGroup","isLastInGroup","isAloneInGroup","dataComponentNames","classNames","message","FallbackDefaultComponent","Avatar","AvatarPrimitive","AvatarImage","AvatarFallback","AgentOrBotAvatar","agent","LoadingDefaultComponent","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","sideOffset","Tooltippy","side","align","disableTooltips","THRESHOLD_PIXELS","useIsSmallScreen","isSmallScreen","setIsSmallScreen","topWindow","checkScreenSize","DEFAULTS","useTheme","dir","useDocumentDir","theme","inline","withInlineDefault","v","withSmallScreenDefault","target","withDefaults","widgetTrigger","_c","_e","_d","_g","_f","_i","_h","_k","_j","triggerOffset","themeWithFallbacks","_l","_m","_n","_o","_p","_q","_r","_s","_u","_t","_w","_v","_y","_x","_A","_z","_C","_B","_E","_D","_G","_F","_I","_H","_L","_K","_J","_O","_N","_M","_R","_Q","_P","_U","_T","_S","computed","cssVars","paletteName","primary","palette","getPaletteColors","_primary","tc","primaryForeground","neutral","stone","zinc","slate","isExhaustive","useSetWidgetSizeFn","width","height","useSetWidgetSize","setWidth","setHeight","FallbackIcon","CircleDashedIcon","DynamicIcon","Icon","CheckIcon","CheckCheckIcon","CircleCheckIcon","CircleCheckBigIcon","CircleXIcon","ExpandIcon","MaximizeIcon","Maximize2Icon","MinimizeIcon","Minimize2Icon","ShrinkIcon","SquareCheckIcon","SquareCheckBigIcon","SquareXIcon","XIcon","useGetHeaderTitle","org","screen","useWidgetRouter","textContent","useGetHeaderDataComponentProp","Header__BackToSessionsScreenButton","router","toSessionsScreen","ChevronLeftIcon","Header__Buttons__Item__CloseWidget","button","useWidgetTrigger","handleClick","Header__Buttons__Item__ExpandShrink","expanded","setExpanded","screenHeight","screenWidth","isExpanded","Header__Buttons__Item__ResolveSession","widgetCtx","resolveSession","sessionState","useSessions","isNoSession","isResolved","onResolved","behaviorBeforeSessionCreation","behaviorIfSessionIsResolved","isDisabled","handleResolve","success","error","handleResolveAlternative","Header__Buttons__Item","defaultCloseWidgetButton","Header__Buttons","headerButtons","buttons","Fragment","Header","dataComponentProp","title","LoadingSpinner","LoaderIcon","useCanvas","isInitialFetchLoading","useMessages","activeMode","Component","useModes","ChatCanvas","sendMessage","createStateCheckpoint","isSendingMessage","setIsSendingMessage","handleSendMessage","args","MotionDiv__VerticalReveal","CSAT_SCORES","CsatSurvey","submitCsat","isCsatRequested","isCsatSubmitted","submittedScore","submittedFeedback","useCsat","score","setScore","feedback","setFeedback","handleRatingClick","value","handleSubmit","s","ArrowUpIcon","useTranslation","hostDocumentDir","config","useMemo","language","isSupportedLanguage","key","getTranslation","SuggestedReplyButton","suggestion","handleSend","trimmed","MightSolveUserIssueSuggestedReplies","options","option","ChatFooterItems","chatFooterItems","isSessionResolved","isSessionOpen","item","FileDisplay","status","file","onCancel","fileContent","setFileContent","reader","getStatusIcon","Loader2","AlertCircle","FileContent","fileType","FileAudio2Icon","FileVideo2Icon","FileIcon","ChatInput","inputRef","useRef","t","inputText","setInputText","allFiles","emptyTheFiles","handleCancelUpload","appendFiles","isUploading","successFiles","useUploadFiles","isHandedOff","isAwaitingBotReply","useIsAwaitingBotReply","handleFileDrop","acceptedFiles","cannotSend","f","dropzone__getRootProps","dropzone__getInputProps","dropzone__openFileSelect","useDropzone","handlePaste","clipboardData","PaperclipIcon","ImageIcon","CircleDashed","NewConvOrBackToConvsButton","canCreateNewSession","SessionClosedSection","ChatFooter","initialQuestions","initialQuestionsPosition","thisWasHelpfulOrNot","messagesState","noMessages","iq","index","BotOrAgentMessage","componentStore","GroupTimestamp","messages","containerClassName","timestamps","lastMessageTimestamp","formattedTimestamp","BotOrAgentMessageGroup","suggestedReplies","array","useSpecialComponentProps","session","SessionResolvedComponent","UserMessage","UserMessageGroup","groupMessagesByType","result","currentGroup","isUserMessageGroup","isBotMessageGroup","isAgentMessageGroup","AdvancedInitialMessages","advancedInitialMessages","bot","ChatBannerItems","chatBannerItems","persistent","InitialMessages","initialMessages","m","ChatBottomComponents","components","ChatMain","groupedMessages","LoadingComponent","messagesContainerRef","handleNewMessage","container_","group","firstIdInGroup","ChatScreen","isCanvasOpen","chatContentKeyRef","Skeleton","OpenLogoSvg","PoweredByOpen","token","SectionTitle","SessionCard","toChatScreen","assigneeName","assigneeAvatarUrl","UserRoundIcon","ChevronRightIcon","SessionsList","sessions","isLoading","openSessions","closedSessions","createElement","SessionsScreen","Input","useWidgetContentHeight","observedElementRef","contentRoot","observedElement","animationFrame","observer","schema","z","WelcomeScreen","createUnverifiedContact","useContact","setName","email","setEmail","extraDataFields","extraData","setExtraData","handleSubmitState","useAsyncFn","field","SendHorizontal","RootScreen","initialContent","styles","WidgetContent","cssOverrides","IFrame","version","WidgetPopoverContent","PopoverPrimitive","ev","ChatBubbleSvg","style","WidgetPopoverTrigger","assets","ChevronDownIcon","WidgetPopoverAnchor","WidgetPopoverTriggerAndContent","defaultComponents","storage","WidgetWrapper","loadingComponent","WidgetProvider","WidgetTriggerProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/data-component.ts","../src/components/lib/utils/cn.ts","../src/components/lib/wobble.tsx","../src/components/lib/MotionDiv.tsx","../src/components/lib/button.tsx","../src/components/Dialoger.tsx","../src/components/AttachmentPreview.tsx","../src/components/MemoizedReactMarkdown.tsx","../src/components/RichText.tsx","../src/components/custom-components/BotOrAgentMessageDefaultComponent.tsx","../src/components/custom-components/FallbackDefaultComponent.tsx","../src/components/lib/avatar.tsx","../src/components/AgentOrBotAvatar.tsx","../src/components/custom-components/LoadingDefaultComponent.tsx","../src/components/lib/tooltip.tsx","../src/hooks/useIsSmallScreen.ts","../src/hooks/useTheme.ts","../src/hooks/useSetWidgetSize.ts","../src/components/lib/DynamicIcon.tsx","../src/components/Header.tsx","../src/components/lib/LoadingSpinner.tsx","../src/hooks/useCanvas.ts","../src/screens/chat/ChatCanvas.tsx","../src/components/lib/MotionDiv__VerticalReveal.tsx","../src/components/CsatSurvey.tsx","../src/hooks/useTranslation.ts","../src/components/SuggestedReplyButton.tsx","../src/components/MightSolveUserIssueSuggestedReplies.tsx","../src/screens/chat/ChatFooterItems.tsx","../src/screens/chat/ChatFooter.tsx","../src/components/BotOrAgentMessage.tsx","../src/components/GroupTimestamp.tsx","../src/components/BotOrAgentMessageGroup.tsx","../src/hooks/useSpecialComponentProps.ts","../src/components/special-components/SessionResolvedComponent.tsx","../src/components/UserMessage.tsx","../src/components/UserMessageGroup.tsx","../src/utils/group-messages-by-type.ts","../src/screens/chat/AdvancedInitialMessages.tsx","../src/screens/chat/ChatBannerItems.tsx","../src/screens/chat/InitialMessages.tsx","../src/components/special-components/ChatBottomComponents.tsx","../src/screens/chat/ChatMain.tsx","../src/screens/chat/index.tsx","../src/components/lib/skeleton.tsx","../src/components/svg/OpenLogoSvg.tsx","../src/components/PoweredByOpen.tsx","../src/screens/sessions/index.tsx","../src/components/lib/input.tsx","../src/hooks/useWidgetContentHeight.tsx","../src/screens/welcome/index.tsx","../src/screens/index.tsx","../src/WidgetPopoverContent.tsx","../src/components/svg/ChatBubbleSvg.tsx","../src/WidgetPopoverTrigger.tsx","../src/WidgetPopoverAnchor.tsx","../src/index.tsx"],"sourcesContent":["import type { OpenCxComponentNameU } from '@opencx/widget-core';\n\n/**\n * A silly util to help with the component name type safety.\n */\nexport function dc(componentName: OpenCxComponentNameU) {\n return { 'data-component': componentName };\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React, {\n cloneElement,\n forwardRef,\n type ReactElement,\n useState,\n} from 'react';\nimport { memo } from 'react';\nimport { cn } from './utils/cn';\n\n/**\n * The maximum number of pixels the element can move in the x and y directions\n *\n * This would make very small elements wobble more visibly, and large elements would wobble more subtly\n */\nexport const WOBBLE_MAX_MOVEMENT_PIXELS = {\n x: 2,\n y: 2,\n};\n\nconst INVERSE_SCALE = true;\n\ntype ChildProps = {\n onMouseMove?: (event: React.MouseEvent<HTMLElement>) => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n style?: React.CSSProperties;\n className?: string;\n ref: React.ForwardedRef<HTMLElement>;\n};\n\nexport interface WobbleProps {\n children: ReactElement<ChildProps>;\n className?: string;\n scale?: number;\n off?: boolean;\n}\n\nconst Wobble = memo(\n forwardRef<HTMLElement, WobbleProps>(\n ({ children, className, scale = 1.02, off = false }, ref) => {\n const [isHovering, setIsHovering] = useState(false);\n const [movement, setMovement] = useState({ x: 0, y: 0 });\n\n if (off) return children;\n\n const hasTranslateClass = /translate/.test(\n children.props.className || '',\n );\n if (hasTranslateClass) return children;\n\n /**\n * Thanks Mr. ChatGippity for refactoring this function\n */\n const handleMouseMove = (event: React.MouseEvent<HTMLElement>) => {\n const { clientX, clientY } = event;\n const rect = event.currentTarget.getBoundingClientRect();\n\n // Calculate mouse position relative to the center of the element\n const offsetX = clientX - (rect.left + rect.width / 2);\n const offsetY = clientY - (rect.top + rect.height / 2);\n\n // Normalize offset values to the range [-1, 1]\n const normalizedX = Math.max(\n -1,\n Math.min(1, offsetX / (rect.width / 2)),\n );\n const normalizedY = Math.max(\n -1,\n Math.min(1, offsetY / (rect.height / 2)),\n );\n\n // Scale normalized values to the desired range\n const x = normalizedX * WOBBLE_MAX_MOVEMENT_PIXELS.x;\n const y = normalizedY * WOBBLE_MAX_MOVEMENT_PIXELS.y;\n\n setMovement({ x, y });\n children.props.onMouseMove?.(event);\n };\n\n const handleMouseEnter = () => {\n setIsHovering(true);\n children.props.onMouseEnter?.();\n };\n const handleMouseLeave = () => {\n setIsHovering(false);\n setMovement({ x: 0, y: 0 });\n children.props.onMouseLeave?.();\n };\n\n const childStyles = {\n '--wobble-x': isHovering ? `${movement.x}px` : '0px',\n '--wobble-y': isHovering ? `${movement.y}px` : '0px',\n '--scale': INVERSE_SCALE\n ? 1 - (scale - 1) // if scale is 1.02, it becomes 0.98\n : scale,\n } as React.CSSProperties;\n\n return cloneElement(children, {\n ref,\n onMouseMove: handleMouseMove,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n style: {\n ...childStyles,\n ...children.props.style,\n },\n className: cn(\n 'translate-x-[var(--wobble-x)]',\n 'translate-y-[var(--wobble-y)]',\n 'hover:scale-[var(--scale)] active:hover:scale-[calc(var(--scale)-0.02)]',\n className,\n children.props.className,\n 'transition-all ease-out',\n ),\n });\n },\n ),\n);\n\nWobble.displayName = 'Wobble';\n\nexport { Wobble };\n","import React from 'react';\nimport { motion, type Target } from 'framer-motion';\nimport { type ComponentProps, forwardRef } from 'react';\n\ntype MotionProps = ComponentProps<typeof motion.div>;\ntype AnimationDirection = 'right' | 'left' | 'up' | 'down';\nexport type MotionDivProps = MotionProps & {\n fadeIn?: AnimationDirection;\n distance?: number;\n snapExit?: boolean;\n overrides?: Overrides;\n delay?: number;\n};\n\ntype Overrides = {\n initial?: Target;\n animate?: Target;\n exit?: Target;\n};\n\nexport const ANIMATION_DISTANCE_PX = 10;\n\nconst fadeInRight = (\n distance: number,\n overrides: Overrides,\n delay: number,\n): MotionProps => ({\n initial: { opacity: 0, x: -distance, ...overrides.initial },\n animate: { opacity: 1, x: 0, ...overrides.animate, transition: { delay } },\n exit: { opacity: 0, x: distance, ...overrides.exit },\n});\n\nconst fadeInLeft = (\n distance: number,\n overrides: Overrides,\n delay: number,\n): MotionProps => ({\n initial: { opacity: 0, x: distance, ...overrides.initial },\n animate: { opacity: 1, x: 0, ...overrides.animate, transition: { delay } },\n exit: { opacity: 0, x: -distance, ...overrides.exit },\n});\n\nconst fadeInUp = (\n distance: number,\n overrides: Overrides,\n delay: number,\n): MotionProps => ({\n initial: { opacity: 0, y: distance, ...overrides.initial },\n animate: { opacity: 1, y: 0, ...overrides.animate, transition: { delay } },\n exit: { opacity: 0, y: -distance, ...overrides.exit },\n});\n\nconst fadeInDown = (\n distance: number,\n overrides: Overrides,\n delay: number,\n): MotionProps => ({\n initial: { opacity: 0, y: -distance, ...overrides.initial },\n animate: { opacity: 1, y: 0, ...overrides.animate, transition: { delay } },\n exit: { opacity: 0, y: distance, ...overrides.exit },\n});\n\nconst treasureMap: Record<\n AnimationDirection,\n (distance: number, overrides: Overrides, delay: number) => MotionProps\n> = {\n right: fadeInRight,\n left: fadeInLeft,\n up: fadeInUp,\n down: fadeInDown,\n};\n\nconst MotionDiv = forwardRef<HTMLDivElement, MotionDivProps>(\n (\n {\n fadeIn = 'down',\n distance = ANIMATION_DISTANCE_PX,\n children,\n snapExit = false,\n overrides = {},\n delay = 0,\n ...props\n },\n ref,\n ) => {\n const fadeInProps: MotionProps = fadeIn\n ? treasureMap[fadeIn](distance, overrides, delay)\n : {};\n\n if (\n snapExit &&\n fadeInProps.exit &&\n typeof fadeInProps.exit === 'object' &&\n !Array.isArray(fadeInProps.exit)\n ) {\n fadeInProps.exit.transition = { duration: 0 };\n }\n\n return (\n <motion.div ref={ref} {...props} {...fadeInProps}>\n {children}\n </motion.div>\n );\n },\n);\nMotionDiv.displayName = 'MotionDiv';\n\nexport { MotionDiv };\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Wobble } from './wobble';\nimport { cn } from './utils/cn';\nimport { dc } from '../../utils/data-component';\n\nconst buttonVariants = cva(\n cn(\n 'inline-flex shrink-0 items-center justify-center gap-2',\n 'text-sm font-medium whitespace-nowrap',\n 'ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'active:scale-95 hover:active:scale-95',\n 'rounded-xl',\n 'transition',\n ),\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground',\n destructive: 'bg-destructive text-destructive-foreground',\n outline: 'bg-background border',\n secondary: 'bg-secondary text-secondary-foreground',\n ghost: 'hover:bg-secondary',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'py-2 px-3.5 text-xs',\n /**\n * This size is useful for top level buttons that needs to sit nicely inside the iframe's border radius.\n * Having the minimum height higher than usual (the `default` variant) will make the border radius look just right.\n */\n lg: 'min-h-12 px-4 rounded-[20px]',\n icon: 'h-10 w-10',\n fit: 'size-fit p-2',\n free: 'p-2',\n selfless: 'p-0',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n { className, variant = 'default', size, asChild = false, ...props },\n ref,\n ) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Wobble ref={ref}>\n <Comp\n {...dc('ui_lib/btn')}\n data-variant={variant}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n </Wobble>\n );\n },\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import { AnimatePresence } from 'framer-motion';\nimport React, {\n cloneElement,\n createContext,\n useContext,\n useEffect,\n useState,\n type Dispatch,\n type SetStateAction,\n} from 'react';\nimport { MotionDiv } from './lib/MotionDiv';\nimport { cn } from './lib/utils/cn';\nimport { Button } from './lib/button';\nimport { X } from 'lucide-react';\nimport { useWidget } from '@opencx/widget-react-headless';\n\ninterface DialogerProviderValue {\n open: (content: React.ReactNode) => void;\n close: () => void;\n isOpen: boolean;\n content: React.ReactNode | null;\n}\n\nconst context = createContext<DialogerProviderValue | null>(null);\n\nexport function DialogerProvider({ children }: { children: React.ReactNode }) {\n const [isOpen, setIsOpen] = useState(false);\n const [content, setContent] = useState<React.ReactNode | null>(null);\n\n const openDialog = (content: React.ReactNode) => {\n setContent(content);\n setIsOpen(true);\n };\n\n const closeDialog = () => {\n setIsOpen(false);\n setTimeout(() => {\n setContent(null);\n }, 200);\n };\n\n return (\n <context.Provider\n value={{ open: openDialog, close: closeDialog, isOpen, content }}\n >\n <DialogerPortal />\n {children}\n </context.Provider>\n );\n}\n\nexport function useDialoger(): DialogerProviderValue {\n const dialoger = useContext(context);\n\n if (!dialoger) {\n console.error('useDialoger must be used within a DialogerProvider');\n return {\n open: () => {},\n close: () => {},\n isOpen: false,\n content: null,\n };\n }\n\n return dialoger;\n}\n\nfunction DialogerPortal() {\n const { contentIframeRef } = useWidget();\n const { isOpen, content, close } = useDialoger();\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close();\n };\n\n contentIframeRef?.current?.contentWindow?.document.addEventListener(\n 'keydown',\n handleEscape,\n );\n return () =>\n contentIframeRef?.current?.contentWindow?.document.removeEventListener(\n 'keydown',\n handleEscape,\n );\n }, []);\n\n return (\n <AnimatePresence mode=\"wait\">\n {isOpen && content && (\n <MotionDiv\n overrides={{\n initial: { y: 0 },\n exit: { y: 0 },\n }}\n key=\"dialog-content\"\n className=\"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm\"\n tabIndex={-1}\n onClick={close}\n >\n {content}\n </MotionDiv>\n )}\n </AnimatePresence>\n );\n}\n\nexport function DialogerContent({\n children,\n className,\n withClose = false,\n}: {\n children: React.ReactNode;\n className?: string;\n withClose?: boolean;\n}) {\n const { close } = useDialoger();\n return (\n <div\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 flex flex-col gap-4 w-full max-w-[61.8%] translate-x-[-50%] translate-y-[-50%] border bg-background p-4 rounded-3xl',\n className,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n {withClose && (\n <Button\n size=\"fit\"\n className=\"rounded-full absolute top-4 right-4\"\n variant=\"secondary\"\n onClick={close}\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n )}\n </div>\n );\n}\n\nexport const DialogerHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col gap-2 text-center pt-2', className)}\n {...props}\n />\n);\nDialogerHeader.displayName = 'DialogerHeader';\n\nexport const DialogerBody = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col gap-2 text-center', className)}\n {...props}\n />\n);\nDialogerBody.displayName = 'DialogerBody';\n\nexport const DialogerFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col gap-2', className)} {...props} />\n);\nDialogerFooter.displayName = 'DialogerFooter';\n\nexport const DialogerTitle = React.forwardRef<\n React.ElementRef<'p'>,\n React.ComponentPropsWithoutRef<'p'>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\n 'text-lg font-semibold leading-none tracking-tight',\n className,\n )}\n {...props}\n />\n));\nDialogerTitle.displayName = 'DialogerTitle';\n\nexport const DialogerDescription = React.forwardRef<\n React.ElementRef<'p'>,\n React.ComponentPropsWithoutRef<'p'>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDialogerDescription.displayName = 'DialogerDescription';\n\nexport function Dialoger({\n children,\n trigger,\n}: {\n children: React.ReactNode;\n trigger: React.ReactElement<{ onClick: () => void }>;\n}) {\n const { open } = useDialoger();\n const clonedTrigger = cloneElement(trigger, {\n onClick: () => open(children),\n });\n\n return clonedTrigger;\n}\n","import type { MessageAttachmentType } from '@opencx/widget-core';\nimport React from 'react';\nimport { cn } from './lib/utils/cn';\nimport { Wobble } from './lib/wobble';\nimport { Dialoger, DialogerContent } from './Dialoger';\n\ntype Props = {\n attachment: MessageAttachmentType;\n};\n\nexport function AttachmentPreview({ attachment }: Props) {\n const { name, size, type, url } = attachment;\n\n const isImage = type.startsWith('image/');\n const isVideo = type.startsWith('video/');\n const isAudio = type.startsWith('audio/');\n\n if (isAudio) {\n return (\n <Wobble>\n <div className=\"w-full shrink-0 overflow-hidden\">\n <audio controls className=\"w-full\">\n <source src={url} type={type} />\n Your browser does not support the audio tag.\n </audio>\n </div>\n </Wobble>\n );\n }\n\n if (isVideo) {\n return (\n <Wobble>\n <div className=\"w-full border shrink-0 rounded-2xl overflow-hidden\">\n <video controls>\n <source src={url} type={type} />\n Your browser does not support the video tag.\n </video>\n </div>\n </Wobble>\n );\n }\n\n if (!isImage && !isVideo && !isAudio) {\n return (\n <Wobble>\n <div className=\"size-fit border shrink-0 rounded-2xl overflow-hidden\">\n <div className=\"flex items-end gap-2 p-2\">\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'text-xs text-blue-500 line-clamp-2 underline hover:text-blue-600',\n 'break-words [word-break:break-word]', // `[word-break:break-word]` is deprecated but works in the browser, while `break-words` which is `[overflow-wrap: break-word]` does not work\n )}\n >\n {name}\n </a>\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">\n {(size / 1024).toFixed(2)} KB\n </span>\n </div>\n </div>\n </Wobble>\n );\n }\n\n return (\n <Dialoger\n trigger={\n <div>\n <Wobble>\n <div className=\"size-fit border shrink-0 rounded-2xl overflow-hidden\">\n {isImage && (\n <img src={url} className=\"object-cover size-16\" alt={name} />\n )}\n </div>\n </Wobble>\n </div>\n }\n >\n <DialogerContent\n className=\"size-full max-w-full rounded-3xl flex items-center justify-center bg-transparent border-none gap-0\"\n withClose\n >\n {isImage && (\n <div className=\"size-fit shrink-0 rounded-2xl overflow-hidden max-h-full\">\n <img src={url} className=\"object-cover size-auto\" alt={name} />\n </div>\n )}\n </DialogerContent>\n </Dialoger>\n );\n}\n","import React from 'react';\nimport ReactMarkdown from 'react-markdown';\n\nexport const MemoizedReactMarkdown = React.memo(\n ReactMarkdown,\n (prev, next) =>\n prev.children === next.children && prev.className === next.className,\n);\n","import React from 'react';\nimport remarkGfm from 'remark-gfm';\nimport { MemoizedReactMarkdown } from './MemoizedReactMarkdown';\nimport rehypeRaw from 'rehype-raw';\nimport { useConfig } from '@opencx/widget-react-headless';\n\nexport function RichText({\n children,\n messageType,\n messageId,\n}: {\n children: string;\n messageType?: string;\n messageId?: string;\n}) {\n const { anchorTarget } = useConfig();\n\n return (\n <MemoizedReactMarkdown\n data-type={messageType}\n data-id={messageId}\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n a: ({ children, ...props }) => {\n return (\n <a target={props.target || anchorTarget || '_top'} {...props}>\n {children}\n </a>\n );\n },\n }}\n // Do not pass className directly to ReactMarkdown component because that will create a container div wrapping the rich text\n >\n {children}\n </MemoizedReactMarkdown>\n );\n}\n","import type { OpenCxComponentNameU } from '@opencx/widget-core';\nimport type { WidgetComponentProps } from '@opencx/widget-react-headless';\nimport React from 'react';\nimport { dc } from '../../utils/data-component.js';\nimport { AttachmentPreview } from '../AttachmentPreview.js';\nimport { cn } from '../lib/utils/cn.js';\nimport { RichText } from '../RichText.js';\n\nexport function BotOrAgentMessageDefaultComponent({\n data,\n id,\n type,\n attachments,\n isFirstInGroup,\n isLastInGroup,\n isAloneInGroup,\n dataComponentNames,\n classNames,\n}: WidgetComponentProps & {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isAloneInGroup: boolean;\n dataComponentNames?: {\n messageContainer?: OpenCxComponentNameU;\n message?: OpenCxComponentNameU;\n };\n classNames?: {\n messageContainer?: string;\n message?: string;\n };\n}) {\n if (type !== 'AI' && type !== 'AGENT') return null;\n\n const { message, variant = 'default' } = data;\n\n if (variant === 'error') {\n return (\n <div>\n <div className=\"flex flex-row flex-wrap items-center justify-start\">\n <div className=\"leading-snug text-sm text-destructive\">{message}</div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n {...dc(dataComponentNames?.messageContainer ?? 'chat/agent_msg/root')}\n className={cn(\n 'w-5/6 flex flex-col items-start gap-1',\n classNames?.messageContainer,\n )}\n >\n {attachments && attachments.length > 0 && (\n <div className=\"w-full gap-1 flex flex-row flex-wrap items-center justify-start\">\n {attachments?.map((attachment) => (\n <AttachmentPreview attachment={attachment} key={attachment.id} />\n ))}\n </div>\n )}\n {message.length > 0 && (\n <div\n {...dc(dataComponentNames?.message ?? 'chat/agent_msg/msg')}\n // Expose these data attributes for external styling customization\n data-first={isFirstInGroup}\n data-last={isLastInGroup}\n data-alone={isAloneInGroup}\n className={cn(\n 'transition-all',\n 'w-fit py-3 px-4 rounded-3xl bg-secondary text-secondary-foreground',\n 'leading-snug text-sm prose prose-sm prose-a:decoration-primary prose-a:underline',\n 'break-words [word-break:break-word]', // `[word-break:break-word]` is deprecated but works in the browser, while `break-words` which is `[overflow-wrap: break-word]` does not work\n // No need to add \"whitespace-pre-wrap\" in the agent or bot message because it is markup and content appear on separate lines as expected\n // Adding \"whitespace-pre-wrap\" will result in unnecessarily huge line breaks\n\n // We're using the booleans directly here, not the data attributes, to make any external styling more specific than this\n isFirstInGroup && !isAloneInGroup && 'rounded-bl-md',\n isLastInGroup && !isAloneInGroup && 'rounded-tl-md',\n !isFirstInGroup &&\n !isLastInGroup &&\n !isAloneInGroup &&\n 'rounded-l-md',\n classNames?.message,\n )}\n >\n <RichText messageType={type} messageId={id}>\n {message}\n </RichText>\n </div>\n )}\n </div>\n );\n}\n","import type { WidgetComponentProps } from '@opencx/widget-react-headless';\nimport React from 'react';\n\n/**\n * The Basic Fallback component (Rendered when Debug is True and the component key is not found)\n */\nexport function FallbackDefaultComponent(props: WidgetComponentProps) {\n return (\n <div className=\"w-full max-w-full overflow-auto shrink-0\">\n <pre className=\"text-xs leading-tight whitespace-pre-wrap break-word\">\n {JSON.stringify(props, null, 1)}\n </pre>\n </div>\n );\n}\n","import * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cn } from './utils/cn';\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex size-6 aspect-square shrink-0 overflow-hidden rounded-full bg-secondary',\n // 'border',\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex size-full text-xs items-center justify-center rounded-lg',\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import type { AgentOrBotType } from '@opencx/widget-core';\nimport React from 'react';\nimport { Avatar, AvatarFallback, AvatarImage } from './lib/avatar';\nimport type { AvatarProps } from '@radix-ui/react-avatar';\n\nexport function AgentOrBotAvatar({\n agent,\n ...props\n}: AvatarProps & {\n agent: AgentOrBotType | undefined;\n}) {\n return (\n <Avatar {...props}>\n <AvatarImage src={agent?.avatar ?? ''} alt=\"Agent Icon\" />\n {agent?.name && (\n <AvatarFallback>\n {agent?.name?.slice(0, 1)?.toUpperCase()}\n </AvatarFallback>\n )}\n </Avatar>\n );\n}\n","import { type AgentOrBotType } from '@opencx/widget-core';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport React from 'react';\nimport { dc } from '../../utils/data-component';\nimport { AgentOrBotAvatar } from '../AgentOrBotAvatar';\nimport { MotionDiv } from '../lib/MotionDiv';\nimport { cn } from '../lib/utils/cn';\n\nexport type LoadingComponentProps = {\n agent: AgentOrBotType | undefined;\n};\n\nexport function LoadingDefaultComponent({ agent }: LoadingComponentProps) {\n return (\n <AnimatePresence>\n <MotionDiv\n {...dc('chat/bot_loading/root')}\n className=\"flex flex-row items-end w-full gap-2 animate-pulse\"\n >\n <AgentOrBotAvatar agent={agent} />\n <div\n {...dc('chat/bot_loading/bouncing_dots_container')}\n className={cn(\n 'flex items-center [&_span]:bg-secondary-foreground [&_span]:size-1 gap-1 p-2 rounded-xl bg-secondary',\n // 'border',\n )}\n >\n <motion.span className=\"rounded-full animate-bounce [animation-delay:-0.3s]\" />\n <motion.span className=\"rounded-full animate-bounce [animation-delay:-0.15s]\" />\n <motion.span className=\"rounded-full animate-bounce\" />\n </div>\n </MotionDiv>\n </AnimatePresence>\n );\n}\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\nimport { cn } from './utils/cn.js';\nimport { useConfig } from '@opencx/widget-react-headless';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden max-w-xs rounded-xl bg-primary border text-primary-foreground p-2 text-center align-middle text-xs animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n));\n\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nfunction Tooltippy({\n children,\n content,\n side,\n align,\n}: {\n children: React.ReactNode;\n content: React.ReactNode;\n side?: TooltipPrimitive.TooltipContentProps['side'];\n align?: TooltipPrimitive.TooltipContentProps['align'];\n}) {\n const { disableTooltips } = useConfig();\n if (!content || disableTooltips) return children;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent\n side={side}\n align={align}\n collisionPadding={8}\n avoidCollisions\n >\n {content}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nexport { TooltipProvider, Tooltippy };\n","import React from 'react';\n\nconst THRESHOLD_PIXELS = 450;\n\nexport function useIsSmallScreen() {\n const [isSmallScreen, setIsSmallScreen] = React.useState(() => {\n return (window.top || window).innerWidth < THRESHOLD_PIXELS;\n });\n\n React.useEffect(() => {\n const topWindow = window.top || window;\n\n const checkScreenSize = () => {\n setIsSmallScreen(topWindow.innerWidth < THRESHOLD_PIXELS);\n };\n\n checkScreenSize();\n\n topWindow.addEventListener('resize', checkScreenSize);\n\n return () => {\n topWindow.removeEventListener('resize', checkScreenSize);\n };\n }, []);\n\n return { isSmallScreen };\n}\n","import type { CSSProperties } from 'react';\nimport tc from 'tinycolor2';\nimport { isExhaustive, type WidgetConfig } from '@opencx/widget-core';\nimport { useConfig, useDocumentDir } from '@opencx/widget-react-headless';\nimport { WOBBLE_MAX_MOVEMENT_PIXELS } from '../components/lib/wobble';\nimport { useIsSmallScreen } from './useIsSmallScreen';\n\ntype DeepRequired<T> = {\n [K in keyof T]-?: DeepRequired<T[K]>;\n};\n\nconst DEFAULTS = {\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n transitionDuration: '1000ms',\n};\n\n/**\n * @returns The widget config theme with fallback default value\n */\nexport function useTheme() {\n const { dir } = useDocumentDir();\n const { isSmallScreen } = useIsSmallScreen();\n const { theme, inline } = useConfig();\n\n const withInlineDefault = (v: string) => {\n return inline ? '100%' : v;\n };\n\n const withSmallScreenDefault = (target: 'w' | 'h', v: string) => {\n return isSmallScreen ? `100dv${target}` : v;\n };\n\n const withDefaults = (target: 'w' | 'h', v: string) => {\n return withInlineDefault(withSmallScreenDefault(target, v));\n };\n\n const widgetTrigger = {\n zIndex: theme?.widgetTrigger?.zIndex ?? 10_000_000,\n offset: {\n bottom: theme?.widgetTrigger?.offset?.bottom ?? 20,\n right:\n theme?.widgetTrigger?.offset?.right ?? (dir === 'ltr' ? 20 : 'initial'),\n left:\n theme?.widgetTrigger?.offset?.left ?? (dir === 'rtl' ? 20 : 'initial'),\n },\n size: {\n button: theme?.widgetTrigger?.size?.button ?? 48,\n icon: theme?.widgetTrigger?.size?.icon ?? 24,\n },\n } satisfies NonNullable<DeepRequired<WidgetConfig['theme']>>['widgetTrigger'];\n\n const triggerOffset = (() => {\n const v =\n dir === 'ltr' ? widgetTrigger.offset.right : widgetTrigger.offset.left;\n if (typeof v !== 'number') return 0;\n return v;\n })();\n\n const themeWithFallbacks = {\n palette: theme?.palette ?? 'neutral',\n primaryColor: theme?.primaryColor ?? 'hsl(0 0% 9%)',\n widgetTrigger,\n widgetContentContainer: {\n borderRadius: isSmallScreen\n ? '0px'\n : (theme?.widgetContentContainer?.borderRadius ?? '32px'),\n zIndex: theme?.widgetContentContainer?.zIndex ?? widgetTrigger.zIndex + 1,\n outline: theme?.widgetContentContainer?.outline ?? 'none', // was: '1px solid'\n outlineColor:\n theme?.widgetContentContainer?.outlineColor ?? 'hsl(0 0% 50% / .5)',\n boxShadow:\n theme?.widgetContentContainer?.boxShadow ??\n '0 0px 100px 0px rgb(0 0 0 / 0.25)',\n transitionProperty:\n theme?.widgetContentContainer?.transitionProperty ?? 'all',\n transitionTimingFunction:\n theme?.widgetContentContainer?.transitionTimingFunction ??\n DEFAULTS.transitionTimingFunction,\n transitionDuration:\n theme?.widgetContentContainer?.transitionDuration ??\n DEFAULTS.transitionDuration,\n offset: {\n side: isSmallScreen\n ? 0\n : widgetTrigger.offset.bottom +\n widgetTrigger.size.button +\n WOBBLE_MAX_MOVEMENT_PIXELS.y * 2 +\n (theme?.widgetContentContainer?.offset?.side ?? 10),\n align: isSmallScreen\n ? 0\n : triggerOffset + (theme?.widgetContentContainer?.offset?.align ?? 0),\n },\n },\n screens: {\n welcome: {\n width: withDefaults('w', theme?.screens?.welcome?.width ?? '400px'),\n // By setting minHeight to 1px, a nice animation will play from 1px to the dynamic height of the content of the screen\n minHeight: withDefaults(\n 'h',\n theme?.screens?.welcome?.minHeight ?? '1px',\n ),\n },\n sessions: {\n width: withDefaults('w', theme?.screens?.sessions?.width ?? '450px'),\n height: withDefaults('h', theme?.screens?.sessions?.height ?? '600px'),\n },\n chat: {\n width: withDefaults('w', theme?.screens?.chat?.width ?? '525px'),\n height: withDefaults('h', theme?.screens?.chat?.height ?? '700px'),\n withCanvas: {\n width: withDefaults(\n 'w',\n theme?.screens?.chat?.withCanvas?.width ?? 'min(1050px, 100vw)',\n ),\n height: withDefaults(\n 'h',\n theme?.screens?.chat?.withCanvas?.height ?? 'min(800px, 100vh)',\n ),\n transitionTimingFunction:\n theme?.screens?.chat?.withCanvas?.transitionTimingFunction ??\n DEFAULTS.transitionTimingFunction,\n transitionDuration:\n theme?.screens?.chat?.withCanvas?.transitionDuration ??\n DEFAULTS.transitionDuration,\n },\n },\n },\n } satisfies NonNullable<DeepRequired<WidgetConfig['theme']>>;\n\n const computed = {\n // Subtract the offset.bottom twice so that it adds a bit of padding to the top\n // Subtract the distance between the trigger and the widget content container\n // Subtract the invisible padding of the trigger (for the wobble effect)\n maxHeight: withDefaults(\n 'h',\n `calc(\n 100vh \n - ${themeWithFallbacks.widgetTrigger.offset.bottom}px\n - ${themeWithFallbacks.widgetContentContainer.offset.side}px\n - ${WOBBLE_MAX_MOVEMENT_PIXELS.y * 2}px\n )`,\n ),\n // Subtract the offset.right twice so that it adds a bit of padding to the left\n maxWidth: withDefaults(\n 'w',\n `calc(\n 100vw \n - ${triggerOffset * 2}px\n )`,\n ),\n\n minHeight: withDefaults(\n 'h',\n `min(\n ${themeWithFallbacks.screens.welcome.minHeight}, \n ${themeWithFallbacks.screens.sessions.height}, \n ${themeWithFallbacks.screens.chat.height}\n )`,\n ),\n minWidth: withDefaults(\n 'w',\n `min(\n ${themeWithFallbacks.screens.welcome.width}, \n ${themeWithFallbacks.screens.sessions.width}, \n ${themeWithFallbacks.screens.chat.width}\n )`,\n ),\n };\n\n return {\n theme: themeWithFallbacks,\n computed,\n cssVars: cssVars({\n palette: themeWithFallbacks.palette,\n primary: themeWithFallbacks.primaryColor,\n }),\n };\n}\n\nfunction cssVars({\n palette: paletteName,\n primary,\n}: {\n palette: NonNullable<NonNullable<WidgetConfig['theme']>['palette']>;\n primary: string;\n}) {\n const palette = getPaletteColors(paletteName);\n const _primary = tc(primary).toHsl();\n const primaryForeground = tc(primary).isLight()\n ? palette['950']\n : palette['50'];\n\n /**\n * Spread the primary color without the `hsl()` call so that we can use tailwind opacity classes on it\n */\n const primitivePrimary = `${_primary.h} ${_primary.s * 100}% ${_primary.l * 100}%`;\n\n return {\n '--opencx-primary': primitivePrimary,\n '--opencx-primary-foreground': primaryForeground,\n\n '--opencx-background': palette['100'],\n '--opencx-foreground': palette['950'],\n\n '--opencx-destructive': '0 72.2% 50.6%',\n '--opencx-destructive-foreground': palette['50'],\n\n '--opencx-accent': palette['200'],\n '--opencx-accent-foreground': 'var(--opencx-foreground)',\n\n '--opencx-secondary': palette['200'],\n '--opencx-secondary-foreground': 'var(--opencx-foreground)',\n\n '--opencx-muted': palette['200'],\n '--opencx-muted-foreground': palette['500'],\n\n '--opencx-input': palette['300'],\n '--opencx-border': palette['300'],\n '--opencx-ring': 'var(--opencx-foreground)',\n } as CSSProperties;\n}\n\ntype PaletteValues = {\n '50': string;\n '100': string;\n '200': string;\n '300': string;\n '400': string;\n '500': string;\n '600': string;\n '700': string;\n '800': string;\n '900': string;\n '950': string;\n};\n/**\n * @returns A palette object with HSL values\n */\nfunction getPaletteColors(\n palette: NonNullable<NonNullable<WidgetConfig['theme']>['palette']>,\n): PaletteValues {\n const neutral: PaletteValues = {\n '50': '0 0% 98%',\n '100': '0 0% 96.1%',\n '200': '0 0% 89.8%',\n '300': '0 0% 83.1%',\n '400': '0 0% 63.9%',\n '500': '0 0% 45.1%',\n '600': '0 0% 32.2%',\n '700': '0 0% 25.1%',\n '800': '0 0% 14.9%',\n '900': '0 0% 9%',\n '950': '0 0% 3.9%',\n };\n\n const stone: PaletteValues = {\n '50': '60 9.1% 97.8%',\n '100': '60 4.8% 95.9%',\n '200': '20 5.9% 90%',\n '300': '24 5.7% 82.9%',\n '400': '24 5.4% 63.9%',\n '500': '25 5.3% 44.7%',\n '600': '33.3 5.5% 32.4%',\n '700': '30 6.3% 25.1%',\n '800': '12 6.5% 15.1%',\n '900': '24 9.8% 10%',\n '950': '20 14.3% 4.1%',\n };\n\n const zinc: PaletteValues = {\n '50': '0 0% 98%',\n '100': '240 4.8% 95.9%',\n '200': '240 5.9% 90%',\n '300': '240 4.9% 83.9%',\n '400': '240 5% 64.9%',\n '500': '240 3.8% 46.1%',\n '600': '240 5.2% 33.9%',\n '700': '240 5.3% 26.1%',\n '800': '240 3.7% 15.9%',\n '900': '240 5.9% 10%',\n '950': '240 10% 3.9%',\n };\n\n const slate: PaletteValues = {\n '50': '210 40% 98%',\n '100': '210 40% 96.1%',\n '200': '214.3 31.8% 91.4%',\n '300': '212.7 26.8% 83.9%',\n '400': '215 20.2% 65.1%',\n '500': '215.4 16.3% 46.9%',\n '600': '215.3 19.3% 34.5%',\n '700': '215.3 25% 26.7%',\n '800': '217.2 32.6% 17.5%',\n '900': '222.2 47.4% 11.2%',\n '950': '222.2 84% 4.9%',\n };\n\n switch (palette) {\n case 'neutral':\n return neutral;\n case 'stone':\n return stone;\n case 'zinc':\n return zinc;\n case 'slate':\n return slate;\n default:\n isExhaustive(palette, getPaletteColors.name);\n return neutral;\n }\n}\n","import { useEffect } from 'react';\nimport { useIsSmallScreen } from './useIsSmallScreen';\nimport { useConfig, useWidget } from '@opencx/widget-react-headless';\n\nexport function useSetWidgetSizeFn() {\n const { contentIframeRef } = useWidget();\n const { inline } = useConfig();\n\n return {\n setWidth: (width: string) => {\n contentIframeRef?.current?.style.setProperty(\n '--opencx-widget-width',\n inline ? '100%' : width,\n );\n },\n setHeight: (height: string) => {\n contentIframeRef?.current?.style.setProperty(\n '--opencx-widget-height',\n inline ? '100%' : height,\n );\n },\n };\n}\n\nexport function useSetWidgetSize({\n width,\n height,\n}: {\n width?: string;\n height?: string;\n}) {\n const { isSmallScreen } = useIsSmallScreen();\n const { setWidth, setHeight } = useSetWidgetSizeFn();\n\n useEffect(() => {\n if (width) setWidth(width);\n\n if (height) setHeight(height);\n }, [isSmallScreen, height, width, setWidth, setHeight]);\n}\n","import { isExhaustive, type IconNameU } from '@opencx/widget-core';\nimport {\n CheckCheckIcon,\n CheckIcon,\n CircleCheckBigIcon,\n CircleCheckIcon,\n CircleDashedIcon,\n CircleXIcon,\n ExpandIcon,\n Maximize2Icon,\n MaximizeIcon,\n Minimize2Icon,\n MinimizeIcon,\n ShrinkIcon,\n SquareCheckBigIcon,\n SquareCheckIcon,\n SquareXIcon,\n XIcon,\n type LucideIcon,\n} from 'lucide-react';\nimport React from 'react';\nimport { cn } from './utils/cn';\n\nconst FallbackIcon = CircleDashedIcon;\n\nexport function DynamicIcon({\n name,\n className,\n}: {\n name: IconNameU | undefined;\n className?: string;\n}) {\n const Icon: LucideIcon = (() => {\n switch (name) {\n case 'Check':\n return CheckIcon;\n case 'CheckCheck':\n return CheckCheckIcon;\n case 'CircleCheck':\n return CircleCheckIcon;\n case 'CircleCheckBig':\n return CircleCheckBigIcon;\n case 'CircleX':\n return CircleXIcon;\n case 'Expand':\n return ExpandIcon;\n case 'Maximize':\n return MaximizeIcon;\n case 'Maximize2':\n return Maximize2Icon;\n case 'Minimize':\n return MinimizeIcon;\n case 'Minimize2':\n return Minimize2Icon;\n case 'Shrink':\n return ShrinkIcon;\n case 'SquareCheck':\n return SquareCheckIcon;\n case 'SquareCheckBig':\n return SquareCheckBigIcon;\n case 'SquareX':\n return SquareXIcon;\n case 'X':\n return XIcon;\n\n case undefined:\n return FallbackIcon;\n\n default:\n isExhaustive(name, DynamicIcon.name);\n return FallbackIcon;\n }\n })();\n\n return <Icon className={cn('size-4', className)} />;\n}\n","import {\n isExhaustive,\n type HeaderButtonU,\n type SafeExtract,\n type ScreenU,\n} from '@opencx/widget-core';\nimport {\n useConfig,\n useSessions,\n useWidget,\n useWidgetRouter,\n useWidgetTrigger,\n} from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport { ChevronLeftIcon } from 'lucide-react';\nimport React, { useState } from 'react';\nimport { useIsSmallScreen } from '../hooks/useIsSmallScreen';\nimport { useSetWidgetSizeFn } from '../hooks/useSetWidgetSize';\nimport { useTheme } from '../hooks/useTheme';\nimport { dc } from '../utils/data-component';\nimport {\n Dialoger,\n DialogerBody,\n DialogerContent,\n DialogerDescription,\n DialogerFooter,\n DialogerHeader,\n DialogerTitle,\n useDialoger,\n} from './Dialoger';\nimport { Button } from './lib/button';\nimport { DynamicIcon } from './lib/DynamicIcon';\nimport { cn } from './lib/utils/cn';\n\nfunction useGetHeaderTitle() {\n const { widgetCtx: { org } } = useWidget();\n const {\n routerState: { screen },\n } = useWidgetRouter();\n const { textContent } = useConfig();\n\n const override = (() => {\n switch (screen) {\n case 'chat':\n return textContent?.chatScreen?.headerTitle;\n case 'sessions':\n return textContent?.sessionsScreen?.headerTitle;\n case 'welcome':\n return undefined;\n default:\n isExhaustive(screen, useGetHeaderTitle.name);\n return undefined;\n }\n })();\n\n return override ?? org.name ?? 'Chat';\n}\n\nfunction useGetHeaderDataComponentProp(\n screen: ScreenU,\n): ReturnType<typeof dc> | undefined {\n switch (screen) {\n case 'chat':\n return dc('chat/header');\n case 'sessions':\n return dc('sessions/header');\n case 'welcome':\n return undefined;\n default:\n isExhaustive(screen, useGetHeaderTitle.name);\n return undefined;\n }\n}\n\nfunction Header__BackToSessionsScreenButton() {\n const { router } = useConfig();\n const {\n routerState: { screen },\n toSessionsScreen,\n } = useWidgetRouter();\n\n if (screen !== 'chat') return null;\n if (router?.chatScreenOnly) return null;\n\n return (\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n onClick={toSessionsScreen}\n >\n <ChevronLeftIcon className=\"size-4 rtl:-scale-100\" />\n </Button>\n );\n}\n\nfunction Header__Buttons__Item__CloseWidget({\n button,\n}: {\n button: SafeExtract<HeaderButtonU, { functionality: 'close-widget' }>;\n}) {\n const { setIsOpen } = useWidgetTrigger();\n const { isSmallScreen } = useIsSmallScreen();\n\n if (isSmallScreen && button.hideOnSmallScreen) return null;\n if (!isSmallScreen && button.hideOnLargeScreen) return null;\n\n const handleClick = () => {\n if (button.handleClick) return button.handleClick();\n setIsOpen(false);\n };\n\n return (\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n onClick={handleClick}\n >\n <DynamicIcon name={button.icon} />\n </Button>\n );\n}\n\nfunction Header__Buttons__Item__ExpandShrink({\n button,\n}: {\n button: SafeExtract<HeaderButtonU, { functionality: 'expand-shrink' }>;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const {\n routerState: { screen },\n } = useWidgetRouter();\n const { isSmallScreen } = useIsSmallScreen();\n const { theme } = useTheme();\n const { setWidth, setHeight } = useSetWidgetSizeFn();\n\n if (screen !== 'chat' && screen !== 'sessions') return null;\n\n const screenHeight = (() => {\n switch (screen) {\n case 'chat':\n return theme.screens.chat.height;\n case 'sessions':\n return theme.screens.sessions.height;\n default:\n isExhaustive(screen, Header__Buttons__Item__ExpandShrink.name);\n return theme.screens.chat.height;\n }\n })();\n const screenWidth = (() => {\n switch (screen) {\n case 'chat':\n return theme.screens.chat.width;\n case 'sessions':\n return theme.screens.sessions.width;\n default:\n isExhaustive(screen, Header__Buttons__Item__ExpandShrink.name);\n return theme.screens.chat.width;\n }\n })();\n\n const handleClick = () => {\n setExpanded((prev) => {\n const isExpanded = !prev;\n setHeight(isExpanded ? '100vh' : screenHeight);\n setWidth(isExpanded ? `max(40vw, ${screenWidth})` : screenWidth);\n\n return isExpanded;\n });\n };\n\n if (isSmallScreen && button.hideOnSmallScreen) return null;\n if (!isSmallScreen && button.hideOnLargeScreen) return null;\n\n return (\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n onClick={handleClick}\n >\n <DynamicIcon\n name={button.icon || (expanded ? button.shrinkIcon : button.expandIcon)}\n />\n </Button>\n );\n}\n\nfunction Header__Buttons__Item__ResolveSession({\n button,\n}: {\n button: SafeExtract<HeaderButtonU, { functionality: 'resolve-session' }>;\n}) {\n const { close: closeDialog } = useDialoger();\n const { widgetCtx } = useWidget();\n const { setIsOpen } = useWidgetTrigger();\n const { resolveSession, sessionState } = useSessions();\n const { isSmallScreen } = useIsSmallScreen();\n\n const isNoSession = !sessionState.session;\n const isResolved = sessionState.session?.isOpened === false;\n const onResolved: NonNullable<typeof button.onResolved> =\n button.onResolved || 'stay-in-chat';\n const behaviorBeforeSessionCreation: NonNullable<\n typeof button.behaviorBeforeSessionCreation\n > = button.behaviorBeforeSessionCreation || 'disabled';\n const behaviorIfSessionIsResolved: NonNullable<\n typeof button.behaviorIfSessionIsResolved\n > = button.behaviorIfSessionIsResolved || 'disabled';\n\n const isDisabled = (() => {\n if (sessionState.isResolvingSession) return true;\n if (isNoSession && behaviorBeforeSessionCreation === 'disabled')\n return true;\n if (isResolved && behaviorIfSessionIsResolved === 'disabled') return true;\n return false;\n })();\n\n const handleResolve = async () => {\n const { success, error } = await resolveSession();\n closeDialog();\n if (!success) return console.error(error);\n\n switch (onResolved) {\n case 'stay-in-chat':\n return;\n case 'close-widget':\n setIsOpen(false);\n break;\n case 'reset-chat':\n widgetCtx.resetChat();\n break;\n case 'reset-chat-and-close-widget':\n setIsOpen(false);\n widgetCtx.resetChat();\n break;\n default:\n isExhaustive(onResolved, Header__Buttons__Item__ResolveSession.name);\n break;\n }\n };\n\n const handleResolveAlternative = () => {\n if (isNoSession) {\n switch (behaviorBeforeSessionCreation) {\n case 'disabled':\n return;\n case 'close-widget':\n setIsOpen(false);\n break;\n default:\n isExhaustive(\n behaviorBeforeSessionCreation,\n handleResolveAlternative.name,\n );\n }\n }\n\n if (isResolved) {\n switch (behaviorIfSessionIsResolved) {\n case 'disabled':\n return;\n case 'close-widget':\n setIsOpen(false);\n break;\n case 'reset-chat':\n widgetCtx.resetChat();\n break;\n case 'reset-chat-and-close-widget':\n setIsOpen(false);\n setTimeout(() => {\n widgetCtx.resetChat();\n }, 200);\n break;\n default:\n isExhaustive(\n behaviorIfSessionIsResolved,\n handleResolveAlternative.name,\n );\n }\n }\n };\n\n if (isSmallScreen && button.hideOnSmallScreen) return null;\n if (!isSmallScreen && button.hideOnLargeScreen) return null;\n\n // TODO: add translations for fallbacks\n if (button.confirmation?.type === 'modal' && !isResolved && !isNoSession) {\n return (\n <Dialoger\n trigger={\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n disabled={isDisabled}\n >\n <DynamicIcon name={button.icon} />\n </Button>\n }\n >\n <DialogerContent>\n <DialogerHeader>\n <DialogerTitle>\n {button.confirmation.title || 'Close conversation'}\n </DialogerTitle>\n </DialogerHeader>\n <DialogerBody>\n <DialogerDescription>\n {button.confirmation.description ||\n 'Are you sure you want to close this conversation?'}\n </DialogerDescription>\n </DialogerBody>\n <DialogerFooter>\n <Button\n variant=\"secondary\"\n onClick={closeDialog}\n disabled={sessionState.isResolvingSession}\n >\n {button.confirmation.cancelButtonText || 'No'}\n </Button>\n <Button\n variant=\"destructive\"\n onClick={handleResolve}\n disabled={sessionState.isResolvingSession}\n >\n {button.confirmation.confirmButtonText || 'Yes'}\n </Button>\n </DialogerFooter>\n </DialogerContent>\n </Dialoger>\n );\n }\n\n return (\n <Button\n variant=\"ghost\"\n size=\"fit\"\n className=\"rounded-full\"\n onClick={\n isResolved || isNoSession ? handleResolveAlternative : handleResolve\n }\n disabled={isDisabled}\n >\n <DynamicIcon name={button.icon} />\n </Button>\n );\n}\n\nfunction Header__Buttons__Item({ button }: { button: HeaderButtonU }) {\n switch (button.functionality) {\n case 'close-widget':\n return <Header__Buttons__Item__CloseWidget button={button} />;\n case 'expand-shrink':\n return <Header__Buttons__Item__ExpandShrink button={button} />;\n case 'resolve-session':\n return <Header__Buttons__Item__ResolveSession button={button} />;\n default:\n isExhaustive(button, Header__Buttons__Item.name);\n return null;\n }\n}\n\nconst defaultCloseWidgetButton = {\n functionality: 'close-widget',\n hideOnLargeScreen: true,\n icon: 'X',\n} satisfies HeaderButtonU;\n\nexport function Header__Buttons() {\n const {\n routerState: { screen },\n } = useWidgetRouter();\n const { headerButtons } = useConfig();\n\n const buttons =\n screen === 'chat'\n ? headerButtons?.chatScreen\n : screen === 'sessions'\n ? headerButtons?.sessionsScreen\n : [];\n\n if (!buttons || buttons.length === 0) {\n return <Header__Buttons__Item button={defaultCloseWidgetButton} />;\n }\n\n return (\n <>\n {buttons.map((button) => (\n <Header__Buttons__Item\n key={`${button.functionality}-${button.icon}`}\n button={button}\n />\n ))}\n </>\n );\n}\n\nexport function Header() {\n const {\n routerState: { screen },\n } = useWidgetRouter();\n const dataComponentProp = useGetHeaderDataComponentProp(screen);\n const title = useGetHeaderTitle();\n\n return (\n <header {...dataComponentProp} className=\"py-2 px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Header__BackToSessionsScreenButton />\n <div\n className={cn(\n 'flex-1 h-8 flex items-center',\n screen === 'sessions' && 'ps-2',\n )}\n >\n <h2 className=\"font-semibold\">{title}</h2>\n </div>\n <Header__Buttons />\n </div>\n </header>\n );\n}\n","import React from 'react';\nimport { LoaderIcon } from 'lucide-react';\nimport { cn } from './utils/cn';\n\nexport function LoadingSpinner({ className }: { className?: string }) {\n return <LoaderIcon className={cn('size-4 animate-spin', className)} />;\n}\n","import { useMessages } from '@opencx/widget-react-headless';\nimport { useIsSmallScreen } from './useIsSmallScreen';\nimport { useModes } from '@opencx/widget-react-headless';\n\nexport function useCanvas() {\n const {\n messagesState: { isInitialFetchLoading },\n } = useMessages();\n const { isSmallScreen } = useIsSmallScreen();\n const { activeMode, Component } = useModes();\n\n const isCanvasOpen =\n !isInitialFetchLoading && !isSmallScreen && !!activeMode && !!Component;\n\n return {\n isCanvasOpen,\n };\n}\n","import React, { useState } from 'react';\nimport { useMessages, useModes, useSessions } from '@opencx/widget-react-headless';\n\nexport function ChatCanvas() {\n const { activeMode, Component } = useModes();\n const { sendMessage } = useMessages();\n const { createStateCheckpoint } = useSessions();\n\n const [isSendingMessage, setIsSendingMessage] = useState(false);\n\n const handleSendMessage = async (args: Parameters<typeof sendMessage>[0]) => {\n try {\n setIsSendingMessage(true);\n await sendMessage(args);\n } catch (error) {\n console.error(error);\n } finally {\n setIsSendingMessage(false);\n }\n };\n\n if (!activeMode || !Component) return null;\n\n return (\n <Component\n react={React}\n mode={activeMode}\n createStateCheckpoint={createStateCheckpoint}\n sendMessage={handleSendMessage}\n isSendingMessage={isSendingMessage}\n />\n );\n}\n","import React from 'react';\nimport { MotionDiv, type MotionDivProps } from './MotionDiv';\nimport { cn } from './utils/cn';\n\nexport const MotionDiv__VerticalReveal = React.forwardRef<HTMLDivElement, MotionDivProps>(\n (props, ref) => {\n return (\n <MotionDiv\n {...props}\n ref={ref}\n className={cn('overflow-hidden', props.className)}\n overrides={{\n initial: { height: 0, opacity: 0, ...props.overrides?.initial },\n animate: { height: 'auto', opacity: 1, ...props.overrides?.animate },\n exit: { height: 0, opacity: 0, ...props.overrides?.exit },\n }}\n />\n );\n }\n);\nMotionDiv__VerticalReveal.displayName = 'MotionDiv__VerticalReveal';\n","import {\n useCsat,\n type WidgetComponentProps,\n} from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport { ArrowUpIcon } from 'lucide-react';\nimport React, { useState } from 'react';\nimport { useIsSmallScreen } from '../hooks/useIsSmallScreen';\nimport { Button } from './lib/button';\nimport { MotionDiv__VerticalReveal } from './lib/MotionDiv__VerticalReveal';\nimport { cn } from './lib/utils/cn';\n\nconst CSAT_SCORES = [\n {\n label: 'Terrible',\n value: 1,\n emoji: '😡',\n },\n {\n label: 'Poor',\n value: 2,\n emoji: '😞',\n },\n {\n label: 'Okay',\n value: 3,\n emoji: '😐',\n },\n {\n label: 'Good',\n value: 4,\n emoji: '😊',\n },\n {\n label: 'Great',\n value: 5,\n emoji: '😍',\n },\n];\n\nexport function CsatSurvey() {\n const { isSmallScreen } = useIsSmallScreen();\n const {\n submitCsat,\n isCsatRequested,\n isCsatSubmitted,\n submittedScore,\n submittedFeedback,\n } = useCsat();\n\n const [score, setScore] = useState<number | null>(null);\n const [feedback, setFeedback] = useState<string | null>(null);\n\n const handleRatingClick = (value: number) => {\n setScore((prev) => (prev === value ? null : value));\n };\n\n const handleSubmit = () => {\n if (!score) return;\n void submitCsat({\n score: score,\n feedback: feedback || undefined,\n });\n };\n\n if (!isCsatRequested && !isCsatSubmitted) return null;\n\n return (\n <div className=\"w-1/2 min-w-80 max-w-96 mx-auto overflow-hidden\">\n {/* ------------------------ TITLE ----------------------- */}\n <AnimatePresence mode=\"wait\">\n {isCsatRequested && !score ? (\n <MotionDiv__VerticalReveal key=\"csat-requested-title\">\n <p className=\"text-sm text-muted-foreground text-center pt-2\">\n How was your conversation?\n </p>\n </MotionDiv__VerticalReveal>\n ) : isCsatSubmitted ? (\n <MotionDiv__VerticalReveal key=\"csat-submitted-title\">\n <p className=\"text-sm text-muted-foreground text-center pt-2\">\n You rated the conversation as\n </p>\n </MotionDiv__VerticalReveal>\n ) : null}\n </AnimatePresence>\n\n {/* ------------------------ EMOJI ----------------------- */}\n <div\n className={cn(\n 'flex gap-4 justify-between pt-2 px-2 pb-2',\n 'transition-all',\n isCsatSubmitted && 'gap-0 justify-center',\n )}\n >\n {CSAT_SCORES.map((s) => (\n <Button\n variant={s.value === score ? 'secondary' : 'ghost'}\n size=\"selfless\"\n className={cn(\n 'transition-all overflow-hidden',\n 'text-2xl size-8 rounded-full',\n 'opacity-35',\n 'hover:opacity-100',\n !score && 'opacity-100',\n s.value === score && 'opacity-100',\n isCsatSubmitted &&\n s.value !== submittedScore &&\n 'opacity-0 size-0',\n isCsatSubmitted &&\n s.value === submittedScore &&\n 'opacity-100 size-fit text-4xl',\n )}\n key={s.value}\n onClick={\n isCsatRequested ? () => handleRatingClick(s.value) : undefined\n }\n >\n {s.emoji}\n </Button>\n ))}\n </div>\n\n {/* ------------------------ FEEDBACK ----------------------- */}\n <AnimatePresence mode=\"wait\">\n {(score || submittedScore) && (\n <MotionDiv__VerticalReveal key=\"feedback-box\">\n <div className=\"pb-2 px-2 flex items-end\">\n <textarea\n // Thw `rows` attribute will take effect in browsers that do not support [field-sizing:content;] (Firefox and Safari as of now)\n rows={3}\n className={cn(\n 'transition-all',\n 'max-h-40 [field-sizing:content]',\n 'w-full resize-none',\n 'bg-transparent outline-none',\n 'placeholder:text-muted-foreground',\n // 16px on mobiles prevents auto-zoom on the input when focused\n isSmallScreen ? 'text-[16px]' : 'text-sm',\n isCsatSubmitted && 'text-center',\n )}\n value={\n isCsatSubmitted ? submittedFeedback || '' : feedback || ''\n }\n onChange={\n isCsatRequested\n ? (e) => setFeedback(e.target.value)\n : undefined\n }\n readOnly={isCsatSubmitted}\n placeholder={\n isCsatRequested ? 'Tell us more... (optional)' : undefined\n }\n />\n <Button\n size=\"fit\"\n onClick={handleSubmit}\n disabled={!score}\n className={cn(\n 'transition-all overflow-hidden',\n 'rounded-full size-8 flex items-center justify-center p-0',\n isCsatSubmitted && 'opacity-0 size-0',\n )}\n >\n <ArrowUpIcon className=\"size-4\" />\n </Button>\n </div>\n </MotionDiv__VerticalReveal>\n )}\n </AnimatePresence>\n\n {/* ----------------------- SPACER ----------------------- */}\n <div className={cn('h-0 transition-[height]', isCsatSubmitted && 'h-4')} />\n </div>\n );\n}\n","import { useConfig, useDocumentDir } from '@opencx/widget-react-headless';\nimport { useMemo } from 'react';\nimport {\n getTranslation,\n isSupportedLanguage,\n type Language,\n type TranslationKeyU,\n} from '@opencx/widget-core';\n\nexport function useTranslation() {\n const { dir: hostDocumentDir } = useDocumentDir();\n const config = useConfig();\n\n return useMemo(() => {\n const language: Language = isSupportedLanguage(config.language)\n ? config.language\n : 'en';\n return {\n t: (key: TranslationKeyU) => getTranslation(key, language, config.translationOverrides),\n language: language,\n dir: language === 'ar' ? 'rtl' : 'ltr',\n hostDocumentDir,\n };\n }, [config.language, hostDocumentDir]);\n}\n","import { useMessages } from '@opencx/widget-react-headless';\nimport React from 'react';\nimport { dc } from '../utils/data-component.js';\nimport { Button, type ButtonProps } from './lib/button.js';\nimport { cn } from './lib/utils/cn.js';\n\nexport function SuggestedReplyButton({\n suggestion,\n className,\n ...props\n}: ButtonProps & { suggestion: string }) {\n const { sendMessage } = useMessages();\n\n const handleSend = () => {\n const trimmed = suggestion.trim();\n if (!trimmed) return;\n sendMessage({ content: trimmed });\n };\n\n return (\n <Button\n {...dc('chat/suggested_reply_btn')}\n size=\"sm\"\n className={cn('rounded-xl w-fit', className)}\n {...props}\n onClick={handleSend}\n >\n {suggestion}\n </Button>\n );\n}\n","import React from 'react';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { SuggestedReplyButton } from './SuggestedReplyButton';\nimport { dc } from '../utils/data-component';\n\nexport function MightSolveUserIssueSuggestedReplies() {\n const { t } = useTranslation();\n const options = [t('i_need_more_help'), t('this_was_helpful')];\n\n return (\n <div\n {...dc('chat/might_solve_user_issue_suggested_replies_container')}\n className=\"flex items-center gap-2 p-2 pb-0 flex-wrap\"\n >\n {options.map((option) => (\n <SuggestedReplyButton\n key={option}\n suggestion={option}\n className=\"flex-1\"\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport { useConfig, useSessions } from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport { MotionDiv__VerticalReveal } from '../../components/lib/MotionDiv__VerticalReveal';\nimport { RichText } from '../../components/RichText';\n\nexport function ChatFooterItems() {\n const { sessionState } = useSessions();\n const { chatFooterItems } = useConfig();\n\n const isSessionResolved = !!sessionState.session && !sessionState.session.isOpened;\n const isSessionOpen = !isSessionResolved;\n\n return (\n <AnimatePresence mode=\"wait\">\n {chatFooterItems?.map((item, i) => {\n if (item.showWhenSessionIsOpen === false && isSessionOpen) {\n return null;\n }\n if (item.showWhenSessionIsResolved === false && isSessionResolved) {\n return null;\n }\n\n return (\n <MotionDiv__VerticalReveal key={`${item.message}-${i}`}>\n <div className=\"pb-2 text-center text-xs\">\n <RichText>{item.message}</RichText>\n </div>\n </MotionDiv__VerticalReveal>\n );\n })}\n </AnimatePresence>\n );\n}\n","import { type SendMessageDto } from '@opencx/widget-core';\nimport {\n useConfig,\n useCsat,\n useIsAwaitingBotReply,\n useMessages,\n useSessions,\n useUploadFiles,\n useWidget,\n useWidgetRouter,\n type FileWithProgress,\n} from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport {\n AlertCircle,\n ArrowUpIcon,\n CircleCheckIcon,\n CircleDashed,\n FileAudio2Icon,\n FileIcon,\n FileVideo2Icon,\n ImageIcon,\n Loader2,\n PaperclipIcon,\n XIcon,\n} from 'lucide-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { CsatSurvey } from '../../components/CsatSurvey';\nimport { MightSolveUserIssueSuggestedReplies } from '../../components/MightSolveUserIssueSuggestedReplies';\nimport { SuggestedReplyButton } from '../../components/SuggestedReplyButton';\nimport { MotionDiv } from '../../components/lib/MotionDiv';\nimport { MotionDiv__VerticalReveal } from '../../components/lib/MotionDiv__VerticalReveal';\nimport { Button } from '../../components/lib/button';\nimport { Tooltippy } from '../../components/lib/tooltip';\nimport { cn } from '../../components/lib/utils/cn';\nimport { useIsSmallScreen } from '../../hooks/useIsSmallScreen';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { dc } from '../../utils/data-component';\nimport { ChatFooterItems } from './ChatFooterItems';\n\nfunction FileDisplay({\n file: { status, file, error },\n onCancel,\n}: {\n file: FileWithProgress;\n onCancel: () => void;\n}) {\n const [fileContent, setFileContent] = useState<string | ArrayBuffer | null>(\n null,\n );\n\n useEffect(() => {\n if (!file.type.startsWith('image/')) return;\n\n const reader = new FileReader();\n reader.onload = () => setFileContent(reader.result as string);\n reader.onerror = () => console.error('Error reading file');\n reader.readAsDataURL(file);\n\n return () => reader.abort();\n }, [file]);\n\n const getStatusIcon = () => {\n switch (status) {\n case 'uploading':\n return <Loader2 className=\"size-4 animate-spin\" />;\n case 'error':\n return <AlertCircle className=\"size-4 text-destructive\" />;\n default:\n return null;\n }\n };\n\n const FileContent = () => {\n const fileType = file.type.split('/')[0];\n\n if (fileType === 'image' && fileContent) {\n return (\n <img\n src={typeof fileContent === 'string' ? fileContent : ''}\n className=\"object-cover bg-secondary size-full\"\n alt={file.name}\n />\n );\n }\n if (fileType === 'audio') {\n return <FileAudio2Icon />;\n }\n if (fileType === 'video') {\n return <FileVideo2Icon />;\n }\n return <FileIcon />;\n };\n\n return (\n <Tooltippy\n side=\"bottom\"\n content={\n status === 'error' ? (\n <span className=\"text-destructive\">Failed to upload: {error}</span>\n ) : (\n file.name\n )\n }\n >\n <div\n className={cn(\n status === 'uploading' && 'opacity-50',\n 'group',\n 'size-12 border rounded-2xl overflow-hidden relative',\n 'flex items-center justify-center shrink-0',\n )}\n >\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {getStatusIcon()}\n </div>\n <button\n type=\"button\"\n className={cn(\n 'absolute bg-black/50 inset-0 size-full z-10 opacity-0',\n 'flex items-center justify-center',\n 'opacity-0 group-hover:opacity-100 transition',\n )}\n onClick={onCancel}\n >\n <XIcon className=\"size-4 text-primary-foreground\" />\n </button>\n <FileContent />\n </div>\n </Tooltippy>\n );\n}\n\nfunction ChatInput() {\n const { isSmallScreen } = useIsSmallScreen();\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const { sendMessage } = useMessages();\n const { sessionState } = useSessions();\n const { t } = useTranslation();\n const [inputText, setInputText] = useState('');\n\n const {\n allFiles,\n emptyTheFiles,\n handleCancelUpload,\n appendFiles,\n isUploading,\n successFiles,\n } = useUploadFiles();\n\n const isHandedOff = !!sessionState.session?.isHandedOff;\n\n const { isAwaitingBotReply } = useIsAwaitingBotReply();\n\n const handleFileDrop = (acceptedFiles: File[]) => {\n appendFiles(acceptedFiles);\n };\n\n const cannotSend = !inputText.trim() && successFiles.length === 0;\n\n const handleSubmit = async () => {\n if (isAwaitingBotReply) return;\n if (cannotSend) return;\n\n if (isUploading) {\n // TODO use something other than toast\n const message = 'please wait for the file(s) to upload';\n console.info(message);\n }\n const trimmed = inputText.trim();\n\n // Do not await this\n void sendMessage({\n content: trimmed,\n attachments: successFiles.flatMap((f) =>\n f.fileUrl\n ? [\n {\n url: f.fileUrl,\n type: f.file.type,\n name: f.file.name,\n id: f.id,\n size: f.file.size,\n } satisfies NonNullable<SendMessageDto['attachments']>[number],\n ]\n : [],\n ),\n });\n\n setInputText('');\n emptyTheFiles();\n };\n\n const {\n getRootProps: dropzone__getRootProps,\n getInputProps: dropzone__getInputProps,\n open: dropzone__openFileSelect,\n } = useDropzone({\n onDrop: handleFileDrop,\n noClick: true,\n onDropRejected() {\n // TODO use something other than toast\n const message = 'unsupported file type, or the file is too large';\n console.error(message);\n },\n maxSize: 5 * 1024 * 1024,\n accept: isHandedOff\n ? {\n 'text/*': ['.txt'],\n 'image/*': ['.png', '.jpg', '.jpeg', '.gif'],\n 'application/pdf': ['.pdf'],\n }\n : {\n 'image/png': ['.png'],\n 'image/jpeg': ['.jpg', '.jpeg'],\n 'image/gif': ['.gif'],\n 'image/webp': ['.webp'],\n },\n });\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) return;\n if (clipboardData.files.length > 0) {\n handleFileDrop(Array.from(clipboardData.files));\n }\n };\n\n return (\n <div\n {...dc('chat/input_box/root')}\n className=\"p-2 relative space-y-1\"\n {...dropzone__getRootProps()}\n >\n <input {...dropzone__getInputProps()} />\n <div\n {...dc('chat/input_box/inner_root')}\n className={cn(\n 'transition-all',\n 'bg-white',\n // 'border',\n 'relative rounded-3xl flex flex-col gap-2 p-2',\n 'hover:border-primary focus-within:border-primary',\n )}\n >\n <div\n {...dc('chat/input_box/textarea_and_attachments_container')}\n className=\"flex flex-col gap-2\"\n >\n {allFiles.length > 0 && (\n <div\n {...dc('chat/input_box/attachments_container')}\n className=\"flex items-center gap-1\"\n >\n <AnimatePresence mode=\"popLayout\">\n {allFiles.map((file) => (\n <MotionDiv key={file.id} snapExit>\n <FileDisplay\n onCancel={() => handleCancelUpload(file.id)}\n file={file}\n />\n </MotionDiv>\n ))}\n </AnimatePresence>\n </div>\n )}\n <textarea\n {...dc('chat/input_box/textarea')}\n onPaste={handlePaste}\n ref={inputRef}\n id=\"chat-input\"\n value={inputText}\n // Thw `rows` attribute will take effect in browsers that do not support [field-sizing:content;] (Firefox and Safari as of now)\n rows={3}\n className={cn(\n /** Match the border radius of the container */\n // INPUT_CONTAINER_B_RADIUS,\n 'max-h-16 [field-sizing:content]',\n 'w-full resize-none px-2',\n allFiles.length === 0 && 'pt-1',\n 'bg-transparent outline-none',\n 'placeholder:text-muted-foreground',\n // 16px on mobiles prevents auto-zoom on the input when focused\n isSmallScreen ? 'text-[16px]' : 'text-sm',\n )}\n onChange={(e) => setInputText(e.target.value)}\n onKeyDown={async (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n handleSubmit();\n }\n }}\n placeholder={t('write_a_message_placeholder')}\n />\n </div>\n <div className=\"gap-2 flex justify-between\">\n <Tooltippy\n side=\"top\"\n align=\"start\"\n content=\"attach files, (maximum size 5mb)\"\n >\n <Button\n onClick={dropzone__openFileSelect}\n size=\"fit\"\n variant=\"ghost\"\n className={cn(\n 'rounded-full size-8 flex items-center justify-center p-0 overflow-hidden',\n )}\n >\n <AnimatePresence mode=\"wait\">\n {isHandedOff && !isAwaitingBotReply ? (\n <MotionDiv key=\"paper-clip\">\n <PaperclipIcon className=\"size-4\" />\n </MotionDiv>\n ) : (\n <MotionDiv key=\"image-icon\">\n <ImageIcon className=\"size-4\" />\n </MotionDiv>\n )}\n </AnimatePresence>\n </Button>\n </Tooltippy>\n\n <Tooltippy content=\"send message\" side=\"top\" align=\"end\">\n <Button\n size=\"fit\"\n onClick={handleSubmit}\n disabled={isAwaitingBotReply || isUploading || cannotSend}\n className=\"rounded-full size-8 flex items-center justify-center p-0\"\n >\n <AnimatePresence mode=\"wait\">\n {isAwaitingBotReply || isUploading ? (\n <MotionDiv key=\"loading\" snapExit>\n <CircleDashed className=\"size-4 animate-spin animate-iteration-infinite\" />\n </MotionDiv>\n ) : (\n <MotionDiv key=\"send\" snapExit>\n <ArrowUpIcon className=\"size-4\" />\n </MotionDiv>\n )}\n </AnimatePresence>\n </Button>\n </Tooltippy>\n </div>\n </div>\n </div>\n );\n}\n\nfunction NewConvOrBackToConvsButton() {\n const { widgetCtx } = useWidget();\n const { router } = useConfig();\n const { canCreateNewSession } = useSessions();\n const { toSessionsScreen } = useWidgetRouter();\n const { t } = useTranslation();\n\n return (\n <>\n {canCreateNewSession || !!router?.chatScreenOnly ? (\n <Button onClick={widgetCtx.resetChat} className=\"rounded-2xl w-full\">\n {t('new_conversation')}\n </Button>\n ) : (\n <Button onClick={toSessionsScreen} className=\"rounded-2xl w-full\">\n {t('back_to_conversations')}\n </Button>\n )}\n </>\n );\n}\n\nfunction SessionClosedSection() {\n const { t } = useTranslation();\n const { isCsatRequested, isCsatSubmitted } = useCsat();\n\n return (\n <div className=\"p-2\">\n <div className=\"p-2 bg-muted rounded-3xl\">\n <AnimatePresence mode=\"wait\">\n {isCsatRequested || isCsatSubmitted ? (\n <MotionDiv__VerticalReveal key=\"csat\">\n <CsatSurvey />\n <AnimatePresence mode=\"wait\">\n {isCsatSubmitted && (\n <MotionDiv__VerticalReveal key=\"new-conv-or-back-to-convs-button\">\n <NewConvOrBackToConvsButton />\n </MotionDiv__VerticalReveal>\n )}\n </AnimatePresence>\n </MotionDiv__VerticalReveal>\n ) : (\n <MotionDiv__VerticalReveal key=\"session-closed\">\n <div className=\"ps-2 flex items-center gap-1 pb-2\">\n <CircleCheckIcon className=\"size-4 text-emerald-600\" />\n <h2 className=\"text-sm font-medium\">\n {t('your_issue_has_been_resolved')}\n </h2>\n </div>\n <NewConvOrBackToConvsButton />\n </MotionDiv__VerticalReveal>\n )}\n </AnimatePresence>\n </div>\n </div>\n );\n}\n\nexport function ChatFooter() {\n const { initialQuestions, initialQuestionsPosition, thisWasHelpfulOrNot } =\n useConfig();\n const { sessionState } = useSessions();\n const { messagesState } = useMessages();\n\n const noMessages = messagesState.messages.length === 0;\n\n return (\n <footer>\n <AnimatePresence mode=\"wait\">\n {sessionState.session && !sessionState.session?.isOpened ? (\n <MotionDiv__VerticalReveal key=\"session-closed\">\n <SessionClosedSection />\n <ChatFooterItems />\n </MotionDiv__VerticalReveal>\n ) : (\n <MotionDiv__VerticalReveal key=\"chat-input\">\n {messagesState.lastAIResMightSolveUserIssue &&\n thisWasHelpfulOrNot?.enabled !== false && (\n <MightSolveUserIssueSuggestedReplies />\n )}\n\n {noMessages &&\n initialQuestions &&\n initialQuestionsPosition !== 'below-initial-messages' && (\n <div className=\"flex items-center flex-row justify-end gap-2 flex-wrap px-2\">\n {initialQuestions?.map((iq, index) => (\n <SuggestedReplyButton\n key={`${iq}-${index}`}\n suggestion={iq}\n />\n ))}\n </div>\n )}\n\n <ChatInput />\n <ChatFooterItems />\n </MotionDiv__VerticalReveal>\n )}\n </AnimatePresence>\n </footer>\n );\n}\n","import {\n useWidget,\n type WidgetComponentProps,\n} from '@opencx/widget-react-headless';\nimport React from 'react';\nimport { BotOrAgentMessageDefaultComponent } from './custom-components/BotOrAgentMessageDefaultComponent';\n\nexport function BotOrAgentMessage({\n isFirstInGroup,\n isLastInGroup,\n isAloneInGroup,\n ...props\n}: WidgetComponentProps & {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isAloneInGroup: boolean;\n}) {\n const { componentStore } = useWidget();\n if (props.type !== 'AGENT' && props.type !== 'AI') return null;\n\n // Try to use custom components first\n if (props.data.action) {\n const Component = componentStore.getComponent(props.data.action.name);\n if (Component) {\n return (\n <Component\n {...props}\n id={props.id}\n isFirstInGroup={isFirstInGroup}\n isLastInGroup={isLastInGroup}\n isAloneInGroup={isAloneInGroup}\n />\n );\n }\n }\n\n const Component = componentStore.getComponent(props.component);\n\n if (!Component) {\n // Fallback... just in case\n return (\n <BotOrAgentMessageDefaultComponent\n {...props}\n isFirstInGroup={isFirstInGroup}\n isLastInGroup={isLastInGroup}\n isAloneInGroup={isAloneInGroup}\n />\n );\n }\n\n return (\n <Component\n {...props}\n id={props.id}\n isFirstInGroup={isFirstInGroup}\n isLastInGroup={isLastInGroup}\n isAloneInGroup={isAloneInGroup}\n />\n );\n}\n","import React from 'react';\nimport type {\n WidgetAiMessage,\n WidgetAgentMessage,\n WidgetUserMessage,\n} from '@opencx/widget-core';\nimport { useConfig } from '@opencx/widget-react-headless';\nimport { cn } from './lib/utils/cn';\n\nexport function GroupTimestamp({\n messages,\n className,\n containerClassName,\n}: {\n messages: WidgetAiMessage[] | WidgetAgentMessage[] | WidgetUserMessage[];\n className?: string;\n containerClassName?: string;\n}) {\n const { timestamps } = useConfig();\n\n if (!timestamps?.perMessageGroup?.enabled) {\n return null;\n }\n\n const lastMessageTimestamp = messages[messages.length - 1]?.timestamp;\n if (!lastMessageTimestamp) return null;\n\n const formattedTimestamp = (() => {\n try {\n return new Date(lastMessageTimestamp).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n });\n } catch (error) {\n console.error(error);\n return null;\n }\n })();\n if (!formattedTimestamp) return null;\n\n return (\n <div className={containerClassName}>\n <span className={cn('text-xs text-muted-foreground', className)}>\n {formattedTimestamp}\n </span>\n </div>\n );\n}\n","import {\n type WidgetAgentMessage,\n type AgentOrBotType,\n type WidgetAiMessage,\n} from '@opencx/widget-core';\nimport React from 'react';\nimport { dc } from '../utils/data-component';\nimport { AgentOrBotAvatar } from './AgentOrBotAvatar';\nimport { BotOrAgentMessage } from './BotOrAgentMessage';\nimport { Tooltippy } from './lib/tooltip';\nimport { cn } from './lib/utils/cn';\nimport { SuggestedReplyButton } from './SuggestedReplyButton';\nimport { GroupTimestamp } from './GroupTimestamp';\n\nexport function BotOrAgentMessageGroup({\n messages,\n agent,\n suggestedReplies,\n}: {\n messages: WidgetAiMessage[] | WidgetAgentMessage[];\n agent: AgentOrBotType | undefined;\n suggestedReplies?: string[];\n}) {\n return (\n <div\n {...dc('chat/agent_msg_group/root')}\n className={cn('flex items-end gap-2')}\n >\n <Tooltippy content={agent?.name} side=\"right\" align=\"end\">\n <AgentOrBotAvatar\n {...dc('chat/agent_msg_group/root/avatar')}\n agent={agent}\n className=\"hidden\"\n />\n </Tooltippy>\n\n <div className={cn('flex-1 flex flex-col gap-1')}>\n <div\n {...dc('chat/agent_msg_group/avatar_and_msgs/root')}\n className={cn('flex items-end gap-2')}\n >\n <Tooltippy content={agent?.name} side=\"right\" align=\"end\">\n <AgentOrBotAvatar\n {...dc('chat/agent_msg_group/avatar_and_msgs/avatar')}\n agent={agent}\n />\n </Tooltippy>\n <div\n {...dc('chat/agent_msg_group/avatar_and_msgs/msgs')}\n className={cn('flex-1 flex flex-col gap-1')}\n >\n {messages.map((message, index, array) => (\n <BotOrAgentMessage\n key={message.id}\n isFirstInGroup={index === 0}\n isLastInGroup={index === array.length - 1}\n isAloneInGroup={array.length === 1}\n {...message}\n />\n ))}\n <GroupTimestamp messages={messages} />\n </div>\n </div>\n\n {suggestedReplies && suggestedReplies.length > 0 && (\n <div\n {...dc('chat/agent_msg_group/suggestions')}\n className={cn('flex flex-col gap-1 ps-8')}\n >\n {suggestedReplies?.map((suggestion, index) => (\n <SuggestedReplyButton\n key={`${suggestion}-${index}`}\n suggestion={suggestion}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { SpecialComponentProps } from '@opencx/widget-core';\nimport {\n useSessions,\n useConfig,\n useWidget,\n useMessages,\n} from '@opencx/widget-react-headless';\nimport React from 'react';\n\nexport function useSpecialComponentProps(): { props: SpecialComponentProps } {\n const {\n widgetCtx: { org },\n } = useWidget();\n const {\n sessionState: { session },\n } = useSessions();\n const config = useConfig();\n const {\n messagesState: { messages },\n } = useMessages();\n\n return {\n props: {\n react: React,\n org,\n session,\n config,\n messages,\n },\n };\n}\n","import React from 'react';\nimport { useSpecialComponentProps } from '../../hooks/useSpecialComponentProps';\n\nexport function SessionResolvedComponent() {\n const { props } = useSpecialComponentProps();\n\n if (props.session?.isOpened || !props.session) return null;\n\n const Component = props.config.specialComponents?.onSessionResolved;\n if (!Component) return null;\n\n return <Component {...props} />;\n}\n","import type { WidgetUserMessage } from '@opencx/widget-core';\nimport React from 'react';\nimport { dc } from '../utils/data-component';\nimport { AttachmentPreview } from './AttachmentPreview';\nimport { cn } from './lib/utils/cn';\n\nexport function UserMessage({\n message,\n isFirstInGroup,\n isLastInGroup,\n isAloneInGroup,\n}: {\n message: WidgetUserMessage;\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isAloneInGroup: boolean;\n}) {\n return (\n <div\n {...dc('chat/user_msg/root')}\n className=\"w-5/6 flex flex-col items-end gap-1\"\n >\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"w-full flex gap-1 flex-wrap justify-end\">\n {message.attachments?.map((attachment) => (\n <AttachmentPreview attachment={attachment} key={attachment.id} />\n ))}\n </div>\n )}\n {message.content.length > 0 && (\n <div\n {...dc('chat/user_msg/msg')}\n // Expose these data attributes for external styling customization\n data-first={isFirstInGroup}\n data-last={isLastInGroup}\n data-alone={isAloneInGroup}\n className={cn(\n 'transition-all',\n 'w-fit py-3 px-4 rounded-3xl text-sm',\n 'bg-primary text-primary-foreground',\n 'break-words [word-break:break-word]', // `[word-break:break-word]` is deprecated but works in the browser, while `break-words` which is `[overflow-wrap: break-word]` does not work\n 'whitespace-pre-wrap',\n\n // We're using the booleans directly here, not the data attributes, to make any external styling more specific than this\n isFirstInGroup && !isAloneInGroup && 'rounded-br-md',\n isLastInGroup && !isAloneInGroup && 'rounded-tr-md',\n !isFirstInGroup &&\n !isLastInGroup &&\n !isAloneInGroup &&\n 'rounded-r-md',\n )}\n >\n {message.content}\n </div>\n )}\n </div>\n );\n}\n","import type { WidgetUserMessage } from '@opencx/widget-core';\nimport React from 'react';\nimport { dc } from '../utils/data-component';\nimport { cn } from './lib/utils/cn';\nimport { UserMessage } from './UserMessage';\nimport { GroupTimestamp } from './GroupTimestamp';\n\nexport function UserMessageGroup({\n messages,\n}: {\n messages: WidgetUserMessage[];\n}) {\n return (\n <div\n {...dc('chat/user_msg_group/root')}\n className={cn('group', 'flex flex-col gap-1 justify-end items-end')}\n >\n {messages.map((message, index, array) => (\n <UserMessage\n key={message.id}\n message={message}\n isFirstInGroup={index === 0}\n isLastInGroup={index === array.length - 1}\n isAloneInGroup={array.length === 1}\n />\n ))}\n <GroupTimestamp messages={messages} containerClassName=\"ms-auto\" />\n </div>\n );\n}\n","import {\n type WidgetAgentMessage,\n type WidgetAiMessage,\n type WidgetMessageU,\n type WidgetSystemMessageU,\n type WidgetUserMessage,\n} from '@opencx/widget-core';\n\nexport function groupMessagesByType(\n messages: WidgetMessageU[],\n): WidgetMessageU[][] {\n const result: WidgetMessageU[][] = [];\n let currentGroup: WidgetMessageU[] | null = null;\n\n messages.forEach((message) => {\n if (\n // Start a new group if the type changes\n currentGroup?.[0]?.type !== message.type ||\n // Start a new group if the agent changes\n (currentGroup[0]?.type === 'AGENT' &&\n message.type === 'AGENT' &&\n (message.agent?.id !== currentGroup[0].agent?.id ||\n message.agent?.name !== currentGroup[0].agent?.name))\n ) {\n currentGroup = [];\n result.push(currentGroup);\n }\n\n currentGroup.push(message);\n });\n\n return result;\n}\n\nexport function isUserMessageGroup(\n messages: WidgetMessageU[],\n): messages is WidgetUserMessage[] {\n return messages?.[0]?.type === 'USER';\n}\n\nexport function isBotMessageGroup(\n messages: WidgetMessageU[],\n): messages is WidgetAiMessage[] {\n return messages?.[0]?.type === 'AI';\n}\n\nexport function isAgentMessageGroup(\n messages: WidgetMessageU[],\n): messages is WidgetAgentMessage[] {\n return messages?.[0]?.type === 'AGENT';\n}\n\nexport function isSystemMessageGroup(\n messages: WidgetMessageU[],\n): messages is WidgetSystemMessageU[] {\n return messages?.[0]?.type === 'SYSTEM';\n}\n","import React from 'react';\nimport type { WidgetAiMessage } from '@opencx/widget-core';\nimport { useMessages, useConfig } from '@opencx/widget-react-headless';\nimport { BotOrAgentMessageGroup } from '../../components/BotOrAgentMessageGroup';\n\nexport function AdvancedInitialMessages() {\n const {\n messagesState: { messages },\n } = useMessages();\n\n const {\n advancedInitialMessages = [],\n initialQuestionsPosition,\n initialQuestions,\n bot,\n } = useConfig();\n\n return (\n <>\n {messages.length === 0 && advancedInitialMessages.length > 0 && (\n <BotOrAgentMessageGroup\n messages={advancedInitialMessages.map(\n ({ message }, index) =>\n ({\n component: 'bot_message',\n data: { message },\n id: `${index}-${message}`,\n type: 'AI',\n timestamp: null,\n }) satisfies WidgetAiMessage,\n )}\n suggestedReplies={\n messages.length === 0 &&\n initialQuestionsPosition === 'below-initial-messages'\n ? initialQuestions\n : undefined\n }\n agent={bot ? { ...bot, isAi: true, id: null } : undefined}\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { useMessages, useConfig } from '@opencx/widget-react-headless';\nimport { RichText } from '../../components/RichText';\n\nexport function ChatBannerItems() {\n const {\n messagesState: { messages },\n } = useMessages();\n const { chatBannerItems } = useConfig();\n\n if (!chatBannerItems?.length) return null;\n if (\n messages.length > 0 &&\n chatBannerItems.every((item) => !item.persistent)\n ) {\n return null;\n }\n\n return (\n <div className=\"w-full text-center text-xs\">\n {chatBannerItems.map(({ message, persistent }, index) =>\n messages.length > 0 && !persistent ? null : (\n <div key={`${message}-${index}`}>\n <RichText>{message}</RichText>\n </div>\n ),\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { WidgetAiMessage } from '@opencx/widget-core';\nimport { useMessages, useConfig } from '@opencx/widget-react-headless';\nimport { BotOrAgentMessageGroup } from '../../components/BotOrAgentMessageGroup';\n\nexport function InitialMessages() {\n const {\n messagesState: { messages },\n } = useMessages();\n const config = useConfig();\n const {\n advancedInitialMessages = [],\n initialQuestions,\n initialQuestionsPosition,\n } = config;\n\n const initialMessages = (() => {\n if (advancedInitialMessages.length) return [];\n if (messages.length) return [];\n // TODO translate default welcome message\n if (!config.initialMessages?.length) return ['Hello, how can I help you?'];\n return config.initialMessages;\n })();\n\n return (\n <>\n {messages.length === 0 && initialMessages.length > 0 && (\n <BotOrAgentMessageGroup\n messages={initialMessages.map(\n (m, index) =>\n ({\n component: 'bot_message',\n data: { message: m },\n id: `${index}-${m}`,\n type: 'AI',\n timestamp: null,\n }) satisfies WidgetAiMessage,\n )}\n suggestedReplies={\n initialQuestionsPosition === 'below-initial-messages'\n ? initialQuestions\n : undefined\n }\n agent={\n config.bot ? { ...config.bot, isAi: true, id: null } : undefined\n }\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { useSpecialComponentProps } from '../../hooks/useSpecialComponentProps';\n\nexport function ChatBottomComponents() {\n const { props } = useSpecialComponentProps();\n const components = props.config.specialComponents?.chatBottomComponents;\n\n if (!components) return null;\n\n return (\n <div>\n {components.map(({ key, component: Component }) => (\n <Component key={key} {...props} />\n ))}\n </div>\n );\n}\n","import {\n type LiteralWidgetComponentKey,\n type SafeExtract,\n} from '@opencx/widget-core';\nimport {\n useConfig,\n useIsAwaitingBotReply,\n useMessages,\n useWidget,\n} from '@opencx/widget-react-headless';\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { BotOrAgentMessageGroup } from '../../components/BotOrAgentMessageGroup';\nimport { SessionResolvedComponent } from '../../components/special-components/SessionResolvedComponent';\nimport { UserMessageGroup } from '../../components/UserMessageGroup';\nimport { dc } from '../../utils/data-component';\nimport {\n groupMessagesByType,\n isAgentMessageGroup,\n isBotMessageGroup,\n isUserMessageGroup,\n} from '../../utils/group-messages-by-type';\nimport { AdvancedInitialMessages } from './AdvancedInitialMessages';\nimport { ChatBannerItems } from './ChatBannerItems';\nimport { InitialMessages } from './InitialMessages';\nimport { ChatBottomComponents } from '../../components/special-components/ChatBottomComponents';\n\nexport function ChatMain() {\n const {\n messagesState: { messages },\n } = useMessages();\n const { isAwaitingBotReply } = useIsAwaitingBotReply();\n const { componentStore } = useWidget();\n const config = useConfig();\n\n const groupedMessages = useMemo(\n () => groupMessagesByType(messages),\n [messages],\n );\n\n const LoadingComponent = componentStore.getComponent(\n 'loading' satisfies SafeExtract<LiteralWidgetComponentKey, 'loading'>,\n );\n\n /* ------------------------------------------------------ */\n /* Auto Scroller */\n /* ------------------------------------------------------ */\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n function handleNewMessage() {\n setTimeout(() => {\n const container_ = messagesContainerRef.current;\n if (container_) {\n container_.scrollTop = container_.scrollHeight;\n }\n }, 0);\n }\n\n useEffect(() => {\n handleNewMessage();\n }, [messages]);\n\n return (\n <div\n {...dc('chat/msgs/root')}\n ref={messagesContainerRef}\n className=\"max-h-full scroll-smooth relative flex-1 py-2 px-4 flex flex-col gap-2 overflow-auto\"\n >\n <ChatBannerItems />\n <AdvancedInitialMessages />\n <InitialMessages />\n\n {groupedMessages.map((group, i) => {\n const type = group?.[0]?.type;\n const firstIdInGroup = group[0]?.id;\n if (!type || !firstIdInGroup) return null;\n\n if (isUserMessageGroup(group)) {\n return <UserMessageGroup key={firstIdInGroup} messages={group} />;\n }\n\n if (isBotMessageGroup(group)) {\n const isLastGroup = i === groupedMessages.length - 1;\n // Do not render any AI messages (most likely came from polling) while waiting for the sendMessage HTTP request to finish\n if (isAwaitingBotReply && isLastGroup) return null;\n\n const agent = group[0]?.agent;\n return (\n <BotOrAgentMessageGroup\n key={firstIdInGroup}\n messages={group}\n agent={agent}\n />\n );\n }\n\n if (isAgentMessageGroup(group)) {\n const agent = group[0]?.agent;\n return (\n <BotOrAgentMessageGroup\n key={firstIdInGroup}\n messages={group}\n agent={agent}\n />\n );\n }\n\n return null;\n })}\n {isAwaitingBotReply && LoadingComponent && (\n <LoadingComponent agent={config.bot} />\n )}\n\n <ChatBottomComponents />\n <SessionResolvedComponent />\n </div>\n );\n}\n","import { useMessages, useSessions } from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport React, { useRef } from 'react';\nimport { Header } from '../../components/Header';\nimport { LoadingSpinner } from '../../components/lib/LoadingSpinner';\nimport { MotionDiv } from '../../components/lib/MotionDiv';\nimport { cn } from '../../components/lib/utils/cn';\nimport { useCanvas } from '../../hooks/useCanvas';\nimport { useSetWidgetSize } from '../../hooks/useSetWidgetSize';\nimport { useTheme } from '../../hooks/useTheme';\nimport { dc } from '../../utils/data-component';\nimport { ChatCanvas } from './ChatCanvas';\nimport { ChatFooter } from './ChatFooter';\nimport { ChatMain } from './ChatMain';\n\nexport function ChatScreen() {\n const {\n messagesState: { isInitialFetchLoading },\n } = useMessages();\n const {\n sessionState: { session },\n } = useSessions();\n const { isCanvasOpen } = useCanvas();\n const { theme } = useTheme();\n\n useSetWidgetSize({\n width: isCanvasOpen\n ? theme.screens.chat.withCanvas.width\n : theme.screens.chat.width,\n height: isCanvasOpen\n ? theme.screens.chat.withCanvas.height\n : theme.screens.chat.height,\n });\n\n // The key is the session id, so that when chat is reset, the animation replays\n const chatContentKeyRef = useRef(session?.id || 'chat').current;\n\n return (\n <div\n {...dc('chat/root')}\n className={cn('flex flex-col overflow-hidden')}\n style={{\n width: '100vw', // Relative to the iframe\n maxWidth: '100vw', // Relative to the iframe\n height: '100vh', // Relative to the iframe\n maxHeight: '100vh', // Relative to the iframe\n }}\n >\n <div className=\"size-full justify-between flex flex-col\">\n <Header />\n <AnimatePresence mode=\"wait\">\n {isInitialFetchLoading ? (\n <MotionDiv\n key=\"loading\"\n className=\"flex flex-col items-center justify-center w-full flex-1\"\n >\n <LoadingSpinner />\n </MotionDiv>\n ) : (\n <MotionDiv\n key={chatContentKeyRef}\n className=\"flex items-start h-full flex-1 overflow-auto\"\n // If we don't snap exit, the initial questions will show before the animation starts\n snapExit\n >\n <div\n {...dc('chat/main/root')}\n className={cn(\n 'flex flex-col h-full overflow-auto transition-all',\n isCanvasOpen ? 'w-2/5' : 'w-full',\n )}\n style={{\n transitionTimingFunction:\n theme.screens.chat.withCanvas.transitionTimingFunction,\n transitionDuration:\n theme.screens.chat.withCanvas.transitionDuration,\n }}\n >\n <ChatMain />\n <ChatFooter />\n </div>\n <div\n {...dc('chat/canvas/root')}\n className={cn(\n 'h-full overflow-auto transition-all',\n isCanvasOpen ? 'w-3/5' : 'w-0',\n )}\n style={{\n transitionTimingFunction:\n theme.screens.chat.withCanvas.transitionTimingFunction,\n transitionDuration:\n theme.screens.chat.withCanvas.transitionDuration,\n }}\n >\n <ChatCanvas />\n </div>\n </MotionDiv>\n )}\n </AnimatePresence>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { cn } from './utils/cn';\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('animate-pulse rounded-md bg-secondary', className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import React from 'react';\nimport { cn } from '../lib/utils/cn';\n\nexport function OpenLogoSvg({ className }: { className?: string }) {\n return (\n <svg\n width=\"26\"\n height=\"32\"\n viewBox=\"0 0 26 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn('text-primary-foreground', className)}\n >\n <path\n d=\"M1.34103 25.6132H5.44245C5.74203 25.6228 6.02673 25.7462 6.23867 25.9582C6.45062 26.1703 6.5739 26.4551 6.58348 26.7548V30.8584C6.59305 31.1581 6.71634 31.443 6.92828 31.655C7.14023 31.8671 7.42492 31.9904 7.7245 32H18.2894C18.589 31.9904 18.8737 31.8671 19.0856 31.655C19.2976 31.443 19.4209 31.1581 19.4304 30.8584V26.7548C19.4401 26.4545 19.5638 26.1692 19.7765 25.957C19.9892 25.7449 20.2748 25.6219 20.5749 25.6132H24.659C24.9586 25.6036 25.2433 25.4803 25.4552 25.2682C25.6671 25.0562 25.7904 24.7713 25.8 24.4716V7.52839C25.7904 7.22865 25.6671 6.94381 25.4552 6.73176C25.2433 6.5197 24.9586 6.39635 24.659 6.38677H20.561C20.2603 6.37802 19.9742 6.25457 19.7614 6.04169C19.5487 5.82881 19.4253 5.54261 19.4165 5.24168V1.14161C19.4072 0.84419 19.2858 0.561291 19.0768 0.349589C18.8678 0.137887 18.5865 0.0130193 18.2894 0L7.7245 0C7.42492 0.00957792 7.14023 0.132929 6.92828 0.344983C6.71634 0.557036 6.59305 0.841878 6.58348 1.14161V5.24168C6.57477 5.54203 6.45187 5.82773 6.23983 6.04052C6.0278 6.25331 5.74262 6.37715 5.44245 6.38677H1.34103C1.04144 6.39635 0.756749 6.5197 0.544805 6.73176C0.332861 6.94381 0.209574 7.22865 0.200001 7.52839V24.4716C0.209574 24.7713 0.332861 25.0562 0.544805 25.2682C0.756749 25.4803 1.04144 25.6036 1.34103 25.6132ZM6.58348 24.4716V7.52839C6.59305 7.22865 6.71634 6.94381 6.92828 6.73176C7.14023 6.5197 7.42492 6.39635 7.7245 6.38677H18.2894C18.589 6.39635 18.8737 6.5197 19.0856 6.73176C19.2976 6.94381 19.4209 7.22865 19.4304 7.52839V24.4716C19.4209 24.7713 19.2976 25.0562 19.0856 25.2682C18.8737 25.4803 18.589 25.6036 18.2894 25.6132H7.7245C7.42492 25.6036 7.14023 25.4803 6.92828 25.2682C6.71634 25.0562 6.59305 24.7713 6.58348 24.4716Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { useConfig } from '@opencx/widget-react-headless';\nimport * as React from 'react';\nimport { cn } from './lib/utils/cn.js';\nimport { Wobble } from './lib/wobble.js';\nimport { OpenLogoSvg } from './svg/OpenLogoSvg.js';\n\nexport function PoweredByOpen({ className }: { className?: string }) {\n const { token } = useConfig();\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center gap-2 p-2 pt-0',\n className,\n )}\n >\n <Wobble>\n <a\n href={`https://open.cx/?ref=${token}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn(\n 'text-[10px] flex items-center',\n 'text-muted-foreground/70 [&_svg]:text-muted-foreground/70',\n 'hover:text-primary [&_svg]:hover:text-primary',\n )}\n >\n <span>Powered by</span>\n <span> </span>\n <span className=\"flex items-center gap-[1px]\">\n <span>\n <OpenLogoSvg className=\"size-3 inline-block\" />\n </span>\n <span className=\"font-semibold\">open</span>\n </span>\n </a>\n </Wobble>\n </div>\n );\n}\n","import { type SessionDto } from '@opencx/widget-core';\nimport {\n useConfig,\n useSessions,\n useWidgetRouter,\n} from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport { ChevronRightIcon, UserRoundIcon } from 'lucide-react';\nimport React from 'react';\nimport rehypeRaw from 'rehype-raw';\nimport remarkGfm from 'remark-gfm';\nimport { Header } from '../../components/Header';\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from '../../components/lib/avatar';\nimport { Button } from '../../components/lib/button';\nimport { LoadingSpinner } from '../../components/lib/LoadingSpinner';\nimport { MotionDiv } from '../../components/lib/MotionDiv';\nimport { Skeleton } from '../../components/lib/skeleton';\nimport { cn } from '../../components/lib/utils/cn';\nimport { MemoizedReactMarkdown } from '../../components/MemoizedReactMarkdown';\nimport { PoweredByOpen } from '../../components/PoweredByOpen';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useSetWidgetSize } from '../../hooks/useSetWidgetSize';\nimport { useTheme } from '../../hooks/useTheme';\nimport { dc } from '../../utils/data-component';\n\nfunction SectionTitle({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"ps-4 text-xs text-muted-foreground/75 uppercase font-semibold tracking-tight\">\n {children}\n </p>\n );\n}\n\nfunction SessionCard({\n session,\n className,\n}: {\n session: SessionDto;\n className?: string;\n}) {\n const { bot } = useConfig();\n const { toChatScreen } = useWidgetRouter();\n\n const assigneeName =\n session.assignee.kind === 'human'\n ? session.assignee.name || 'Support Agent'\n : bot?.name || 'AI Support Agent';\n const assigneeAvatarUrl =\n session.assignee.kind === 'human'\n ? session.assignee.avatarUrl || ''\n : bot?.avatar || '';\n\n return (\n <Button\n variant=\"ghost\"\n size=\"lg\"\n className={cn(\n 'rounded-full p-2 pe-4 flex text-start justify-between w-full whitespace-normal',\n className,\n )}\n onClick={() => toChatScreen(session.id)}\n >\n <div className=\"flex-1 flex gap-2 items-center\">\n <AnimatePresence mode=\"wait\">\n <MotionDiv snapExit>\n <Avatar className=\"size-10\">\n <AvatarImage src={assigneeAvatarUrl} alt=\"Agent Icon\" />\n <AvatarFallback>\n <UserRoundIcon className=\"size-4\" />\n </AvatarFallback>\n </Avatar>\n </MotionDiv>\n </AnimatePresence>\n <div className=\"flex-1\">\n <AnimatePresence mode=\"wait\">\n <MotionDiv key={assigneeName} snapExit>\n {assigneeName}\n </MotionDiv>\n </AnimatePresence>\n <AnimatePresence mode=\"wait\">\n {session.lastMessage ? (\n <MotionDiv key={session.lastMessage || 'content'} snapExit>\n <MemoizedReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n // Do not add `prose` styling for last message preview\n className=\"line-clamp-1 overflow-hidden text-ellipsis text-xs text-muted-foreground\"\n >\n {session.lastMessage}\n </MemoizedReactMarkdown>\n </MotionDiv>\n ) : (\n <MotionDiv key=\"skeleton\" className=\"w-1/2\" snapExit>\n <Skeleton className=\"h-4 w-full\" />\n </MotionDiv>\n )}\n </AnimatePresence>\n </div>\n </div>\n <ChevronRightIcon className=\"size-4 text-muted-foreground shrink-0 rtl:-scale-100\" />\n </Button>\n );\n}\n\nfunction SessionsList() {\n const { t } = useTranslation();\n const { toChatScreen } = useWidgetRouter();\n const {\n sessionsState: { data: sessions, isInitialFetchLoading: isLoading },\n openSessions,\n closedSessions,\n canCreateNewSession,\n } = useSessions();\n\n return (\n <div className=\"flex-1 flex flex-col overflow-scroll py-2 px-2\">\n <AnimatePresence mode=\"wait\">\n {isLoading ? (\n <MotionDiv\n key=\"loading\"\n className=\"flex-1 flex items-center justify-center\"\n >\n <LoadingSpinner />\n </MotionDiv>\n ) : (\n <MotionDiv\n key=\"sessions\"\n className=\"flex-1 flex flex-col gap-2 relative\"\n >\n {sessions.length ? (\n <>\n <AnimatePresence>\n {openSessions.length > 0 && (\n <MotionDiv\n fadeIn=\"up\"\n delay={0.2}\n key=\"open-sessions\"\n className=\"space-y-2\"\n snapExit\n >\n {openSessions.map((s) => (\n <SessionCard key={s.id} session={s} />\n ))}\n </MotionDiv>\n )}\n\n {closedSessions.length > 0 && (\n <MotionDiv\n key=\"closed-sessions\"\n className=\"space-y-2\"\n delay={0.2}\n snapExit\n >\n <SectionTitle>{t('closed_conversations')}</SectionTitle>\n {closedSessions.map((s) => (\n <SessionCard\n key={s.id}\n session={s}\n className=\"opacity-50 hover:opacity-100\"\n />\n ))}\n </MotionDiv>\n )}\n </AnimatePresence>\n\n {canCreateNewSession && (\n <div className=\"mt-auto w-full rounded-3xl sticky bottom-0 outline outline-8 outline-background bg-background\">\n <Button\n {...dc('sessions/new_conversation_btn')}\n size=\"lg\"\n key=\"new-session\"\n className=\"w-full\"\n onClick={() => toChatScreen()}\n >\n {t('new_conversation')}\n </Button>\n </div>\n )}\n </>\n ) : (\n <div className=\"flex-1 flex flex-col gap-2 items-center\">\n <div className=\"flex-1 flex items-center justify-center\">\n <p className=\"text-muted-foreground\">\n {t('no_conversations_yet')}\n </p>\n </div>\n <Button\n {...dc('sessions/new_conversation_btn')}\n size=\"lg\"\n key=\"new-session\"\n className=\"w-full\"\n onClick={() => toChatScreen()}\n >\n {t('new_conversation')}\n </Button>\n </div>\n )}\n </MotionDiv>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nexport function SessionsScreen() {\n const { theme } = useTheme();\n useSetWidgetSize({\n width: theme.screens.sessions.width,\n height: theme.screens.sessions.height,\n });\n\n return (\n <div\n {...dc('sessions/root')}\n className={cn('flex flex-col overflow-hidden bg-background')}\n style={{\n width: '100vw', // Relative to the iframe\n maxWidth: '100vw', // Relative to the iframe\n height: '100vh', // Relative to the iframe\n maxHeight: '100vh', // Relative to the iframe\n }}\n >\n <div className=\"size-full flex flex-col\">\n <Header />\n <SessionsList />\n <PoweredByOpen />\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { useIsSmallScreen } from '../../hooks/useIsSmallScreen.js';\nimport { cn } from './utils/cn.js';\nimport { Wobble } from './wobble.js';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n const { isSmallScreen } = useIsSmallScreen();\n\n return (\n <Wobble ref={ref}>\n <input\n type={type}\n className={cn(\n // 16px on mobiles prevents auto-zoom on the input when focused\n isSmallScreen ? 'text-[16px]' : 'text-sm',\n 'flex w-full rounded-xl p-2 ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-primary-foreground placeholder:text-muted-foreground/75 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition',\n 'rounded-2xl px-4',\n 'border shadow-sm',\n className,\n )}\n {...props}\n />\n </Wobble>\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import { useEffect, useRef } from 'react';\nimport { useConfig, useWidget } from '@opencx/widget-react-headless';\n\nexport function useWidgetContentHeight() {\n const { contentIframeRef } = useWidget();\n const { inline } = useConfig();\n /**\n * This is the element that we will observe for height changes\n */\n const observedElementRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const contentRoot = contentIframeRef?.current;\n\n if (contentRoot && observedElementRef.current) {\n const observedElement = observedElementRef.current;\n\n let animationFrame: number;\n const observer = new ResizeObserver(() => {\n animationFrame = requestAnimationFrame(() => {\n const height = observedElement.offsetHeight;\n contentRoot.style.setProperty(\n '--opencx-widget-height',\n inline ? '100%' : `${height.toFixed(1)}px`,\n );\n });\n });\n observer.observe(observedElement);\n\n return () => {\n cancelAnimationFrame(animationFrame);\n observer.unobserve(observedElement);\n };\n }\n }, [contentIframeRef, inline]);\n\n return { observedElementRef };\n}\n","import {\n useConfig,\n useContact,\n useWidget,\n useWidgetTrigger,\n} from '@opencx/widget-react-headless';\nimport { SendHorizontal, XIcon } from 'lucide-react';\nimport React, { useState } from 'react';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport { z } from 'zod';\nimport { Button } from '../../components/lib/button';\nimport { Input } from '../../components/lib/input';\nimport { MotionDiv } from '../../components/lib/MotionDiv';\nimport { cn } from '../../components/lib/utils/cn';\nimport { PoweredByOpen } from '../../components/PoweredByOpen';\nimport { useIsSmallScreen } from '../../hooks/useIsSmallScreen';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { useSetWidgetSize } from '../../hooks/useSetWidgetSize';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useWidgetContentHeight } from '../../hooks/useWidgetContentHeight';\n\nconst schema = z.object({\n name: z.string().min(2),\n email: z.string().email(),\n});\n\nexport function WelcomeScreen() {\n const {\n widgetCtx: { org },\n } = useWidget();\n const { setIsOpen } = useWidgetTrigger();\n const { createUnverifiedContact } = useContact();\n const { isSmallScreen } = useIsSmallScreen();\n const config = useConfig();\n const { theme } = useTheme();\n const { t } = useTranslation();\n const { observedElementRef } = useWidgetContentHeight();\n\n useSetWidgetSize({\n height: undefined,\n width: theme.screens.welcome.width,\n });\n\n const [name, setName] = useState(config.prefillUserData?.name || '');\n const [email, setEmail] = useState(config.prefillUserData?.email || '');\n\n const extraDataFields = (config.extraDataCollectionFields || []).filter(\n (f) => f !== 'name' && f !== 'email' && !!f,\n );\n\n const [extraData, setExtraData] = useState<Record<string, string>>({});\n\n const [handleSubmitState, handleSubmit] = useAsyncFn(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const result = schema.safeParse({ name, email });\n if (result.success) {\n await createUnverifiedContact(\n {\n email: result.data.email,\n non_verified_name: result.data.name,\n },\n // Only pass extra data if there is any\n Object.values(extraData).filter(Boolean).length\n ? extraData\n : undefined,\n );\n }\n },\n [name, email, extraData],\n );\n\n return (\n <div\n style={{\n width: '100vw', // Relative to the iframe\n maxWidth: '100vw', // Relative to the iframe\n minHeight: theme.screens.welcome.minHeight,\n height: '100vh', // Relative to the iframe\n maxHeight: '100vh', // Relative to the iframe\n overflowY: 'auto',\n }}\n >\n <div\n ref={observedElementRef}\n className={cn(\n 'flex flex-col',\n isSmallScreen && 'h-full',\n 'bg-[radial-gradient(ellipse_at_top_left,hsl(var(--opencx-primary)),transparent),radial-gradient(ellipse_at_top_right,hsl(var(--opencx-primary)),transparent)]',\n )}\n >\n <div\n className={cn(\n 'flex-1 flex flex-col px-4 py-12 text-start space-y-4 relative z-10',\n 'text-primary-foreground',\n )}\n >\n {isSmallScreen && (\n <MotionDiv className=\"absolute top-6 end-6\">\n <Button size=\"selfless\" onClick={() => setIsOpen(false)}>\n <XIcon className=\"size-4\" />\n </Button>\n </MotionDiv>\n )}\n\n <div className=\"flex items-center justify-between w-full mb-2\">\n {config.assets?.organizationLogo ? (\n <img\n src={config.assets?.organizationLogo}\n alt=\"Company Logo\"\n className=\"h-8 w-auto object-contain\"\n />\n ) : (\n <h2 className=\"font-bold text-sm\">{org.name}</h2>\n )}\n </div>\n <div className=\"space-y-2\">\n <h1 className=\"text-[1.75rem] font-semibold tracking-tight leading-none\">\n {config.textContent?.welcomeScreen?.title ||\n t('welcome_screen_title')}\n </h1>\n\n <p className=\"text-sm\">\n {config.textContent?.welcomeScreen?.description ||\n t('welcome_screen_description')}\n </p>\n </div>\n </div>\n\n <div\n className={cn(\n 'z-10 m-2 px-2 pt-2 bp-0 space-y-2',\n 'bg-[white]',\n 'border shadow',\n 'rounded-3xl',\n )}\n >\n <form onSubmit={handleSubmit} className=\"space-y-2\">\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n required\n placeholder={t('your_name_placeholder')}\n name=\"name\"\n />\n <Input\n required\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n type=\"email\"\n placeholder={t('your_email_placeholder')}\n name=\"email\"\n />\n {extraDataFields.map((field) => (\n <Input\n key={field}\n value={extraData[field]}\n onChange={(e) =>\n setExtraData((prev) => ({\n ...prev,\n [field]: e.target.value,\n }))\n }\n placeholder={`${field} (${t('optional')})`}\n />\n ))}\n\n <Button\n disabled={handleSubmitState.loading}\n className=\"w-full\"\n size=\"lg\"\n >\n {handleSubmitState.loading\n ? t('start_chat_button_loading')\n : t('start_chat_button')}\n <SendHorizontal className=\"size-4 rtl:-scale-100\" />\n </Button>\n </form>\n\n <PoweredByOpen />\n </div>\n </div>\n </div>\n );\n}\n","import { isExhaustive } from '@opencx/widget-core';\nimport { useWidgetRouter } from '@opencx/widget-react-headless';\nimport { AnimatePresence } from 'framer-motion';\nimport React from 'react';\nimport { MotionDiv } from '../components/lib/MotionDiv';\nimport { ChatScreen } from './chat';\nimport { SessionsScreen } from './sessions';\nimport { WelcomeScreen } from './welcome';\n\nexport function RootScreen() {\n const {\n routerState: { screen },\n } = useWidgetRouter();\n\n return (\n <div className=\"relative bg-background size-full\">\n <AnimatePresence mode=\"wait\">\n {(() => {\n switch (screen) {\n case 'welcome':\n return (\n <MotionDiv\n key={screen}\n fadeIn=\"right\"\n className=\"size-full\"\n snapExit\n >\n <WelcomeScreen />\n </MotionDiv>\n );\n\n case 'sessions':\n return (\n <MotionDiv\n key={screen}\n fadeIn=\"right\"\n className=\"size-full\"\n snapExit\n >\n <SessionsScreen />\n </MotionDiv>\n );\n\n case 'chat':\n return (\n <MotionDiv\n key={screen}\n fadeIn=\"right\"\n className=\"size-full\"\n snapExit\n >\n <ChatScreen />\n </MotionDiv>\n );\n default: {\n isExhaustive(screen, RootScreen.name);\n return null;\n }\n }\n })()}\n </AnimatePresence>\n </div>\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport IFrame from '@uiw/react-iframe';\nimport { motion } from 'framer-motion';\nimport React from 'react';\nimport styles from '../index.css?inline.css';\nimport {\n useConfig,\n useWidget,\n useWidgetTrigger,\n} from '@opencx/widget-react-headless';\nimport { TooltipProvider } from './components/lib/tooltip';\nimport { cn } from './components/lib/utils/cn';\nimport { useTheme } from './hooks/useTheme';\nimport { RootScreen } from './screens';\nimport { useTranslation } from './hooks/useTranslation';\nimport { version } from '../package.json';\nimport { DialogerProvider } from './components/Dialoger';\n\nconst initialContent = `<!DOCTYPE html>\n<html>\n<head>\n<style>\n${styles}\nhtml, body {\n height: 100%;\n width: 100%;\n margin: 0;\n padding: 0;\n font-size: 16px;\n}\n</style>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, interactive-widget=resizes-content\">\n</head>\n<body>\n</body>\n</html>`;\n\nexport function WidgetContent() {\n const { isOpen } = useWidgetTrigger();\n const { contentIframeRef } = useWidget();\n const { cssOverrides, inline } = useConfig();\n const { theme, cssVars, computed } = useTheme();\n const { dir } = useTranslation();\n\n return (\n <motion.div\n animate={isOpen ? 'visible' : 'hidden'}\n initial=\"hidden\"\n variants={{\n hidden: {\n opacity: 0,\n y: 8,\n transitionEnd: { display: 'none' },\n transition: { duration: 0.15 },\n },\n visible: {\n opacity: 1,\n y: 0,\n display: 'block',\n height: inline ? '100%' : undefined,\n },\n }}\n >\n <IFrame\n ref={contentIframeRef}\n initialContent={initialContent}\n allowFullScreen\n title=\"OpenCX Live Chat\"\n style={{\n // @ts-expect-error this is a valid css variable\n '--opencx-widget-width': computed.minWidth,\n '--opencx-widget-height': computed.minHeight,\n\n minWidth: computed.minWidth,\n width: 'var(--opencx-widget-width)',\n maxWidth: computed.maxWidth, // Relative to the viewport\n\n minHeight: computed.minHeight,\n height: 'var(--opencx-widget-height)',\n maxHeight: computed.maxHeight, // Relative to the viewport\n\n overflow: 'hidden',\n /** outline is better than border because of box sizing; the outline wouldn't affect the content inside... the border will mess up how the children's border radius sits with the parent */\n outline: theme.widgetContentContainer.outline,\n outlineColor: theme.widgetContentContainer.outlineColor,\n borderRadius: theme.widgetContentContainer.borderRadius,\n boxShadow: theme.widgetContentContainer.boxShadow,\n transitionProperty: theme.widgetContentContainer.transitionProperty,\n transitionTimingFunction:\n theme.widgetContentContainer.transitionTimingFunction,\n transitionDuration: theme.widgetContentContainer.transitionDuration,\n\n // reset iframe defaults\n boxSizing: 'border-box',\n borderWidth: '0px',\n }}\n >\n {cssOverrides && <style>{cssOverrides}</style>}\n <div\n style={{\n ...cssVars,\n zIndex: theme.widgetContentContainer.zIndex,\n }}\n data-version={version}\n className={cn(\n 'antialiased font-sans size-full overflow-hidden relative text-secondary-foreground isolate',\n )}\n dir={dir}\n >\n <TooltipProvider\n delayDuration={200}\n // this is important, because without it, the tooltip remains even after moving the mouse away from trigger\n disableHoverableContent\n >\n <DialogerProvider>\n <RootScreen />\n </DialogerProvider>\n </TooltipProvider>\n </div>\n </IFrame>\n </motion.div>\n );\n}\n\nexport function WidgetPopoverContent() {\n const { theme } = useTheme();\n\n return (\n <PopoverPrimitive.Content\n onInteractOutside={(ev) => ev.preventDefault()}\n forceMount\n style={{\n zIndex: theme.widgetContentContainer.zIndex,\n fontSize: '16px',\n }}\n side=\"top\"\n align=\"end\"\n sideOffset={theme.widgetContentContainer.offset.side}\n alignOffset={theme.widgetContentContainer.offset.align}\n avoidCollisions={false}\n // do not use `asChild` as it will mess up setting the zIndex correctly on the top-most div\n >\n <WidgetContent />\n </PopoverPrimitive.Content>\n );\n}\n","import React from 'react';\nimport { cn } from '../lib/utils/cn';\n\nexport function ChatBubbleSvg({\n className,\n style,\n}: {\n className?: string;\n style?: React.CSSProperties;\n}) {\n return (\n <svg\n width=\"32\"\n height=\"30\"\n viewBox=\"0 0 32 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn('text-primary-foreground', className)}\n style={style}\n >\n <path\n d=\"M0 6.94263C0 3.62892 2.68629 0.942627 6 0.942627H26C29.3137 0.942627 32 3.62892 32 6.94263V17.9426C32 21.2563 29.3137 23.9426 26 23.9426H6C2.68629 23.9426 0 21.2563 0 17.9426V6.94263Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.9945 23.8935L26.237 23.8934C26.1982 24.3557 26.1712 25.2778 26.1704 26.2318C26.1688 28.2839 26.1376 28.7041 25.974 28.868C25.583 29.2598 25.2686 29.0967 24.0616 27.8754C23.4162 27.2222 22.1141 25.9522 21.1682 25.0531L19.9945 23.8935Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport IFrame from '@uiw/react-iframe';\nimport { AnimatePresence } from 'framer-motion';\nimport { ChevronDownIcon } from 'lucide-react';\nimport React from 'react';\nimport styles from '../index.css?inline.css';\nimport { useConfig, useWidgetTrigger } from '@opencx/widget-react-headless';\nimport { MotionDiv } from './components/lib/MotionDiv';\nimport { cn } from './components/lib/utils/cn';\nimport { Wobble, WOBBLE_MAX_MOVEMENT_PIXELS } from './components/lib/wobble';\nimport { ChatBubbleSvg } from './components/svg/ChatBubbleSvg';\nimport { useTheme } from './hooks/useTheme';\nimport { dc } from './utils/data-component';\n\nconst initialContent = `<!DOCTYPE html>\n<html>\n<head>\n<style>\n${styles}\nhtml, body {\n height: 100%;\n width: 100%;\n margin: 0;\n padding: 0;\n font-size: 16px;\n}\n</style>\n</head>\n<body>\n</body>\n</html>`;\n\nfunction WidgetPopoverTrigger() {\n const { isOpen } = useWidgetTrigger();\n const { cssOverrides, assets } = useConfig();\n const { theme, cssVars } = useTheme();\n\n return (\n <IFrame\n initialContent={initialContent}\n style={{\n height: `calc(${theme.widgetTrigger.size.button}px + ${WOBBLE_MAX_MOVEMENT_PIXELS.x * 2}px)`,\n width: `calc(${theme.widgetTrigger.size.button}px + ${WOBBLE_MAX_MOVEMENT_PIXELS.y * 2}px)`,\n fontSize: '16px',\n position: 'fixed',\n zIndex: theme.widgetTrigger.zIndex,\n right: theme.widgetTrigger.offset.right,\n bottom: theme.widgetTrigger.offset.bottom,\n left: theme.widgetTrigger.offset.left,\n\n // reset iframe defaults\n boxSizing: 'border-box',\n borderWidth: '0px',\n\n // A quick fix for the white square background of the iframe when the hosting website switches to dark mode\n borderRadius: '100%',\n }}\n >\n {cssOverrides && <style>{cssOverrides}</style>}\n <div\n style={{\n ...cssVars,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <PopoverPrimitive.PopoverTrigger\n className={cn(\n 'font-sans flex items-center justify-center rounded-full',\n )}\n style={{\n height: theme.widgetTrigger.size.button,\n width: theme.widgetTrigger.size.button,\n }}\n >\n <Wobble>\n <div\n {...dc('trigger/btn')}\n className={cn(\n 'relative size-full rounded-full',\n 'flex items-center justify-center',\n 'overflow-hidden',\n 'transition-all',\n 'bg-primary',\n 'text-primary-foreground',\n )}\n >\n <AnimatePresence mode=\"wait\">\n {isOpen ? (\n <MotionDiv\n key=\"x-icon\"\n snapExit\n fadeIn=\"up\"\n overrides={{\n initial: { rotate: 45 },\n animate: { rotate: 0 },\n }}\n >\n {assets?.widgetTrigger?.closeIcon ? (\n <img\n src={assets.widgetTrigger.closeIcon}\n alt=\"Widget trigger close icon\"\n style={{\n width: theme.widgetTrigger.size.icon,\n height: theme.widgetTrigger.size.icon,\n }}\n />\n ) : (\n <ChevronDownIcon\n style={{\n width: theme.widgetTrigger.size.icon,\n height: theme.widgetTrigger.size.icon,\n }}\n />\n )}\n </MotionDiv>\n ) : (\n <MotionDiv\n key=\"message-icon\"\n snapExit\n overrides={{\n initial: { rotate: 45 },\n animate: { rotate: 0 },\n }}\n >\n {assets?.widgetTrigger?.openIcon ? (\n <img\n src={assets.widgetTrigger.openIcon}\n alt=\"Widget trigger open icon\"\n style={{\n width: theme.widgetTrigger.size.icon,\n height: theme.widgetTrigger.size.icon,\n }}\n />\n ) : (\n <ChatBubbleSvg\n style={{\n width: theme.widgetTrigger.size.icon,\n height: theme.widgetTrigger.size.icon,\n }}\n className=\"mt-0.5 opacity-95\"\n />\n )}\n </MotionDiv>\n )}\n </AnimatePresence>\n </div>\n </Wobble>\n </PopoverPrimitive.PopoverTrigger>\n </div>\n </IFrame>\n );\n}\n\nexport { WidgetPopoverTrigger };\n","import React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { useDocumentDir } from '@opencx/widget-react-headless';\n\nexport function WidgetPopoverAnchor() {\n const { dir } = useDocumentDir();\n\n return (\n <PopoverPrimitive.Anchor\n style={{\n position: 'fixed',\n bottom: 0,\n right: dir === 'ltr' ? 0 : undefined,\n left: dir === 'rtl' ? 0 : undefined,\n }}\n />\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport React from 'react';\nimport type {\n ExternalStorage,\n LiteralWidgetComponentKey,\n WidgetConfig,\n} from '@opencx/widget-core';\nimport {\n useWidgetTrigger,\n WidgetProvider,\n WidgetTriggerProvider,\n type WidgetComponentType,\n} from '@opencx/widget-react-headless';\nimport { BotOrAgentMessageDefaultComponent } from './components/custom-components/BotOrAgentMessageDefaultComponent';\nimport { FallbackDefaultComponent } from './components/custom-components/FallbackDefaultComponent';\nimport { LoadingDefaultComponent } from './components/custom-components/LoadingDefaultComponent';\nimport { WidgetContent, WidgetPopoverContent } from './WidgetPopoverContent';\nimport { WidgetPopoverTrigger } from './WidgetPopoverTrigger';\nimport { WidgetPopoverAnchor } from './WidgetPopoverAnchor';\n\nfunction WidgetPopoverTriggerAndContent() {\n const { isOpen, setIsOpen } = useWidgetTrigger();\n\n return (\n <PopoverPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>\n <WidgetPopoverAnchor />\n <WidgetPopoverTrigger />\n <WidgetPopoverContent />\n </PopoverPrimitive.Root>\n );\n}\n\nconst defaultComponents: WidgetComponentType[] = [\n {\n key: 'loading' satisfies LiteralWidgetComponentKey,\n component: LoadingDefaultComponent,\n },\n {\n key: 'fallback' satisfies LiteralWidgetComponentKey,\n component: FallbackDefaultComponent,\n },\n {\n key: 'bot_message' satisfies LiteralWidgetComponentKey,\n component: BotOrAgentMessageDefaultComponent,\n },\n {\n key: 'agent_message' satisfies LiteralWidgetComponentKey,\n component: BotOrAgentMessageDefaultComponent,\n },\n];\n\nconst storage: ExternalStorage = {\n get: async (key: string) => {\n return localStorage.getItem(key);\n },\n set: async (key: string, value: string) => {\n localStorage.setItem(key, value);\n },\n remove: async (key: string) => {\n localStorage.removeItem(key);\n },\n};\n\nfunction WidgetWrapper({\n options,\n components = [],\n loadingComponent,\n}: {\n options: WidgetConfig;\n components?: WidgetComponentType[];\n loadingComponent?: React.ReactNode;\n}) {\n return (\n <WidgetProvider\n components={[...defaultComponents, ...components]}\n options={options}\n storage={storage}\n loadingComponent={loadingComponent}\n >\n <WidgetTriggerProvider>\n {options.inline ? (\n <WidgetContent />\n ) : (\n <WidgetPopoverTriggerAndContent />\n )}\n </WidgetTriggerProvider>\n </WidgetProvider>\n );\n}\n\nexport { WidgetWrapper as Widget };\n"],"names":["dc","componentName","cn","inputs","twMerge","clsx","WOBBLE_MAX_MOVEMENT_PIXELS","Wobble","memo","forwardRef","children","className","scale","off","ref","isHovering","setIsHovering","useState","movement","setMovement","handleMouseMove","event","clientX","clientY","rect","offsetX","offsetY","normalizedX","normalizedY","x","y","_b","_a","handleMouseEnter","handleMouseLeave","childStyles","cloneElement","ANIMATION_DISTANCE_PX","fadeInRight","distance","overrides","delay","fadeInLeft","fadeInUp","fadeInDown","treasureMap","MotionDiv","fadeIn","snapExit","props","fadeInProps","jsx","motion","buttonVariants","cva","Button","React","variant","size","asChild","Comp","Slot","context","createContext","DialogerProvider","isOpen","setIsOpen","content","setContent","openDialog","closeDialog","jsxs","DialogerPortal","useDialoger","dialoger","useContext","contentIframeRef","useWidget","close","useEffect","handleEscape","e","AnimatePresence","DialogerContent","withClose","X","DialogerHeader","DialogerBody","DialogerFooter","DialogerTitle","DialogerDescription","Dialoger","trigger","open","AttachmentPreview","attachment","name","type","url","isImage","isVideo","isAudio","MemoizedReactMarkdown","ReactMarkdown","prev","next","RichText","messageType","messageId","anchorTarget","useConfig","remarkGfm","rehypeRaw","BotOrAgentMessageDefaultComponent","data","id","attachments","isFirstInGroup","isLastInGroup","isAloneInGroup","dataComponentNames","classNames","message","FallbackDefaultComponent","Avatar","AvatarPrimitive","AvatarImage","AvatarFallback","AgentOrBotAvatar","agent","LoadingDefaultComponent","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","sideOffset","Tooltippy","side","align","disableTooltips","THRESHOLD_PIXELS","useIsSmallScreen","isSmallScreen","setIsSmallScreen","topWindow","checkScreenSize","DEFAULTS","useTheme","dir","useDocumentDir","theme","inline","withInlineDefault","v","withSmallScreenDefault","target","withDefaults","widgetTrigger","_c","_e","_d","_g","_f","_i","_h","_k","_j","triggerOffset","themeWithFallbacks","_l","_m","_n","_o","_p","_q","_r","_s","_u","_t","_w","_v","_y","_x","_A","_z","_C","_B","_E","_D","_G","_F","_I","_H","_L","_K","_J","_O","_N","_M","_R","_Q","_P","_U","_T","_S","computed","cssVars","paletteName","primary","palette","getPaletteColors","_primary","tc","primaryForeground","neutral","stone","zinc","slate","isExhaustive","useSetWidgetSizeFn","width","height","useSetWidgetSize","setWidth","setHeight","FallbackIcon","CircleDashedIcon","DynamicIcon","Icon","CheckIcon","CheckCheckIcon","CircleCheckIcon","CircleCheckBigIcon","CircleXIcon","ExpandIcon","MaximizeIcon","Maximize2Icon","MinimizeIcon","Minimize2Icon","ShrinkIcon","SquareCheckIcon","SquareCheckBigIcon","SquareXIcon","XIcon","useGetHeaderTitle","org","screen","useWidgetRouter","textContent","useGetHeaderDataComponentProp","Header__BackToSessionsScreenButton","router","toSessionsScreen","ChevronLeftIcon","Header__Buttons__Item__CloseWidget","button","useWidgetTrigger","handleClick","Header__Buttons__Item__ExpandShrink","expanded","setExpanded","screenHeight","screenWidth","isExpanded","Header__Buttons__Item__ResolveSession","widgetCtx","resolveSession","sessionState","useSessions","isNoSession","isResolved","onResolved","behaviorBeforeSessionCreation","behaviorIfSessionIsResolved","isDisabled","handleResolve","success","error","handleResolveAlternative","Header__Buttons__Item","defaultCloseWidgetButton","Header__Buttons","headerButtons","buttons","Fragment","Header","dataComponentProp","title","LoadingSpinner","LoaderIcon","useCanvas","isInitialFetchLoading","useMessages","activeMode","Component","useModes","ChatCanvas","sendMessage","createStateCheckpoint","isSendingMessage","setIsSendingMessage","handleSendMessage","args","MotionDiv__VerticalReveal","CSAT_SCORES","CsatSurvey","submitCsat","isCsatRequested","isCsatSubmitted","submittedScore","submittedFeedback","useCsat","score","setScore","feedback","setFeedback","handleRatingClick","value","handleSubmit","s","ArrowUpIcon","useTranslation","hostDocumentDir","config","useMemo","language","isSupportedLanguage","key","getTranslation","SuggestedReplyButton","suggestion","handleSend","trimmed","MightSolveUserIssueSuggestedReplies","options","option","ChatFooterItems","chatFooterItems","isSessionResolved","isSessionOpen","item","FileDisplay","status","file","onCancel","fileContent","setFileContent","reader","getStatusIcon","Loader2","AlertCircle","FileContent","fileType","FileAudio2Icon","FileVideo2Icon","FileIcon","ChatInput","inputRef","useRef","t","inputText","setInputText","allFiles","emptyTheFiles","handleCancelUpload","appendFiles","isUploading","successFiles","useUploadFiles","isHandedOff","isAwaitingBotReply","useIsAwaitingBotReply","handleFileDrop","acceptedFiles","cannotSend","f","dropzone__getRootProps","dropzone__getInputProps","dropzone__openFileSelect","useDropzone","handlePaste","clipboardData","PaperclipIcon","ImageIcon","CircleDashed","NewConvOrBackToConvsButton","canCreateNewSession","SessionClosedSection","ChatFooter","initialQuestions","initialQuestionsPosition","thisWasHelpfulOrNot","messagesState","noMessages","iq","index","BotOrAgentMessage","componentStore","GroupTimestamp","messages","containerClassName","timestamps","lastMessageTimestamp","formattedTimestamp","BotOrAgentMessageGroup","suggestedReplies","array","useSpecialComponentProps","session","SessionResolvedComponent","UserMessage","UserMessageGroup","groupMessagesByType","result","currentGroup","isUserMessageGroup","isBotMessageGroup","isAgentMessageGroup","AdvancedInitialMessages","advancedInitialMessages","bot","ChatBannerItems","chatBannerItems","persistent","InitialMessages","initialMessages","m","ChatBottomComponents","components","ChatMain","groupedMessages","LoadingComponent","messagesContainerRef","handleNewMessage","container_","group","i","firstIdInGroup","isLastGroup","ChatScreen","isCanvasOpen","chatContentKeyRef","Skeleton","OpenLogoSvg","PoweredByOpen","token","SectionTitle","SessionCard","toChatScreen","assigneeName","assigneeAvatarUrl","UserRoundIcon","ChevronRightIcon","SessionsList","sessions","isLoading","openSessions","closedSessions","createElement","SessionsScreen","Input","useWidgetContentHeight","observedElementRef","contentRoot","observedElement","animationFrame","observer","schema","z","WelcomeScreen","createUnverifiedContact","useContact","setName","email","setEmail","extraDataFields","extraData","setExtraData","handleSubmitState","useAsyncFn","field","SendHorizontal","RootScreen","initialContent","styles","WidgetContent","cssOverrides","IFrame","version","WidgetPopoverContent","PopoverPrimitive","ev","ChatBubbleSvg","style","WidgetPopoverTrigger","assets","ChevronDownIcon","WidgetPopoverAnchor","WidgetPopoverTriggerAndContent","defaultComponents","storage","WidgetWrapper","loadingComponent","WidgetProvider","WidgetTriggerProvider"],"mappings":"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"}
|