{"version":3,"file":"chat-panel-trigger.cjs","sources":["../../../components/chat-panel/chat-panel-trigger.tsx"],"sourcesContent":["'use client';\n\nimport { useDraggable } from '@dnd-kit/core';\nimport { cx } from 'class-variance-authority';\nimport {\n  ComponentProps,\n  MouseEvent,\n  PointerEvent,\n  useEffect,\n  useRef\n} from 'react';\nimport { CoPilotIcon } from '~/icons';\nimport styles from './chat-panel.module.css';\nimport { useChatPanelContext } from './chat-panel-context';\n\nexport interface ChatPanelTriggerProps extends ComponentProps<'button'> {\n  /**\n   * Whether the minimized bubble can be dragged around the viewport. The\n   * dropped position is kept across minimize/restore cycles. Shadows the\n   * (useless here) native `draggable` attribute.\n   * @defaultValue false\n   */\n  draggable?: boolean;\n}\n\nexport function ChatPanelTrigger({\n  className,\n  children,\n  onClick,\n  onPointerDown,\n  style,\n  draggable = false,\n  'aria-label': ariaLabel = 'Open chat',\n  ref,\n  ...props\n}: ChatPanelTriggerProps) {\n  const { mode, restore, bubbleDraggableId, bubbleElementRef } =\n    useChatPanelContext('Trigger');\n\n  const dragEnabled = mode === 'minimized' && draggable;\n  const { setNodeRef, listeners, transform, isDragging } = useDraggable({\n    id: bubbleDraggableId,\n    disabled: !dragEnabled\n  });\n\n  // A completed drag must not restore the panel. dnd-kit swallows the click\n  // right after a drag ends; this ref backs that up (jsdom, slow frames).\n  const wasDraggedRef = useRef(false);\n  const prevDraggingRef = useRef(false);\n  useEffect(() => {\n    const wasDragging = prevDraggingRef.current;\n    prevDraggingRef.current = isDragging;\n    if (wasDragging && !isDragging) {\n      wasDraggedRef.current = true;\n      const timer = setTimeout(() => {\n        wasDraggedRef.current = false;\n      }, 100);\n      return () => clearTimeout(timer);\n    }\n  }, [isDragging]);\n\n  if (mode !== 'minimized') return null;\n\n  const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n    if (wasDraggedRef.current) {\n      wasDraggedRef.current = false;\n      return;\n    }\n    onClick?.(event);\n    if (event.defaultPrevented) return;\n    restore();\n  };\n\n  const handlePointerDown = (event: PointerEvent<HTMLButtonElement>) => {\n    onPointerDown?.(event);\n    if (event.defaultPrevented) return;\n    listeners?.onPointerDown?.(event);\n  };\n\n  return (\n    <button\n      type='button'\n      ref={node => {\n        bubbleElementRef.current = node;\n        setNodeRef(node);\n        if (typeof ref === 'function') ref(node);\n        else if (ref) ref.current = node;\n      }}\n      className={cx(styles.trigger, className)}\n      data-slot='chat-panel-trigger'\n      data-chat-panel-trigger=''\n      data-draggable={dragEnabled || undefined}\n      data-dragging={isDragging || undefined}\n      aria-label={ariaLabel}\n      onClick={handleClick}\n      onPointerDown={handlePointerDown}\n      style={{\n        // The committed position lands on the panel frame; the live movement\n        // is the dnd-kit transform.\n        ...(transform\n          ? { transform: `translate3d(${transform.x}px, ${transform.y}px, 0)` }\n          : null),\n        ...style\n      }}\n      {...props}\n    >\n      {children ?? <CoPilotIcon aria-hidden='true' />}\n    </button>\n  );\n}\n\nChatPanelTrigger.displayName = 'ChatPanel.Trigger';\n"],"names":[],"mappings":";;;;;;;;;;;;AAyBgB;AAWd;AAGA;;AAEE;;AAED;;;AAID;AACA;;AAEE;AACA;AACA;AACE;AACA;AACE;;AAEF;;AAEJ;;AAE0B;AAE1B;AACE;AACE;;;AAGF;;;AAEA;AACF;AAEA;AACE;;;AAEA;AACF;;AAMM;;;;AAGK;AAAS;AAChB;;;AAYE;AACE;;AAEF;;AAOR;AAEA;;"}